Ë
    �…jA*  ã                   ó‚   — d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	  ee
«      Zd„ Z G d„ de«      Z G d	„ d
e«      Zy)é    )Ú	getLogger)ÚFusion)ÚNumpyHelper)Úhelper)Ú	OnnxModelc                 óÎ   — t        | «      dk7  ryt        |«      dk(  r"|d   dk(  xr |d   | d   k(  xr |d   | d   k(  S t        |«      dk(  r|d   | d   k(  xr |d   | d   k(  S y)z£Check if skip_shape can broadcast to input_shape for SkipLayerNormalization.

    The kernel supports: input 3D (B,S,H) with skip 3D (1,S,H) or skip 2D (S,H).
    é   Fr   é   é   )Úlen)Úinput_shapeÚ
skip_shapes     ún/root/aria/tools/markitdown-venv/lib/python3.12/site-packages/onnxruntime/transformers/fusion_skiplayernorm.pyÚ_is_broadcast_skipr      sŒ   € ô
 ˆ;Ó˜1ÒØÜ
ˆ:ƒ˜!ÒØ˜!‰} Ñ!Òi j°¡m°{À1±~Ñ&EÒiÈ*ÐUVÉ-Ð[fÐghÑ[iÑJiÐiÜ
ˆ:ƒ˜!ÒØ˜!‰} ¨A¡Ñ.ÒR°:¸a±=ÀKÐPQÁNÑ3RÐRØó    c            	       óH   ‡ — e Zd ZdZ	 	 	 d	dedededefˆ fd„Zd„ Zd„ Z	ˆ xZ
S )
ÚFusionSkipLayerNormalizationzï
    Fuse Add + LayerNormalization into one node: SkipLayerNormalization.
    Supports broadcasting of the skip input: (1, sequence_length, hidden_size)
    or (sequence_length, hidden_size) will be broadcast to match the input shape.
    ÚmodelÚfused_op_typeÚsearch_op_typesÚshape_inferc                 ó¼   •— t         ‰| �  |||«       |rH| j                  j                  dddœd¬«      | _        | j                  €t
        j                  d«       y y y )Né   é   )Ú
