o
    X۷i=                     @  sP  d dl mZ d dlZd dlZd dlZd dlZddlmZ ddl	m
Z
mZmZmZmZmZmZ dZdZdZed			d0ddZejd	dd1ddZd2ddZd3ddZejd	ddd Zd4ddZdd Zdd Zd5d d!Zejd	dd6d#d$Zd%d& Zd5d'd(Z ejd	dd)d* Z!ejd	dd7d+d,Z"	"	"d8d"ddd-d.d/Z#dS )9    )annotationsN   )_get_inttype)_check_distances_check_indices_distance_tranform_arg_check_generate_indices_ops_generate_shape_get_block_sizelcmz_

#define MARKER     {marker}
#define MAX_INT    {max_int}
#define BLOCKSIZE  {block_size_3d}

as  
// Sites     : ENCODE(x, y, z, 0, 0)
// Not sites : ENCODE(0, 0, 0, 1, 0) or MARKER
#define ENCODED_INT_TYPE int
#define ZERO 0
#define ONE 1
#define ENCODE(x, y, z, a, b)  (((x) << 20) | ((y) << 10) | (z) | ((a) << 31) | ((b) << 30))
#define DECODE(value, x, y, z)     x = ((value) >> 20) & 0x3ff;     y = ((value) >> 10) & 0x3ff;     z = (value) & 0x3ff

#define NOTSITE(value)  (((value) >> 31) & 1)
#define HASNEXT(value)  (((value) >> 30) & 1)

#define GET_X(value)    (((value) >> 20) & 0x3ff)
#define GET_Y(value)    (((value) >> 10) & 0x3ff)
#define GET_Z(value)    ((NOTSITE((value))) ? MAX_INT : ((value) & 0x3ff))

a  
// Sites     : ENCODE(x, y, z, 0, 0)
// Not sites : ENCODE(0, 0, 0, 1, 0) or MARKER
#define ENCODED_INT_TYPE long long
#define ZERO 0L
#define ONE 1L
#define ENCODE(x, y, z, a, b)  (((x) << 40) | ((y) << 20) | (z) | ((a) << 61) | ((b) << 60))
#define DECODE(value, x, y, z)     x = ((value) >> 40) & 0xfffff;     y = ((value) >> 20) & 0xfffff;     z = (value) & 0xfffff

#define NOTSITE(value)  (((value) >> 61) & 1)
#define HASNEXT(value)  (((value) >> 60) & 1)

#define GET_X(value)    (((value) >> 40) & 0xfffff)
#define GET_Y(value)    (((value) >> 20) & 0xfffff)
#define GET_Z(value)    ((NOTSITE((value))) ? MAX_INT : ((value) & 0xfffff))

T          c                 C  s   t j| ||d}|dkr|t7 }n|t7 }tjtjtd}t	tj|d}d|
 }W d    n1 s;w   Y  ||7 }|S )N)block_size_3dmarkermax_intr   cudazpba_kernels_3d.h
)pba3d_defines_templateformatpba3d_defines_encode_64bitpba3d_defines_encode_32bitospathjoindirname__file__open	readlines)r   r   r   size_max
pba3d_codekernel_directoryfpba3d_kernels r%   Q/home/ubuntu/vllm_env/lib/python3.10/site-packages/cupyx/scipy/ndimage/_pba_3d.pyget_pba3d_srcF   s   
r'   )for_each_devicec                 C  sj   | dkrd}nd}| dkrd}nd}d| d| d| d	| d
| d| d| d| d}t jdd|dS )z-Pack array coordinates into a single integer.r   	ptrdiff_tintz!(((x) << 40) | ((y) << 20) | (z))z!(((x) << 20) | ((y) << 10) | (z))z$
    if (arr[i]) {
        out[i] = z;
    } else {
        z# shape_2 = arr.shape()[2];
        z# shape_1 = arr.shape()[1];
        z _i = i;
        z2 x = _i % shape_2;
        _i /= shape_2;
        z2 y = _i % shape_1;
        _i /= shape_1;
        z z = _i;
        out[i] = z;
    }
    z	raw B arrz	raw I out	in_params
