
    `iA>                        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j        d          	 	 d d            Z ej        d          d!d            Zd"dZd#dZ ej        d          d             Zd$dZd Zd Zd%dZ ej        d          d&d            Zd Zd%dZ ej        d          d             Z ej        d          d'd            Z 	 	 d(dddddZ!dS ))    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                    t                               | ||          }|dk    r|t          z  }n
|t          z  }t          j                            t          j                            t                    d          }t          t          j                            |d          d          5 }d                    |
                                          }d d d            n# 1 swxY w Y   ||z  }|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_kernelss           o/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/cupyx/scipy/ndimage/_pba_3d.pyget_pba3d_srcr(   D   s	    (..#FG /  J $00

00
w||BGOOH$=$=vFF	bgll+-?@@$	G	G 11		!++--001 1 1 1 1 1 1 1 1 1 1 1 1 1 1-Js   )(CC!$C!)for_each_devicec                     | 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z--std=c++11	in_params
out_params	operationoptions)cupyElementwiseKernel)r"   r   int_typevaluecodes        r'   _get_encode3d_kernelr8   U   s     $ $77  
	 
 
  
  
  
  
    D ! 	       c                    | j         dk    rt          d          |dvrt          d          |dk    rt          j        }nt          j        }t          j        | j        |d          }t          ||          } || ||j	        	           |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int32r3   zerosshaper8   r@   )arrr   	bit_depthr"   r>   imagekerns          r'   encode3drL   z   s    
x1}}0111  BCCC$JsyS999E888DDe%*%%%%Lr9    c                 D    | dk    rd| d| d| d}n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"   r5   r7   s      r'   _get_decode3d_coderP      s~    $	 	  
  	 	  
  
 Kr9   c                 T    t          | d          }t          j        dd|d          S )z1Unpack 3 coordinates encoded as a single integer.rM   r5   	E encodedzI x, I y, I zr-   r.   )rP   r3   r4   )r"   r7   s     r'   _get_decode3d_kernelrT      s<    
 h444D!" 	   r9   c                     |dk     rt           j        nt           j        }t          j        | |          }t          j        |          }t          j        |          }t	          |          } || |||           |||fS )N        r>   )r3   rE   rD   
empty_likerT   )encodedr"   coord_dtypexyzrK   s          r'   decode3dr^      sz     (5 0 0$**djK{333AAA))DD!Qq!9r9   c                    t          ||||||          }| \  }}	}
d}|
|z  dk    rd}|t          j        |
|z            z  }n|
}|	|z  dk    rd}|t          j        |	|z            z  }n|	}||z  dk    rd}|t          j        ||z            z  }n|}||cxk    o|k    nc  }|s|r&t          |||          }d||z
  fd||	z
  fd||
z
  ff}nd }|S )NFr   T)r   mathceilmax)rG   
block_sizem1m2m3blockxblockyLCMorig_szorig_syorig_sxround_upsxsyszanisosmaxpadding_widths                     r'   _determine_paddingrt      s7    j"b"ff
5
5C %GWgH}49Ws]+++}49Ws]+++}49Ws]+++rR E  2r2w!TG^!4q$.6I
 r9   c                     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));
    rO   )r5   dist_int_types     r'   _generate_distance_computationrx      s+        r9   c                 z    t          d| d|          }|t          d|           z  }|t          | |          z  }|S Nr;   distrA   r5   var_nameraw_varrA   r5   )r	   r   rx   )r5   rw   raw_out_varr7   s       r'   _get_distance_kernel_coder      sS    FK  D 	!q8<<<<D*8]CCCDKr9   Fc                 b    |rdnd}t          | |d          }t          j        dd|d          S )	zAReturns kernel computing the Euclidean distance from coordinates.r+   r,   Tr   zI z, I y, I x
raw F distr-   r.   )r   r3   r4   )r5   
large_distrw   r1   s       r'   _get_distance_kernelr      sU     $.8KK5M)-T  I !! 	   r9   c                      dS )rv   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));
    rO   rO   r9   r'   $_generate_aniso_distance_computationr      s     r9   c                 v    t          d| d|          }|t          d|           z  }|t                      z  }|S rz   )r	   r   r   )r5   r   r7   s      r'   _get_aniso_distance_kernel_coder     sO    FK  D 	!q8<<<<D0222DKr9   c                 T    t          | d          }t          j        dd|d          S )z\Returns kernel computing the Euclidean distance from coordinates with
    axis spacing != 1.Tr   zI z, I y, I x, raw F samplingr   r-   r.   )r   r3   r4   )r5   r1   s     r'   _get_aniso_distance_kernelr     sE     0d  I !1 	   r9   c                    ||rdnd}d}t          | |          }|t          d|dd          z  }|t          d|	          z  }||t          ||          z  }d
}n|t	                      z  }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,   rR   r;   r{   Tr|   r   rS   zE encoded, raw F samplingr   r-   r.   )rP   r	   r   rx   r   r3   r4   )r"   r   samplingrw   r5   r7   r/   s          r'   _get_decode_as_distance_kernelr   %  s     '1<uH h:::D 	OFD   D 	!q8<<<<D.xGGG		4666/	! 	   r9   )float64_distances	distancesindicesc          	      d
   t          |t          j                  }	t          |t          j                  }
t          |
|	||           | j        dk    rt          d| j         d          |d}d}d}n|\  }}}t          | j                  }|dk    rd}n|dk    rd}n|dk    rd}nd	}d}t          |          }| j        \  }}}t          | j        ||||||          }|t          j
        | |d
d          } | j        d         }t          | j                  }t          | |          }d}t          j        |          }||g}||df}||d         z  ||d         z  df}t          j        t          ||                    }|                    d          }|-|                    d          } |                    d          }!d}"nc|                    d          } |                    d          }!t#          t%          t&          |                    }|d         |d         |d         f}" |||||         |d|z
           |f           d|z
  }||df}||d         z  ||d         z  df} | ||||         |d|z
           |f|"z              ||df}||d         z  |df} |!|||d|z
           ||         |f|"z              ||d         |d         |d         f}"||df}||d         z  ||d         z  df} | ||||         |d|z
           |f|"z              ||df}||d         z  |df} |!|||d|z
           ||         |f|"z              ||         }|r|||f}#|rt          j        nt          j        }$|
rt-          ||#|$           nt          j        |#|$          }t1          d |#D                       }%|%dk    }&|sjt3          ||&|          }'| |'|d |d |d |f         |           n7t          j        ||j                  } |'|d |d |d |f         ||           |fS |r$t9          |d |d |d |f         |          \  }(})}*d}+|r||-t;          t=          |          |&          }' |'|*|)|(|           nGt?          t=          |                    }'t          j        ||j                  } |'|*|)|(||           |+|fz   }+|rZ|	r9tA          || j        f| j        z   |(j        j!                   |*|d<   |)|d<   |(|d<   nt          j"        |*|)|(fd          }|+|fz   }+|+S ) Nr;   zexpected a 3D array, got Dr               r   constant)modeconstant_valuesr   )r"   )r   r"   )r7   kernelFloodZkernelMaurerAxiskernelColorAxisrO   kernelMaurerAxisWithSpacingkernelColorAxisWithSpacingrW   c              3   &   K   | ]}|d z
  dz  V  dS )r   r   NrO   ).0ss     r'   	<genexpr>z_pba_3d.<locals>.<genexpr>  s*      >>qQ
>>>>>>r9   rV   )r"   r   r   )r5   r   rR   )r   .)r   .)r   .)axis)#
isinstancer3   ndarrayr   rA   rB   minrG   r
   rt   padrb   rL   
zeros_like	RawModuler(   get_functiontuplemapfloatfloat64float32r   rF   sumr   asarrayr>   r^   r   r   r   r   itemsizestack),rH   r   return_distancesreturn_indicesblock_paramscheck_warp_sizer   r   r   indices_inplace
dt_inplacerd   re   rf   s_minrg   rh   rc   rj   rk   rl   rs   r@   r"   	input_arr
buffer_idxoutput
pba_imagesblockgridpba3dr   r   r   sampling_args	out_shape	dtype_outmax_possible_distr   rK   r[   r\   r]   valss,                                               r'   _pba_3dr   I  s    !$,77OIt|44J O%5~   x1}}@SX@@@AAA!
B 	NNEzz	!	"F 11J #	GWg&	:r2r66 M  hsM
ANNN9Q<D 39~~Hx000IJ_Y''FV$JVQEE!HdeAh.2DNhGGG  E %%n55L --.@AA,,->?? --.KLL,,-IJJUH--..!!hqk8A;?L	J	A
N!;TB  
 ZJVQEE!HdeAh.2D	J	A
N!;TB]R   QEE!HdA&DO	A
N	#Z
%;TB]R    "!hqk8A;?VQEE!HdeAh.2D	J	A
N!;TB]R   QEE!HdA&DO	A
N	#Z
%;TB]R  
 
#F  gw/	$5GDLL4<	 	?Y	9====
9I>>>I  >>I>>>>>&%/
 	 1!%!  D
 VHWHhwh899EEEE<	HHHVHWHhwh898YOOO< .6(7(HWHhwh">?$,. . .1aD 
#'%i00Z  D DAq)$$$$-|I7N7NOOOD|HIODDDHDAq(I...yl" ! 	47SXK#)$;QW=MNNNGFOGFOGFOOj!Q333Gwj Kr9   )r   r   r   r   )r   )r   r   r   )rM   )r   )T)F)FN)NTFNF)"r`   r   r3   numpyrC   _utilr   _pba_2dr   r   r   r   r	   r
   r   r   r   r   memoizer(   r8   rL   rP   rT   r^   rt   rx   r   r   r   r   r   r   r   rO   r9   r'   <module>r      s    				           = = = = = = = = = = = = = = = = = =  . , d@J     d###! ! ! $#!H      " d###  $#   ! ! !H      d###   $#      d###  $# d###      $# F GL/4b#tTb b b b b b br9   