o
    ٷi                     @   sf   d dl 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 )
    N)Fusion)FusionSkipLayerNormalization)helper)	OnnxModelc                       s4   e Zd Zdef fddZdedefddZ  ZS )"FusionSimplifiedLayerNormalizationmodelc                       t  |dd d S )NSimplifiedLayerNormalizationMulsuper__init__selfr   	__class__ h/home/ubuntu/.local/lib/python3.10/site-packages/onnxruntime/transformers/fusion_simplified_layernorm.pyr         z+FusionSimplifiedLayerNormalization.__init__input_name_to_nodesoutput_name_to_nodec                 C   s  |j dkrd S d }g }| jj|g dg d||d}|r/|\}}}}	}
| j|ds,d S |}n?g }| jj|g dg d||d}|d urN|\}}}}	}
|}n g }| jj|g dg d	||d}|d url|\}}}	}
|}nd S | j|
d
|}|d u s|j dvrd S |j dkr| j|ddkrd S n|j dksJ |d
 |d krd S |jd
 }||jvrd S | j|	\}}|d u s|d
ks|dkrt	d|  d S | j
|
d}|sd S | j
|
d}|st|
jdkr| j|
jd }|rt|dkrd S | j| | j| | j| tjd||jd|d
   g|jd
 g| jjdddd}|jtdt|g |jtd|d
 g |jtddg | j| | j| j|j< d S )Nr
   )r
   DivSqrtAdd
ReduceMean)N   r   r   N)r   return_indiceg      ?)r
   
Reciprocalr   r   r   )Nr   r   r   N)r   r   r   r   )Nr   r   Nr   )Powr
   r   g       @r   g-C6?zepsilon value is not expected: keepdimsaxesr	   RMSNorm)name_prefix)inputsoutputsnameepsilonaxis
stash_type)op_typer   match_parent_pathhas_constant_input
get_parentfind_constant_inputinputget_constant_inputloggerwarningget_node_attributelenget_constant_valuenodes_to_removeextendappendr   	make_nodeoutputcreate_node_name	attributemake_attributefloatnodes_to_addthis_graph_namenode_name_to_graph_namer%   )r   noder   r   sim_ln_nodesr   mul_nodediv_node
_sqrt_nodeadd_nodereduce_mean_nodenode_parent_reciprocal_nodereduce_mean_parent
root_input_ir&   r   r    normalize_noder   r   r   fuse   s   




z'FusionSimplifiedLayerNormalization.fuse)__name__
__module____qualname__r   r   dictrN   __classcell__r   r   r   r   r      s    r   c                       s.   e Zd Zdef fddZ fddZ  ZS )&FusionSkipSimplifiedLayerNormalizationr   c                    r   )N SkipSimplifiedLayerNormalizationr	   r   r   r   r   r   r      r   z/FusionSkipSimplifiedLayerNormalization.__init__c                    s   t  ||| d S )N)r   rN   )r   rA   r   r   r   r   r   rN      r   z+FusionSkipSimplifiedLayerNormalization.fuse)rO   rP   rQ   r   r   rN   rS   r   r   r   r   rT      s    rT   )loggingfusion_baser   fusion_skiplayernormr   onnxr   
onnx_modelr   	getLoggerrO   r0   r   rT   r   r   r   r   <module>   s    
 