U
    qh}                     @  sd   d dl mZ d dlZd dlmZ d dlmZmZ dd Z	dd Z
d	d
 Zdd ZG dd deZdS )    )annotationsN)OpRun)_get_indices_is_outc                 C  s  |\}}|\}}	|\}
}|\}}t | j}|dkrN| jd dkrN| jd dksz|dkrr| jd dkrr| jd dksztdt | jdkrdnd}| j|d  }||	|  dkrtd| d| d	| j|d  }||dd d f   |
|d   d | d }||dd d f   ||	d   d | d }||| krtd
| d| d| j d| d| d| d| d| dd| d| d||  d| d		|dkr|dkstd
| d| d| j d| d| d| d| d| d| d| dd S )N   r         zmExpected 2D or 3D (batch mode) tensor for input with possibly 0 batch size and non-zero dimensions for input.zjExpected size of input's dimension 1 to be divisible by the product of kernel_size, but got input.size(1)=z and kernel_size=.zGiven batch_dim=z, n_input_plane=
, X.shape=, output_shape=, kernel_shape=, dilations=, pads=
, strides=zI, expected size of input's dimension 2 to match the calculated number of zsliding blocks z *  = , but got input.size(2)=z6, calculated shape of the array of sliding blocks as (z, z%), which is too small (non-positive).)lenshape
ValueErrorsum)Xoutput_shapekernel_shape	dilationspadsstridesoutput_heightoutput_widthZkernel_heightZkernel_widthZdilation_heightZdilation_widthZstride_heightZstride_widthndimZ	batch_dimn_input_planeinput_lengthZn_blocks_heightZn_blocks_width r"   @/tmp/pip-unpacked-wheel-xnis5xre/onnx/reference/ops/op_col2im.py_col2im_shape_check_2d   s\    
&&6 	Br$   c           "        s  t d  t fddt D }t| ||||| |  }tj|| jd }|\}	}
|	|
 }|\}}|\}}|d d df \}}|\}}|\}}||dd d f 	  ||	d  d  | d }||dd d f 	  ||
d  d  | d }t|D ]}||
 }||
 |	 }||	|
  }t|D ]}|| | ||  }t|D ]}|| | ||  }d|  kr|k rRn nzd|  kr|k rRn n^|| | | | } || | | | }!d|!  kr|j
d k rRn n||   ||! 7  < qRq2q||S )Nr   c                   s    g | ]}| |   fqS r"   r"   .0in_dimsr   r"   r#   
<listcomp>G   s     z3_col2im_naive_implementation_2d.<locals>.<listcomp>dtyper   r   )r   nparrayranger$   Zravelzerosr,   flattenr   r   reshape)"resimage_shaper   r   r   r   new_padsdata_coldata_imZkernel_hZkernel_wZchannels_colZstride_hZstride_wZ
dilation_hZ
dilation_wZpad_hZpad_wheightwidthr   r   Z
height_colZ	width_colc_colZw_offsetZh_offsetZc_imZh_colZh_imZw_colZw_imZi_imZi_colr"   r(   r#   _col2im_naive_implementation_2dA   sH    &&8" r;   c                 C  s  | j d }t|}|| dkrJtd| d| d| d| j  d| d| j d }t|}	g }
t|	D ]N}|| ||d d f   || || d   d ||  d }|
| qht|
}||krtd	| d| j  d| d
| d| d| d| d|
 d| d| dd S )Nr   zSExpected size of input's dimension 1 to be divisible by the product of kernel_size=z, but got input.size(1)=z and kernel_shape=r   r   r
   r   zGiven n_input_plane=r   r   r   r   zX, expected size of input's dimension 2 to match the calculated number of sliding blocks r   r   )r   r-   prodr   r   r/   r   append)r   r   r   r   r   r   r    kernel_sizer!   r)   Zn_blocksr'   Zn_block
block_sizer"   r"   r#   _col2im_shape_checkn   s6    

$


Br@   c                   sd  t d  t fddt D }t| ||||| | }tj|| jd}g }	t D ]N}
||
 ||
ddf   ||
 ||
 d  d  ||
  d }|	| q\t	|}t	|	}t|D ]}t
||}t|D ]~}t
||	}g }t D ]:}
||
 ||
  ||
df  ||
 ||
   }|| qt||js|t|  |||f 7  < qq|S )z"Naive implementation for `col2im`.r   c                   s    g | ]}| |   fqS r"   r"   r%   r(   r"   r#   r*      s     z/col2im_naive_implementation.<locals>.<listcomp>r+   Nr   r   )r   r-   r.   r/   r@   r0   r,   r   r=   r<   r   r   r   tuple)datar4   r   r   r   r   r5   r6   r7   Zdim_colr'   colr>   Zcol_sizer:   offsetZind_colZind_imindr"   r(   r#   col2im_naive_implementation   s>    



* rF   c                   @  s   e Zd ZdddZdS )Col2ImNc              	   C  s  |d krdd |D }|d kr0dd |D d }|d krFdd |D }t |}|jd | }||jd d |f |f |jdd   }t|}	d }
t|jd D ]p}t|jd D ]\}t|||df ||	|||}|
d kr|jd d |j }t j||jd	}
||
||df< qq|
fS )
Nc                 S  s   g | ]}d qS r   r"   r&   sr"   r"   r#   r*      s     zCol2Im._run.<locals>.<listcomp>c                 S  s   g | ]}d qS )r   r"   rI   r"   r"   r#   r*      s     r   c                 S  s   g | ]}d qS rH   r"   rI   r"   r"   r#   r*      s     r   r   .r+   )	r-   r<   r   r2   rA   r/   rF   emptyr,   )selfrB   r4   Zblock_shaper   r   r   blCksr3   ncoutZ	new_shaper"   r"   r#   _run   s4    
.     
zCol2Im._run)NNN)__name__
__module____qualname__rS   r"   r"   r"   r#   rG      s        rG   )
__future__r   Znumpyr-   Zonnx.reference.op_runr   Z%onnx.reference.ops._op_common_indicesr   r   r$   r;   r@   rF   rG   r"   r"   r"   r#   <module>   s   5-%(