o
    i"                     @   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      )Z
batch_sizeZseq_lenT)updatez,symbolic shape inference disabled or failed.)super__init__r
   Zinfer_runtime_shapeshape_infer_helperloggerwarning)selfr
   r   r   r   	__class__ g/home/kim/smarthome/.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   Z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 failedZGatherZConstantOfShape ZSkipLayerNorm)Zname_prefixinputsoutputsnamecom.microsoftepsilon-q=) r
   Z
get_parentZop_typeleninputget_initializernodes_to_removehasattrr   Zget_edge_shaper   debugZcompare_shapematch_parent_pathZfind_graph_inputZfind_graph_outputoutputZ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addZ	add_inputZ
simplifiedZgather_pathZadd_has_graph_outputZ#residual_add_has_multiple_consumersZoutputs_to_keepr"   r!   Znormalize_nodeattr   r   r   fuse%   s   





"(
z!FusionSkipLayerNormalization.fuse)r   r	   T)
__name__
__module____qualname____doc__r   strboolr   r?   __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   ZCastrH   )NNNr   r   r   r   zBias weight not foundzBias weight is not 1DzASkip fusing SkipLayerNormalization with Bias since it is not safer   ZSkipLayerNorm_AddBias_r    r$   r%   r&   )r'   r(   r
   r-   r)   r   Zto_arrayr   r,   shaper0   r.   r*   r/   r   r1   r2   r3   r4   r#   r5   r6   r7   r8   r9   )r   r:   r;   r<   Zreturn_indicenodesr=   Z_matmulZ_castZadd_input_indexZ	sln_inputZ
bias_inputZ
skip_inputZinitializerZbias_weightZsubgraph_nodesr!   new_noder>   r   r   r   r?      sp   






z%FusionBiasSkipLayerNormalization.fuse)r@   rA   rB   r   r   r?   rF   r   r   r   r   rG      s    rG   N)loggingr   Zfusion_baser   Zfusion_utilsr   Zonnxr   Z
onnx_modelr   r@   r   r   rG   r   r   r   r   <module>   s   w