U
    qh=                     @  s\  d dl mZ d dlmZmZ d dlZd dlmZ d@ddddd	d
Z	dAddddddZ
dBdddddddZdCdddddddZdDddddddZddddddZdddddd d!Zdddd"d#d$d%ZdEddddd)dddd*dd+
d,d-ZdFddd.d/d.d)dd*d0dd1
d2d3Zddd4d5d6ZdGdd)d8d9d8dd:d*d0dd;
d<d=ZG d>d? d?eZdS )H    )annotations)AnyCallableN)OpRunzlist[np.ndarray]znp.ndarray | Nonez
np.ndarray)arraysoutreturnc                 C  s   dd | D } | d j }tdd | D }|dkrJtj|t| g|d}|| d j }t| d ||dddf< | dd rt| dd |d|ddf d td| d jD ]4}|d|ddf ||| |d | ddf< q|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  )npZasarray.0xr	   r	   @/tmp/pip-unpacked-wheel-xnis5xre/onnx/reference/ops/op_resize.py
<listcomp>-   s     z_cartesian.<locals>.<listcomp>r   c                 S  s   g | ]
}|j qS r	   )sizer   r	   r	   r   r   0   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_floorzfloat | int | np.ndarraystr)ratiomoder   c                 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rrtddgS |dkrtddgS td|d	d S )
Nr   r   r         ?Zround_prefer_ceilfloorceilUnexpected value .)
isinstanceint
is_integerr
   array
ValueError)r   r    r	   r	   r   _nearest_coeffs=   s    r+         floatzfloat | None)r   scaleAr   c                 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
   r)   )r   r.   r/   coeffsr	   r	   r   _cubic_coeffsM   s    2**
r7   c                   sz   t dddd fddttd d }d| }fd	d
t||D }fdd
|D }t|t| S )N      ?r-   r   r   c                   sp   t | } | |  }| | }| dkr< d |  d |  d S | dk rl | d  |  d  |   d   S dS )Nr   r3   r4   r0   r1   r2           abs)r   Zx_2Zx_3r/   r	   r   compute_coeff`   s    (z._cubic_coeffs_antialias.<locals>.compute_coeffr   r3   c                   s   g | ]}|   qS r	   r	   r   ir   r.   r	   r   r   l   s     z+_cubic_coeffs_antialias.<locals>.<listcomp>c                   s   g | ]} |qS r	   r	   r   )r>   r	   r   r   m   s     )minr'   r
   r"   r   r)   sum)r   r.   r/   Zi_startZi_endargsr6   r	   )r/   r>   r   r.   r   _cubic_coeffs_antialias\   s    

rF   )r   r.   r   c                 C  s   ~t d|  | gS )Nr   r5   rB   r	   r	   r   _linear_coeffsq   s    rG   c                 C  sn   t |d}ttd| d }dd|  }t||| |  | }tdt| dd}t|t| S )Nr8   r   r3   r   )	rC   r'   r
   r"   ZarangeZclipr<   r)   rD   )r   r.   startZ	footprintrE   r6   r	   r	   r   _linear_coeffs_antialiasv   s    
rJ   r'   )r   r   limitr   c                   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 Nr;   )idxr   r	   r   <lambda>       z%_get_neighbor_idxes.<locals>.<lambda>)keyN)sortedr   r
   r)   )r   r   rK   idxesr	   rN   r   _get_neighbor_idxes   s     rT   ztuple[np.ndarray, np.ndarray])r   r   datar   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.
    r3   Zedger    )r
   r#   astyper'   padrT   r   )r   r   rU   Z	pad_widthZpaddedrS   retr	   r	   r   _get_neighbor   s    rZ   r:   
half_pixelFz$Callable[[float, float], np.ndarray]bool)
rU   scale_factoroutput_width_intr   
get_coeffsroiextrapolation_valuecoordinate_transformation_modeexclude_outsider   c	                 C  s  t | }	||	 }
|dkr>|
dkr&d}n||	d  |
d  }n>|dkrR|| }n*|dkr|d krjtd|
dkr|d |d  |	d  d }n$||d |d   |	d  |
d  }||d |	d  7 }|dk s||	d krt|S n|d	kr|
dkrd
}n|d | d }nh|dkr0|d | d }nL|dkrl||
 }|	d }|d|  }||d |  d }ntd|dt|t }| rd}n|| }|||}t |}t	||| \}}|rt
|D ]&\}}|dk s||	krd||< q|t| }t|| S )NZalign_cornersr   r:   Z
asymmetricZtf_crop_and_resizezroi cannot be None.r   r3   Zpytorch_half_pixelg      r!   r[   Zhalf_pixel_symmetricz(Invalid coordinate_transformation_mode: r%   )r   r*   r
   r)   r"   rW   r'   itemr(   rZ   	enumeraterD   dot)rU   r]   r^   r   r_   r`   ra   rb   rc   Zinput_widthZoutput_widthZx_oriZ
adjustmentcenteroffsetZ	x_ori_intr   r6   r   rS   ZpointsrA   rM   r	   r	   r   _interpolate_1d_with_x   sX    $






