
     Ng"                         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        i/var/www/html/ai-engine/env/lib/python3.11/site-packages/onnxruntime/transformers/fusion_skiplayernorm.pyr   z%FusionSkipLayerNormalization.__init__   s     	??? 	O&*j&D&DTUbcEdEdmq&D&r&rD#&.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 sy>>QF 	 	Iz)))44@ A $&&&F \%CC
4-.. 	&2+::39Q<HHD3BB39Q<PPQQUVVVLL!gilirstiuvvvF .<<SYq\39UV<XX LLh	!	!  
 F ghhhj223
TFKK"tz'B'B;q>CWXYCZ'['['cz++KN=N<ORSQTUU]  $z;;CJqMJJRVV ^C
(?(?EX(Y(Y$Z$Z]^$^ 	, +. 	4""CJqM?333;q>" / 	4NNBCJqM2333:++S$KJ]_rss 	U ''d444 "A1sy|TZ]DJqMJJilCIaL$*Q-@ 
 $-"Z001CQ`0aa	  N %4N! ~ ; ;8y((",33SE::: >+,,11(//1FyRY1Z1Z0[\\\$$^444@D@TD()<===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:RT^_____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   tz??aF
,,TE83DtTlTgivww"NS'' MJ00///1C1C1CEXZg E  (-%eWW=!!Q&&#m*<*<*A*A*A*A'*aFImA./	Yq=#334
ZO 34
 j00<<F!*;77LL0111F{ !!Q&&LL0111Fz//M`buvv 	LL\]]]F##N333JqMJqM
 #$K,,-EG_``	
 
 
 * > 	1 	1Cx9$$"))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   