
    `iA                        d dl Z d dlZd dlZd dlZddlmZ  ee d          re j        Zn	 d Zd ZdZ	d Z
 ej        d	          d!d            Zd"dZ ej        d	          d#d            Zdej        fdZdej        fdZd Zd$dZd Zd%dZ ej        d	          d             Zd%dZ ej        d	          d             Zd Zd Zd Z	 	 d&ddddd ZdS )'    N   )_get_inttypelcmc                 R    t          || t          j        | |          z  z            S N)absmathgcd)abs     o/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/cupyx/scipy/ndimage/_pba_2d.py_lcmr      s$    1TXa^^+,---    c                  H   t          |           }t          d | D                       st          d          |dk    rdS t          | d                   }|dk    rt	          |          S t          d|          D ]'}t          | |                   }t          ||          }(|S )Nc              3   J   K   | ]}t          |t          j                  V  d S r   )
isinstancenumbersIntegral).0r   s     r   	<genexpr>zlcm.<locals>.<genexpr>   s/      EEq:a!122EEEEEEr   zall arguments must be integersr   r   )lenall	TypeErrorintr   ranger   )integersnargsresixs        r   r   r      s    HEEHEEEEE 	><===A::1(1+A::s88Oq% 	 	AHQK  AsA,,CC
r   a  

// MARKER is used to mark blank pixels in the texture.
// Any uncolored pixels will have x = MARKER.
// Input texture should have x = MARKER for all pixels other than sites
#define MARKER      {marker}
#define BLOCKSIZE   {block_size_2d}
#define pixel_int2_t {pixel_int2_t}                // typically short2 (int2 for images with > 32k pixels per side)
#define make_pixel(x, y)  {make_pixel_func}(x, y)  // typically make_short2 (make_int2 images with > 32k pixels per side

c                 p    | t           j        k    rd}n"| t           j        k    rd}nt          d          |S )z<use a minimum value that is appropriate to the integer dtype i   z8expected int_dtype to be either cupy.int16 or cupy.int32)cupyint16int32
ValueError)	int_dtypemarkers     r   _init_markerr)   ,   sH    DJ	dj	 	  "F
 
 	
 Mr   T@   r"   short2c                    d|z   }t                               | |||          }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make_)block_size_2dr(   pixel_int2_tmake_pixel_funccudazpba_kernels_2d.hrt
)	pba2d_defines_templateformatospathjoindirname__file__open	readlines)r.   r(   r/   r0   
pba2d_codekernel_directoryfpba2d_kernelss           r   get_pba2d_srcrA   <   s    ,O'..#!'	 /  J 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Fc                     | r\t           j        j                                        }t           j        j                            |          }t          |d                   S dS )NwarpSize    )r#   r1   runtime	getDevicegetDevicePropertiesr   )check_warp_sizedevdevice_propertiess      r   _get_block_sizerK   N   sR     i))++ I-AA#FF$Z0111rr   )for_each_devicec                 D    d| d| d}t          j        dd|d          S )a=  Pack coordinates into array of type short2 (or int2).

    This kernel works with 2D input data, `arr` (typically boolean).

    The output array, `out` will be 3D with a signed integer dtype.
    It will have size 2 on the last axis so that it can be viewed as a CUDA
    vector type such as `int2` or `float2`.
    z&
    if (arr[i]) {
        out[2*i] = z;
        out[2*i + 1] = z;
    } else {
        int shape_1 = arr.shape()[1];
        int _i = i;
        int ind_1 = _i % shape_1;
        _i /= shape_1;
        out[2*i] = ind_1;   // out.x
        out[2*i + 1] = _i;  // out.y
    }
    z	raw B arrz	raw I outz--std=c++11	in_params
out_params	operationoptions)r#   ElementwiseKernel)int_typer(   codes      r   _get_pack_kernelrW   W   sR        D ! 	   r   c                    | j         dk    rt          d          t          j        ddg|gdz  d          }t          j        | j        dz   |          }|j        d| j        z  k    sJ t          |t          j        k    rdnd	|
          } || || j                   t          j	        |
                    |                    }|S )N   zonly 2d arr supportedr    ynamesformatsrY   dtypeshortr   )rU   r(   size)ndimr&   r#   r`   zerosshaperc   rW   r$   squeezeview)arrr(   r'   
int2_dtypeoutpack_kernels         r   
_pack_int2rm   v   s    
x1}}0111sCji[1_MMNNJ
*SY%Y
7
7
7C8q38|####"%33  K KSsx((((
,sxx
++
,
,CJr   c                     |                      |                              | j        dz             }|r|                                }|S )Nr^   )rh   reshaperf   copy)img	make_copyr'   temps       r   _unpack_int2rt      sB    88I&&sy4'788D yy{{Kr   c                 J    | \  }}||k    s||k    rd||z
  fd||z
  ff}nd }|S )Nr    )rf   padded_size
