o
    i	                     @   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NhwcConvZConv)super__init__update_weightr   fusion_utils)selfr	   r   	__class__ c/home/kim/smarthome/.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 inputZ	TransposeN_out-ZinputsZoutputsnamer   )r	   create_node_namer   	make_node	attributeextendZmake_attribute)r   r   r   Zoutput_name	node_nameZ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   Zto_typeoutput_name_to_noder    r!   Z_weight_NHWC)r   	data_typedimsvalsr   r   r   zcom.microsoft)r   r!   r"   r    )r   inputoutputr	   r   Zget_initializerr   Zto_arraylenshapeZ	get_dtyper%   r   Zadd_cast_noder   Z	transposeZadd_initializerlistr   r   r   r   r   domainZnodes_to_removeappendZthis_graph_nameZnode_name_to_graph_namenodes_to_addZincrease_counter)r   convZinput_name_to_nodesr$   Zinput_transpose_nodeZnhwc_conv_inputr   Zweight_tensorweightZdtypeZ	cast_nodeZweight_nameZweight_transpose_nodeZnhwc_output_nameZ	nhwc_convZoutput_transpose_noder/   noder   r   r   fuse$   s^   





zFusionNhwcConv.fuse)F)N)__name__
__module____qualname____doc__r   r   strr,   intr   r3   __classcell__r   r   r   r   r      s
    r   N)loggingr   Zfusion_baser   r   r   Zonnxr   r   Z
onnx_modelr   r4   loggerr   r   r   r   r   <module>   s   