
    fPi)                     t    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e          ZdS )    )	getLoggerN)Fusion)TensorProtohelper)	OnnxModelc                   6     e Zd Zddef fdZdedefdZ xZS )FusionGroupNormTmodelc                 \    t                                          |dd           || _        d S )N	GroupNormAdd)super__init__channels_last)selfr
   r   	__class__s      ~/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/onnxruntime/transformers/fusion_group_norm.pyr   zFusionGroupNorm.__init__   s-    U333*    input_name_to_nodesoutput_name_to_nodec           	         | j                             |g dg d|          }|dS |\  }}}}|j        d         }	| j                             |dgdg|          }
|
dS |
d         j        d         |	k    rdS |
d         }| j                             |d          }d}|)| j                             |dgdg|          }||d         }|j        d| j                             |j        d         |          z
           }| j                             |d	d
          sdS |j        d| j                             |j        d         |          z
           }| j                             |d	d          sdS | j                             |          }|dS t          |j	                  d	k    r"|j	        d         dk    r|j	        d         dk    sdS | j                             |          }|dS t          |j	                  d	k    r"|j	        d         dk    r|j	        d         dk    sdS t          t          j        |j	                            }t          t          j        |j	                            }||k    rdS | j                             |j        d                   }|t          |j	                  dk    rdS t          |j	        d                   }| j                             |j        d                   }||j	        |j	        k    rdS t          j        t          j        |          |          sdS t          j        t          j        |          |          sdS | j                             dd          }|                     |dz   t$          j        |g|           |                     |dz   t$          j        |g|           |}||||||g}|o|}|r|r|                    ||g           |}| j                             ||j        ||          s| j                            |g           n| j                            |           d| _        |	}|j        d         }| j        r|dz   n|}| j        r|dz   n|}| j        ret3          j        d|g|g| j                             dd          g d          } | j                            |            | j        | j        | j        <   t3          j        d||dz   |dz   g|g|          }!|!j                             |j                    |!j                             t3          j!        d|          g           |!j                             t3          j!        d|rdnd          g           | j        s.|!j                             t3          j!        dd          g           d|!_"        | j                            |!           | j        | j        |!j        <   | j        rgt3          j        d|g|g| j                             dd          g 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_outputs#                                      r   fusezFusionGroupNorm.fuse   s    
,,LLLlll\o
 
 =F<A9
Jz"*..zG9qcK^__?F1:A$&&FQZ
 J77%HH	 :77	I;QUPVXkllL' ,Q!'DJ,B,B:CTUVCWYc,d,d(dez>>|QPcdd 	F^A
(>(>z?PQR?SU](^(^$^_
z>>z1N^__ 	F..|<<>FFL!!Q&&6<?a+?+?FLQROWXDXDXFz,,Z88<FDJ1$$A!););
1QR@R@RFbgfl3344BGDJ//00m++F"j;;M<OPQ<RSS&#.A.G*H*HA*M*MF,21566
!Z::=;Nq;QRR%)<)BFYF_)_)_F{2<(;<<>QRR 	F{2=);<<>PQQ 	F*55k{5[[ 8+!'!"	 	 	
 	
 	
 	 7*!'	 	 	
 	
 	
 	"J
M:Wab(:] 	" 	"!!9m"<===!Iz//	
 
 	8  ''4444 ''777  
&q)8<8J Z
W 4 4PZ:>:L!]w!6!6R]  		V$.&'Z00Jb0cc!\\  O $$_555AEAUD()=>#)?X+EY`G`a+, 	
 
 
 	!!-"9:::!!6#8:#N#N"OPPP!!6#8L`Ggqqfg#h#h"ijjj! 	S%%v'<_a'P'P&QRRR)  ***6:6J$X]3  		W%/'(Z00Jb0cc!\\      $$%5666BFBVD()9)>???		W 		Wr   )T)__name__
__module____qualname__r   r   dictrn   __classcell__)r   s   @r   r	   r	      s        + +i + + + + + +`W$ `WT `W `W `W `W `W `W `W `Wr   r	   )loggingr   numpyr:   fusion_baser   onnxr   r   
onnx_modelr   ro   loggerr	    r   r   <module>r{      s   
                 $ $ $ $ $ $ $ $            	8		eW eW eW eW eWf eW eW eW eW eWr   