o
    g!                     @   sh   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	m
Z
 d dlmZ eeZG dd deZd	S )
    )	getLogger)List)Fusion)FusionUtils)helpernumpy_helper)	OnnxModelc                       sH   e Zd ZdZddef fddZddedee fd	d
Z	dd Z
  ZS )FusionNhwcConvzConvert Conv to NhwcConvFmodelc                    s(   t  |ddgd || _t|| _d S )NNhwcConvConv)super__init__update_weightr   fusion_utils)selfr
   r   	__class__ `/var/www/visachat/venv/lib/python3.10/site-packages/onnxruntime/transformers/fusion_nhwc_conv.pyr      s   zFusionNhwcConv.__init__N
input_namepermc                 C   sT   | j d}|du r|d d | }tjd|g|g|d}|jtd|g |S )z&Append a Transpose node after an input	TransposeN_out-inputsoutputsnamer   )r
   create_node_namer   	make_node	attributeextendmake_attribute)r   r   r   output_name	node_nametranspose_noder   r   r   create_transpose_node   s   z$FusionNhwcConv.create_transpose_nodec                 C   s  |  |jd g d}|jd }| jd}| j|jd }|d u r%d S t|}t|j	dkr3d S | j
|}	|	d urB|j|	ksQ| jj||j|d}
|
jd }| jrp|dddd}|d	 }| j||jt|j	|d
 d }n|  |jd g d}|jd }|d d |jd  }tjd||g|jdd   |g|d |j d}|j|j d|_|  |jd g d|jd }| j| |||g}|r|| |D ]	}| j| j|j< q| j| | d d S )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_dtyper/   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_nodesr-   input_transpose_nodenhwc_conv_inputr%   weight_tensorweightdtype	cast_nodeweight_nameweight_transpose_nodenhwc_output_name	nhwc_convoutput_transpose_noderB   noder   r   r   fuse%   s^   





zFusionNhwcConv.fuse)F)N)__name__
__module____qualname____doc__r   r   strr   intr'   rR   __classcell__r   r   r   r   r	      s
    r	   N)loggingr   typingr   fusion_baser   r   r   onnxr   r   
onnx_modelr   rS   loggerr	   r   r   r   r   <module>   s   