§
    ¹¯ÅjÐ#  ã                   ó�   — 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 G d„ de¦  «        Z G d„ d	e¦  «        Zd
S )é    )Ú	getLogger)ÚFusion)ÚNumpyHelper)Úhelper)Ú	OnnxModelc            	       óB   ‡ — e Zd ZdZ	 	 	 ddedededefˆ fd	„Zd
„ Zˆ xZ	S )ÚFusionSkipLayerNormalizationz¡
    Fuse Add + LayerNormalization into one node: SkipLayerNormalization
    Note: This fusion does not check the input shape of Add and LayerNormalization.
    ÚSkipLayerNormalizationÚLayerNormalizationTÚmodelÚfused_op_typeÚsearch_op_typesÚshape_inferc                 óä   •— t          ¦   «                              |||¦  «         |rG| j                             dddœd¬¦  «        | _        | j        €t
                               d¦  «         d S d S d S )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        €ú^C:\Projects\Historical\venv\Lib\site-packages\onnxruntime/transformers/fusion_skiplayernorm.pyr   z%FusionSkipLayerNormalization.__init__   sˆ   ø€ õ 	‰Œ×Ò˜ ¨Ñ?Ô?Ð?Øð 	Oà&*¤j×&DÒ&DÐTUÐbcÐEdÐEdÐmqÐ&DÑ&rÔ&rˆDÔ#ØÔ&Ð.å—’ÐMÑNÔNÐNÐNÐNð	Oð 	Oð /Ð.ó    c           	      óˆ  — | j                              |d|¦  «        }|�|j        dk    rd S t          |j        ¦  «        dk    rd S |j        D ]}| j                              |¦  «        � d S Œ || j        v rd S |j        dk    }t          | d¦  «        �r| j        �é| j         	                    |j        d         ¦  «        r^t          | j         	                    |j        d         ¦  «        ¦  «        dk    r(t                               d|j        d         ¦  «         d S | j                             |j        d         |j        d         ¦  «        s4t                               d	|j        d         |j        d         ¦  «         d S nt                               d
¦  «         d S | j                              |dgd g¦  «        }|�Q| j                              |d         j        d         ¦  «        €&| j                              |d         dgdg¦  «        €d S | j                              |j        d         ¦  «        d u}|p+t          | j                              ||¦  «        ¦  «        dk    }	|j        }
|	r!|
                     |j        d         g¦  «         |j        d         g}|	r#|                     dd|j        d         g¦  «         | j                              ||g|
||¦  «        �r_| j                             ||g¦  «         |s2|j        d         |j        d         |j        d         |j        d         gn%|j        d         |j        d         |j        d         g}t)          j        | j        ||| j                              | j        d¬¦  «        ¬¦  «        }d|_        |j        D ](}|j        dk    r|j                             |g¦  «         Œ)t          |j        ¦  «        dk    r.|j                             t)          j        dd¦  «        g¦  «         | j                             |¦  «         | j        | j        |j        <   d S d S )Nr   ÚAddé   ÚSimplifiedLayerNormalizationr   é   zDskip SkipLayerNormalization fusion since shape of input %s is not 3Dé   zNskip SkipLayerNormalization fusion since shape of inputs (%s, %s) are not samezHskip SkipLayerNormalization fusion since symbolic shape inference failedÚGatherÚConstantOfShapeÚ ÚSkipLayerNorm)Úname_prefix©ÚinputsÚoutputsÚnameúcom.microsoftÚepsilonçê-�™—q=) r   Ú
get_parentÚop_typeÚlenÚinputÚget_initializerÚnodes_to_removeÚhasattrr   Úget_edge_shaper   ÚdebugÚcompare_shapeÚmatch_parent_pathÚfind_graph_inputÚfind_graph_outputÚoutputÚget_childrenÚextendÚis_safe_to_fuse_nodesr   Ú	make_noder   Úcreate_node_nameÚdomainÚ	attributer.   Úmake_attributeÚnodes_to_addÚappendÚthis_graph_nameÚnode_name_to_graph_name)r   ÚnodeÚinput_name_to_nodesÚoutput_name_to_nodeÚaddÚ	add_inputÚ
simplifiedÚgather_pathÚadd_has_graph_outputÚ#residual_add_has_multiple_consumersÚoutputs_to_keepr-   r,   Únormalize_nodeÚatts                  r   Úfusez!FusionSkipLayerNormalization.fuse%   sd  € ØŒj×#Ò# D¨!Ð-@ÑAÔAˆð ˆ;˜#œ+¨Ò.Ð.ØˆFõ ˆsŒy‰>Œ>˜QÒÐØˆFàœð 	ð 	ˆIØŒz×)Ò)¨)Ñ4Ô4Ð@Ø��ð Að �$Ô&Ð&Ð&ØˆFð ”\Ð%CÒCˆ
å�4Ð-Ñ.Ô.ñ 	ØÔ&Ð2àÔ+×:Ò:¸3¼9ÀQ¼<ÑHÔHðå˜DÔ3×BÒBÀ3Ä9ÈQÄ<ÑPÔPÑQÔQÐUVÒVÐVå—L’LÐ!gÐilÔirÐstÔiuÑvÔvÐvØ�Fð Ô.×<Ò<¸S¼YÀq¼\È3Ì9ÐUVÌ<ÑXÔXð Ý—L’LØhØœ	 !œØœ	 !œñô ð ð
 �Fðõ —’ÐgÑhÔhÐhØ�à”j×2Ò2°3¸¸
