Ë
    �…jó  ã                   ó    — d dl Z d dlmZmZ d dlm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 G d	„ d
e«      Zy)é    N)ÚAttentionMaskÚFusionAttention)ÚNumpyHelper)Ú	NodeProtoÚhelper)Ú	OnnxModel)ÚBertOnnxModelc                   ól   ‡ — e Zd ZdZdedededefˆ fd„Zdede	d	e	deded
ededede	dz  fd„Z
d„ Zˆ xZS )ÚFusionTnlrAttentionz˜
    Fuse TNLR Attention subgraph into one Attention node.
    TNLR Attention has extra addition after qk nodes and adopts [S, B, NH] as I/O shape.
    ÚmodelÚhidden_sizeÚ	num_headsÚattention_maskc                 ó*   •— t         ‰| �  ||||«       y ©N)ÚsuperÚ__init__)Úselfr   r   r   r   Ú	__class__s        €úi/root/aria/tools/markitdown-venv/lib/python3.12/site-packages/onnxruntime/transformers/onnx_model_tnlr.pyr   zFusionTnlrAttention.__init__   s   ø€ ô 	‰Ñ˜ ¨Y¸ÕGó    Ú
mask_indexÚmatmulÚaddÚinputÚoutputÚ
add_qk_strÚreturnNc	                 ó  — |dkD  sJ ‚|dkD  r$||z  dk7  rt         j                  d|› d|› �«       y | j                  j                  |j                  d   «      }	| j                  j                  |j                  d   «      xs( | j                  j                  |j                  d   «      }
|	�|
€y t        j                  |	«      }t        j                  |
«      }| j                  j                  d«      }|	j                  }t        j                  |«      }t        j                  |dz   ||d|z  g|j                  |«      j                  «       d¬	«      }	| j                  j                  |	| j                  «       t        j                  |d
z   |d|z  g|j                  |«      j                  «       d¬	«      }
| j                  j                  |
| j                  «       ||dz   |d
z   g}|�|j!                  |«       n|j!                  d«       |�"|j!                  d«       |j!                  |«       t        j"                  d||g|¬«      }d|_        |j&                  j)                  t        j*                  d|«      g«       |S )Nr   zinput hidden size z# is not a multiple of num of heads é   Ú	AttentionÚ_qkv_weighté   T)ÚnameÚ	data_typeÚdimsÚvalsÚrawÚ	_qkv_biasÚ )ÚinputsÚoutputsr$   zcom.microsoftr   )ÚloggerÚdebugr   Úget_initializerr   r   Úto_arrayÚcreate_node_namer%   r   Útensor_dtype_to_np_dtypeÚmake_tensorÚastypeÚtobytesÚadd_initializerÚthis_graph_nameÚappendÚ	make_nodeÚdomainÚ	attributeÚextendÚmake_attribute)r   r   r   r   r   r   r   r   r   ÚweightÚbiasÚ
qkv_weightÚqkv_biasÚattention_node_nameÚtensor_dtypeÚnp_typeÚattention_inputsÚattention_nodes                     r   Úcreate_attention_nodez)FusionTnlrAttention.create_attention_node   sc  € ð ˜1Š}Ðˆ}Ø˜Š? ¨iÑ 7¸AÒ=Ü�L‰LÐ-¨k¨]Ð:]Ð^gÐ]hÐiÔjØà—‘×+Ñ+¨F¯L©L¸©OÓ<ˆØ�z‰z×)Ñ)¨#¯)©)°A©,Ó7Òc¸4¿:¹:×;UÑ;UÐVY×V_ÑV_Ð`aÑVbÓ;cˆàˆ>˜T˜\Øä ×)Ñ)¨&Ó1ˆ
Ü×'Ñ'¨Ó-ˆà"Ÿj™j×9Ñ9¸+ÓFÐà×'Ñ'ˆÜ×1Ñ1°,Ó?ˆÜ×#Ñ#Ø$ }Ñ4Ø"Ø˜q ;™Ð/Ø×"Ñ" 7Ó+×3Ñ3Ó5Øô
ˆð 	�
‰
×"Ñ" 6¨4×+?Ñ+?Ô@ä×!Ñ!Ø$ {Ñ2Ø"Ø�k‘/Ð"Ø—‘ Ó)×1Ñ1Ó3Øô
ˆð 	�
‰
×"Ñ" 4¨×)=Ñ)=Ô>ð Ø -Ñ/Ø +Ñ-ð
Ðð
 Ð!Ø×#Ñ# JÕ/à×#Ñ# BÔ'àÐ!Ø×#Ñ# BÔ'Ø×#Ñ# JÔ/ä×)Ñ)ØØ#Ø�HØ$ô	