batch_sizeÚseq_lenT)Úupdatez,symbolic shape inference disabled or failed.)ÚsuperÚ__init__r   Úinfer_runtime_shapeÚshape_infer_helperÚloggerÚwarning)Úselfr   r   r   r   Ú	__class__s        €r   r   z%FusionSkipLayerNormalization.__init__%   s`   ø€ ô 	‰Ñ˜ ¨Ô?Ùà&*§j¡j×&DÑ&DÐTUÐbcÑEdÐmqÐ&DÓ&rˆDÔ#Ø×&Ñ&Ð.ä—‘ÐMÕNð /ð r   c                 ó  — | j                   j                  |j                  d   «      }| j                   j                  |j                  d   «      }|�|€y||k(  rt        |«      dk(  rdS dS t	        ||«      ryt	        ||«      ryy)zÿIdentify which Add input is the skip tensor (the one that may broadcast).

        Returns (skip_index, broadcast):
            skip_index: 0 or 1 (which Add input is skip), -1 if incompatible
            broadcast: True if broadcasting is needed
        r   r
   )éÿÿÿÿFr	   )r
   F)r
   T)r   T)r!   Úget_edge_shapeÚinputr   r   )r$   ÚaddÚshape_aÚshape_bs       r   Úget_skip_indexz+FusionSkipLayerNormalization.get_skip_index4   s‰   € ð ×)Ñ)×8Ñ8¸¿¹À1¹ÓFˆØ×)Ñ)×8Ñ8¸¿¹À1¹ÓFˆØˆ?˜g˜oØà�gÒÜ!$ W£°Ò!2�:ÐC¸ÐCô ˜g wÔ/Øä˜g wÔ/Øàr   c           	      óž  — | j                   j                  |d|«      }|�|j                  dk7  ry t        |j                  «      dk7  ry |j                  D ]  }| j                   j                  |«      €Œ y  || j                  v ry |j                  dk(  }d}d}t        | d«      rm| j                  �K| j                  |«      \  }}|dk  rHt        j                  d|j                  d   |j                  d   «       y t        j                  d	«       y | j                   j                  |d
gd g«      }	|	�N| j                   j                  |	d   j                  d   «      €#| j                   j                  |	d   dgdg«      €y |rWt        d«      D ]I  }
| j                   j                  ||
|«      }|€Œ#|j                  d
k(  sŒ3t        j                  d|
«        y  | j                   j                  |j                   d   «      d u}|xs( t        | j                   j#                  ||«      «      dkD  }|j                   }|r|j%                  |j                   d   g«       |j                   d   g}|r!|j%                  dd|j                   d   g«       | j                   j'                  ||g|||«      �r�| j                  j%                  ||g«       d|z
  }|s:|j                  |   |j                  |   |j                  d   |j                  d   gn+|j                  |   |j                  |   |j                  d   g}t)        j*                  | j,                  ||| j                   j/                  | j,                  d¬«      ¬«      }d|_        |j2                  D ].  }|j4                  dk(  sŒ|j2                  j%                  |g«       Œ0 t        |j2                  «      dk(  r0|j2                  j%                  t)        j6                  dd«      g«       | j8                  j;                  |«       | j<                  | j>                  |j4                  <   y y )Nr   ÚAddr   ÚSimplifiedLayerNormalizationr
   Fr!   zUskip SkipLayerNormalization fusion since shapes of inputs (%s, %s) are not compatiblezHskip SkipLayerNormalization fusion since symbolic shape inference failedÚGatherÚConstantOfShapez]skip SkipLayerNormalization broadcast fusion since Add input %d comes from Gather (embedding)Ú ÚSkipLayerNorm)Úname_prefix©ÚinputsÚoutputsÚnameúcom.microsoftÚepsilonçê-�™—q=) r   Ú
get_parentÚop_typer   r)   Úget_initializerÚnodes_to_removeÚhasattrr!   r-   r"   ÚdebugÚmatch_parent_pathÚfind_graph_inputÚrangeÚfind_graph_outputÚoutputÚget_childrenÚextendÚis_safe_to_fuse_nodesr   Ú	make_noder   Úcreate_node_nameÚdomainÚ	attributer9   Úmake_attributeÚnodes_to_addÚappendÚthis_graph_nameÚnode_name_to_graph_name)r$   ÚnodeÚinput_name_to_nodesÚoutput_name_to_noder*   Ú	add_inputÚ
simplifiedÚ
skip_indexÚ
_broadcastÚgather_pathÚiÚparentÚadd_has_graph_outputÚ#residual_add_has_multiple_consumersÚoutputs_to_keepr8   Úinput_indexr7   Únormalize_nodeÚatts                       r   Úfusez!FusionSkipLayerNormalization.fuseL   s  € Ø�j‰j×#Ñ# D¨!Ð-@ÓAˆð ˆ;˜#Ÿ+™+¨Ò.Øô ˆs�y‰y‹>˜QÒØàŸ™ò 	ˆIØ�z‰z×)Ñ)¨)Ó4Ñ@Ùð	ð
 �$×&Ñ&Ñ&Øð —\‘\Ð%CÑCˆ
àˆ
Øˆ
ä�4Ð-Ô.Ø×&Ñ&Ð2Ø)-×)<Ñ)<¸SÓ)AÑ&�
˜JØ ’>Ü—L‘LØoØŸ	™	 !™ØŸ	™	 !™ôð
 ä—‘ÐgÔhØà—j‘j×2Ñ2°3¸¸
ÀTÀFÓKˆØÐ" t§z¡z×'BÑ'BÀ;ÈqÁ>×CWÑCWÐXYÑCZÓ'[Ð'cØ�z‰z×+Ñ+¨K¸©NÐ=NÐ<OÐRSÐQTÓUÐ]Øñ
 Ü˜1“Xò �ØŸ™×.Ñ.¨s°AÐ7JÓK�ØÑ%¨&¯.©.¸HÓ*DÜ—L‘LØwØôñ ðð  $Ÿz™z×;Ñ;¸C¿J¹JÀq¹MÓJÐRVÐVÐà Ò^¤C¨¯
©
×(?Ñ(?ÀÐEXÓ(YÓ$ZÐ]^Ñ$^ð 	,ð Ÿ+™+ˆá.Ø×"Ñ" C§J¡J¨q¡M ?Ô3à—;‘;˜q‘>Ð"ˆñ /Ø�N‰N˜B  C§J¡J¨q¡MÐ2Ô3à�:‰:×+Ñ+¨S°$¨K¸ÐJ]Ð_rÕsØ× Ñ ×'Ñ'¨¨d¨Ô4à˜j™.ˆKñ "ð —‘˜;Ñ'¨¯©°:Ñ)>ÀÇ
Á
È1ÁÈtÏzÉzÐZ[É}Ñ]à—i‘i Ñ,¨c¯i©i¸
Ñ.CÀTÇZÁZÐPQÁ]ÐSð ô
 $×-Ñ-Ø×"Ñ"ØØØ—Z‘Z×0Ñ0°×1CÑ1CÐQ`Ð0Óaô	ˆNð %4ˆNÔ!ð —~‘~ò ;�Ø—8‘8˜yÓ(Ø"×,Ñ,×3Ñ3°S°EÕ:ð;ô
 �>×+Ñ+Ó,°Ò1Ø×(Ñ(×/Ñ/´×1FÑ1FÀyÐRYÓ1ZÐ0[Ô\à×Ñ×$Ñ$ ^Ô4Ø@D×@TÑ@TˆD×(Ñ(¨×)<Ñ)<Ò=ð7 tr   )ÚSkipLayerNormalizationÚLayerNormalizationT)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚstrÚboolr   r-   rd   Ú__classcell__©r%   s   @r   r   r      sO   ø„ ñð 6Ø3Ø ñOàðOð ðOð ð	Oð
 õOòö0iUr   r   c                   ó*   ‡ — e Zd Zdefˆ fd„Zd„ Zˆ xZS )Ú FusionBiasSkipLayerNormalizationr   c                 ó*   •— t         ‰| �  |ddd«       y )Nre   zadd bias)r   r   )r$   r   r%   s     €r   r   z)FusionBiasSkipLayerNormalization.__init__¹   s   ø€ Ü‰Ñ˜Ð 8Ð:RÐT^Õ_r   c           	      ó®  — t        |j                  «      dk7  ry g }| j                  j                  |ddgd d g||«      }|�|\  }}n/g }| j                  j                  |g d¢g d¢||«      }|�|\  }}}ny t        |«      dk(  st        |«      dk(  sJ ‚|d   }	|	dk\  ry |j                  |d	      }
