U
    qhg                     @  s@   d dl mZ d dlZd dlmZ d dlmZ G dd deZdS )    )annotationsN)OpRun)col2im_naive_implementationc                	   @  s   e Zd ZdddZdS )ConvTransposeNc           $        s8  d kr dd  j dd  D d kr6|j dd  d krZdd  j dd  D d d krzdd  j dd  D d kr|dkrdd tdt D d krd kr҇ fddttD  fd	dttD }g }g }ttD ]j}|d
krF||| d  ||| || d   n,||| || d   ||| d  q
|| td nVt j d tfddtD d kr fddtD |j dd  t}|j d | }|| | } j d }|}t j dd  }|| }||||f}d }|dkr,t j d D ]}|d j}t	| | ||f}||d|j d f}t|D ]t}t
|| }|d krtj j d d |f |j   jd}|d k	r||| 7 }|d |||df< qqjnt j d |f}g }t|D ]}  d d | | | | d | | df }!|| | | | d | | df }"| j|!|"||dd}#t|#d }#||# qPt j d D ]<}t|D ],} ||  }#|#|df ||| | d df< qq| jfS )Nc                 S  s   g | ]}d qS     .0sr   r   H/tmp/pip-unpacked-wheel-xnis5xre/onnx/reference/ops/op_conv_transpose.py
<listcomp>   s     z&ConvTranspose._run.<locals>.<listcomp>   c                 S  s   g | ]}d qS r   r   r	   r   r   r   r       s     c                 S  s   g | ]}d qS r   r   r	   r   r   r   r   "   s     >   
SAME_UPPER
SAME_LOWERc                 S  s   g | ]}d qS r   r   r
   ir   r   r   r   $   s     c                   s"   g | ]} j |d   |  qS )r   shaper   )Xstridesr   r   r   '   s    c                   sN   g | ]F}|  j |d   d  |  | d |  d  |  qS )r   r   r   r   )r   	dilationskernel_shapeoutput_paddingoutput_shaper   r   r   r   *   s   r   c                   s    g | ]}| |   fqS r   r   r   )n_dimspadsr   r   r   >   s     c                   sZ   g | ]R}|  j |d   d  |  | d |  d  |ddf   qS )r   r   N)r   sumr   )r   r   r   new_padsr   r   r   r   r   @   s   r   r   )dtype.)	Bauto_padr   groupr   r   r   r   r   )r   rangelenappendnparrayprodZreshapeTmatmulr   emptyr!   zeros_runZastype)$selfr   Wr"   r#   r   r$   r   r   r   r   r   Ztotal_paddingZpads_1Zpads_2r   Zkernel_sizeZnum_output_channelsZ
kernel_dimCmnkZ
w_reshapedfinalZimage_idZw_tZgemmZgemmccresZoutput_arrayZgroup_idZgroup_XZgroup_WZgroup_outputr   )	r   r   r   r   r   r   r   r   r   r   r/      s    








     

*	zConvTranspose._run)	NNNNNNNNN)__name__
__module____qualname__r/   r   r   r   r   r      s            r   )	
__future__r   Znumpyr(   Zonnx.reference.op_runr   Zonnx.reference.ops.op_col2imr   r   r   r   r   r   <module>   s   