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__ n/home/kim/smarthome/.venv/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
   Z
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	   ZRMSNorm)Zname_prefix)ZinputsZoutputsnameepsilonZaxisZ
stash_type)Zop_typer   Zmatch_parent_pathZhas_constant_inputZ
get_parentZfind_constant_inputinputZget_constant_inputloggerwarningZget_node_attributelenZget_constant_valueZnodes_to_removeextendappendr   Z	make_nodeoutputZcreate_node_name	attributeZmake_attributefloatZnodes_to_addZthis_graph_nameZnode_name_to_graph_namer    )r   noder   r   Zsim_ln_nodesr   Zmul_nodeZdiv_nodeZ
_sqrt_nodeadd_nodeZreduce_mean_nodeZnode_parentZ_reciprocal_nodeZreduce_mean_parentZ
root_inputZ_ir!   r   r   Znormalize_noder   r   r   fuse   s   




z'FusionSimplifiedLayerNormalization.fuse)__name__
__module____qualname__r   r   dictr-   __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   )NZ SkipSimplifiedLayerNormalizationr	   r   r   r   r   r   r      r   z/FusionSkipSimplifiedLayerNormalization.__init__c                    s   t  ||| d S )N)r   r-   )r   r+   r   r   r   r   r   r-      r   z+FusionSkipSimplifiedLayerNormalization.fuse)r.   r/   r0   r   r   r-   r2   r   r   r   r   r3      s    r3   )loggingZfusion_baser   Zfusion_skiplayernormr   Zonnxr   Z
onnx_modelr   	getLoggerr.   r#   r   r3   r   r   r   r   <module>   s    
 