§
    kŠtjA*  ã                   ó–   — 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dS )é    )Ú	getLogger)ÚFusion)ÚNumpyHelper)Úhelper)Ú	OnnxModelc                 ó$  — t          | ¦  «        dk    rdS t          |¦  «        dk    r0|d         dk    o#|d         | d         k    o|d         | d         k    S t          |¦  «        dk    r$|d         | d         k    o|d         | d         k    S dS )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     úk/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/onnxruntime/transformers/fusion_skiplayernorm.pyÚ_is_broadcast_skipr      s    € õ
 ˆ;ÑÔ˜1ÒÐØˆuÝ
ˆ:�„˜!ÒÐØ˜!Œ} Ò!Ði j°¤m°{À1´~Ò&EÐiÈ*ÐUVÌ-Ð[fÐghÔ[iÒJiÐiÝ
ˆ:�„˜!ÒÐØ˜!Œ} ¨A¤Ò.ÐR°:¸a´=ÀKÐPQÄNÒ3RÐRØˆ5ó    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.
    Ú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        €r   r!   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ð /Ð.r   c                 ó(  — | j                              |j        d         ¦  «        }| j                              |j        d         ¦  «        }|�|€dS ||k    rt          |¦  «        dk    rdndS t	          ||¦  «        rdS t	          ||¦  «        rdS dS )	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
   N)éÿÿÿÿ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ÔFˆØÔ)×8Ò8¸¼À1¼ÑFÔFˆØˆ?˜g˜oØ�9à�gÒÐÝ!$ W¡¤°Ò!2Ð!2�:�:¸ÐCõ ˜g wÑ/Ô/ð 	Ø�7å˜g wÑ/Ô/ð 	Ø�7àˆyr   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    }d}d}t          | d¦  «        rv| j        �S|  	                    |¦  «        \  }}|dk     r4t                               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 |rYt          d¦  «        D ]I}
| j                              ||
|¦  «        }|�)|j        d
k    rt                               d|
¦  «          d S ŒJ| 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|||¦  «        �rd| j                             ||g¦  «         d|z
  }|s2|j        |         |j        |         |j        d         |j        d         gn%|j        |         |j        |         |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   Ú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Ú	attributer;   Ú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_keepr:   Úinput_indexr9   Únormalize_nodeÚatts                       r   Úfusez!FusionSkipLayerNormalization.fuseL   sw  € ØŒj×#Ò# D¨!Ð-@ÑAÔAˆð ˆ;˜#œ+¨Ò.Ð.ØˆFõ ˆsŒy‰>Œ>˜QÒÐØˆFàœð 	ð 	ˆIØŒz×)Ò)¨)Ñ4Ô4Ð@Ø��ð Að �$Ô&Ð&Ð&ØˆFð ”\Ð%CÒCˆ
àˆ
Øˆ
å�4Ð-Ñ.Ô.ð 	ØÔ&Ð2Ø)-×)<Ò)<¸SÑ)AÔ)AÑ&�
˜JØ ’>�>Ý—L’LØoØœ	 !œØœ	 !œñô ð ð
 �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Ð]Ø�ð
 ð 	Ý˜1‘X”Xð ð �Øœ×.Ò.¨s°AÐ7JÑKÔK�ØÐ%¨&¬.¸HÒ*DÐ*DÝ—L’LØwØñô ð ð �F�Føð  $œ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à˜j™.ˆKð "ðT�”˜;Ô'¨¬°:Ô)>ÀÄ
È1ÄÈtÌzÐZ[Ì}Ð]Ð]à”i Ô,¨c¬i¸
Ô.CÀTÄZÐPQÄ]ÐSð õ
 $Ô-ØÔ"ØØØ”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Ô(¨Ô)<Ñ=Ð=Ð=ð7	Uð 	Ur   )r   r   T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚstrÚboolr!   r/   rf   Ú__classcell__©r'   s   @r   r   r      s´   ø€ € € € € ðð ð 6Ø3Ø ðOð OàðOð ðOð ð	Oð
 ðOð Oð Oð Oð Oð Oðð ð ð0iUð iUð iUð iUð iUð iUð i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   r1   ÚMatMul)r1   ÚCastrs   )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_r8   r<   r=   r>   )r   r+   r   rE   rA   r   Úto_arrayr$   rD   ÚshaperL   rI   rB   rK   r   rM   rN   rO   rP   r;   rQ   rR   rS   rT   rU   )r&   rV   rW   rX   Úreturn_indiceÚnodesr,   Ú_matmulÚ_castÚadd_input_indexÚ	sln_inputÚ
bias_inputÚ
skip_inputÚinitializerÚbias_weightÚsubgraph_nodesr9   Únew_nodere   s                      r   rf   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   )rg   rh   ri   r   r!   rf   rm   rn   s   @r   rp   rp   ¸   sh   ø€ € € € € ð`˜ið `ð `ð `ð `ð `ð `ðFKð FKð FKð FKð FKð FKð FKr   rp   N)Úloggingr   Úfusion_baser   Úfusion_utilsr   Úonnxr   Ú
onnx_modelr   rg   r$   r   r   rp   © r   r   ú<module>rŠ      s  ðð Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  à	ˆ�8Ñ	Ô	€ðð ð ðWUð WUð WUð WUð WU 6ñ WUô WUð WUðtJKð JKð JKð JKð JK vñ JKô JKð JKð JKð JKr   