o
    toi                     @  sL   d dl mZ d dlZd dlmZ dd Zdd Zdd	 ZG d
d deZ	dS )    )annotationsN)OpRunc                   sh   t j t jd} fddtt D }dgt  } |  || < t  |  |}||t|< |S )Ndtypec                   s   g | ]	}t d  | qS r   )slice.0ishape b/home/ubuntu/.local/lib/python3.10/site-packages/onnx/reference/ops_optimized/op_conv_optimized.py
<listcomp>   s    z_make_ind.<locals>.<listcomp>   )npemptyint64rangelenarangereshapetuple)dimr   mind	new_shapefirstr   r   r   	_make_ind   s   r   c                   sd  t | | jd d \}}t|}g }t|D ]"\}}	| jd|  }
||
|  |    |	 ||  d  qg }tt |D ]'}t||}t||||  }t|	 |
dd|
dd }|| qCtt||
dd}dgd } fddt D }tj| t|t| dd}td	||g|R }|| }tj|dd
}|t|fS )N   r   )r   r   c                   s    g | ]}| |   fqS r   r   r   n_dimspadsr   r   r   )   s     zim2col_fast.<locals>.<listcomp>constant)moder   )axis)r   r   r   prod	enumerateappendr   r   tileravelr   repeatr   padr   r   concatenate)Xkernel_shaper#   stridesr   n_Ckernel_size	shape_outr
   r   dxindiceskindiindindexdncpaddingX_paddedgetitemcols	conc_colsr   r!   r   im2col_fast   s*   
0
$
rA   c	           (      C  s  |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 }t|}| j d |j d | ksV|j d | dkrtd| j  d	|j  d
| d|j d | j d | t|j dd  | j d  | f d	|dkrg }	d}
|j d | }|j d }t| j d D ]}t|D ]|}| ||d || |d | f }||| |d |  }zt||d ||d|||	}W n: ttfy } z+td| j  d	|j  d
| d| d|j  d|j  d| d| d| d| d| d|d }~ww |dkr|
|j d 7 }
|	||f qq| j d gt	|	d d j dd  }|
|d< tj
t||	d d jd}d}|	D ]'\}}||||d |||j d  f< ||j d 7 }||j d krrd}qL|d urdd |j D }|j d |d< |t|}||7 }|S |d dkst|t|kr/t|}g }t	|j d |  }t|D ]2\}}t|j | | }||j | |j | d |d    ||| || d |d    qtj
t||jd}td|j d td|j d g}t|D ]\}}t|j | | }|td|j | | q
||t|< |}|}|dv rg }g }tt| j d D ]@}| j | }|||  d ||  }|d ||  ||  | } |dkrn| d d }!n| d }!| |! }"||! ||" qA|| }t| |||\}#}$|d|#j d f}%|%|# }&|&|j d | j d g|$R }&ddgttt| j d d R }'|&|'}&|d ur|jdkr|&| S dgt|&j  }d|d< |&|t|7 }&|&S )Nc                 S     g | ]}d qS r   r   r	   sr   r   r   r   6       z/_conv_implementation_im2col.<locals>.<listcomp>r   c                 S  rB   r   r   rD   r   r   r   r   :   rF   c                 S  rB   rC   r   rD   r   r   r   r   <   rF   r   r   zShape inconsistencies, X.shape=z
, W.shape=z, group=z, W should be ./z, gx.shape=z, gw.shape=z, auto_pad=z, dilations=z, kernel_shape=z, pads=z
, strides=r   c                 S  rB   rC   r   rD   r   r   r   r   o   rF   >   VALID
SAME_LOWER
SAME_UPPERrJ   r    )r   r   
ValueErrorr   r'   r   _conv_implementation_im2colRuntimeErrorr)   listzerosr   r   minmaxr   r(   r   rA   r   	transposesize)(r/   WBauto_pad	dilationsgroupr0   r#   r1   restdmgdwbggxgwcver   finalpndnew_kernel_shaper
   r:   dinew_wr6   headtailtarget_size
pad_neededpad_headpad_tailc2	out_shape
w_reshapedmulpermr   r   r   rM   2   s   *6

$
&"
 && 



 &

rM   c                   @  s$   e Zd Z							dddZdS )ConvNc
           
   
   C  sB   t |jdk rtd|j dt|||||||||		|jfS )N   z3X must have at least 3 dimensions but its shape is rG   )r   r   rL   rM   astyper   )
selfr/   rU   rV   rW   rX   rY   r0   r#   r1   r   r   r   _run   s   z	Conv._run)NNNNNNN)__name__
__module____qualname__ry   r   r   r   r   ru      s    ru   )

__future__r   numpyr   onnx.reference.op_runr   r   rA   rM   ru   r   r   r   r   <module>   s   
u