ˆð !0ˆÔØ× Ñ ×'Ñ'¬×)>Ñ)>¸{ÈIÓ)VÐ(WÔXàÐr   c                 óâ  — |}|j                   dk7  ry | j                  j                  |g d¢g d¢«      }|�
|\  }}}}}	}
ny g }t        |j                  «      D ]1  \  }}||vrŒ||d   j
                  d   k(  rŒ!|j                  |«       Œ3 t        |«      dk7  ry |d   }| j                  j                  |
g d¢g d¢«      }|€y |\  }}}}}| j                  j                  |dgdg«      }|d   }| j                  j                  |
g d	¢g d
¢«      }|€y |\  }}}| j                  j                  |g d¢g d¢«      }|€y |d   }|d   }| j                  j                  |g d¢g d¢«      }|€y |d   }|d   }| j                  j                  |ddgddg«      }|€y |j                  d   |k(  �rÃd }|}| j                  |||| j                  | j                  ||j
                  d   |d   j                  d   «      }|€y | j                  j                  |«       | j                  | j                  |j                  <   t        j                   dd|j                  z   g|j
                  d   gd|j                  z   g d¢¬«      }| j                  j#                  || j                  «       |j                  d   |j                  d<   d|j                  z   |j
                  d<   | j$                  j'                  ||	|
g«       | j$                  j'                  |«       | j$                  j'                  |«       | j$                  j'                  |«       | j$                  j'                  |«       d| _        y y )NÚSkipLayerNormalization)ÚWhereÚAddÚMatMulÚReshapeÚ	TransposerL   )r    r    r    r   r   r   r   r    )rN   rM   ÚSlicerK   rL   )r    r   r   r   r    rN   )ÚSoftmaxrK   rL   )r   r   r   )ÚMulrN   rM   rO   rK   rL   )r   r   r   r   r   r    éþÿÿÿéÿÿÿÿrM   rJ   Úback_transpose_in_Úback_transpose_)r    r   é   )ÚpermT)Úop_typer   Úmatch_parent_pathÚ	enumerater   r   r8   ÚlenrG   r   r   Únodes_to_addr7   Únode_name_to_graph_namer$   r   r9   Úadd_nodeÚnodes_to_remover<   Úprune_graph)r   Únormalize_nodeÚinput_name_to_nodesÚoutput_name_to_nodeÚ
start_nodeÚ	qkv_nodesÚ_Úmatmul_belowÚreshape_qkvÚtranspose_qkvÚ
matmul_qkvÚother_inputsÚ_ir   Ú
root_inputÚv_nodesr   r   Úupper_nodesÚ	transposeÚqk_nodesÚadd_qkÚ	matmul_qkÚq_nodesÚk_nodesÚrelative_position_bias_nodesr   Úattention_last_nodeÚnew_nodeÚback_transposes                                 r   ÚfusezFusionTnlrAttention.fuseg   s   € ð $ˆ
Ø×!Ñ!Ð%=Ò=Øð —J‘J×0Ñ0ØÚHÚó
ˆ	ð
 Ð ØKTÑHˆQ��< ¨m¹ZààˆÜ" :×#3Ñ#3Ó4ò 	'‰IˆB�ØÐ/Ñ/Øà˜	 !™×+Ñ+¨AÑ.Ò.ØØ×Ñ Õ&ð	'ô ˆ|Ó Ò!Øà! !‘_ˆ
