o
    toi                     @  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r'| jd dkr'| jd dks=|dkr9| jd dkr9| jd dks=tdt | jdkrFdnd}| j|d  }||	|  dkrbt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_widthkernel_heightkernel_widthdilation_heightdilation_widthstride_heightstride_widthndim	batch_dimn_input_planeinput_lengthn_blocks_heightn_blocks_width r+   P/home/ubuntu/.local/lib/python3.10/site-packages/onnx/reference/ops/op_col2im.py_col2im_shape_check_2d   s   
$$&&	r-   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 ]y}||
 }||
 |	 }||	|
  }t|D ]b}|| | ||  }t|D ]Q}|| | ||  }d|  kr|k rn qd|  kr|k rn q|| | | | } || | | | }!d|!  kr|j
d k rn q||   ||! 7  < qqq||S )Nr   c                       g | ]}| |   fqS r+   r+   .0in_dimsr   r+   r,   
<listcomp>G        z3_col2im_naive_implementation_2d.<locals>.<listcomp>dtyper   r   )r   nparrayranger-   ravelzerosr7   flattenr   r   reshape)"resimage_shaper   r   r   r   new_padsdata_coldata_imkernel_hkernel_wchannels_colstride_hstride_w
dilation_h
dilation_wpad_hpad_wheightwidthr   r   
height_col	width_colc_colw_offseth_offsetc_imh_colh_imw_colw_imi_imi_colr+   r2   r,   _col2im_naive_implementation_2dA   sN   &&0

r[   c                 C  s  | j d }t|}|| dkr%td| d| d| d| j  d| d| j d }t|}	g }
t|	D ]'}|| ||d d f   || || d   d ||  d }|
| q4t|
}||krt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   r8   prodr   r   r:   r   append)r   r   r   r   r   r   r'   kernel_sizer(   r3   n_blocksr1   n_block
block_sizer+   r+   r,   _col2im_shape_checkn   sl   



rb   c                   sd  t d  t fddt D }t| ||||| | }tj|| jd}g }	t D ]'}
||
 ||
ddf   ||
 ||
 d  d  ||
  d }|	| q.t	|}t	|	}t|D ]K}t
||}t|D ]?}t
||	}g }t D ]}
||
 ||
  ||
df  ||
 ||
   }|| q|t||js|t|  |||f 7  < qoqd|S )z"Naive implementation for `col2im`.r   c                   r.   r+   r+   r/   r2   r+   r,   r4      r5   z/col2im_naive_implementation.<locals>.<listcomp>r6   Nr   r   )r   r8   r9   r:   rb   r<   r7   r   r]   r\   r   r   r   tuple)datar@   r   r   r   r   rA   rB   rC   dim_colr1   colr^   col_sizerQ   offsetind_colind_imindr+   r2   r,   col2im_naive_implementation   sB   



*rl   c                   @  s   e Zd Z	dddZdS )Col2ImNc              	   C  s  |d u rdd |D }|d u rdd |D d }|d u r#dd |D }t |}|jd | }|g |jd d |||jdd  R }t|}	d }
t|jd D ]7}t|jd D ]-}t|||df ||	|||}|
d u r|jd d |j }t j||jd	}
||
||df< q]qT|
fS )
Nc                 S     g | ]}d qS r   r+   r0   sr+   r+   r,   r4          zCol2Im._run.<locals>.<listcomp>c                 S  rn   )r   r+   rp   r+   r+   r,   r4      rr   r   c                 S  rn   ro   r+   rp   r+   r+   r,   r4      rr   r   r   .r6   )	r8   r\   r   r>   rc   r:   rl   emptyr7   )selfrd   r@   block_shaper   r   r   blCksr?   ncout	new_shaper+   r+   r,   _run   s,   
0zCol2Im._run)NNN)__name__
__module____qualname__r}   r+   r+   r+   r,   rm      s    rm   )
__future__r   numpyr8   onnx.reference.op_runr   %onnx.reference.ops._op_common_indicesr   r   r-   r[   rb   rl   rm   r+   r+   r+   r,   <module>   s   5-%(