U
    T?h  ã                   @   sd   d dl mZ d dlmZ d dlZd dlmZ d dlm	Z	m
Z
 d dlmZ eeƒZG dd„ deƒZdS )	é    )Ú	getLogger)ÚDictN)ÚFusion)ÚTensorProtoÚhelper)Ú	OnnxModelc                       s4   e Zd Zdedœ‡ fdd„Zeedœdd„Z‡  ZS )	ÚFusionGroupNormT)Úmodelc                    s   t ƒ  |dd¡ || _d S )NÚ	GroupNormÚAdd)ÚsuperÚ__init__Úchannels_last)Úselfr	   r   ©Ú	__class__© ú\/var/www/html/venv/lib/python3.8/site-packages/onnxruntime/transformers/fusion_group_norm.pyr      s    zFusionGroupNorm.__init__)Úinput_name_to_nodesÚoutput_name_to_nodec           "   	   C   s´  | j  |ddddgddddg|¡}|dkr.dS |\}}}}|jd }	| j  |dgdg|¡}
|
dkrfdS |
d jd |	kr|dS |
d }| j  |d¡}d}|dk	rÄ| j  |dgdg|¡}|dk	rÄ|d }|jd| j  |jd |¡  }| j  |d	d
¡södS |jd| j  |jd |¡  }| j  |d	d¡s*dS | j  |¡}|dkrDdS t|j	ƒd	krt|j	d dkrt|j	d dksxdS | j  |¡}|dkr’dS t|j	ƒd	krÂ|j	d dkrÂ|j	d dksÆdS t
t |j	¡ƒ}t
t |j	¡ƒ}||krôdS | j  |jd ¡}|dks t|j	ƒdkr$dS | j  |jd ¡}|dksN|j	|j	krRdS t t |¡|¡sjdS t t |¡|¡s‚dS | j jddd}| j|d tj|g|d | j|d tj|g|d |}||||||g}|oâ|}|r|r| ||g¡ |}| j  ||j||¡s(| j |g¡ n| j |¡ d| _|	}|jd }| jrX|d n|}| jrl|d n|}| jr¾tjd|g|g| j jdddddd	dgd}| j |¡ | j| j|j< tjd||d |d g|g|d} | j  |j ¡ | j  t !dd¡g¡ | j  t !d|rdnd¡g¡ | jsB| j  t !dd¡g¡ d| _"| j | ¡ | j| j| j< | jr°tjd|g|g| j jddddd	ddgd}!| j |!¡ | j| j|!j< dS )a‚  
         Fuse Group Normalization subgraph into one node GroupNorm.
         The following is the pattern with swish activation:
               +----------------Shape-------------------------------+
               |                                                    |
               |    (0, 32, -1)                                     v     (512x1x1) (512x1x1) (optional)
           [Root] --> Reshape -------> InstanceNormalization --> Reshape ---> Mul --> Add --> Mul--> [output]
        Bx512xHxW                 (scale=ones(32), B=zeros(32))                        |       ^     Bx512xHxW
                                                                                       |       |
                                                                                       +--->Sigmoid (optional)
        The Mul and Sigmoid before output is for Swish activation. They are optional.
        ZMulZReshapeZInstanceNormalizationr   NZShapeé   ZSigmoidé   zgroup norm weightzlayernorm biasé   r
   )Zname_prefixZ_gamma)ÚnameZ	data_typeZdimsÚvalsZ_betaTZ_NHWCZ	TransposeZTranspose_NCHW_to_NHWC)r   Úperm)ÚinputsÚoutputsr   Úgroupsé    Z
activationr   zcom.microsoftZTranspose_NHWC_to_NCHW)#r	   Zmatch_parent_pathÚinputZfind_first_child_by_typeZinput_indexÚoutputZ$is_constant_with_specified_dimensionZget_constant_valueÚlenÚshapeÚintÚnpÚprodZallcloseZ	ones_likeZ
zeros_likeZcreate_node_nameZadd_initializerr   ÚFLOATÚextendZis_safe_to_fuse_nodesZnodes_to_removeZprune_graphr   r   Z	make_nodeZnodes_to_addÚappendZthis_graph_nameZnode_name_to_graph_namer   Ú	attributeZmake_attributeÚdomain)"r   Úadd_noder   r   ZnodesZ
weight_mulZ
reshape_4dZinstance_normZ
reshape_3dÚrootÚparentsZ
shape_nodeZ	swish_mulZswish_sigmoidZsigmoid_pathZweight_inputZ
bias_inputÚweightZbiasZweight_elementsZbias_elementsZinstance_norm_scaleZinstance_norm_biasZgroup_norm_nameZ	last_nodeZsubgraph_nodesZhas_swish_activationZ
input_nameZoutput_nameZgroup_norm_input_nameZgroup_norm_output_nameZtranspose_inputÚnew_nodeZtranspose_outputr   r   r   Úfuse   sì     
 
 ÿ

0
0
üü
ü

ûü 
ûzFusionGroupNorm.fuse)T)Ú__name__Ú
__module__Ú__qualname__r   r   r   r1   Ú__classcell__r   r   r   r   r      s   r   )Úloggingr   Útypingr   Únumpyr%   Zfusion_baser   Zonnxr   r   Z
onnx_modelr   r2   Úloggerr   r   r   r   r   Ú<module>   s   