à—*‘*×.Ñ.ØÚ>Úó
ˆð
 ˆ?ØØ!(ÑˆˆAˆq�#�và—j‘j×2Ñ2°6¸K¸=È1È#ÓNˆØ ‘Nˆ	à—:‘:×/Ñ/°
Ò<XÒZcÓdˆØÐØØ!)ÑˆˆF�Ià—*‘*×.Ñ.ØÚEÚó
ˆð
 ˆ?ØØ�b‰kˆØ˜‘ˆà—*‘*×.Ñ.ØÚ>Úó
ˆð
 ˆ?ØØ�b‰kˆØ˜‘ˆà'+§z¡z×'CÑ'CÀFÈYÐX_ÐL`ÐcdÐfgÐbhÓ'iÐ$Ø'Ð/Øà�<‰<˜‰?˜jÓ(ØˆJØ"-Ðð ×1Ñ1ØØØØ—‘Ø× Ñ ØØ#×*Ñ*¨1Ñ-Ø,¨QÑ/×5Ñ5°aÑ8ó	ˆHð ÐØà×Ñ×$Ñ$ XÔ.Ø:>×:NÑ:NˆD×(Ñ(¨¯©Ñ7ô $×-Ñ-ØØ%¨¯©Ñ5Ð6Ø—‘ Ñ#Ð$Ø! H§M¡MÑ1ÚôˆNð �J‰J×Ñ °×0DÑ0DÔEØ )§¡°Ñ 2ˆH�N‰N˜1ÑØ!5¸¿¹Ñ!EˆH�O‰O˜AÑà× Ñ ×'Ñ'Ð)<¸mÈZÐ(XÔYØ× Ñ ×'Ñ'¨Ô1Ø× Ñ ×'Ñ'¨Ô0Ø× Ñ ×'Ñ'¨Ô0Ø× Ñ ×'Ñ'¨Ô0ð  $ˆDÕðS )r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úintr   r   Ústrr   rG   rz   Ú__classcell__©r   s   @r   r   r      s«   ø„ ñð
HàðHð ðHð ð	Hð
 &õHðFàðFð ðFð ð	Fð
 ðFð ðFð ðFð ðFð ðFð 
�TÑ	óFöPq$r   r   c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚTnlrOnnxModelc                 óª   •— t         ‰| �  |||«       t        | «      | _        t	        | | j
                  | j                  | j                  «      | _        y r   )r   r   r   r   r   r   r   Úattention_fusion)r   r   r   r   r   s       €r   r   zTnlrOnnxModel.__init__Ü   sE   ø€ Ü‰Ñ˜ 	¨;Ô7Ü+¨DÓ1ˆÔÜ 3°D¸$×:JÑ:JÈDÏNÉNÐ\`×\oÑ\oÓ pˆÕr   c                 ó8   — | j                   j                  «        y r   )r†   Úapply)r   s    r   Úfuse_attentionzTnlrOnnxModel.fuse_attentioná   s   € Ø×Ñ×#Ñ#Õ%r   )r{   r|   r}   r   r‰   r�   r‚   s   @r   r„   r„   Û   s   ø„ ôqö
&r   r„   )ÚloggingÚfusion_attentionr   r   Úfusion_utilsr   Úonnxr   r   Ú
onnx_modelr   Úonnx_model_bertr	   Ú	getLoggerr{   r-   r   r„   © r   r   ú<module>r’      sF   ðó
 ç ;Ý $ß "Ý  Ý )à	ˆ×	Ñ	˜8Ó	$€ôH$˜/ô H$ôV&�Mõ &r   