o
    )wi	                     @   s\   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)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__ f/home/ubuntu/sommelier/.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_noderA   noder   r   r   fuse$   s^   





zFusionNhwcConv.fuse)F)N)__name__
__module____qualname____doc__r   r   strr;   intr&   rQ   __classcell__r   r   r   r   r      s
    r   N)loggingr   fusion_baser   r   r   onnxr   r   
onnx_modelr   rR   loggerr   r   r   r   r   <module>   s   