U
    qh]4                     @  sH   d dl mZ d dlZd dlZd dlmZ d dlmZ G dd deZ	dS )    )annotationsN)OpRun)_get_all_coordsc                   @  s   e Zd ZdddddZddddZd	d
 Zdd Zdd Zdd Zdd Z	dd Z
dd Zdd Zdd ZddddZddd d!Zddd"d#Zd$d% Zd)d'd(Zd&S )*
GridSampleintbool)lengthalign_cornersc                 C  s2   |r|d d |d  }n|d | d d }|S )N   g       @ )selfnr   r	   xr   r   E/tmp/pip-unpacked-wheel-xnis5xre/onnx/reference/ops/op_grid_sample.py_gs_denormalize   s    zGridSample._gs_denormalizer	   c                 C  sH   t jt|t jd}tt||D ] \}\}}| j|||d||< q"|S )Ndtype)r   r   r	   )npzeroslenZfloat32	enumeratezipr   )r   r   dimsr	   r   ivZdimr   r   r   _gs_denormalize_coordinates.   s    z&GridSample._gs_denormalize_coordinatesc           	      C  s   |}|| }||k rT|| }t || }|||  }|d dkrJ|| }q|| }nF||kr|| }t || }|||  }|d dkr|| }n|| }|S )zReflect by the near border till within the borders
        Use float for borders to avoid potential issues with integer T
           r   )r   )	r   r   x_minx_maxZfxrngZdxr   rr   r   r   _gs_reflect4   s"    


zGridSample._gs_reflectc                 C  s   d}t |}||d  d|  |d  d|  |d  d|  |d< |d | |d  | | d |d< |d d|  |d  d|  d|  d |d< |d|  d|  d|  d|  d|  d|  |d< d	S )
zCalculate cubic convolution interpolation coefficients
        ROBERT G. KEYS https://ieeexplore.ieee.org/document/1163711
        Use float to avoid potential issues with integer.
        g      r
            r   r      Nabs)r   r   coeffsZcubic_alphar   r   r   _gs_get_cubic_coeffsL   s$    "$"zGridSample._gs_get_cubic_coeffsc                 C  s    t |}d| |d< ||d< d S )Nr
   r   r'   )r   r   r)   r   r   r   _gs_get_linear_coeffs^   s    z GridSample._gs_get_linear_coeffsc                 C  sf   t jd|jd}t jd|jd}| || tdD ]}|||d d f  ||< q4| || || S )Nr%   r   r%   )r   emptyr   r*   range)r   pr   yr   r)   r   r   r   r   _gs_bicubic_interpolatec   s    z"GridSample._gs_bicubic_interpolatec                 C  s   t jd|jd}t jd|jd}tt |}|d }|d }	|d }
| || | | j||
||d|d< | j||||d|d< | j||||d|d< | j||	||d|d< || S )Nr,   r   r
   r   arrayr   borderpadding_moder   r&   )r   r-   r   r   floorr*   _pixel_at_array)r   datar   r4   r5   r   r)   x_0x_1Zx_2Z	x_minus_1r   r   r   !_gs_cubic_interpolation_1d_with_xl   s@       
   
   
   
z,GridSample._gs_cubic_interpolation_1d_with_xc           	      C  sz   t jd|jd}t jd|jd}tt |}|d }| || | | j||||d|d< | j||||d|d< || S )N)r   r   r
   r2   r   )r   r-   r   r   r6   r+   r7   )	r   r8   r   r4   r5   r   r)   r9   r:   r   r   r   "_gs_linear_interpolation_1d_with_x   s$       
   
z-GridSample._gs_linear_interpolation_1d_with_xc           	   
   C  s   |j }|t|  kr*tt|d ks0n t|dkrN| j||d ||dS g }t|jd D ]P}| j|| |dd  t|d| t|d| d|   |d}|	| q`t
|}| j||d |d || g|dS Nr   r
   r   r8   r   r4   r5   )ndimr   r   AssertionErrorr<   r.   shape"_gs_linear_interpolation_nd_with_xlistappendr   r3   	r   r8   r   r4   r5   num_dimsZres1dr   r!   r   r   r   rB      s6    *   

z-GridSample._gs_linear_interpolation_nd_with_xc           	   
   C  s   |j }|t|  kr*tt|d ks0n t|dkrN| j||d ||dS g }t|jd D ]P}| j|| |dd  t|d| t|d| d|   |d}|	| q`t
