Ë
    �…j|[  ã                   óv   — d dl Z d dlZd dlmZmZ d dlmZ d dlm	Z	  e j                  e«      Z G d„ de«      Zy)é    N)ÚAttentionMaskÚFusionAttention)Úhelper)Ú	OnnxModelc                   ó:   ‡ — e Zd ZdZdedededefˆ fd„Zd„ Zˆ xZ	S )ÚFusionBartAttentionz?
    Fuse Bart Attention subgraph into one Attention node.
    ÚmodelÚhidden_sizeÚ	num_headsÚattention_maskc                 ó*   •— t         ‰| �  ||||«       y )N)ÚsuperÚ__init__)Úselfr	   r
   r   r   Ú	__class__s        €úo/root/aria/tools/markitdown-venv/lib/python3.12/site-packages/onnxruntime/transformers/fusion_bart_attention.pyr   zFusionBartAttention.__init__   s   ø€ ô 	‰Ñ˜ ¨Y¸ÕGó    c                 ó¼  — | j                   j                  |g d¢g d¢«      }d }|€-| j                   j                  |g d¢g d¢«      }|�
|d   }|dd  }|�	|\  }}}	}
}nt        j                  d«       y |�?|j                  d   |j
                  d   k(  r|j                  d   }nc|j                  d   }nSg }|j                  D ].  }||vrŒ||d   j
                  d   k(  rŒ|j                  |«       Œ0 t        |«      dk7  ry |d   }	 ||   }|j                  dv r| j                   j                  |«      d   }|j
                  D ];  }|sŒ||   }|D �cg c]  }|j                  ‘Œ }}|j                  d	«      dk\  sŒ9|} n | j                   j                  «       j                  D �ch c]  }|j                  ’Œ }}| j                   j                  «       j
                  D �ch c]  }|j                  ’Œ }}| j                   j                  |g d
¢g d¢«      }| j                   j                  |g d¢g d¢«      }| j                   j                  |g d¢g d¢«      }d\  }}g d d }}}|�Ä|}|\  }} }}||j
                  d      }!|!D ]Z  }"|"j                  dk(  sŒ| j                   j                  |"ddgddg«      }#|#�|#d   j                  d   }||"j
                  d      }! n |!D ]D  }"||"j
                  d      }$|$D ]$  }%|%j
                  d   |v sŒ|%j
                  d   } n |dk7  sŒD n{ ny|�)|}|\  }&}} }}|&j                  d   }|&j
                  d   }nN|j                  d   |v r|j                  d   }n-|�|}|d   j                  d   }nt        j                  d«       y ||v r|nd}||v r|nd}| j                   j                  |dd	gddg«      }'| j                   j                  |g d¢g d¢«      }(| j                   j                  |g d¢g d¢«      })| j                   j                  |g d¢g d¢«      }*g d },}+|'�|'\  }-}.|'}+n8|(�	|(\  }-},}.|(}+n-|)�	|)\  }-}-}.|)}+n"|*�
