U
    hE                     @   s`   d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	 d dl
mZ eeZG dd deZdS )	    )	getLogger)List)Fusion)TensorProtohelpernumpy_helper)	OnnxModelc                       sF   e Zd ZdZded fddZdeee ddd	Z	d
d Z
  ZS )FusionNhwcConvzConvert Conv to NhwcConvF)modelc                    s   t  |ddgd || _d S )NNhwcConvZConv)super__init__update_weight)selfr
   r   	__class__ M/tmp/pip-unpacked-wheel-socb9apf/onnxruntime/transformers/fusion_nhwc_conv.pyr      s    zFusionNhwcConv.__init__N)
input_namepermc                 C   sT   | j d}|dkr$|d d | }tjd|g|g|d}|jtd|g |S )z&Append a Transpose node after an inputZ	TransposeN_out-inputs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 ddddg}|jd }| jd}| j|jd }|d krNd S t|}t|j	dkrjd S | j
r|dddd}|d }	| j|	tjt|j	|d d }
n$|  |jd ddddg}
|
jd }	|d	 d
 |jd  }tjd||	g|jdd   |g|d
 |j d}|j|j d|_|  |jd ddddg|jd }| j| |||g}|
rn||
 |D ]}| j| j|j< qr| j| | d d S )Nr            r      Z_weight_NHWC)r   Z	data_typeZdimsvalsr   r   r   zcom.microsoft)r!   inputoutputr
   r   Zget_initializerr   Zto_arraylenshaper   Z	transposeZadd_initializerr   FLOAT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_nodesZoutput_name_to_nodeZinput_transpose_nodeZnhwc_conv_inputr    Zweight_tensorZweightZweight_nameZweight_transpose_nodeZnhwc_output_nameZ	nhwc_convZoutput_transpose_noder/   noder   r   r   fuse#   sN    


"

zFusionNhwcConv.fuse)F)N)__name__
__module____qualname____doc__r   r   strr   intr!   r2   __classcell__r   r   r   r   r	      s   r	   N)loggingr   typingr   Zfusion_baser   Zonnxr   r   r   Z
onnx_modelr   r3   loggerr	   r   r   r   r   <module>   s   