o
    ٷi)                     @   sX   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 )    )	getLoggerN)Fusion)TensorProtohelper)	OnnxModelc                       s6   e Zd Zd	def fddZdedefddZ  ZS )
FusionGroupNormTmodelc                    s   t  |dd || _d S )N	GroupNormAdd)super__init__channels_last)selfr   r   	__class__ ^/home/ubuntu/.local/lib/python3.10/site-packages/onnxruntime/transformers/fusion_group_norm.pyr      s   
zFusionGroupNorm.__init__input_name_to_nodesoutput_name_to_nodec           #      C   s  | j |g dg d|}|du rdS |\}}}}|jd }	| j |dgdg|}
|
du r/dS |
d jd |	kr:dS |
d }| j |d}d}|dur^| j |dgdg|}|dur^|d }|jd| j |jd |  }| j |d	d
swdS |jd| j |jd |  }| j |d	dsdS | j |}|du rdS t|j	d	kr|j	d dkr|j	d dksdS | j |}|du rdS t|j	d	kr|j	d dkr|j	d dksdS t
t|j	}t
t|j	}||krdS | j |jd }|du st|j	dkrdS t
|j	d }| j |jd }|du s |j	|j	kr"dS tt||s.dS tt||s:dS | j jddd}| j|d tj|g|d | j|d tj|g|d |}||||||g}|oj|}|rz|rz|||g |}| j ||j||s| j|g n| j| d| _|	}|jd }| jr|d n|}| jr|d n|}| jrtjd|g|g| j jdddg dd} | j|  | j| j| j< tjd||d |d g|g|d}!|!j |j  |!j t!d|g |!j t!d|rdndg | js|!j t!ddg d|!_"| j|! | j| j|!j< | jrOtjd|g|g| j jdddg dd}"| j|" | j| j|"j< dS 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.
        )MulReshapeInstanceNormalizationr   )r   r   r   r   Nr   Shape   r   Sigmoid   zgroup norm weightzlayernorm bias   r	   )name_prefix_gamma)name	data_typedimsvals_betaT_NHWC	TransposeTranspose_NCHW_to_NHWC)r   r   r   r   )r   perm)inputsoutputsr   groups
activationr   zcom.microsoftTranspose_NHWC_to_NCHW)r   r   r   r   )#r   match_parent_pathinputfind_first_child_by_typeinput_indexoutput$is_constant_with_specified_dimensionget_constant_valuelenshapeintnpprodallclose	ones_like
zeros_likecreate_node_nameadd_initializerr   FLOATextendis_safe_to_fuse_nodesnodes_to_removeprune_graphr   r   	make_nodenodes_to_addappendthis_graph_namenode_name_to_graph_namer   	attributemake_attributedomain)#r   add_noder   r   nodes
weight_mul
reshape_4dinstance_norm
reshape_3drootparents
shape_node	swish_mulswish_sigmoidsigmoid_pathweight_input
bias_inputweightbiasweight_elementsbias_elementsinstance_norm_scale
num_groupsinstance_norm_biasgroup_norm_name	last_nodesubgraph_nodeshas_swish_activation
input_nameoutput_namegroup_norm_input_namegroup_norm_output_nametranspose_inputnew_nodetranspose_outputr   r   r   fuse   s   
**

 zFusionGroupNorm.fuse)T)__name__
__module____qualname__r   r   dictrk   __classcell__r   r   r   r   r      s    r   )loggingr   numpyr7   fusion_baser   onnxr   r   
onnx_modelr   rl   loggerr   r   r   r   r   <module>   s   