|*\  }-}-},}.|*}+nt        j                  d«       y | j                   j                  |.g d¢g d ¢«      }/| j                   j                  |.g d!¢g d ¢«      }0| j                   j                  |.g d!¢g d"¢«      }1g }2|/�|/}2|2\  }3}4}5}6}7n0|0�|0}2|2\  }5}3}4}6}7n#|1�|1}2|2\  }5}3}4}6}7nt        j                  d#«       y | j                   j                  |.g d$¢g d%¢«      }8| j                   j                  |.g d&¢g d'¢«      }9| j                   j                  |.g d(¢g d¢«      }:| j                   j                  |.g d)¢g d*¢«      };| j                   j                  |.g d+¢g d,¢«      }<d\  }=}>g d d }A}@}?|8�F|8}?|?\  }B}C}A||Cj
                  d      }D|DD ]%  }E|Ej
                  d   |v sŒEj
                  d   }> �nz �nw|9�*|9}?|?\  }-}F}B}C}A|Fj                  d   }=|Fj
                  d   }>�nK||.j                  d      j                  d   |v r'||.j                  d      g}?|?d   j                  d   }=�n|<�|<}?|?\  }-}-}-}-}B}C}@}Anó|:�Ä|:}?|?\  }-}B}C}A||Aj
                  d      }!|!D ]Z  }"|"j                  dk(  sŒ| j                   j                  |"ddgddg«      }G|G�Gd   j                  d   }=||"j
                  d      }! n |!D ]D  }"||"j
                  d      }$|$D ]$  }%|%j
                  d   |v sŒ|%j
                  d   }> n |>dk7  sŒD n/ n-|;�|;}?|?d   j                  d   }=nt        j                  d-«       y |=|v r|=nd}=|>|v r|>nd}>A�ó@€ñ| j                   j                  |j                  d   «      }H|Hj                  d   }I|Hj                  }Jd.}K| j                   j                  |K«      }L|L€B| j!                  KJIgt#        j$                  d/g|Iz  t'        j(                  |J«      ¬0«      ¬1«       | j                   j+                  d2«      }Mt'        j,                  d2KAj
                  d   gCj                  g|M«      }@t/        |=«      xr t/        |«      xr
 Ad u xr |d u }N|N xr: |7j                  d   |k(  xr& Aj                  d   |k(  xr |j                  d   |k(  }ON xrT |7j                  d   |k(  xr@ Aj                  d   |j                  d   k(  xr Aj                  d   |7j                  d   k7  }P|+|(|*fv }Q|Q }ROxr R}SOxr Q}TPxr R}UTxr t/        |=«      xr t/        |«      }VNxr R}WQ}Xg }Y|Xr¼| j                   j                  |,d3gdg«      }Z| j                   j                  |,g d4¢g d5¢«      }[| j                   j                  |,g d6¢g d7¢«      }\| j                   j                  |,d8d8gddg«      }]|[�[}Yn%\�\}Yn ]�]}YnZ�Z}Ynt        j                  d9«       y t        Y«      dkD  sJ ‚Ss	TsUsVsW�rq|	}^| j1                  |4«      \  }_}`|_dk  s`dk  rc| j2                  dkD  rT| j4                  dkD  rEt        j                  d:_`| j2                  | j4                  «       | j2                  }_| j4                  }`_dk  s`dk  s`_z  dk7  rt        j                  d;«       y d }aVsUsWr[| j6                  rL| j9                  |7UsVrAn|=UsVr|n||6UsVr@nd UsVr|nd _`^j
                  d   XVr|=ndVr|nd|>|¬<«      nd }anH| j6                  }bd=| _        | j;                  d |7A||6@|_`|^j
                  d   X|=||>|¬>«      }a|b| _        a€t        j                  d?«       y | j<                  j                  a«       | j>                  | j@                  |aj                  <   | jB                  jE                  ^|
|g«       | jB                  jE                  |+«       VsUsW�r,t        |2«      dkD  r"|2d   j                  d	k(  r|2jG                  «        t        |?«      dkD  r"|?d   j                  d	k(  r|?jG                  «        t        |«      dkD  r"|d   j                  d	k(  r|jG                  «        | jH                  r�t        |2«      dkD  r"|2d   j                  d2k(  r|2jG                  «        t        |?«      dkD  r"|?d   j                  d2k(  r|?jG                  «        t        |«      dkD  r"|d   j                  d2k(  r|jG                  «        | jB                  jE                  |2«       | jB                  jE                  |?«       | jB                  jE                  |«       d@| _%        y y c c}w c c}w c c}w )AN)ÚAddÚMatMulÚReshapeÚ	Transposer   )é   r   r   r   r   )r   r   r   r   r   r   )r   Nr   r   r   r   r   r   z(fuse_attention: failed to match qkv path>   r   ÚClipr   )r   r   r   r   )r   r   r   N)ÚConcatr   r   r   r   )r   r   r   r   N)r   r   r   r   )r   r   r   r   )Ú r   r   r   r   éÿÿÿÿr   z&fuse_attention: failed to match v pathÚSoftmax)r   r   r   )r   r   r   )ÚWherer   r   )r   é   r   )r   r   r   r   )r   r    r   r   z'fuse_attention: failed to match qk path)r   r   ÚMulr   r   )r   r   r   r   r   )r!   r   r   r   r   )r   r   r   r   Nz&fuse_attention: failed to match q path)r   r   r   )r   r   r   )r   r   r   r   r   )r   r   r   r   r   )r!   r   r   r   )r!   r   r   r   r   )r   r   r   r   r   )r!   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   Nz&fuse_attention: failed to match k pathÚ
empty_biasg        )Údtype)ÚdimsÚvalsr   r   )ÚSliceÚExpandr   )r   r   r   )r&   Ú	UnsqueezeÚGatherÚShaper   )r   r    r   r   r   r&   z*fuse_attention: failed to match mask nodesz€fuse_attention: reshape dims invalid (num_heads=%d, hidden_size=%d), falling back to user-specified num_heads=%d, hidden_size=%dz9fuse_attention: failed to detect num_heads or hidden_size)Úq_matmulÚk_matmulÚv_matmulÚq_addÚk_addÚv_addr   r
   ÚoutputÚunidirectionalÚpast_kÚpast_vÚ	present_kÚ	present_vF)Ú
