
    bIg]4                    N    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e      Z	y)    )annotationsN)OpRun)_get_all_coordsc                  x    e Zd ZddZddZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd ZddZddZddZd ZddZy)
GridSamplec                F    |r|dz   dz  |dz
  z  }|S |dz   |z  dz
  dz  }|S )N   g       @ )selfnlengthalign_cornersxs        ^/var/www/html/answerous/venv/lib/python3.12/site-packages/onnx/reference/ops/op_grid_sample.py_gs_denormalizezGridSample._gs_denormalize   sE      Q#!,A  a%6!A%,A    c                    t        j                  t        |      t         j                        }t	        t        ||            D ]  \  }\  }}| j                  |||      ||<   ! |S )Ndtype)r   r   r   )npzeroslenfloat32	enumeratezipr   )r   r   dimsr   r   ivdims           r   _gs_denormalize_coordinatesz&GridSample._gs_denormalize_coordinates.   s^    HHSV2::.$SD\2 	VKAx3''!C}'UAaD	Vr   c                    |}||z
  }||k  r1||z
  }t        ||z        }|||z  z
  }|dz  dk(  r||z   }|S ||z
  }|S ||kD  r/||z
  }t        ||z        }|||z  z
  }|dz  dk(  r||z
  }|S ||z   }|S )zReflect by the near border till within the borders
        Use float for borders to avoid potential issues with integer T
           r   )int)	r   r   x_minx_maxfxrngdxr   rs	            r   _gs_reflectzGridSample._gs_reflect4   s     em:BBHAQWA1uzQY 	 QY 	 %ZeBBHAQWA1uzQY 	 QY	r   c                <   d}t        |      }||dz   z  d|z  z
  |dz   z  d|z  z   |dz   z  d|z  z
  |d<   |dz   |z  |dz   z
  |z  |z  dz   |d<   |dz   d|z
  z  |dz   z
  d|z
  z  d|z
  z  dz   |d<   |d|z
  z  d|z  z
  d|z
  z  d|z  z   d|z
  z  d|z  z
  |d<   y	)
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_alphas       r   _gs_get_cubic_coeffszGridSample._gs_get_cubic_coeffsL   s   
 FAE"Q_4Q?!k/QU+o&q	 "Ao*kAo>!CaG!Kq	!Ao!a%0K!ODQOE
q	 AE"Q_4Q?!k/QU+o&q	r   c                4    t        |      }d|z
  |d<   ||d<   y )Nr	   r   r0   )r   r   r2   s      r   _gs_get_linear_coeffsz GridSample._gs_get_linear_coeffs^   s!    FEq	q	r   c                   t        j                  d|j                        }t        j                  d|j                        }| j                  ||       t	        d      D ]  }|||d d f   z  ||<    | j                  ||       ||z  S )Nr.   r   r.   )r   emptyr   r4   range)r   pr   yr   r2   r   s          r   _gs_bicubic_interpolatez"GridSample._gs_bicubic_interpolatec   s}    HHT)$agg.!!!V,q 	$AAadG#AaD	$!!!V,zr   c                   t        j                  d|j                        }t        j                  d|j                        }t        t        j                  |            }|dz   }|dz   }	|dz
  }
| j                  ||z
  |       | j                  ||
