o
    toi=                     @  s   d dl mZ d dlmZmZ d dlZd dlZd dlm	Z	 er$d dl
mZ dNdOddZ	dPdQddZ	dRdSddZdTdUddZdNdVddZdWd d!ZdXd&d'ZdYd*d+Z		,	-	.dZd[d8d9Z		.d\d]d@dAZd^dBdCZ					D	.d_d`dJdKZG dLdM dMe	ZdS )a    )annotations)TYPE_CHECKINGAnyN)OpRun)Callablearrayslist[np.ndarray]outnp.ndarray | Nonereturn
np.ndarrayc                 C  s   dd | D } | d j }tdd | D }|du r%tj|t| g|d}|| d j }t| d ||dddf< | dd rut| dd |d|ddf d td| d jD ]}|d|ddf ||| |d | ddf< qZ|S )	a  From https://stackoverflow.com/a/1235363
    Generate a cartesian product of input arrays.
    Parameters
    ----------
    arrays : list of array-like
        1-D arrays to form the cartesian product of.
    out : ndarray
        Array to place the cartesian product in.

    Returns:
    -------
    out : ndarray
        2-D array of shape (M, len(arrays)) containing cartesian products
        formed of input arrays.

    Examples:
    --------
    >>> cartesian(([1, 2, 3], [4, 5], [6, 7]))
    array([[1, 4, 6],
           [1, 4, 7],
           [1, 5, 6],
           [1, 5, 7],
           [2, 4, 6],
           [2, 4, 7],
           [2, 5, 6],
           [2, 5, 7],
           [3, 4, 6],
           [3, 4, 7],
           [3, 5, 6],
           [3, 5, 7]])
    c                 S  s   g | ]}t |qS  )npasarray.0xr   r   P/home/ubuntu/.local/lib/python3.10/site-packages/onnx/reference/ops/op_resize.py
<listcomp>1       z_cartesian.<locals>.<listcomp>r   c                 S  s   g | ]}|j qS r   )sizer   r   r   r   r   4   s    Ndtype   )r	   )	r   r   prodzeroslenr   repeat
_cartesianrange)r   r	   r   nmjr   r   r   r      s    
$2r   round_prefer_floorratiofloat | int | np.ndarraymodestrc                 C  s   t | ts	|  rtddgS |dkrt| dk| dkgS |dkr.t| dk | dkgS |dkr9tddgS |dkrDtddgS td|d	)
Nr   r   r#         ?round_prefer_ceilfloorceilUnexpected value .)
isinstanceint
is_integerr   array
ValueError)r$   r&   r   r   r   _nearest_coeffsA   s   r3         floatscalefloat | NoneAc                 C  s   ~|| d  d|  | d  d|  | d  d|  |d |  |d  |  |  d |d d|   |d  d|   d|   d |d|  d  d|  d|  d  d|  d|  d  d|  g}t |S )Nr                  r   r1   )r$   r6   r8   coeffsr   r   r   _cubic_coeffsQ   s   2**