out_params	operation)cupyElementwiseKernel)r    r   int_typevaluecoder%   r%   r&   _get_encode3d_kernelW   s8   	r4   c                 C  sj   | j dkr	td|dvrtd|dkrtj}ntj}tj| j|dd}t||d}|| ||j	d	 |S )
N   zonly 3d arr supported)r   @   z'only bit_depth of 32 or 64 is supportedr   C)dtypeorder)r   )size)
ndim
ValueErrornpint64int32r/   zerosshaper4   r:   )arrr   	bit_depthr    r8   imagekernr%   r%   r&   encode3d{   s   
rF    c                 C  s@   | dkrd| d| d| d}|S d| d| d| d}|S )	Nr   z	
        z( x = (encoded >> 40) & 0xfffff;
        z( y = (encoded >> 20) & 0xfffff;
        z  z = encoded & 0xfffff;
        z& x = (encoded >> 20) & 0x3ff;
        z& y = (encoded >> 10) & 0x3ff;
        z z = encoded & 0x3ff;
        r%   )r    r1   r3   r%   r%   r&   _get_decode3d_code   s"   rH   c                 C     t | dd}tjdd|dS )z1Unpack 3 coordinates encoded as a single integer.rG   r1   	E encodedzI x, I y, I zr+   )rH   r/   r0   )r    r3   r%   r%   r&   _get_decode3d_kernel   s   rL   c                 C  sV   |dk rt jnt j}t j| |d}t |}t |}t|}|| ||| |||fS )N        r8   )r/   r?   r>   
empty_likerL   )encodedr    coord_dtypexyzrE   r%   r%   r&   decode3d   s   


rU   c                 C  s   t ||||||}| \}}	}
d}|
| dkr"d}|t|
|  }n|
}|	| dkr6d}|t|	|  }n|	}|| dkrJd}|t||  }n|}||  koU|kn   }|s]|rvt|||}d|| fd||	 fd||
 ff}|S d }|S )NFr   T)r   mathceilmax)rA   
block_sizem1m2m3blockxblockyLCMorig_szorig_syorig_sxround_upsxsyszanisosmaxpadding_widthr%   r%   r&   _determine_padding   s.   
rj   c                 C  s   d|  d| dS )
    Compute euclidean distance from current coordinate (ind_0, ind_1, ind_2) to
    the coordinates of the nearest point (z, y, x).z
    z tmp = z - ind_0;
    z sq_dist = tmp * tmp;
    tmp = y - ind_1;
    sq_dist += tmp * tmp;
    tmp = x - ind_2;
    sq_dist += tmp * tmp;
    dist[i] = sqrt(static_cast<F>(sq_dist));
    r%   )r1   dist_int_typer%   r%   r&   _generate_distance_computation   s
   rm   c                 C  s2   t d| d|d}|td| d7 }|t| |7 }|S Nr5   distr;   r1   var_nameraw_varr;   r1   )r	   r   rm   )r1   rl   raw_out_varr3   r%   r%   r&   _get_distance_kernel_code   s   ru   Fc                 C  s*   |rdnd}t | |dd}tjdd|dS )zAReturns kernel computing the Euclidean distance from coordinates.r)   r*   Trt   zI z, I y, I x
raw F distr+   )ru   r/   r0   )r1   
large_distrl   r.   r%   r%   r&   _get_distance_kernel   s   ry   c                   C  s   dS )rk   a  
    F tmp = static_cast<F>(z - ind_0) * sampling[0];
    F sq_dist = tmp * tmp;
    tmp = static_cast<F>(y - ind_1) * sampling[1];
    sq_dist += tmp * tmp;
    tmp = static_cast<F>(x - ind_2) * sampling[2];
    sq_dist += tmp * tmp;
    dist[i] = sqrt(static_cast<F>(sq_dist));
    r%   r%   r%   r%   r&   $_generate_aniso_distance_computation   s   rz   c                 C  s.   t d| d|d}|td| d7 }|t 7 }|S rn   )r	   r   rz   )r1   rt   r3   r%   r%   r&   _get_aniso_distance_kernel_code  s   