|}| j||d |d || g|dS r=   )r?   r   r   r@   r;   r.   rA   !_gs_cubic_interpolation_nd_with_xrC   rD   r   r3   rE   r   r   r   rG      s6    *   

z,GridSample._gs_cubic_interpolation_nd_with_xc                 C  s   ||k r|S ||kr|S |S )Nr   )r   vallohir   r   r   _clamp   s
    zGridSample._clamprC   )r   c              	   C  s  |j }|t|  kr*tt|d ks0n t|dkrN| j||d ||dS |d }|jd }|dkr|dkr||k r|| }qd}t|| }nF|dkr| |d|d }|| }n"t| 	||d || }|| }| j
||dd  t|d| t|d| d|   |dS )Nr   r
   r   r2   r   r4   ndarrayr   r4   r5   )r?   r   r   r@   r7   rA   r   
zeros_likerK   r"   _pixel_at_ndarrayrC   )r   rM   r   r4   r5   rF   r   dr   r   r   rO      s6    *   



&zGridSample._pixel_at_ndarray)r   c                 C  s   |j dkst|jd }|dkr@|dkr:||k r:|| }qd}nF|dkrd| |d|d }|| }n"t| ||d |d }|| }|S )Nr
   r   r   r4   )r?   r@   rA   rK   r   r"   )r   r3   r   r4   r5   rP   Zpixelr   r   r   r7      s    


zGridSample._pixel_at_arrayc                 C  sd   t |}t|d }t|D ]@}d||< || d ||| < |rd||< || d ||| < q|S )Nr   g            ?        g      ?)r   r   r   r.   )r   r   r	   rF   Zbordersr   r   r   r   _prepare_border   s    zGridSample._prepare_borderc                 C  sl   dd }t |tjr||S |jdks*tt|}t|jd D ]}||| ||< qB|	tj
}|S d S )Nc                 S  s(   | dkrt | d S t | d S d S )NrR   rQ   )r   r6   ceil)r   r   r   r   round_single_value  s    z5GridSample._cpp_std_round.<locals>.round_single_valuer
   r   )
isinstancenumbersNumberr?   r@   r   rN   r.   rA   astypeint32)r   r   rU   Z	x_roundedr   r   r   r   _cpp_std_round  s    
zGridSample._cpp_std_roundNc              
   C  sZ  |p| j }|p| j}|p| j}|j}|j}|d }|d }	||	f|dd }
t|
dkrltjg |jdS tj|
|jd}t	|D ]}|| }t	|	D ]}|||f }t
|dd  }|dd  }| j||d}t|||f D ]^}|t| }|d d d }| j|||d}|dkr*t|}t|D ]t\}}|| }|||  }||k sb||kr2|d	kr| |d|| d ||< n|d
kr2| |||||< q2|dkr|tj}| j||||d|| | t|< q|dkr| j||||d|| | t|< q|dkr>| j||||d|| | t|< qtdqqq||jfS )Nr   r
   r   r   r   )r   r   r	   Znearestr4   Z
reflectionrL   Zlinearr>   ZcubiczHGridSample interpolation only supports nearest, linear, and cubic modes.)moder5   r	   rA   r   prodr3   r   r-   r.   r   rS   r   tupler   Zrintr   rK   r"   rY   rZ   rO   rB   rG   RuntimeError)r   XZgridr]   r5   r	   Zx_dimsZ	grid_dimsNCZy_dimsYr   Z	grid_datacZX_datarF   r   r4   ZoxZnxr   r   r   r   r   r   r   r   _run!  s|    


  





   
   
zGridSample._run)NNN)__name__
__module____qualname__r   r   r"   r*   r+   r1   r;   r<   rB   rG   rK   rO   r7   rS   r[   rf   r   r   r   r   r      s    	r   )

__future__r   rW   Znumpyr   Zonnx.reference.op_runr   Zonnx.reference.ops.op_resizer   r   r   r   r   r   <module>   s
   