ri   zlist[float]z	list[int]r   )
rU   r   scale_factorsoutput_sizer   r_   r`   rc   kwargsr   c              	   K  s   |dkr2t | |d |d |d |f||d|S g }	t| jd D ]x}
t| |
 |d |dd  |dd  |dd  |f|d krd n t|d| ||d d  g|d|}|	| qDt |	|d |d |d |f|d krd n|d || g|d|S )Nr   r   r`   rc   )ri   r   shape_interpolate_nd_with_xr
   Zconcatenateappend)rU   r   rj   rk   r   r_   r`   rc   rl   Zres1drA   rr	   r	   r   ro      sR    



,	ro   )rU   r   c                   s    t  fddtt jD S )Nc                   s   g | ]}t t j| qS r	   )listr   rn   r@   rU   r	   r   r   0  s     z#_get_all_coords.<locals>.<listcomp>)r   r   r   rn   rs   r	   rs   r   _get_all_coords-  s    rt   stretchzlist[int] | Nonezlist[float] | None
str | None)
rU   r_   rk   rj   axesr`   keep_aspect_ratio_policyrc   rl   r   c                   sH  d kr|d krt dtj}	 d k	r|d k	r^dg|	 }
t D ]\}}|| |
|< qD|
}d k	rfddt|	D }t D ]\}}| ||< q||d k	rdg|	 dg|	  }t }t D ](\}}|| ||< |||  ||	| < q|}ntt|	 d k	rfddt|	D }|dkr|dkrPt|   n,|d	krnt|  	 nt d
| fddt|	D }ddddd fddt|	D n|tj 
t|d krt dd krt dt}t|D ]4}ttj|||f||d||t|< q|S )Nz.output_size is None and scale_factors is None.r8   c                   s   g | ]} j | qS r	   rn   r@   rs   r	   r   r   K  s     z#_interpolate_nd.<locals>.<listcomp>r:   c                   s   g | ]}|  j |  qS r	   ry   r@   )rU   rk   r	   r   r   [  s     ru   Z
not_largerZnot_smallerz!Invalid keep_aspect_ratio_policy=c                   s   g | ]}| krnd qS )r8   r	   r@   )rw   r.   r	   r   r   f  s     r-   r'   r9   c                 S  s   t | d S )Nr!   )r'   rN   r	   r	   r   round_half_uph  s    z&_interpolate_nd.<locals>.round_half_upc                   s0   g | ](}| kr"j |  nj | qS r	   ry   r@   )rw   rU   rz   r.   r	   r   r   k  s   zscale_factors is None.zoutput_size is None.rm   )r*   r   rn   re   r   rr   r
   r)   rC   maxrW   r'   r   rt   ro   tuple)rU   r_   rk   rj   rw   r`   rx   rc   rl   rq   Znew_scale_factorsrA   dZnew_output_sizeZnew_roiZnaxesrY   r   r	   )rw   rU   rk   rz   r.   r   _interpolate_nd4  st    








	r~   c                   @  s   e Zd ZdddddZdS )ResizeNrv   rV   c                   s  |dkr>|r"t d|d|dd k	r8fdd}qt}nJ|dkrb|rNtntfdd}n&|d	krx|rrtnt}ntd
|dd krt ||||||	||
d	 j	}|fS fddt
t jD }t| }t |}dt fddD }||}d }t
|jd D ]\}t|| ||||||	||
d	 j	}|d krttj|jd f|j|j	d}|||< q"|t fdd|D |d j }t|}t|D ]\}}|||< qt|t|}|fS )NZnearestz	antilias=z is not supported for mode=r%   c                   s   ~t |  dS )NrV   )r+   )r   r]   )nearest_moder	   r   fct  s    zResize._run.<locals>.fctZcubicc                   s   | | dS )Nr=   r	   )r   r.   )cubic_coeff_afct_r	   r   r     s    Zlinearr$   z
 for mode.)rj   rk   r`   rx   rc   rb   ra   c                   s   g | ]}| kr|qS r	   r	   r   a)rw   r	   r   r     s      zResize._run.<locals>.<listcomp>rH   c                 3  s   | ]} j | V  qd S rL   ry   r   Xr	   r   	<genexpr>  s     zResize._run.<locals>.<genexpr>r   r   c                 3  s   | ]} j | V  qd S rL   ry   r   r   r	   r   r     s     )rH   )RuntimeErrorr+   rF   r7   rJ   rG   r*   r~   rW   r   r   r   rn   r|   r
   Z	transposeZreshapeemptyrr   re   )selfr   r`   ZscalesZsizesZ	antialiasrw   rb   r   rc   ra   rx   r    r   r   outputZnot_axespermZpermutedZ	new_shapeZreshapedresrA   Zres_reshapedZnew_permr   finalr	   )r   rw   r   r   r   r   _run  st    



&zResize._run)NNNNNNNNNNN)__name__
__module____qualname__r   r	   r	   r	   r   r     s              r   )N)r   )Nr,   )r,   )N)Nr:   r[   F)NF)NNNNru   F)
__future__r   typingr   r   Znumpyr
   Zonnx.reference.op_runr   r   r+   r7   rF   rG   rJ   rT   rZ   ri   ro   rt   r~   r   r	   r	   r	   r   <module>   s>   1        "O  "1
      "T