U
    qh`                     @  s<   d dl mZ d dlZd dlmZ dd ZG dd deZdS )    )annotationsN)OpRunc           0      C  s  |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rd}|d krd}| j d d \}}|j d }|j dd  }||j d | ks|| dkrtd| j  d	|j  d
| d|j d ||  }}|| dkr$td|| }|t| t| |j d krltd|j  d| d| d|||f|t|f|}|d krt||t| f|}|||f||}ddlm} t| j dkr^| j dd  \}}|j dd  \}}|\}}|
\}}|\}}|d | d |d | d  }}|t	|| |	d  |	d  | d ks|t	|| |	d  |	d  | d krt
d|	d  |	d   }} tj||||f| jd}!|d k	r|d|!d d d d d d d d f< ttd||td||\}"}#tj|#|"fdd}$t|D ]"}%t|D ]}&t|D ]}'|'| |&| krlqP|'| }(t|D ]})|||)  }*t|D ]}+| ||+  },t|$t}-|-d d d d df  |*||%|(d d d d d|)|+f  7  < |-d d d d df  |,||%|(d d d d d|)|+f  7  < |-d d d d df |d  d d |-d d d d df< |-d d d d df |d  d d |-d d d d df< t|-d}-t|-d}-|j| |%|%d |'|'d f |-dd}.t|.||&|'| d d d d f }/t|/||%|(d d d d |)|+f }/|!|%|&|)|+f  t|/7  < qq|qPqBq4|!S t
d| j  d	|j  d| dd S )Nc                 S  s   g | ]}d qS     .0sr   r   E/tmp/pip-unpacked-wheel-xnis5xre/onnx/reference/ops/op_deform_conv.py
<listcomp>   s     z/_deform_conv_implementation.<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     r   r   zShape inconsistencies, X.shape=z
, W.shape=z, group=.z;Number of input channels must be divisible by offset_group.zOffset shape z# is inconsistent with offset_group z and kernel shape )
GridSample      zKPadding, dilation, stride, and kernel shape incompatible with output shape.)dtype)r   r   r   )Zaxis)Zalign_cornerszThe convolution for X.shape=z, kernel_shape=z is not implemented yet.)shape
ValueErrornpprodlenZreshapeZonesZonnx.reference.ops._op_listr   intRuntimeErrorzerosr   ZmeshgridZarangestackrangecopyZastypefloatZexpand_dimsZflipevalmultiplysum)0XWoffsetBmask	dilationsgroupkernel_shapeoffset_grouppadsstridesnZicocZoutput_shapeZics_per_groupZocs_per_groupZics_per_offset_groupr   ZihiwZohZowZkhkwZsthZstwZdhZdwZkh_newZkw_newZbhZbwresZkernel_pos_wZkernel_pos_hZkernel_pos_wrt_first_elemZ	batch_idxZoc_idxZic_idxZoffset_group_idxiZh_coordjZw_coordkernelZgrid_sample_outputZ
conv_valuer   r   r
   _deform_conv_implementation   s    
"
".
&  88 2r6   c                   @  s   e Zd ZdddZdS )
DeformConvNc                 C  s>   t |jdk r td|j dt|||||||||	|
|fS )Nr   z3X must have at least 3 dimensions but its shape is r   )r   r   r   r6   )selfr#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r   r   r
   _run   s$    zDeformConv._run)NNNNNNNN)__name__
__module____qualname__r9   r   r   r   r
   r7      s           r7   )
__future__r   Znumpyr   Zonnx.reference.op_runr   r6   r7   r   r   r   r
   <module>   s
    