
    
NgS4                     V    d dl Z d dlmZ d dlZd dlmZ d dlmZ  G d de          Z	dS )    N)List)OpRun)_get_all_coordsc                       e Zd ZdedefdZdefdZd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd ZdefdZdefdZdefdZd ZddZdS )
GridSamplelengthalign_cornersc                 D    |r|dz   dz  |dz
  z  }n|dz   |z  dz
  dz  }|S )N   g       @ )selfnr   r	   xs        ]/var/www/html/ai-engine/env/lib/python3.11/site-packages/onnx/reference/ops/op_grid_sample.py_gs_denormalizezGridSample._gs_denormalize   sE      	- Q#!,AA a%6!A%,A    c                     t          j        t          |          t           j                  }t	          t          ||                    D ]#\  }\  }}|                     |||          ||<   $|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/   sl    HSVV2:...$SD\\22 	V 	VKAx3''!C}'UUAaDDr   c                     |}||z
  }||k     r4||z
  }t          ||z            }|||z  z
  }|dz  dk    r||z   }n?||z
  }n9||k    r3||z
  }t          ||z            }|||z  z
  }|dz  dk    r||z
  }n||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_reflect5   s     em::BBHAQWA1uzzQYQY%ZZeBBHAQWA1uzzQYQY	r   c                 F   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<   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_alphas       r   _gs_get_cubic_coeffszGridSample._gs_get_cubic_coeffsM   s   
 FF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                 >    t          |          }d|z
  |d<   ||d<   d S )Nr   r   r0   )r   r   r2   s      r   _gs_get_linear_coeffsz GridSample._gs_get_linear_coeffs_   s'    FFEq	q			r   c                    t          j        d|j                  }t          j        d|j                  }|                     ||           t	          d          D ]}|||d d f         z  ||<   |                     ||           ||z  S )Nr.   r   r.   )r   emptyr   r4   range)r   pr   yr   r2   r   s          r   _gs_bicubic_interpolatez"GridSample._gs_bicubic_interpolated   s    HT)))$ag...!!!V,,,q 	$ 	$AAadG#AaDD!!!V,,,zr   c                    t          j        d|j                  }t          j        d|j                  }t          t          j        |                    }|dz   }|dz   }	|dz
  }
|                     ||z
  |           |                     ||
||          |d<   |                     ||||          |d<   |                     ||||          |d<   |                     ||	||          |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_xm   s&   HT,,,$dj111"(1++AgAg!G	!!!c'6222##)F $ 
 
! ###f< $ 
 
! ###f< $ 
 
! ###f< $ 
 
! zr   c                 f   t          j        d|j                  }t          j        d|j                  }t          t          j        |                    }|dz   }|                     ||z
  |           |                     ||||          |d<   |                     ||||          |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    HT,,,$dj111"(1++Ag""1s7F333###f< $ 
 
! ###f< $ 
 
