U
    T?h!                     @   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                       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 || _t|| _d S )NNhwcConvZConv)super__init__update_weightr   fusion_utils)selfr
   r   	__class__ [/var/www/html/venv/lib/python3.8/site-packages/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
|}	|	d k	r|j|	ks| jj||j|d}
|
jd }| jr|dddd}|d }| j||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}|r|| |D ]}| j| j|j< q| j| | d d S )Nr            r      )r   Zto_typeoutput_name_to_nodeZ_weight_NHWC)r   	data_typeZdimsvalsr   r   r   zcom.microsoft)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_noder1   noder   r   r   fuse%   s^    



"

zFusionNhwcConv.fuse)F)N)__name__
__module____qualname____doc__r   r   strr   intr"   r5   __classcell__r   r   r   r   r	      s   r	   N)loggingr   typingr   Zfusion_baser   r   r   Zonnxr   r   Z
onnx_modelr   r6   loggerr	   r   r   r   r   <module>   s   