o
    X۷iU                     @  s   d dl mZ d dlZd dlZd dlmZ d dlZd dlmZ dd Zdd Z	d	d
 Z
dd Zd(ddZdd fddZdd Zdd Zdd Zdd Zdd Zd)dd Zd!d" Z	#	d*d$d%Zd&d' ZdS )+    )annotationsN)Iterable)	AxisErrorc                 C  s<   | d u r
|j jdv S t| tjr| j jdv S t | jdv S )Niu)dtypekind
isinstancecupyndarray)outputinput r   O/home/ubuntu/vllm_env/lib/python3.10/site-packages/cupyx/scipy/ndimage/_util.py_is_integer_output   s
   r   c                 C  s*   | dkr|rt |stdd S d S d S )Nconstantz@Non-finite cval is not supported for outputs with integer dtype.)r	   isfiniteNotImplementedError)modecvalinteger_outputr   r   r   _check_cval   s   r   c                 C  s0   | j jdkrt| jj tjS t| jj tjS )zInitialize filter weights based on the input array.

    This helper is only used during initialization of some internal filters
    like prewitt and sobel to avoid costly double-precision computation.
    c)r   r   r	   promote_typesreal	complex64float32)r   r   r   r   _init_weights_dtype   s   r   c                 C  sN   |j jdks| j jdkrt| jj tjS |j jdv rtjS t| jj tjS )Nr   iub)r   r   r	   r   r   r   float64r   )r   weightsr   r   r   _get_weights_dtype$   s
   r    Fc                 C  s   |d u r|j n|}| d u r$|rt|jtj}n|j}tj||d} | S t| ttjfrK|rBt| jdkrBt	
d t| tj} tj|| d} | S t| trit| } |r`| jdkr`tdtj|| d} | S | j |krrtd|r~| jjdkr~td| S )N)r   r   z+promoting specified output dtype to complexzoutput must have complex dtypezoutput shape not correct)shaper	   r   r   r   emptyr   typer   warningswarnstrRuntimeError)r   r   r!   complex_output_dtyper   r   r   _get_output-   s0   




r*   c                 C  s   | S Nr   )xr   r   r   <lambda>F   s    r-   c                   sz   t | tr | g| S zt| } W n ty"    | g|  Y S w  fdd| D }t||kr;d|}t||S )Nc                   s   g | ]} |qS r   r   ).0r,   convr   r   
<listcomp>M   s    z%_fix_sequence_arg.<locals>.<listcomp>z'{} must have length equal to input rank)r   r&   iter	TypeErrorlenformatr'   )argndimnamer0   lstmsgr   r/   r   _fix_sequence_argF   s   

r;   c                 C  s4   t | } |d |  dk s|d |  |krtd| S )N   r   zinvalid origin)int
ValueError)originwidthr   r   r   _check_originT   s    rA   c                 C  s    | dvrd|  d}t || S )N)reflectr   nearestmirrorwrapgrid-mirror	grid-wrapzgrid-reflectz%boundary mode not supported (actual: ))r'   )r   r:   r   r   r   _check_mode[   s   rI   c                   s   | d u r
t t S t| rt| f} n8t| trHt dd | D } | D ]}|  k s3| d kr;td| dq&t  fdd| D } nd}t	|t
t t| t
| kr^t	d| S )	Nc                 s  s    | ]}t |V  qd S r+   )operatorindexr.   axr   r   r   	<genexpr>i   s    z_check_axes.<locals>.<genexpr>   zspecified axis: z is out of rangec                 3  s$    | ]}|d k r|  n|V  qdS )r   Nr   rL   r7   r   r   rN   m      " z6axes must be an integer, iterable of integers, or Nonezaxes must be unique)tupleranger	   isscalarrJ   rK   r   r   r   r>   r4   set)axesr7   rM   messager   rP   r   _check_axesc   s    