mask_indexr+   r,   r-   r.   r/   r0   r   r
   Úfirst_inputr1   Úcausalr3   r4   r5   r6   z+fuse_attention: failed to create fused nodeT)&r	   Úmatch_parent_pathÚloggerÚdebugÚinputr1   ÚappendÚlenÚop_typeÚget_childrenÚcountÚgraphÚnameÚget_initializerr$   Ú	data_typeÚadd_initializerÚnpÚarrayr   Útensor_dtype_to_np_dtypeÚcreate_node_nameÚ	make_nodeÚboolÚget_num_heads_and_hidden_sizer   r
   Úuse_multi_head_attentionÚcreate_multihead_attention_nodeÚcreate_attention_nodeÚnodes_to_addÚthis_graph_nameÚnode_name_to_graph_nameÚnodes_to_removeÚextendÚpopÚ!disable_multi_head_attention_biasÚprune_graph)cr   Únormalize_nodeÚinput_name_to_nodesÚoutput_name_to_nodeÚ	qkv_nodesÚadd_before_layernormÚqkv_nodes_with_residualÚadd_outÚ
matmul_outÚreshape_qkvÚtranspose_qkvÚ
matmul_qkvÚ
root_inputÚother_inputsÚinput_Úskip_layernormr1   ÚchildrenÚchildÚchildren_typesÚnodeÚgraph_input_namesÚgraph_output_namesÚv_nodes_past_or_presentÚv_nodes_with_pastÚv_nodes_past_only_oair4   r6   Úv_nodesÚadd_vÚmatmul_vÚtranspose_vÚ	reshape_vÚstart_child_nodesÚstart_child_nodeÚconcat_v_nodesÚstart_grandchild_nodesÚstart_grandchild_nodeÚconcat_vÚqk_nodes_no_maskÚqk_nodes_with_maskÚqk_nodes_sdpa_no_maskÚqk_nodes_sdpa_with_maskÚqk_nodesÚadd_qkÚ_Ú	matmul_qkÚ
q_nodes_hfÚq_nodes_oaiÚq_nodes_sdpaÚq_nodesÚtranspose_qÚ	reshape_qÚmul_qÚadd_qÚmatmul_qÚk_nodes_no_past_hfÚk_nodes_with_past_hfÚk_nodes_past_or_present_oaiÚk_nodes_past_only_oaiÚk_nodes_sdpar3   r5   Úk_nodesÚadd_kÚmatmul_kÚtranspose_kÚ	reshape_kÚtranspose_k_nodesÚtranspose_k_nodeÚconcat_kÚconcat_k_nodesÚadd_v_tensorÚbias_dimr#   Úempty_bias_nameÚempty_tensorÚadd_nameÚthree_root_inputsÚone_root_inputÚtwo_root_inputsÚhas_maskÚno_maskÚencoder_attentionÚdecoder_self_attentionÚdecoder_cross_attentionÚ decoder_self_attention_with_pastÚ!decoder_cross_attention_with_pastÚcausal_maskÚ
mask_nodesÚmask_nodes_bartÚmask_nodes_whisper_hfÚmask_nodes_whisper_oaiÚ mask_nodes_whisper_oai_unit_testÚattention_last_noder   r
   Únew_nodeÚ%use_multi_head_attention_ground_truthsc                                                                                                      r   ÚfusezFusionBartAttention.fuse   sØ  € à—J‘J×0Ñ0ØÚ?Úó