! zr   c                 n   |j         }|t          |          cxk    r#t          t          |          dz            k    sn J |dk    r|                     ||d         ||          S g }t	          |j        d                   D ]q}|                     ||         |dd          t          |d|                   t          |d|z   d|z                     z   |          }|                    |           rt          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]   93q669999SVq%9%9999999q==::QqT&| ;    tz!}%% 	 	A77!WABB%F1X:.//va(lQ\9:;;<) 8  A LLOOOO66d1Ivh/0%	 7 
 
 	
r   c                 n   |j         }|t          |          cxk    r#t          t          |          dz            k    sn J |dk    r|                     ||d         ||          S g }t	          |j        d                   D ]q}|                     ||         |dd          t          |d|                   t          |d|z   d|z                     z   |          }|                    |           rt          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]   93q669999SVq%9%9999999q==99QqT&| :    tz!}%% 	 	A66!WABB%F1X:.//va(lQ\9:;;<) 7  A LLOOOO55d1Ivh/0%	 6 
 
 	
r   c                 &    ||k     r|S ||k    r|S |S )Nr   )r   vallohis       r   _clampzGridSample._clamp   s#    88I88I
r   r   c                    |j         }|t          |          cxk    r#t          t          |          dz            k    sn J |dk    r|                     ||d         ||          S |d         }|j        d         }|dk    r2|dk    r||k     r	||         }n~d}t          j        ||                   }na|dk    r#|                     |d|dz
            }||         }n8t          |                     ||d         ||                             }||         }| 	                    ||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   s   <3q669999SVq%9%9999999q==''1f< (    aDM!7""Avv!a%%!!* -
33X%%Aq!a%((AajGGD$$Qq	6(3CDDEEAajG%%eqz*++d6!h,X:U3V.W.WW%	 & 
 
 	
r   r   c                 8   |j         dk    sJ |j        d         }|dk    r|dk    r||k     r	||         }ndd}na|dk    r#|                     |d|dz
            }||         }n8t          |                     ||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    zQKN7""Avv!a%%aX%%Aq!a%((A!HEED$$Qq	6!9==>>A!HEr   c                     t          |          }t          j        |dz            }t          |          D ]0}d||<   ||         dz
  |||z   <   |rd||<   ||         dz
  |||z   <   1|S )Nr"   g            ?        g      ?)r   r   r   r:   )r   r   r	   rV   bordersr   s         r   _prepare_borderzGridSample._prepare_border   s    t99(8a<((x 		6 		6AGAJ$(GcMGAL! 6 
(,Q#H%r   c                 8   d }t          |t          j                  r ||          S |j        dk    sJ t	          j        |          }t          |j        d                   D ]} |||                   ||<   |                    t          j	                  }|S )Nc                 j    | 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  s3    CxxxC(((wq3w'''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(((6Q;;;;a((I171:&& 8 811!A$77	!!((22Ir   Nc           
         |p| j         }|p| j        }|p| j        }|j        }|j        }|d         }|d         }	||	g|dd         R }
t	          j        |
          dk    rt	          j        g |j                  S t	          j        |
|j                  }t          |          D ]0}||         }t          |	          D ]}|||f         }t          |dd                    }|dd          }|                     ||          }t          |||f                   D ]}|t          |                   }|d d d         }|                     |||          }|dk    rt	          j        |          }t!          |          D ]n\  }}||         }|||z            }||k     s||k    rJ|d	k    r$|                     |d||         dz
            ||<   N|d
k    r|                     |||          ||<   o|dk    rV|                    t          j                  }|                     ||||          ||         |         t          |          <   /|dk    r7|                     ||||          ||         |         t          |          <   l|dk    r7|                     ||||          ||         |         t          |          <   t1          d          2|                    |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"  sV     ty#8t'8%;);J	1I1IQ)1R4))76??a8Bag....HV17+++q ;	 ;	AQI1XX 8 8
 1a4vabbz??abbz --d--PP)!AqD'22 + +B"599-BDDbDB884} 9  A y(( GAJJ )! I I1 &q	 &q8| 4u99E		+x77'+{{1aa1'E'E!!-!=!='+'7'75%'H'H!y((HHRX..-1-C-C$*#))5	 .D . .!Qb		** ))-1-T-T!'1V, .U . .!Qb		** -1-S-S!'1V, .T . .!Qb		** +f  S+8t !!##r   )NNN)__name__
__module____qualname__r#   boolr   r    r*   r4   r6   r=   rJ   rL   rR   rY   r^   r   rc   rD   rk   rv   r   r   r   r   r   r      sR        T    <$      0& & &$  
    .  
 
 
6
 
 
6  
D 
 
 
 
>     4    "  $O$ O$ O$ O$ O$ O$r   r   )
rq   typingr   numpyr   onnx.reference.op_runr   onnx.reference.ops.op_resizer   r   r   r   r   <module>r      s               ' ' ' ' ' ' 8 8 8 8 8 8b$ b$ b$ b$ b$ b$ b$ b$ b$ b$r   