||      |d<   | j                  ||||      |d<   | j                  ||||      |d<   | j                  ||	||      |d<   ||z  S )Nr8   r   r	   r"   arrayr   borderpadding_moder   r/   )r   r9   r   r#   floorr4   _pixel_at_array)r   datar   rA   rB   r   r2   x_0x_1x_2	x_minus_1s              r   !_gs_cubic_interpolation_1d_with_xz,GridSample._gs_cubic_interpolation_1d_with_xl   s   HHT,$djj1"((1+AgAg!G	!!!c'62##)F $ 
! ###f< $ 
! ###f< $ 
! ###f< $ 
! zr   c                `   t        j                  d|j                        }t        j                  d|j                        }t        t        j                  |            }|dz   }| j                  ||z
  |       | j                  ||||      |d<   | j                  ||||      |d<   ||z  S )N)r"   r   r	   r?   r   )r   r9   r   r#   rC   r6   rD   )	r   rE   r   rA   rB   r   r2   rF   rG   s	            r   "_gs_linear_interpolation_1d_with_xz-GridSample._gs_linear_interpolation_1d_with_x   s    HHT,$djj1"((1+Ag""1s7F3###f< $ 
! ###f< $ 
! zr   c                   |j                   }|t        |      cxk(  rt        t        |      dz        k(  sJ  J |dk(  r| j                  ||d   ||      S g }t	        |j
                  d         D ]O  }| j                  ||   |dd  t        |d|       t        |d|z   d|z         z   |      }|j                  |       Q t        j                  |      }| j                  ||d   |d   ||   g|      S Nr"   r	   r   rE   r   rA   rB   )ndimr   r#   rL   r:   shape"_gs_linear_interpolation_nd_with_xlistappendr   r@   	r   rE   r   rA   rB   num_dimsres1dr   r)   s	            r   rR   z-GridSample._gs_linear_interpolation_nd_with_x   s)   993q69SVq%999999q=::QqT&| ;   tzz!}% 	A77!WAB%F1X./va(lQ\:;<) 8 A LLO	 66d1Ivh/0%	 7 
 	
r   c                   |j                   }|t        |      cxk(  rt        t        |      dz        k(  sJ  J |dk(  r| j                  ||d   ||      S g }t	        |j
                  d         D ]O  }| j                  ||   |dd  t        |d|       t        |d|z   d|z         z   |      }|j                  |       Q t        j                  |      }| j                  ||d   |d   ||   g|      S rN   )rP   r   r#   rJ   r:   rQ   !_gs_cubic_interpolation_nd_with_xrS   rT   r   r@   rU   s	            r   rY   z,GridSample._gs_cubic_interpolation_nd_with_x   s)   993q69SVq%999999q=99QqT&| :   tzz!}% 	A66!WAB%F1X./va(lQ\:;<) 7 A LLO	 55d1Ivh/0%	 6 
 	
r   c                "    ||k  r|S ||kD  r|S |S )Nr
   )r   vallohis       r   _clampzGridSample._clamp   s    8I8I
r   c                :   |j                   }|t        |      cxk(  rt        t        |      dz        k(  sJ  J |dk(  r| j                  ||d   ||      S |d   }|j                  d   }|dk(  r+|dk\  r||k  r||   }ncd}t        j                  ||         }nH|dk(  r| j                  |d|dz
        }||   }n't        | j                  ||d   ||               }||   }| j                  ||dd  t        |d|       t        |d|z   d|z         z   |      S )Nr"   r	   r   r?   r   rA   ndarrayr   rA   rB   )rP   r   r#   rD   rQ   r   
zeros_liker^   r*   _pixel_at_ndarrayrS   )r   ra   r   rA   rB   rV   r   ds           r   rc   zGridSample._pixel_at_ndarray   sR   <<3q69SVq%999999q=''1f< (   aDMM!7"Av!a%!!* --
3X%Aq!a%(AajGD$$Qq	6(3CDEAajG%%eq*+d6!h,X3V.WW%	 & 
 	
r   c                   |j                   dk(  sJ |j                  d   }|dk(  r|dk\  r||k  r||   }|S d}|S |dk(  r| j                  |d|dz
        }||   }|S t        | j	                  ||d   |d               }||   }|S )Nr	   r   r   rA   )rP   rQ   r^   r#   r*   )r   r@   r   rA   rB   rd   pixels          r   rD   zGridSample._pixel_at_array   s    zzQKKN7"Av!a%a    X%Aq!a%(A!HE  D$$Qq	6!9=>A!HEr   c                    t        |      }t        j                  |dz        }t        |      D ]+  }d||<   ||   dz
  |||z   <   |sd||<   ||   dz
  |||z   <   - |S )Nr"   g            ?        g      ?)r   r   r   r:   )r   r   r   rV   bordersr   s         r   _prepare_borderzGridSample._prepare_border   sx    t9((8a<(x 		6AGAJ$(GcMGAL! 
(,Q#H%		6 r   c                0   d }t        |t        j                        r ||      S |j                  dk(  sJ t	        j
                  |      }t        |j                  d         D ]  } |||         ||<    |j                  t        j                        }|S )Nc                l    | dk\  rt        j                  | dz         S t        j                  | dz
        S )Nri   rh   )r   rC   ceil)r   s    r   round_single_valuez5GridSample._cpp_std_round.<locals>.round_single_value  s/    CxxxC((wwq3w''r   r	   r   )

isinstancenumbersNumberrP   r   rb   r:   rQ   astypeint32)r   r   ro   	x_roundedr   s        r   _cpp_std_roundzGridSample._cpp_std_round  s    	( a(%a((66Q;;a(I1771:& 81!A$7	!8!((2Ir   Nc           
     <   |xs | j                   }|xs | j                  }|xs | j                  }|j                  }|j                  }|d   }|d   }	||	g|dd }
t	        j
                  |
      dk(  r!t	        j                  g |j                        S t	        j                  |
|j                        }t        |      D ]  }||   }t        |	      D ]  }|||f   }t        |dd        }|dd  }| j                  ||      }t        |||f         D ]a  }|t        |         }|d d d   }| j                  |||      }|dk(  rt	        j                  |      }t!        |      D ][  \  }}||   }|||z      }||k  s||kD  s|d	k(  r| j#                  |d||   dz
        ||<   @|d
k(  sF| j%                  |||      ||<   ] |dk(  rG|j'                  t        j(                        }| j+                  ||||      ||   |   t        |      <   |dk(  r)| j-                  ||||      ||   |   t        |      <   +|dk(  r)| j/                  ||||      ||   |   t        |      <   Yt1        d         |j'                  |j                        fS )Nr   r	   r   r"   )r   )r   r   r   nearestrA   
reflectionr`   linearrO   cubiczHGridSample interpolation only supports nearest, linear, and cubic modes.)moderB   r   rQ   r   prodr@   r   r9   r:   r   rk   r   tupler    rintr   r^   r*   rs   rt   rc   rR   rY   RuntimeError)r   Xgridr}   rB   r   x_dims	grid_dimsNCy_dimsYr   	grid_datacX_datarV   r   rA   oxnxr   r   r   r$   r%   s                             r   _runzGridSample._run!  s     tyy#8t'8'8%;););JJ	1I1IQ)1R)776?a88Bagg..HHV177+q ;	AQI1X 8
 1a4vabz?abz --d--P)!AqD'2 +B"59-BDbDB884} 9 A y( GGAJ )! I1 &q	 &q8| 4u9E	+x7'+{{1aa1'E!!-!='+'7'75%'H!I y(HHRXX.-1-C-C$*#))5	 .D .!Qb	* )-1-T-T!'1V, .U .!Qb	* -1-S-S!'1V, .T .!Qb	* +f S+8;	z !##r   )r   r#   r   bool)r   r   )r   rS   )r   r#   )NNN)__name__
__module____qualname__r   r    r*   r4   r6   r=   rJ   rL   rR   rY   r^   rc   rD   rk   rv   r   r
   r   r   r   r      sS    <0&$
.
6
6
> "$O$r   r   )

__future__r   rq   numpyr   onnx.reference.op_runr   onnx.reference.ops.op_resizer   r   r
   r   r   <module>r      s$    #   ' 8b$ b$r   