o
    g"                     @   sh   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 deZG dd	 d	eZd
S )    )	getLogger)Fusion)NumpyHelper)helper)	OnnxModelc                	       sB   e Zd ZdZ			ddedededef fd	d
Zdd Z  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                    sL   t  ||| |r"| jjddddd| _| jd u r$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__ d/var/www/visachat/venv/lib/python3.10/site-packages/onnxruntime/transformers/fusion_skiplayernorm.pyr      s   
z%FusionSkipLayerNormalization.__init__c                 C   s  | j |d|}|d u s|jdkrd S t|jdkrd S |jD ]}| j |d ur, d S q|| jv r4d S |jdk}t| dr| jd ur| j	|jd rdt| j	|jd dkrdt
d|jd  d S | j|jd |jd st
d	|jd |jd  d S nt
d
 d S | j |dgd g}|d ur| j |d jd d u r| j |d dgdgd u rd S | j |jd d u}|pt| j ||dk}	|j}
|	r|
|jd g |jd g}|	r|dd|jd g | j ||g|
||rm| j||g |s|jd |jd |jd |jd gn|jd |jd |jd g}tj| j||| j j| jddd}d|_|jD ]}|jdkrI|j|g q:t|jdkr^|jt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attr   r   r   fuse%   s   





"(
z!FusionSkipLayerNormalization.fuse)r   r	   T)
__name__
__module____qualname____doc__r   strboolr   rU   __classcell__r   r   r   r   r      s    r   c                       s*   e Zd Zdef fddZdd Z  ZS ) FusionBiasSkipLayerNormalizationr
   c                    s   t  |ddd d S )Nr   zadd bias)r   r   )r   r
   r   r   r   r      s   z)FusionBiasSkipLayerNormalization.__init__c                 C   s  t |jdkr	d S g }| j|ddgd d g||}|d ur"|\}}ng }| j|g dg d||}|d ur<|\}}}nd S t |dksLt |dksLJ |d }	|	dkrVd S |j|d	  }
|jd	|d	   }|jd	|	  }| j|}|d u ryd S t|}|d u rtd
 d S t |j	d	krtd d S ||g}| j
||j||std d S | j| |
||jd |jd |g}tjd||j| jddd}d|_|jD ]}|jdkr|j|g qt |jdkr|jtddg | j| | j| j|j< d S )Nr   r   MatMul)r   Castr^   )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,   r-   r.   )r1   r2   r
   r9   r3   r   to_arrayr   r7   shaper?   r<   r4   r>   r   r@   rA   rB   rC   r+   rD   rE   rF   rG   rH   )r   rI   rJ   rK   return_indicenodesrL   _matmul_castadd_input_index	sln_input
bias_input
skip_inputinitializerbias_weightsubgraph_nodesr)   new_noderT   r   r   r   rU      sp   






z%FusionBiasSkipLayerNormalization.fuse)rV   rW   rX   r   r   rU   r\   r   r   r   r   r]      s    r]   N)loggingr   fusion_baser   fusion_utilsr   onnxr   
onnx_modelr   rV   r   r   r]   r   r   r   r   <module>   s   w