|j                  d	|d	   z
     }|j                  d	|	z
     }| j                  j	                  |«      }|€y t        j                  |«      }|€t        j                  d
«       y t        |j                  «      d	k7  rt        j                  d«       y ||g}| j                  j                  ||j                  ||«      st        j                  d«       y | j                  j                  |«       |
||j                  d   |j                  d   |g}t        j                  d||j                  | j                  j!                  dd«      ¬«      }d|_        |j$                  D ].  }|j&                  dk(  sŒ|j$                  j                  |g«       Œ0 t        |j$                  «      dk(  r0|j$                  j                  t        j(                  dd«      g«       | j*                  j-                  |«       | j.                  | j0                  |j&                  <   y )Nr   r/   ÚMatMul)r/   ÚCastrs   )NNNr   r	   r   r
   zBias weight not foundzBias weight is not 1DzASkip fusing SkipLayerNormalization with Bias since it is not safere   ÚSkipLayerNorm_AddBias_r6   r:   r;   r<   )r   r)   r   rC   r?   r   Úto_arrayr"   rB   ÚshaperJ   rG   r@   rI   r   rK   rL   rM   rN   r9   rO   rP   rQ   rR   rS   )r$   rT   rU   rV   Úreturn_indiceÚnodesr*   Ú_matmulÚ_castÚadd_input_indexÚ	sln_inputÚ
bias_inputÚ
skip_inputÚinitializerÚbias_weightÚsubgraph_nodesr7   Únew_noderc   s                      r   rd   z%FusionBiasSkipLayerNormalization.fuse¼   s¸  € Üˆt�z‰z‹?˜aÒØàˆØ—
‘
×,Ñ,¨T°E¸8Ð3DÀtÈTÀlÐTgÐivÓwˆØÐØ"‰NˆS‘'ð ˆMØ—J‘J×0Ñ0ØÒ/Ò1CÐEXÐZgóˆEð Ð Ø(-Ñ%��e™Wàä�=Ó! QÒ&¬#¨mÓ*<ÀÒ*AÐAÐAØ'¨Ñ*ˆØ˜aÒØØ—I‘I˜m¨AÑ.Ñ/ˆ	Ø—Y‘Y˜q =°Ñ#3Ñ3Ñ4ˆ
Ø—Z‘Z  OÑ 3Ñ4ˆ
ð —j‘j×0Ñ0°Ó<ˆØÐØÜ!×*Ñ*¨;Ó7ˆØÐÜ�L‰LÐ0Ô1ØÜˆ{× Ñ Ó! QÒ&Ü�L‰LÐ0Ô1Øà ˜ˆØ�z‰z×/Ñ/°ÀÇÁÐM`ÐbuÔvÜ�L‰LÐ\Ô]Øà×Ñ×#Ñ# NÔ3àØØ�J‰J�q‰MØ�J‰J�q‰MØð
ˆô ×#Ñ#Ø$ØØ—K‘KØ—‘×,Ñ,Ð-EÐG_Ó`ô	
ˆð *ˆŒð —>‘>ò 	1ˆCØ�x‰x˜9Ó$Ø×"Ñ"×)Ñ)¨3¨%Õ0ð	1ô
 ˆx×!Ñ!Ó" aÒ'Ø×Ñ×%Ñ%¤v×'<Ñ'<¸YÈÓ'PÐ&QÔRà×Ñ× Ñ  Ô*Ø6:×6JÑ6Jˆ×$Ñ$ X§]¡]Ò3r   )rg   rh   ri   r   r   rd   rm   rn   s   @r   rp   rp   ¸   s   ø„ ð`˜iõ `öFKr   rp   N)Úloggingr   Úfusion_baser   Úfusion_utilsr   Úonnxr   Ú
onnx_modelr   rg   r"   r   r   rp   © r   r   ú<module>rŠ      sF   ðõ å Ý $Ý Ý  á	�8Ó	€òôWU 6ô WUôtJK võ JKr   