ÀTÀFÑKÔKˆØÐ" t¤z×'BÒ'BÀ;ÈqÄ>ÔCWÐXYÔCZÑ'[Ô'[Ð'cØŒz×+Ò+¨K¸¬NÐ=NÐ<OÐRSÐQTÑUÔUÐ]Ø�ð  $œz×;Ò;¸C¼JÀq¼MÑJÔJÐRVÐVÐà Ð^¥C¨¬
×(?Ò(?ÀÐEXÑ(YÔ(YÑ$ZÔ$ZÐ]^Ò$^ð 	,ð œ+ˆà.ð 	4Ø×"Ò" C¤J¨q¤M ?Ñ3Ô3Ð3à”;˜q”>Ð"ˆð /ð 	4Ø�NŠN˜B  C¤J¨q¤MÐ2Ñ3Ô3Ð3àŒ:×+Ò+¨S°$¨K¸ÐJ]Ð_rÑsÔsñ 	UØÔ ×'Ò'¨¨d¨Ñ4Ô4Ð4ð "ðA�”˜1”˜sœy¨œ|¨T¬Z¸¬]¸D¼JÀq¼MÐJÐJà”i ”l C¤I¨a¤L°$´*¸Q´-Ð@ð õ
 $Ô-ØÔ"ØØØ”Z×0Ò0°Ô1CÐQ`Ð0ÑaÔað	ñ ô ˆNð %4ˆNÔ!ð ”~ð ;ð ;�Ø”8˜yÒ(Ð(Ø"Ô,×3Ò3°S°EÑ:Ô:Ð:øõ �>Ô+Ñ,Ô,°Ò1Ð1ØÔ(×/Ò/µÔ1FÀyÐRYÑ1ZÔ1ZÐ0[Ñ\Ô\Ð\àÔ×$Ò$ ^Ñ4Ô4Ð4Ø@DÔ@TˆDÔ(¨Ô)<Ñ=Ð=Ð=ð5	Uð 	Ur   )r
   r   T)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚstrÚboolr   rX   Ú__classcell__©r   s   @r   r	   r	      s¥   ø€ € € € € ðð ð 6Ø3Ø ðOð OàðOð ðOð ð	Oð
 ðOð Oð Oð Oð Oð Oð_Uð _Uð _Uð _Uð _Uð _Uð _Ur   r	   c                   ó*   ‡ — e Zd Zdefˆ fd„Zd„ Zˆ xZS )Ú FusionBiasSkipLayerNormalizationr   c                 óP   •— t          ¦   «                              |ddd¦  «         d S )Nr
   zadd bias)r   r   )r   r   r   s     €r   r   z)FusionBiasSkipLayerNormalization.__init__ˆ   s*   ø€ Ý‰Œ×Ò˜Ð 8Ð:RÐT^Ñ_Ô_Ð_Ð_Ð_r   c           	      óŽ  — t          |j        ¦  «        dk    rd S g }| j                             |ddgd d g||¦  «        }|�|\  }}n/g }| j                             |g d¢g d¢||¦  «        }|�|\  }}}nd S t          |¦  «        dk    st          |¦  «        dk    sJ ‚|d         }	|	dk    rd S |j        |d	                  }