r{   c                 C  rI   )z\Returns kernel computing the Euclidean distance from coordinates with
    axis spacing != 1.Trv   zI z, I y, I x, raw F samplingrw   r+   )r{   r/   r0   )r1   r.   r%   r%   r&   _get_aniso_distance_kernel  s   r|   c                 C  s   |du r
|rdnd}d}t | |d}|td|ddd7 }|td|d	7 }|du r2|t||7 }d
}n|t 7 }d}tj|d|dS )am  Fused decode3d and distance computation.

    This kernel is for use when `return_distances=True`, but
    `return_indices=False`. It replaces the separate calls to
    `_get_decode3d_kernel` and `_get_distance_kernel`, avoiding the overhead of
    generating full arrays containing the coordinates since the coordinate
    arrays are not going to be returned.
    Nr)   r*   rJ   r5   ro   Trp   rs   rK   zE encoded, raw F samplingrw   r+   )rH   r	   r   rm   rz   r/   r0   )r    rx   samplingrl   r1   r3   r,   r%   r%   r&   _get_decode_as_distance_kernel#  s$   

r~   )float64_distances	distancesindicesc          ,      C  s  t |tj}	t |tj}
t|
|	|| | jdkr!td| j d|d u r,d}d}d}n|\}}}t| j}|dkr=d}n|dkrDd}n	|dkrKd}nd	}d}t|}| j\}}}t	| j||||||}|d urqtj
| |d
dd} | jd }t| j}t| |d}d}t|}||g}||df}||d  ||d  df}tjt||dd}|d}|d u r|d} |d}!d}"n|d} |d}!ttt|}|d |d |d f}"||||| |d|  |f d| }||df}||d  ||d  df}| |||| |d|  |f|"  ||df}||d  |df}|!|||d|  || |f|"  |d ur?|d |d |d f}"||df}||d  ||d  df}| |||| |d|  |f|"  ||df}||d  |df}|!|||d|  || |f|"  || }|r|||f}#|rtjntj}$|
rt||#|$ ntj|#|$d}tdd |#D }%|%dk}&|st||&|d}'|d u r|'|d |d |d |f | |fS tj||jd}|'|d |d |d |f || |fS |r	t|d |d |d |f |d\}(})}*d}+|r?|d u r#tt||&d}'|'|*|)|(| ntt|d}'tj||jd}|'|*|)|(|| |+|f }+|rn|	r_t || jf| j |(jj! |*|d< |)|d< |(|d< n
tj"|*|)|(fdd }|+|f }+|+S )!Nr5   zexpected a 3D array, got Dr               r   constant)modeconstant_valuesr   )r    )r   r    )r3   kernelFloodZkernelMaurerAxiskernelColorAxisr%   kernelMaurerAxisWithSpacingkernelColorAxisWithSpacingrN   c                 s  s    | ]	}|d  d V  qdS )r   r   Nr%   ).0sr%   r%   r&   	<genexpr>  s    z_pba_3d.<locals>.<genexpr>rM   )r    rx   r}   )r1   rx   rJ   )r   .)r   .)r   .)axis)#
isinstancer/   ndarrayr   r;   r<   minrA   r
   rj   padrX   rF   
zeros_like	RawModuler'   get_functiontuplemapfloatfloat64float32r   r@   sumr~   asarrayr8   rU   ry   r   r|   r   itemsizestack),rB   r}   return_distancesreturn_indicesblock_paramscheck_warp_sizer   r   r   indices_inplace
dt_inplacerZ   r[   r\   s_minr]   r^   rY   r`   ra   rb   ri   r:   r    	input_arr
buffer_idxoutput
pba_imagesblockgridpba3dr   r   r   sampling_args	out_shape	dtype_outmax_possible_distrx   rE   rR   rS   rT   valsr%   r%   r&   _pba_3dF  s  



















 "



r   )r   r   r   r   )r   )r   r   r   )rG   )r   )T)F)FN)NTFNF)$
__future__r   rV   r   r/   numpyr=   _utilr   _pba_2dr   r   r   r   r	   r
   r   r   r   r   memoizer'   r4   rF   rH   rL   rU   rj   rm   ru   ry   rz   r{   r|   r~   r   r%   r%   r%   r&   <module>   sJ    $

#




$

	

	

"