o
    toiq3                     @  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Z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Zd,d d!Zd*d"d#Zd$d% Zd-d'd(Zd&S ).
GridSamplelengthintalign_cornersboolc                 C  s4   |r|d d |d  }|S |d | d d }|S )N   g       @ )selfnr   r   xr   r   U/home/ubuntu/.local/lib/python3.10/site-packages/onnx/reference/ops/op_grid_sample.py_gs_denormalize   s
   zGridSample._gs_denormalizec                 C  sL   t jt|t jd}tt||ddD ]\}\}}| j|||d||< q|S )NdtypeF)strict)r   r   r   )npzeroslenfloat32	enumeratezipr   )r   r   dimsr   r   ivdimr   r   r   _gs_denormalize_coordinates.   s   z&GridSample._gs_denormalize_coordinatesc           	      C  s   |}|| }||k r,|| }t || }|||  }|d dkr&|| }|S || }|S ||krP|| }t || }|||  }|d dkrL|| }|S || }|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_maxfxrng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   coeffs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  ||< q| || || 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 )Nr1   r   r
   r   arrayr   borderpadding_moder   r*   )r   r2   r   r   floorr/   _pixel_at_array)r   datar   r9   r:   r   r-   x_0x_1x_2	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
   r7   r   )r   r2   r   r   r;   r0   r<   )	r   r=   r   r9   r:   r   r-   r>   r?   r   r   r   "_gs_linear_interpolation_1d_with_x   s   

z-GridSample._gs_linear_interpolation_1d_with_xc           	   
   C     |j }|t|  krtt|d ksJ  J |dkr(| j||d ||dS g }t|jd D ](}| j|| |dd  t|d| t|d| d|   |d}|| q1t	
|}| j||d |d || g|dS Nr   r
   r   r=   r   r9   r:   )ndimr   r   rC   r3   shape"_gs_linear_interpolation_nd_with_xlistappendr   r8   	r   r=   r   r9   r:   num_dimsres1dr   r%   r   r   r   rI      0   ,

z-GridSample._gs_linear_interpolation_nd_with_xc           	   
   C  rD   rE   )rG   r   r   rB   r3   rH   !_gs_cubic_interpolation_nd_with_xrJ   rK   r   r8   rL   r   r   r   rP      rO   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._clampr   rJ   c              	   C  s  |j }|t|  krtt|d ksJ  J |dkr(| j||d ||dS |d }|jd }|dkrL|dkrB||k rB|| }n-d}t|| }n#|dkr^| |d|d }|| }nt| ||d || }|| }| j	||dd  t
|d| t
|d| d|   |dS )Nr   r
   r   r7   r   r9   ndarrayr   r9   r:   )rG   r   r   r<   rH   r   
zeros_likerT   r&   _pixel_at_ndarrayrJ   )r   rV   r   r9   r:   rM   r   dr   r   r   rX      s0   ,



&zGridSample._pixel_at_ndarrayr   c                 C  s   |j dksJ |jd }|dkr"|dkr||k r|| }|S d}|S |dkr5| |d|d }|| }|S t| ||d |d }|| }|S )Nr
   r   r   r9   )rG   rH   rT   r   r&   )r   r8   r   r9   r:   rY   pixelr   r   r   r<      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   r3   )r   r   r   rM   bordersr   r   r   r   _prepare_border   s   zGridSample._prepare_borderc                 C  sd   dd }t |tjr||S |jdksJ t|}t|jd D ]
}||| ||< q!|tj	S )Nc                 S  s$   | dkrt | d S t | d S )Nr\   r[   )r   r;   ceil)r   r   r   r   round_single_value  s   z5GridSample._cpp_std_round.<locals>.round_single_valuer
   r   )

isinstancenumbersNumberrG   r   rW   r3   rH   astypeint32)r   r   r`   	x_roundedr   r   r   r   _cpp_std_round  s   
zGridSample._cpp_std_roundNc              
   C  sD  |p| j }|p	| j}|p| j}|j}|j}|d }|d }	||	g|dd R }
t|
dkr7t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rt|}t|D ]5\}}|| }|||  }||k s||kr|d	kr| |d|| d ||< q|d
kr| |||||< q|dkr|tj}| j||||d|| | t|< qr|dkr| j||||d|| | t|< qr|dkr| j||||d|| | t|< qrtdqMqC||jfS )Nr   r
   r   r   )r   )r   r   r   nearestr9   
reflectionrU   linearrF   cubiczHGridSample interpolation only supports nearest, linear, and cubic modes.)moder:   r   rH   r   prodr8   r   r2   r3   r   r^   r   tupler   rintr   rT   r&   rd   re   rX   rI   rP   RuntimeError)r   Xgridrm   r:   r   x_dims	grid_dimsNCy_dimsYr   	grid_datacX_datarM   r   r9   oxnxr   r   r   r    r!   r   r   r   _run  sr   




:zGridSample._run)r   r   r   r	   )r   r	   )r   rJ   )r   r   )NNN)__name__
__module____qualname__r   r   r&   r/   r0   r6   rB   rC   rI   rP   rT   rX   r<   r^   rg   r   r   r   r   r   r      s"    

	


r   )

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