|j        d	|d	         z
           }|j        d	|	z
           }| j                             |¦  «        }|€d S t          j        |¦  «        }|€t                               d
¦  «         d S t          |j	        ¦  «        d	k    rt                               d¦  «         d S ||g}| j         
                    ||j        ||¦  «        st                               d¦  «         d S | j                             |¦  «         |
||j        d         |j        d         |g}t          j        d||j        | j                             dd¦  «        ¬¦  «        }d|_        |j        D ](}|j        dk    r|j                             |g¦  «         Œ)t          |j        ¦  «        dk    r.|j                             t          j        dd¦  «        g¦  «         | j                             |¦  «         | j        | j        |j        <   d S )Nr   r!   ÚMatMul)r!   ÚCastre   )NNNr"   r$   r   r%   zBias weight not foundzBias weight is not 1DzASkip fusing SkipLayerNormalization with Bias since it is not safer
   ÚSkipLayerNorm_AddBias_r+   r/   r0   r1   )r4   r5   r   r<   r6   r   Úto_arrayr   r:   ÚshaperB   r?   r7   rA   r   rC   rD   rE   rF   r.   rG   rH   rI   rJ   rK   )r   rL   rM   rN   Úreturn_indiceÚnodesrO   Ú_matmulÚ_castÚadd_input_indexÚ	sln_inputÚ
bias_inputÚ
skip_inputÚinitializerÚbias_weightÚsubgraph_nodesr,   Únew_noderW   s                      r   rX   z%FusionBiasSkipLayerNormalization.fuse‹   s  € ÝˆtŒz‰?Œ?˜aÒÐØˆFàˆØ”
×,Ò,¨T°E¸8Ð3DÀtÈTÀlÐTgÐivÑwÔwˆØÐØ"‰NˆS�'�'ð ˆMØ”J×0Ò0ØÐ/Ð/Ð/Ð1CÐ1CÐ1CÐEXÐZgñô ˆEð Ð Ø(-Ñ%��e˜W˜Wà�å�=Ñ!Ô! QÒ&Ð&­#¨mÑ*<Ô*<ÀÒ*AÐ*AÐ*AÐAØ'¨Ô*ˆØ˜aÒÐØˆFØ”I˜m¨AÔ.Ô/ˆ	Ø”Y˜q =°Ô#3Ñ3Ô4ˆ
Ø”Z  OÑ 3Ô4ˆ
ð ”j×0Ò0°Ñ<Ô<ˆØÐØˆFÝ!Ô*¨;Ñ7Ô7ˆØÐÝ�LŠLÐ0Ñ1Ô1Ð1ØˆFÝˆ{Ô Ñ!Ô! QÒ&Ð&Ý�LŠLÐ0Ñ1Ô1Ð1ØˆFà ˜ˆØŒz×/Ò/°ÀÄÐM`ÐbuÑvÔvð 	Ý�LŠLÐ\Ñ]Ô]Ð]ØˆFàÔ×#Ò# NÑ3Ô3Ð3àØØŒJ�qŒMØŒJ�qŒMØð
ˆõ Ô#Ø$ØØ”KØ”×,Ò,Ð-EÐG_Ñ`Ô`ð	
ñ 
ô 
ˆð *ˆŒð ”>ð 	1ð 	1ˆCØŒx˜9Ò$Ð$ØÔ"×)Ò)¨3¨%Ñ0Ô0Ð0øõ ˆxÔ!Ñ"Ô" aÒ'Ð'ØÔ×%Ò%¥vÔ'<¸YÈÑ'PÔ'PÐ&QÑRÔRÐRàÔ× Ò  Ñ*Ô*Ð*Ø6:Ô6JˆÔ$ X¤]Ñ3Ð3Ð3r   )rY   rZ   r[   r   r   rX   r_   r`   s   @r   rb   rb   ‡   sh   ø€ € € € € ð`˜ið `ð `ð `ð `ð `ð `ðFKð FKð FKð FKð FKð FKð FKr   rb   N)Úloggingr   Úfusion_baser   Úfusion_utilsr   Úonnxr   Ú
onnx_modelr   rY   r   r	   rb   © r   r   ú<module>r|      só   ðð Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  à	ˆ�8Ñ	Ô	€ðtUð tUð tUð tUð tU 6ñ tUô tUð tUðnJKð JKð JKð JKð JK vñ JKô JKð JKð JKð JKr   