ˆ	ð  $ÐØÐØ&*§j¡j×&BÑ&BØÚJÚ%ó'Ð#ð
 'Ð2Ø'>¸qÑ'AÐ$Ø3°A°BÐ7�	àÐ ð ñØØØØÙô �L‰LÐCÔDØàÐ+à#×)Ñ)¨!Ñ,°·±¸qÑ0AÒAØ1×7Ñ7¸Ñ:‘
à1×7Ñ7¸Ñ:‘
àˆLØ(×.Ñ.ò ,�ØÐ!4Ñ4ØØ˜Y q™\×0Ñ0°Ñ3Ò3ØØ×#Ñ# FÕ+ð,ô �<Ó  AÒ%ØØ% a™ˆJð	ð -¨ZÑ8ˆð ×!Ñ! _Ñ4Ø!ŸZ™Z×4Ñ4°^ÓDÀQÑGˆNØ$×+Ñ+ò 	ˆFÙØØ*¨6Ñ2ˆHØ9AÖB°˜eŸm›mÐBˆNÐBØ×#Ñ# HÓ-°Ó2Ø#�
Ùð	ð 48·:±:×3CÑ3CÓ3E×3KÑ3KÖL¨4˜TŸY›YÐLÐÐLØ48·J±J×4DÑ4DÓ4F×4MÑ4MÖN¨D˜dŸi›iÐNÐÐNà"&§*¡*×">Ñ">ØÚ5Úó#
Ðð
 !ŸJ™J×8Ñ8ØÚ?Úó
Ðð
 !%§
¡
× <Ñ <ØÚ<Úó!
Ðð
 #Ñˆ�	Ø#% t¨T˜�ˆØ"Ð.Ø-ˆGØ8?Ñ5ˆ[˜) U¨Hð !4°E·L±LÀ±OÑ DÐØ$5ò 
Ð Ø#×+Ñ+¨xÓ7Ø%)§Z¡Z×%AÑ%AØ(Ø" KÐ0Ø˜A˜ó&�Nð
 &Ð1Ø!/°Ñ!3×!9Ñ!9¸!Ñ!<˜Ø(;Ð<L×<SÑ<SÐTUÑ<VÑ(WÐ%Ùð
ð %6ò Ð Ø)<Ð=M×=TÑ=TÐUVÑ=WÑ)XÐ&Ø-Cò Ð)Ø,×3Ñ3°AÑ6Ð:LÒLØ$9×$@Ñ$@ÀÑ$C˜	Ùðð  “?Ùñð Ð*Ø'ˆGØBIÑ?ˆX�{ I¨u°hØ—^‘^ AÑ&ˆFØ Ÿ™¨Ñ*‰IØ×Ñ˜aÑ Ð$5Ñ5à×%Ñ% aÑ(‰FØ"Ð.à+ˆGØ˜R‘[×&Ñ& qÑ)‰Fä�L‰LÐAÔBØØ!Ð%6Ñ6‘¸BˆØ!*Ð.@Ñ!@‘IÀbˆ	àŸ:™:×7Ñ7¸
ÀYÐPXÐDYÐ\]Ð_`Ð[aÓbÐØ!ŸZ™Z×9Ñ9¸*ÒFbÒdmÓnÐð !%§
¡
× <Ñ <¸ZÒIgÒirÓ sÐØ"&§*¡*×">Ñ">ØÒ=º|ó#
Ðð ˜t�&ˆØÐ'Ø+‰LˆAˆyØ'‰HØÐ+Ø#5Ñ ˆAˆv�yØ)‰HØ"Ð.Ø3‰OˆAˆq�)Ø,‰HØ$Ð0Ø&=Ñ#ˆAˆq�&˜)Ø.‰Hä�L‰LÐBÔCØà—Z‘Z×1Ñ1ØÚ<Úó
ˆ
ð
 —j‘j×2Ñ2ØÚ<Úó
ˆð —z‘z×3Ñ3ØÚ<Úó
ˆð
 ˆØÐ!Ø ˆGØ?FÑ<ˆ[˜) U¨E±8ØÐ$Ø!ˆGØ?FÑ<ˆU�K ¨E±8ØÐ%Ø"ˆGØ?FÑ<ˆU�K ¨E±8ä�L‰LÐAÔBØà!ŸZ™Z×9Ñ9ØÚ.Úó
Ðð
  $Ÿz™z×;Ñ;ØÚEÚó 
Ðð
 '+§j¡j×&BÑ&BØÚ5Úó'
Ð#ð
 !%§
¡
× <Ñ <ØÚCÚó!
Ðð —z‘z×3Ñ3ØÚ_Ú'ó
ˆð
 #Ñˆ�	Ø#% t¨T˜�ˆØÐ)Ø(ˆGØ18Ñ.ˆ[˜) Xð !4°I×4DÑ4DÀQÑ4GÑ HÐØ$5ò Ð Ø#×*Ñ*¨1Ñ-Ð1CÒCØ 0× 7Ñ 7¸Ñ :�IÚòð "Ð-Ø*ˆGØ>EÑ;ˆQ�˜+ y°(Ø—^‘^ AÑ&ˆFØ Ÿ™¨Ñ*ŠIØ  §¡°Ñ!3Ñ4×:Ñ:¸1Ñ=ÐARÑRà*¨9¯?©?¸1Ñ+=Ñ>Ð?ˆGØ˜Q‘Z×%Ñ% aÑ(ŠFØÐ%Ø"ˆGØDKÑAˆQ��1�a˜ i°¹Ø(Ð4Ø1ˆGØ4;Ñ1ˆQ�˜Y¨ð !4°H·O±OÀAÑ4FÑ GÐØ$5ò 
Ð Ø#×+Ñ+¨xÓ7Ø%)§Z¡Z×%AÑ%AØ(Ø" KÐ0Ø˜A˜ó&�Nð
 &Ð1Ø!/°Ñ!3×!9Ñ!9¸!Ñ!<˜Ø(;Ð<L×<SÑ<SÐTUÑ<VÑ(WÐ%Ùð
ð %6ò Ð Ø)<Ð=M×=TÑ=TÐUVÑ=WÑ)XÐ&Ø-Cò Ð)Ø,×3Ñ3°AÑ6Ð:LÒLØ$9×$@Ñ$@ÀÑ$C˜	Ùðð  “?Ùñð #Ð.à+ˆGØ˜R‘[×&Ñ& qÑ)‰Fä�L‰LÐAÔBØØ!Ð%6Ñ6‘¸BˆØ!*Ð.@Ñ!@‘IÀbˆ	àÐ E MàŸ:™:×5Ñ5°e·k±kÀ!±nÓEˆLØ#×(Ñ(¨Ñ+ˆHØ ×*Ñ*ˆEØ*ˆOØŸ:™:×5Ñ5°oÓFˆLØÐ#Ø×$Ñ$Ø#ØØ"˜ÜŸ™ 3 %¨(Ñ"2¼&×:YÑ:YÐZ_Ó:`Ôað	 %ô ð —z‘z×2Ñ2°5Ó9ˆHÜ×$Ñ$ U¨_¸h¿o¹oÈaÑ>PÐ,QÐT]×TbÑTbÐScÐemÓnˆEä  ›LÒc¬T°&«\Òc¸hÈ$Ð>NÒcÐS[Ð_cÐScÐà!Ð!ò 0Ø—‘˜qÑ! ZÑ/ò0à—‘˜qÑ! ZÑ/ò0ð —‘˜qÑ! ZÑ/ð	 	ð "Ð!ò 7Ø—‘˜qÑ! ZÑ/ò7à—‘˜qÑ! X§^¡^°AÑ%6Ñ6ò7ð —‘˜qÑ! X§^¡^°AÑ%6Ñ6ð	 	ð  Ð 2Ð4KÐLÐLˆØ�,ˆØ*Ò6¨wÐØ!/Ò!<°HÐØ"1Ò"=°gÐØ+AÒ+cÄdÈ6ÃlÒ+cÔW[Ð\bÓWcÐ(Ø,=Ò,IÀ'Ð)ð ˆØˆ
ÙØ"Ÿj™j×:Ñ:ØØ�	Ø�óˆOð
 %)§J¡J×$@Ñ$@ØÚ,Úó%Ð!ð
 &*§Z¡Z×%AÑ%AØÚ@Úó&Ð"ð
 04¯z©z×/KÑ/KØØ˜'Ð"Ø�A�ó0Ð,ð
 %Ð0Ø2‘