r@   c                   st   t dd fddttd d }d	| }fd
dt||D }fdd|D }t|t| S )N      ?r   r5   r   c                   sp   t | } | |  }| | }| dkr d |  d |  d S | dk r6 | d  |  d  |   d   S dS )Nr   r<   r=   r9   r:   r;           abs)r   x_2x_3r8   r   r   compute_coeffd   s   (z._cubic_coeffs_antialias.<locals>.compute_coeffr   r<   c                   s   g | ]}|   qS r   r   r   ir$   r6   r   r   r   p       z+_cubic_coeffs_antialias.<locals>.<listcomp>c                   s   g | ]} |qS r   r   r   )rH   r   r   r   q   s    )r   r5   r   r5   )minr/   r   r*   r   r1   sum)r$   r6   r8   i_starti_endargsr?   r   )r8   rH   r$   r6   r   _cubic_coeffs_antialias`   s   

rS   c                 C  s   ~t d|  | gS )Nr   r>   rL   r   r   r   _linear_coeffsu   s   rT   c                 C  sn   t |d}ttd| d }dd|  }t||| |  | }tdt| dd}t|t| S )NrA   r   r<   r   )	rN   r/   r   r*   arangecliprD   r1   rO   )r$   r6   start	footprintrR   r?   r   r   r   _linear_coeffs_antialiasz   s   
rZ   r   r    r/   limitc                   s2   t t| fdddd| }t |}t|S )a  Return the n nearest indexes to x among `[0, limit)`,
    prefer the indexes smaller than x.
    As a result, the ratio must be in `(0, 1]`.

    Examples::

        get_neighbor_idxes(4, 2, 10) == [3, 4]
        get_neighbor_idxes(4, 3, 10) == [3, 4, 5]
        get_neighbor_idxes(4.4, 3, 10) == [3, 4, 5]
        get_neighbor_idxes(4.5, 3, 10) == [3, 4, 5]
        get_neighbor_idxes(4.6, 3, 10) == [4, 5, 6]
        get_neighbor_idxes(4.4, 1, 10) == [4]
        get_neighbor_idxes(4.6, 1, 10) == [5]

    Args:
        x: float.
        n: the number of the wanted indexes.
        limit: the maximum value of index.

    Returns:
        An np.array containing n nearest indexes in ascending order
    c                   s   t  |  | fS NrC   )idxr   r   r   <lambda>   s    z%_get_neighbor_idxes.<locals>.<lambda>)keyN)sortedr   r   r1   )r   r    r[   idxesr   r^   r   _get_neighbor_idxes   s    
rc   datatuple[np.ndarray, np.ndarray]c                 C  sP   t |d t}t j||dd}| |7 } t| |t|}|| }|| |fS )a  Pad `data` in 'edge' mode, and get n nearest elements in the padded array and their indexes in the original array.

    Args:
        x: Center index (in the unpadded coordinate system) of the found
            nearest elements.
        n: The number of neighbors.
        data: The array.

    Returns:
        A tuple containing the indexes of neighbor elements (the index
        can be smaller than 0 or higher than len(data)) and the value of
        these elements.
    r<   edger&   )r   r+   astyper/   padrc   r   )r   r    rd   	pad_widthpaddedrb   retr   r   r   _get_neighbor   s   rm   rB   
half_pixelFscale_factoroutput_width_int
get_coeffs$Callable[[float, float], np.ndarray]roiextrapolation_valuecoordinate_transformation_modeexclude_outsideboolc	                 C  s  t | }	||	 }
|dkr|
dkrd}n||	d  |
d  }n|dkr'|| }n|dkrr|d u r3td|
dkrF|d |d  |	d  d }n||d |d   |	d  |
d  }||d |	d  7 }|dk sl||	d krqt|S nF|d	kr|
dkr}d
}n;|d | d }n2|dkr|d | d }n%|dkr||
 }|	d }|d|  }||d |  d }ntd|dt|t }| rd}n|| }|||}t |}t	||| \}}|rt
|D ]\}}|dk s||	krd||< q|t| }t|| S )Nalign_cornersr   rB   
asymmetrictf_crop_and_resizezroi cannot be None.r   r<   pytorch_half_pixelg      r(   rn   half_pixel_symmetricz(Invalid coordinate_transformation_mode: r-   )r   r2   r   r1   r*   rh   r/   itemr0   rm   	enumeraterO   dot)rd   ro   rp   r   rq   rs   rt   ru   rv   input_widthoutput_widthx_ori
adjustmentcenteroffset	x_ori_intr$   r?   r    rb   pointsrK   r]   r   r   r   _interpolate_1d_with_x   s\   
$


r   scale_factorslist[float]output_size	list[int]kwargsr   c              	   K  s   |dkrt | |d |d |d |f||d|S g }	t| jd D ]<}
t| |
 |d |dd  |dd  |dd  |f|d u rBd nt|d| ||d d  g|d|}|	| q"t |	|d |d |d |f|d u rrd n|d || g|d|S )Nr   r   rs   rv   )r   r   shape_interpolate_nd_with_xr   concatenateappend)rd   r    r   r   r   rq   rs   rv   r   res1drK   rr   r   r   r      sR   



,	r   c                   s    t  fddtt jD S )Nc                   s   g | ]}t t j| qS r   )listr   r   rJ   rd   r   r   r   4      z#_get_all_coords.<locals>.<listcomp>)r   r   r   r   r   r   r   r   _get_all_coords1  s   r   stretchlist[int] | Nonelist[float] | Noneaxeskeep_aspect_ratio_policy
str | Nonec                   s4  d u r|d u rt dtj}	 d ur}|d ur/dg|	 }
t D ]
\}}|| |
|< q"|
}d urOfddt|	D }t D ]
\}}| ||< qB||d ur|dg|	 dg|	  }t }t D ]\}}|| ||< |||  ||	| < qe|}ntt|	 d urڇfddt|	D }|dkr|dkrt|   n|d	krt|  	 nt d
| fddt|	D }ddd fddt|	D n|tj 
t|d u rt dd u rt dt}t|D ]}ttj|||f||d||t|< q|S )Nz.output_size is None and scale_factors is None.rA   c                   s   g | ]} j | qS r   r   rJ   r   r   r   r   O  r   z#_interpolate_nd.<locals>.<listcomp>rB   c                   s   g | ]}|  j |  qS r   r   rJ   )rd   r   r   r   r   _  r   r   
not_largernot_smallerz!Invalid keep_aspect_ratio_policy=c                   s   g | ]
}| v r
nd qS )rA   r   rJ   )r   r6   r   r   r   j  s    r   r5   r   r/   c                 S  s   t | d S )Nr(   )r/   r^   r   r   r   round_half_upl  s   z&_interpolate_nd.<locals>.round_half_upc                   s0   g | ]}| v rj |  nj | qS r   r   rJ   )r   rd   r   r6   r   r   r   o  s    "zscale_factors is None.zoutput_size is None.r   )r   r5   r   r/   )r2   r   r   r~   r   r   r   r1   rN   maxrh   r/   r   r   r   tuple)rd   rq   r   r   r   rs   r   rv   r   r   new_scale_factorsrK   dnew_output_sizenew_roinaxesrl   r   r   )r   rd   r   r   r6   r   _interpolate_nd8  sx   



	r   c                   @  s.   e Zd Z											ddddZdS )ResizeNr&   r   c                   s  |dkr|rt d|d|dd urfdd}n(t}n%|dkr1|r'tntfdd}n|d	kr<|r9tnt}ntd
|dd u r^tj	t
 ||||||	||
d	 j}|fS fddtt jD }t| }t |}dgt fddD R }||}d }t|jd D ]/}t
|| ||||||	||
d	}|d u rtj|jd g|jR  jd}tj	| j||< q|t fdd|D |d j }t|}t|D ]\}}|||< qt|t|}|fS )Nnearestz	antilias=z is not supported for mode=r-   c                   s   ~t |  dS )Nrg   )r3   )r   ro   )nearest_moder   r   fct  s   zResize._run.<locals>.fctcubicc                   s   | | dS )NrG   r   )r   r6   )cubic_coeff_afct_r   r   r     s   linearr,   z
 for mode.)r   r   rs   r   rv   ru   rt   c                   s   g | ]}| vr|qS r   r   r   a)r   r   r   r     rM   zResize._run.<locals>.<listcomp>rU   c                 3      | ]} j | V  qd S r\   r   r   Xr   r   	<genexpr>      zResize._run.<locals>.<genexpr>r   r   c                 3  r   r\   r   r   r   r   r   r     r   )RuntimeErrorr3   rS   r@   rZ   rT   r2   onnxnumpy_helpersaturate_castr   r   r   r   r   r   r   	transposereshapeemptyr   r~   )selfr   rs   scalessizes	antialiasr   ru   r   rv   rt   r   r&   r   r   outputnot_axespermpermuted	new_shapereshapedresrK   res_reshapednew_permr   finalr   )r   r   r   r   r   r   _run  sr   
 &
zResize._run)NNNNNNNNNNN)r&   r   )__name__
__module____qualname__r   r   r   r   r   r     s    r   r\   )r   r   r	   r
   r   r   )r#   )r$   r%   r&   r'   r   r   )Nr4   )r$   r5   r6   r7   r8   r5   r   r   )r4   )r$   r5   r6   r5   r8   r5   r   r   )r$   r5   r6   r7   r   r   )r$   r5   r6   r5   r   r   )r   r5   r    r/   r[   r/   r   r   )r   r5   r    r/   rd   r   r   re   )NrB   rn   F)rd   r   ro   r5   rp   r/   r   r5   rq   rr   rs   r
   rt   r5   ru   r'   rv   rw   r   r   )NF)rd   r   r    r/   r   r   r   r   r   r   rq   rr   rs   r
   rv   rw   r   r   r   r   )rd   r   r   r   )NNNNr   F)rd   r   rq   rr   r   r   r   r   r   r   rs   r
   r   r   rv   rw   r   r   r   r   )
__future__r   typingr   r   numpyr   r   onnx.reference.op_runr   collections.abcr   r   r3   r@   rS   rT   rZ   rc   rm   r   r   r   r   r   r   r   r   r   <module>   sD   1


O
1
T