rX   c                 C  s4   t dd t| j| jD | jj }|dk rdS dS )Nc                 s  s$    | ]\}}|d  t | V  qdS )rO   N)abs)r.   r,   strider   r   r   rN   {   rQ   z_get_inttype.<locals>.<genexpr>l        r=   	ptrdiff_t)sumzipr!   stridesr   itemsize)r   nbytesr   r   r   _get_inttypev   s   ra   c                 C  sL   t |}t||dt}|| k r$dg|  }t||D ]\}}|||< q|}|S )Nr?   r   )r4   r;   r=   r]   )
ndim_imagerV   r?   num_axesoriginsorigins_temporM   r   r   r   _expand_origin   s   
rg   	footprintc                   s\   t  }|| k r,|j|krt| d|j d| dt|t fddt| D }|S )Nz.ndim (z) must match len(axes) (rH   c                 3  s    | ]	}| vr|V  qd S r+   r   rL   rV   r   r   rN      s    z$_expand_footprint.<locals>.<genexpr>)r4   r7   r'   r	   expand_dimsrR   rS   )rb   rV   rh   footprint_namerc   r   ri   r   _expand_footprint   s   
rl   c                 C  sX   t |}t|ts*t|tr*t||dt}dg|  }t||D ]\}}|||< q|}|S )Nr   r   )r4   r   r&   r   r;   r]   )rb   rV   r   rc   modes
modes_tempmrM   r   r   r   _expand_mode   s   

rp   r=   c                 C  s   |rdnd}|r
dnd}| dv rdj |||d}|S | dkr(d	j |||d}|S | d
kr>dj |||||dkr8dndd}|S | dkrKdj ||d}|S | dkrYdj |||d}|S | dv rddj ||d}|S )Nfminminfmaxmax)rB   rF   z
        if ({ix} < 0) {{
            {ix} = - 1 -{ix};
        }}
        {ix} %= {xsize} * 2;
        {ix} = {min}({ix}, 2 * {xsize} - 1 - {ix});)ixxsizerr   rD   a  
        if ({xsize} == 1) {{
            {ix} = 0;
        }} else {{
            if ({ix} < 0) {{
                {ix} = -{ix};
            }}
            {ix} = 1 + ({ix} - 1) % (({xsize} - 1) * 2);
            {ix} = {min}({ix}, 2 * {xsize} - 2 - {ix});
        }}rC   zD
        {ix} = {min}({max}(({T}){ix}, ({T})0), ({T})({xsize} - 1));r=   z	long long)ru   rv   rr   rt   TrG   z]
        {ix} %= {xsize};
        while ({ix} < 0) {{
            {ix} += {xsize};
        }})ru   rv   rE   z
        if ({ix} < 0) {{
            {ix} += ({sz} - 1) * (({int_t})(-{ix} / ({sz} - 1)) + 1);
        }} else if ({ix} > ({sz} - 1)) {{
            {ix} -= ({sz} - 1) * ({int_t})({ix} / ({sz} - 1));
        }};)ru   szint_t)r   zgrid-constantzP
        if (({ix} < 0) || {ix} >= {xsize}) {{
            {ix} = -1;
        }}r5   )r   ru   rv   ry   float_ixmin_funcmax_funcopsr   r   r    _generate_boundary_condition_ops   sF   +	#r   c                   s@   d  fddt | d ddD }djd|d d	S )
Nz<{type} ind_{j} = _i % ysize_{j} - {offset}; _i /= ysize_{j};c                   s    g | ]} j || d qS ))r#   joffsetrz   )r.   r   codeint_typeoffsetsr   r   r1      s    z)_generate_indices_ops.<locals>.<listcomp>rO   r   z3{type} _i = i;
{body}
{type} ind_0 = _i - {offset};
)r#   bodyr   )rS   r5   join)r7   r   r   r   r   r   r   _generate_indices_ops   s   r   )NF)rh   )r=   F)
__future__r   rJ   r$   collections.abcr   r	   r   r   r   r   r    r*   r;   rA   rI   rX   ra   rg   rl   rp   r   r   r   r   r   r   <module>   s.    
	


3