block_sizeorig_syorig_sxpadding_widths         r   _determine_paddingr|      sR     GW+K!7!7g%&K',A(B
 r   rk   c           
      ^    d}|sd|z   }t          |           D ]}|| d| d| d| dz  }|S )N _raw_z shape_z = z	.shape()[z];
r   )rd   rU   var_nameraw_varrV   r   s         r   _generate_shaper      sb    D &X%4[[ E E8DDADD(DDQDDDDKr   c           
      p    | d}t          | dz
  dd          D ]}|| d| d| d| dz  }|| d	z  }|S )
Nz	 _i = i;
r   r   z ind_z = _i % shape_z;
_i /= shape_z;
z ind_0 = _i;r   )rd   rU   rV   js       r   _generate_indices_opsr      sv    """D4!8Q## L L8KK!KK1KKQKKKKx%%%%DKr   c                 l    t          d| d|          }|t          d|           z  }|d|  d| dz  }|S )NrY   distrd   rU   r   r   rd   rU   z
    z
 tmp;
    z sq_dist;
    tmp = y[i] - ind_0;
    sq_dist = tmp * tmp;
    tmp = x[i] - ind_1;
    sq_dist += tmp * tmp;
    dist[i] = sqrt(static_cast<F>(sq_dist));
    r   r   )rU   dist_int_typeraw_out_varrV   s       r   _get_distance_kernel_coder      sn    FK  D 	!q8<<<<D     D Kr   c                 V    t          | |d          }t          j        dd|d          S )AReturns kernel computing the Euclidean distance from coordinates.Tr   zraw I y, raw I x
raw F distrN   rO   )r   r#   rT   )rU   r   rR   s      r   _get_distance_kernelr      sG     *-T  I !$ 	   r   c                 ^    t          d| d|          }|t          d|           z  }|dz  }|S )NrY   r   r   r   z
    F tmp;
    F sq_dist;
    tmp = static_cast<F>(y[i] - ind_0) * sampling[0];
    sq_dist = tmp * tmp;
    tmp = static_cast<F>(x[i] - ind_1) * sampling[1];
    sq_dist += tmp * tmp;
    dist[i] = sqrt(sq_dist);
    r   )rU   r   rV   s      r   _get_aniso_distance_kernel_coder      sO    FK  D 	!q8<<<<D  D Kr   c                 T    t          | d          }t          j        dd|d          S )r   Tr   z raw I y, raw I x, raw F samplingr   rN   rO   )r   r#   rT   )rU   rR   s     r   _get_aniso_distance_kernelr      s<     0dKKKI!4 	   r   c                     g }|s|s|                     d           | r|s|                     d           |r|s|                     d           |r"t          d                    |                    dS )z1Raise a RuntimeError if the arguments are invalidz<at least one of return_distances/return_indices must be Truez6return_distances must be True if distances is suppliedz2return_indices must be True if indices is suppliedz, N)appendRuntimeErrorr8   )distances_outindices_outreturn_distancesreturn_indices
error_msgss        r   _distance_tranform_arg_checkr      s     J L~ LJ	L 	L 	L 
- 
D	
 	
 	
  P> PNOOO 2499Z001112 2r   c                 t    | j         |k    rt          d          | j        |k    rt          d|           d S )Nzdistances array has wrong shapez!distances array must have dtype: )rf   r   r`   )	distancesrf   r`   s      r   _check_distancesr      sP    %<===%7779 9 	9  r   c                     | j         |k    rt          d          | j        j        dvrt          d          | j        j        |k     rt          d|           d S )Nzindices array has wrong shapeiuz(indices array must have an integer dtypez#indices dtype must have itemsize > )rf   r   r`   kinditemsize)indicesrf   r   s      r   _check_indicesr      sz    }:;;;}%%6
 
 	
 
	(	*	*<(<<
 
 	
 
+	*r   )float64_distancesr   r   c          
         t          |t          j                  }	t          |t          j                  }
t          |
|	||           t	          |          }|t          j        t          | j                  |z            |z  }||z  }t          dt          ||z  |                    }dt          j
        t          j        |                    z  }||z  dk    rt          d          t          t          ||          d          }nt          d |D                       rt          d          |\  }}}t          j        |          dz  dk    rt          d          t          ||||          }t          j        t          | j                  |z            |z  }|||z  k    rt          d	|           |||z  k    rt          d
|           |||z  k    rt          d|           |||fD ]$}||z  dk    rt          d| d|||f d          %t          | j                  }|dk    rt          j        }d}n.|dk    rt          dd d| j                   t          j        }d}t%          |          }| j        \  }}t'          | j        ||          }|t          j        | |dd          } | j        d         }t+          | ||          }t          j        |          }t          j        ddg|gdz  d          }t          j        d|z  |z  f|          }t          j        t5          |||                    }|                    d          }|                    d          } |                    d           }!|                    d!          }"|                    d"          }#|                    d#          }$|@|                    d$          }%|                    d%          }&|                    d&          }'n?|                    d'          }%|                    d(          }&|                    d)          }'|ddf}(t          j        ||(d         z            |df})||z  }* ||)|(||||*f            | |)|(||||*f            |!|)|(||||*f            |"|)|(|||||*f           |ddf}(t          j        ||(d         z            |df})||z  }+|d*},n2t9          t;          t<          |                    }|d         |d         f}, |%|)|(||||+f|,z               |#|)|(||||+f           |}-|-dk    rEt          j        ||(d         z            |-dz  f}) |&|)|(||||||-z  f|,z              |-dz  }-|-dk    Et          j        ||(d         z            |f}) |$|)|(||||f           ||df}(t          j        ||(d         z            ddf}) |'|)|(|||f|,z              t?          |d+|,          }|d |d |df         }.|d |d |df         }/d*}0|r|rt          j         nt          j!        }1|
rtE          ||/j        |1           nt          j#        |/j        |1          }tI          d- |/j        D                       }2|2d.k     rd/nd0}3|3tK          tM          |          |31          }4 |4|/|.||j'        2           nHtQ          tM          |          3          }4t          j)        ||1          } |4|/|.|||j'        2           |0|fz   }0|rT|	r4tU          || j+        f| j        z   |.j        j,                   |/|d4<   |.|d5<   nt          j-        |/|.fd6          }|0|fz   }0|0S )7Nr   rY   r   zerror in setting default m2c              3   "   K   | ]
}|d k     V  dS )r   Nrv   )r   ps     r   r   z_pba_2d.<locals>.<genexpr>,  s&      ++q1u++++++r   z((m1, m2, m3) in blockparams must be >= 1gh㈵>zm2 must be a power of 2z0m1 too large. must be <= padded arr.shape[0] // z0m2 too large. must be <= padded arr.shape[1] // z0m3 too large. must be <= padded arr.shape[1] // zLargest dimension of image (z<) must be evenly disivible by each element of block_params: .i   r+   i   zmaximum axis size of z  exceeded, for image with shape int2constant)modeconstant_values)r(   r'   r    rZ   r[   r_   )r.   r(   r/   )rV   kernelFloodDownkernelFloodUpkernelPropagateInterbandkernelUpdateVerticalkernelCreateForwardPointerskernelDoubleToSingleListkernelProximatePointskernelMergeBandskernelColor kernelProximatePointsWithSpacingkernelMergeBandsWithSpacingkernelColorWithSpacingrv   F)rr   r'   c              3   &   K   | ]}|d z
  dz  V  dS )r   rY   Nrv   )r   ss     r   r   z_pba_2d.<locals>.<genexpr>  s*      <<qQ
<<<<<<r   l        r   	ptrdiff_t)rU   r   rb   )rU   )r   .)r   .)axis).r   r#   ndarrayr   rK   r	   ceilmaxrf   minfloorlog2r   anyr&   r   r$   r%   r)   r|   padrm   
zeros_liker`   empty	RawModulerA   get_functiontuplemapfloatrt   float64float32r   re   sumr   r   rc   r   asarrayr   rd   r   stack)5ri   samplingr   r   block_paramsrH   r   r   r   indices_inplace
dt_inplacerx   rw   m1m2m3multiplem	shape_maxr'   pixel_int2_typer(   ry   rz   r{   rc   	input_arroutputrj   marginpba2dr   r   r   r   r   r   r   r   r   blockgrid	bandSize1	bandSize2sampling_argsnoBandr    rZ   vals	dtype_outmax_possible_distr   distance_kernels5                                                        r   _pba_2dr     s|	    !$,77OIt|44J O%5~   !11JiCI ;<<zI J&Cz1:>>??
49R==)))q  <===Ra  ++l+++++ 	IGHHH!
B9R==1t##6777z2r2..iCI 9::XE	K:%%%KzKK
 
 	
 
K:%%%KzKK
 
 	
 
K:%%%KzKK
 
 	
 "b\  ?aN{ N N?A2rlN N N     CIIEJ	"   % % %% %   J	 )$$FyGW&sy+zJJM hsM
ANNN9Q<D3vCCCI_Y''FsCji[1_MMNNJZR$(
;;;F N$(
 
 
  E (():;;O&&77M$112LMM --.DEE"'"4"4%# #  %112LMM % 2 23J K K --.@AA((77 % 2 2.!
 !
 !--.KLL(()ABBAEIdU1Xo&&A.D
IO	ItY/   M	ItY/   	FD),   	FFD)4   AEIdU1Xo&&A.D
I UH--..!!hqk2	D),}<  
  	ItY/   F
1**	$q/**FaK8Y	4@=P	
 	
 	

 	1 1** IdU1Xo&&-D	It,   QEIdU1Xo&&1-DK	FD!M1   &EYGGGFxx'1$%Axx'1$%AD #$5GDLL4<	 	=Y;;;;
17)<<<I  <<AG<<<<<!2U!:!:2%i00+  O OAq)).AAAAA8%i00  O |HI>>>HOAq(IINKKKKyl" ! 	17SXK#)$;QW=MNNNGFOGFOOj!Qa000Gwj Kr   )r*   r"   r+   )F)r"   )rk   T)T)NTFNF)r	   r   r6   r#   _utilr   hasattrr   r   r4   r)   memoizerA   rK   rW   r$   rm   rt   r|   r   r   r   r   r   r   r   r   r   r   rv   r   r   <module>r      sY     				       
74 
(CC@. . .  
     d   "    d###   $#< "TZ     !&    
 
 
        " d###
 
 $#
   " d###  $#2 2 2"9 9 9

 

 

 GL/4k#tTk k k k k k kr   