o
    iA>                     @   sD  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		d/ddZejddd0ddZd1ddZd2ddZejdddd Zd3ddZdd Zdd Zd4dd Zejddd5d"d#Zd$d% Zd4d&d'Zejddd(d) Zejddd6d*d+Z 	!	!d7d!ddd,d-d.Z!dS )8    N   )_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}d|
 }W d    n1 s<w   Y  ||7 }|S )N)block_size_3dmarkermax_intr   cudazpba_kernels_3d.hrt
)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%   X/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/cupyx/scipy/ndimage/_pba_3d.pyget_pba3d_srcD   s   
r'   )for_each_devicec                 C   sl   | 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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z--std=c++11	in_params
out_params	operationoptions)cupyElementwiseKernel)r    r   int_typevaluecoder%   r%   r&   _get_encode3d_kernelU   s:   	r6   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int32r1   zerosshaper6   r<   )arrr   	bit_depthr    r:   imagekernr%   r%   r&   encode3dz   s   
rH    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    r3   r5   r%   r%   r&   _get_decode3d_code   s"   rJ   c                 C      t | dd}tjdd|ddS )z1Unpack 3 coordinates encoded as a single integer.rI   r3   	E encodedzI x, I y, I zr+   r,   )rJ   r1   r2   )r    r5   r%   r%   r&   _get_decode3d_kernel   s   rN   c                 C   sV   |dk rt jnt j}t j| |d}t |}t |}t|}|| ||| |||fS )N        r:   )r1   rA   r@   
empty_likerN   )encodedr    coord_dtypexyzrG   r%   r%   r&   decode3d   s   


rW   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)rC   
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.   
rl   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%   )r3   dist_int_typer%   r%   r&   _generate_distance_computation   s
   ro   c                 C   s2   t d| d|d}|td| d7 }|t| |7 }|S Nr7   distr=   r3   var_nameraw_varr=   r3   )r   r   ro   )r3   rn   raw_out_varr5   r%   r%   r&   _get_distance_kernel_code   s   rw   Fc                 C   s,   |rdnd}t | |dd}tjdd|ddS )	zAReturns kernel computing the Euclidean distance from coordinates.r)   r*   Trv   zI z, I y, I x
raw F distr+   r,   )rw   r1   r2   )r3   
large_distrn   r/   r%   r%   r&   _get_distance_kernel   s   r{   c                   C   s   dS )rm   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   r|   c                 C   s.   t d| d|d}|td| d7 }|t 7 }|S rp   )r   r   r|   )r3   rv   r5   r%   r%   r&   _get_aniso_distance_kernel_code  s   
r}   c                 C   rK   )z\Returns kernel computing the Euclidean distance from coordinates with
    axis spacing != 1.Trx   zI z, I y, I x, raw F samplingry   r+   r,   )r}   r1   r2   )r3   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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*   rL   r7   rq   Trr   ru   rM   zE encoded, raw F samplingry   r+   r,   )rJ   r   r   ro   r|   r1   r2   )r    rz   samplingrn   r3   r5   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 )!Nr7   zexpected a 3D array, got Dr               r   constant)modeconstant_valuesr   )r    )r   r    )r5   kernelFloodZkernelMaurerAxiskernelColorAxisr%   kernelMaurerAxisWithSpacingkernelColorAxisWithSpacingrP   c                 s   s    | ]	}|d  d V  qdS )r   r   Nr%   ).0sr%   r%   r&   	<genexpr>  s    z_pba_3d.<locals>.<genexpr>rO   )r    rz   r   )r3   rz   rL   )r   .)r   .)r   .)axis)#
isinstancer1   ndarrayr   r=   r>   minrC   r	   rl   padrZ   rH   
zeros_like	RawModuler'   get_functiontuplemapfloatfloat64float32r   rB   sumr   asarrayr:   rW   r{   r   r~   r   itemsizestack),rD   r   return_distancesreturn_indicesblock_paramscheck_warp_sizer   r   r   indices_inplace
dt_inplacer\   r]   r^   s_minr_   r`   r[   rb   rc   rd   rk   r<   r    	input_arr
buffer_idxoutput
pba_imagesblockgridpba3dr   r   r   sampling_args	out_shape	dtype_outmax_possible_distrz   rG   rT   rU   rV   valsr%   r%   r&   _pba_3dI  s  



















 "



r   )r   r   r   r   )r   )r   r   r   )rI   )r   )T)F)FN)NTFNF)"rX   r   r1   numpyr?   _utilr   _pba_2dr   r   r   r   r   r	   r
   r   r   r   memoizer'   r6   rH   rJ   rN   rW   rl   ro   rw   r{   r|   r}   r~   r   r   r%   r%   r%   r&   <module>   sH    $

$




$

	

	

#