Ø'Ð3Ø3‘
Ø1Ð=Ø=‘
Ø Ð,Ø,‘
ä—‘ÐIÔJØÜ�z“? QÒ&Ð&Ð&ñ Ù%Ù&Ù/Ú0à"-ÐØ%)×%GÑ%GÈ	Ó%RÑ"ˆI�{ð ˜Q’ +°Ò"2¸¿¹ÈÒ8JÈt×O_ÑO_ÐbcÒOcÜ—‘ðRàØØ—N‘NØ×$Ñ$ôð !ŸN™N�	Ø"×.Ñ.�à˜AŠ~ °Ò!1°kÀIÑ6MÐRSÒ5SÜ—‘ÐXÔYØàˆHÙ/Ñ3JÑNoð* ×4Ò4ð! ×8Ñ8Ø!)Ù-DÑHh¡ÐntÙ-DÑHh¡ÐntØ#Ù'>ÑBb™eÐhlÙ'>ÑBb™eÐhlØ"+Ø$/Ø2×9Ñ9¸!Ñ<Ø'2Ù)I™vÈrÙ)I™vÈrØ"+Ø"+ð 9ô ð" ñ% ð, 9=×8UÑ8UÐ5Ø05�Ô-Ø×5Ñ5Ø#Ø%Ø%Ø%ØØØØ'Ø +Ø *Ø.×5Ñ5°aÑ8Ø&Ø!Ø!Ø'Ø'ð! 6ó �ð$ 1V�Ô-ØÐÜ—‘ÐJÔKØà×Ñ×$Ñ$ XÔ.Ø:>×:NÑ:NˆD×(Ñ(¨¯©Ñ7à× Ñ ×'Ñ'Ð)<¸mÈZÐ(XÔYØ× Ñ ×'Ñ'¨Ô1ñ 0Ñ3JÒNoÜ�w“< !Ò#¨°©×(;Ñ(;¸xÒ(GØ—K‘K”MÜ�w“< !Ò#¨°©×(;Ñ(;¸xÒ(GØ—K‘K”MÜ�w“< !Ò#¨°©×(;Ñ(;¸xÒ(GØ—K‘K”MØ×9Ò9Ü˜7“| aÒ'¨G°B©K×,?Ñ,?À5Ò,HØŸ™œÜ˜7“| aÒ'¨G°B©K×,?Ñ,?À5Ò,HØŸ™œÜ˜7“| aÒ'¨G°B©K×,?Ñ,?À5Ò,HØŸ™œà× Ñ ×'Ñ'¨Ô0Ø× Ñ ×'Ñ'¨Ô0Ø× Ñ ×'Ñ'¨Ô0ð  $ˆDÕðM 1ùò_	 Cùò
 MùÚNs   ÅwÆ*wÇ%w)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úintr   r   r´   Ú__classcell__)r   s   @r   r   r      s>   ø„ ñðHàðHð ðHð ð	Hð
 &õHö]$r   r   )ÚloggingÚnumpyrH   Úfusion_attentionr   r   Úonnxr   Ú
onnx_modelr   Ú	getLoggerrµ   r;   r   © r   r   ú<module>rÂ      s6   ðó
 ã ß ;Ý Ý  à	ˆ×	Ñ	˜8Ó	$€ôk$˜/õ k$r   