o
    wi]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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   ^/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/onnx/reference/ops/op_grid_sample.py_gs_denormalize   s
   zGridSample._gs_denormalizec                 C  sH   t jt|t jd}tt||D ]\}\}}| j|||d||< q|S )Ndtype)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 )Nr0   r   r
   r   arrayr   borderpadding_moder   r)   )r   r1   r   r   floorr.   _pixel_at_array)r   datar   r8   r9   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
   r6   r   )r   r1   r   r   r:   r/   r;   )	r   r<   r   r8   r9   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   r8   r9   )ndimr   r   rB   r2   shape"_gs_linear_interpolation_nd_with_xlistappendr   r7   	r   r<   r   r8   r9   num_dimsres1dr   r$   r   r   r   rH      0   ,

z-GridSample._gs_linear_interpolation_nd_with_xc           	   
   C  rC   rD   )rF   r   r   rA   r2   rG   !_gs_cubic_interpolation_nd_with_xrI   rJ   r   r7   rK   r   r   r   rO      rN   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   rI   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   r6   r   r8   ndarrayr   r8   r9   )rF   r   r   r;   rG   r   
zeros_likerS   r%   _pixel_at_ndarrayrI   )r   rU   r   r8   r9   rL   r   dr   r   r   rW      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   r8   )rF   rG   rS   r   r%   )r   r7   r   r8   r9   rX   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   r2   )r   r   r   rL   bordersr   r   r   r   _prepare_border   s   zGridSample._prepare_borderc                 C  sh   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[   rZ   )r   r:   ceil)r   r   r   r   round_single_value  s   z5GridSample._cpp_std_round.<locals>.round_single_valuer
   r   )

isinstancenumbersNumberrF   r   rV   r2   rG   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   nearestr8   
reflectionrT   linearrE   cubiczHGridSample interpolation only supports nearest, linear, and cubic modes.)moder9   r   rG   r   prodr7   r   r1   r2   r   r]   r   tupler   rintr   rS   r%   rc   rd   rW   rH   rO   RuntimeError)r   Xgridrl   r9   r   x_dims	grid_dimsNCy_dimsYr   	grid_datacX_datarL   r   r8   oxnxr   r   r   r   r    r   r   r   _run!  sr   




:zGridSample._run)r   r   r   r	   )r   r	   )r   rI   )r   r   )NNN)__name__
__module____qualname__r   r   r%   r.   r/   r5   rA   rB   rH   rO   rS   rW   r;   r]   rf   r~   r   r   r   r   r      s"    

	


r   )

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