
    Bvh	                     j    d dl mZ d dlm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y)	    )	getLogger)Fusion)FusionUtils)helpernumpy_helper)	OnnxModelc                   H     e Zd ZdZddef fdZd	dedee   fdZ	d Z
 xZS )
FusionNhwcConvzConvert Conv to NhwcConvmodelc                 Z    t         |   |ddgd       || _        t        |      | _        y )NNhwcConvConv)super__init__update_weightr   fusion_utils)selfr   r   	__class__s      S/RAG/venv/lib/python3.12/site-packages/onnxruntime/transformers/fusion_nhwc_conv.pyr   zFusionNhwcConv.__init__   s-    
VHjA*'.    
input_namepermc                     | j                   j                  d      }||dz   dz   |z   }t        j                  d|g|g|      }|j                  j                  t        j                  d|      g       |S )z&Append a Transpose node after an input	Transpose_out-inputsoutputsnamer   )r   create_node_namer   	make_node	attributeextendmake_attribute)r   r   r   output_name	node_nametranspose_nodes         r   create_transpose_nodez$FusionNhwcConv.create_transpose_node   sw    JJ//<	#f,s2Z?K))+zlU`Tahqr  '')>)>vt)L(MNr   c                    | j                  |j                  d   g d      }|j                  d   }| j                  j	                  d      }| j                  j                  |j                  d         }|y t        j                  |      }t        |j                        dk7  ry | j                  j                  |      }	|	|j                  |	k(  s7| j                  j                  ||j                  |      }
|
j                  d   }| j                  rN|j                  dddd      }|d	z   }| j!                  ||j                  t#        |j                        |
       d }n0| j                  |j                  d   g d      }|j                  d   }|dz   dz   |j                  d   z   }t%        j&                  d||g|j                  dd  z   |g|dz   |j(                  z         }|j*                  j-                  |j*                         d|_        | j                  |j                  d   g d|j                  d         }| j0                  j3                  |       |||g}|r|j3                  |       |D ]%  }| j4                  | j6                  |j(                  <   ' | j8                  j-                  |       | j;                  d       y )Nr   )r            r   r-      )r   to_typeoutput_name_to_noder+   r,   _weight_NHWC)r    	data_typedimsvalsr   r   r   zcom.microsoft)r   r,   r-   r+   )r)   inputoutputr   r!   get_initializerr   to_arraylenshape	get_dtyper2   r   add_cast_noder   	transposeadd_initializerlistr   r"   r    r#   r$   domainnodes_to_removeappendthis_graph_namenode_name_to_graph_namenodes_to_addincrease_counter)r   convinput_name_to_nodesr0   input_transpose_nodenhwc_conv_inputr'   weight_tensorweightdtype	cast_nodeweight_nameweight_transpose_nodenhwc_output_name	nhwc_convoutput_transpose_noderE   nodes                     r   fusezFusionNhwcConv.fuse$   s   #99$**Q-V.55a8 JJ//
;	 

224::a=A &&}5v||!

$$_5!m&=&=&F))77*%//$7 8 I
 (..q1O%%aAq1F#n4K   '11&,,'	 !  %)!$($>$>tzz!}l$[!/66q9K$v-3dkk!nD$$#[1DJJqrNB%&S499,	
	 	""4>>2*	 $ : :9;K;KA;NP\^b^i^ijk^l m##D),i9NO  56 D6:6J6JD((3 !  .j)r   )F)N)__name__
__module____qualname____doc__r   r   strr?   intr)   rU   __classcell__)r   s   @r   r
   r
      s.    "/i /

 
49 
?*r   r
   N)loggingr   fusion_baser   r   r   onnxr   r   
onnx_modelr   rV   loggerr
    r   r   <module>rc      s.      $ %  	8	S*V S*r   