o
    toiE                     @  sH   d dl mZ d dlZd dlmZ d dlmZ dd ZG dd deZ	dS )	    )annotationsN)OpRun)op_grid_samplec           /      C  sr  |d u rdd | j dd  D }|d u r|j dd  }|	d u r-dd | j dd  D d }	|
d u r=dd | j dd  D }
|d u rCd}|d u rId}| j d d \}}|j d }|j dd  }||j d | ksm|| dkr}td| j  d	|j  d
| d|j d || }}|| dkrtd|| }|t| t| |j d krtd|j  d| d| d|||g|t||R }|d u rt||t| g|R }|||g||R }t| j dkr| j dd  \}}|j dd  \}}|\}}|
\}}|\}}|d | d |d | d }}|t|| |	d  |	d  | d ksD|t|| |	d  |	d  | d krHtd|	d  |	d  }}tj	||||f| j
d} |d urw|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rq|&| }'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},tjj| |$|$d |&|&d f |,dd}-t|-||%|&| d d d d f }.t|.||$|'d d d d |(|*f }.| |$|%|(|*f  t|.7  < qŐqqqq| S td| j  d	|j  d| d)Nc                 S     g | ]}d qS     .0sr   r   U/home/ubuntu/.local/lib/python3.10/site-packages/onnx/reference/ops/op_deform_conv.py
<listcomp>       z/_deform_conv_implementation.<locals>.<listcomp>   c                 S  r   )r   r   r	   r   r   r   r      r   c                 S  r   r   r   r	   r   r   r   r      r   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       zKPadding, dilation, stride, and kernel shape incompatible with output shape.)dtype)r   r   r   )axis)align_cornerszThe convolution for X.shape=z, kernel_shape=z is not implemented yet.)shape
ValueErrornpprodlenreshapeonesintRuntimeErrorzerosr   meshgridarangestackrangecopyastypefloatexpand_dimsflipr   
GridSampleevalmultiplysum)/XWoffsetBmask	dilationsgroupkernel_shapeoffset_grouppadsstridesnicocoutput_shapeics_per_groupocs_per_groupics_per_offset_groupihiwohowkhkwsthstwdhdwkh_newkw_newbhbwreskernel_pos_wkernel_pos_hkernel_pos_wrt_first_elem	batch_idxoc_idxic_idxoffset_group_idxih_coordjw_coordkernelgrid_sample_output
conv_valuer   r   r   _deform_conv_implementation   s   
 ".
&88"2r^   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   r^   )selfr/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r   r   r   _run   s$   zDeformConv._run)NNNNNNNN)__name__
__module____qualname__ra   r   r   r   r   r_      s    r_   )

__future__r   numpyr   onnx.reference.op_runr   onnx.reference.opsr   r^   r_   r   r   r   r   <module>   s    