U
    h                     @   sr   d dl Z 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 )    N)Dict)Fusion)FusionSkipLayerNormalization)helper)	OnnxModelc                       s2   e Zd Zed fddZeedddZ  ZS )"FusionSimplifiedLayerNormalizationmodelc                    s   t  |dd d S )NSimplifiedLayerNormalizationMulsuper__init__selfr	   	__class__ X/tmp/pip-unpacked-wheel-socb9apf/onnxruntime/transformers/fusion_simplified_layernorm.pyr      s    z+FusionSimplifiedLayerNormalization.__init__)input_name_to_nodesoutput_name_to_nodec                 C   s  |j dkrd S d }| j|dddddddgdddddddg}| j|ddddddd	gdddddddg}| j|dddddddgdddddddg}| j|ddddddgddddddg}d
\}	}
|d k	r|}|d }	|d }
n~|d k	r|}|d }	|d }
n^|d k	r$|}|d }	|d }
n>|d k	r^|}|d }	|d }
|
jd | j krbd S nd S |||fkrtdnd}||k}| j|
ddkrd S |
jd }||d jd krd S | j|	\}}|d ks|dks|dkrtd|  d S | j	
|s|d d n| | j	| tjd||j| 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   ZDivZSqrtZAddZ
ReduceMeanZPow   r   ZGather)NN   g       @g-C6?zepsilon value is not expected: r
   Z	LayerNorm)Zname_prefix)inputsoutputsnameepsilonZaxisZ
stash_type)Zop_typer	   Zmatch_parent_pathinputZget_graphs_input_namesZfind_constant_inputZget_constant_inputloggerwarningZ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_nodesZsim_ln_nodes_1Zsim_ln_nodes_2Zsim_ln_nodes_3Zsim_ln_nodes_4add_nodeZpow_nodeZlayernorm_weight_indexZstarts_with_graph_inputZ
root_inputiZ
add_weightZnormalize_noder   r   r   fuse   s    








z'FusionSimplifiedLayerNormalization.fuse)__name__
__module____qualname__r   r   r   r*   __classcell__r   r   r   r   r      s   r   c                       s.   e Zd Zed fddZ fddZ  ZS )&FusionSkipSimplifiedLayerNormalizationr   c                    s   t  |dd d S )NZ SkipSimplifiedLayerNormalizationr
   r   r   r   r   r   r      s    z/FusionSkipSimplifiedLayerNormalization.__init__c                    s   t  ||| d S )N)r   r*   )r   r'   r   r   r   r   r   r*      s    z+FusionSkipSimplifiedLayerNormalization.fuse)r+   r,   r-   r   r   r*   r.   r   r   r   r   r/      s   r/   )loggingtypingr   Zfusion_baser   Zfusion_skiplayernormr   Zonnxr   Z
onnx_modelr   	getLoggerr+   r    r   r/   r   r   r   r   <module>   s   
|