U
    qh5                     @  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 R/tmp/pip-unpacked-wheel-xnis5xre/onnx/reference/ops_optimized/op_conv_optimized.py
<listcomp>   s     z_make_ind.<locals>.<listcomp>   )npemptyZint64rangelenarangereshapetuple)dimr   mind	new_shapefirstr   r   r   	_make_ind   s    r   c                   sb  t | | jd d \}}t|}g }t|D ]D\}}	| jd|  }
||
|  |    |	 ||  d  q0g }tt |D ]N}t||}t||||  }t|	 |
dd|
dd }|| qtt||
dd}dgd } fddt D }tj| t|t| dd}td	||f|}|| }tj|dd
}|t|fS )N   r   )r   r   c                   s    g | ]}| |   fqS r   r   r   Zn_dimspadsr   r   r   )   s     zim2col_fast.<locals>.<listcomp>Zconstant)moder   )Zaxis)r   r   r   prod	enumerateappendr   r   ZtileZravelr   repeatr   padr   r   Zconcatenate)Xkernel_shaper!   stridesr   Zn_CZkernel_sizeZ	shape_outr
   r   ZdxindiceskindZiindindexdZncpaddingZX_paddedgetitemcolsZ	conc_colsr   r    r   im2col_fast   s*    
0
$
r2   c	           (      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 }t|}| j d |j d | ks|j d | dkrtd| j  d	|j  d
| d|j d | j d | t|j dd  | j d  | f d	|dkr>g }	d}
|j d | }|j d }t| j d D ]}t|D ]}| ||d || |d | f }||| |d |  }zt||d ||d|||	}W n~ ttfk
r* } zZtd| j  d	|j  d
| d| d|j  d|j  d| d| d| d| d| d|W 5 d }~X Y nX |dkrD|
|j d 7 }
|	||f qNq@| j d ft	|	d d j dd  }|
|d< tj
t||	d d jd}d}|	D ]N\}}||||d |||j d  f< ||j d 7 }||j d krd}q|d k	r:dd |j D }|j d |d< |t|}||7 }|S |d dks^t|t|krrt|}g }t	|j d |  }t|D ]d\}}t|j | | }||j | |j | d |d    ||| || d |d    qtj
t||jd}td|j d td|j d g}t|D ]4\}}t|j | | }|td|j | | q(||t|< |}|}|dkr g }g }tt| j d D ]}| j | }|||  d ||  }|d ||  ||  | } |dkr| d d }!n| d }!| |! }"||! ||" q|| }t| |||\}#}$|d|#j d f}%|%|# }&|&|j d | j d f|$}&dttt| j d d }'|&|'}&|d k	r|jdkr|&| S dgt|&j  }d|d< |&|t|7 }&|&S )Nc                 S  s   g | ]}d qS r   r   r	   sr   r   r   r   6   s     z/_conv_implementation_im2col.<locals>.<listcomp>r   c                 S  s   g | ]}d qS r   r   r4   r   r   r   r   :   s     c                 S  s   g | ]}d qS r3   r   r4   r   r   r   r   <   s     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  s   g | ]}d qS r3   r   r4   r   r   r   r   o   s     >   
SAME_LOWER
SAME_UPPERVALIDr8   r   )r   r   )r   r   
ValueErrorr   r#   r   _conv_implementation_im2colRuntimeErrorr%   listzerosr   r   minmaxr   r$   r   r2   r   Z	transposesize)(r(   WBauto_pad	dilationsgroupr)   r!   r*   restdZmgZdwbgZgxZgwZcver   finalpZndZnew_kernel_shaper
   r.   ZdiZnew_wr+   headtailZtarget_sizeZ
pad_neededZpad_headZpad_tailc2Z	out_shapeZ
w_reshapedmulpermr   r   r   r<   2   s    ,T

$N
&"
 && 



 

r<   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 r6   )r   r   r;   r<   Zastyper   )
selfr(   rC   rD   rE   rF   rG   r)   r!   r*   r   r   r   _run   s$            z	Conv._run)NNNNNNN)__name__
__module____qualname__rW   r   r   r   r   rT      s          rT   )

__future__r   Znumpyr   Zonnx.reference.op_runr   r   r2   r<   rT   r   r   r   r   <module>   s   
u