
    bi5                       d dl mZ d dlZd dlZd dlmZ d dlmZ d dl	m
Z
mZmZmZmZmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ d d	lmZmZ  e
j<                  eej@                  fejB                          ej<                  eej@                  ejD                  jF                  fejH                          ej<                  eej@                  fejJ                          ej<                  eej@                  fejL                          ej<                  eej@                  fejN                          ej<                  ejD                  jF                  ejD                  jN                          ej<                  eej@                  fe        ej<                  ejD                  jF                  e        ej<                  ej@                        d&d
       Z( e
j<                  ejD                  jF                        d'd       Z) ej<                  ejD                  jF                        d(d       Z* ejV                  d       e
jV                  d       ejV                  d       ejV                  d       ejV                  d       ejV                  d      d                                           Z,d'dZ- ejV                  d       e
jV                  d      d               Z. ejV                  d       e
jV                  d       ejV                  d       ejV                  d       ejV                  d      d                                    Z/ ejV                  d       e
jV                  d       ejV                  d      d                      Z0d Z1 ej<                  ejD                  jF                        d        Z2 ej<                  eej@                  f      d        Z3d Z4d)dZ5 ej<                  eej@                  f      d        Z6d Z7 G d de      Z8 ej<                  ej@                        d        Z9 G d  d!e8      Z: ed"d#e8d$%      Z;e;jy                  d# e:              y)*    )annotationsN)chunk)Array)concatenate_lookupdivide_lookupeinsum_lookupempty_lookupnannumel_lookupnumel_lookuppercentile_lookuptake_lookuptensordot_lookupto_cupy_dispatchto_numpy_dispatch)divide)	ma_divide_percentile)CreationDispatchDaskBackendEntrypointc                    t        | ||      S Nr   )aqmethods      N/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/dask/array/backends.py
percentiler   %   s    q!V$$    c                6   t         j                  j                  | |      }| D cg c]  }t        |d      s|j                   }}t        d |D              rt        d      |r-t        j                  |      }t        |      dk(  r
|d   |_        |S c c}w )N)axis
fill_valuec              3  P   K   | ]  }t        |t        j                           y wr   )
isinstancenpndarray).0fs     r   	<genexpr>z_concatenate.<locals>.<genexpr>.   s     
::a$
:s   $&zADask doesn't support masked array's with non-scalar `fill_value`s   r   )	r$   maconcatenatehasattrr!   any
ValueErroruniquelen)arraysr    outifill_valuess        r   _concatenater5   *   s    
%%

F

.C)/LA71l3K1<<LKL

:k
::O
 	
 ii,{q (^CNJ Ms
   BBc                   	 t        |       |\  }}	 t	        |      }t        |      }	 t	        |      }t        |      }| j
                  }| j                  }|j
                  }	|j                  }
d}||k7  rd}nPt        |      D ]B  }|||      |	||      k7  rd} n-||   dk  r||xx   |z  cc<   ||   dk  s6||xx   |
z  cc<   D |st        d      t        |      D cg c]	  }||vs| }}||z   }d}|D ]
  }|||   z  } d|f}|D cg c]  }||   	 }}t        |
      D cg c]	  }||vs| }}||z   }d}|D ]
  }||	|   z  } |df}|D cg c]  }|	|   	 }}| j                  |      j                  |      }|j                  |      j                  |      }t        j                  j                  ||      }|j                  ||z         S # t        $ r/ t        t        | d            }t        t        d|            }Y w xY w# t        $ r	 |g}d}Y  w xY w# t        $ r	 |g}d}Y w xY wc c}w c c}w c c}w c c}w )Nr   r)   TFzshape-mismatch for sum)iter	TypeErrorlistranger0   shapendimr.   	transposereshaper$   r*   dot)r   baxesaxes_aaxes_bnanbas_ndabsndbequalknotin	newaxes_aN2r    
newshape_aolda	newaxes_b
newshape_boldbatbtress                            r   
_tensordotrX   :   s   T

 [f[f ''C
&&C	
B
&&CE	Rxr 	!A6!9~F1I.ay1}q	S 	ay1}q	S 		! 122 c
61avoQ6E6I	
B 
c$ibJ"'($CI(D(c
61avoQ6E6I	
B 
bhbJ!&'BtH'D'	
Y		'	'
	3B	
Y		'	'
	3B
%%))B
C;;td{##w  &eTE1o&eAtn%&    4 7 )6 (sW   G H H- $	I.II-	I7II4HHH*)H*-H?>H?cupyc                    dd l t        j                  j                  j                         t        j                  j                  j                         t        j                  j                  j                         t        j                  j                  t               t        j                  j                  t               t        j                  j                  t               t        j                  j                        fd       } t!        j                  t"        j                        fd       }t%        j                  j                        fd       }y )Nr   c                *     j                   | fi |S r   )asnumpydatakwargsrY   s     r   cupy_to_numpyz$register_cupy.<locals>.cupy_to_numpy       t||D+F++r   c                *     j                   | fi |S r   )asarrayr]   s     r   numpy_to_cupyz$register_cupy.<locals>.numpy_to_cupy   ra   r   c                 p    |j                  dd        |j                  dd         j                  | i |S )Ncastingorder)popeinsum)argsr_   rY   s     r   _cupy_einsumz#register_cupy.<locals>._cupy_einsum   s7     	

9d#

7D!t{{D+F++r   )rY   r   registerr%   r+   r   taker   	tensordotr   r   r   _numel_arrayliker
   	_nannumelr   r   r$   r   )r`   rd   rk   rY   s      @r   register_cupyrq   ~   s     d.>.>?tyy1dllDNN;t||Z8$,,(89T\\95-, ., rzz*, +, DLL), *,r   c                b    |dvrt        d      |rt        d       |fn|t        d       f}| |   S )N>   r   r)   z:Sparse matrices can only be concatenated along axis 0 or 1)r.   slice)arrayidxr    indexers       r   sparse_takerw      s;    6UVV$(uT{C sE$K.@G>r   cupyxc                    ddl m}  	 ddl mm dfd	}t        j                  | |       t        j                  | t               t        j                  | t               y # t        $ r}t	        d      |d }~ww xY w)Nr   )spmatrix)hstackvstackz>Stacking of sparse arrays requires at least CuPy version 8.0.0c                X    |dk(  r |       S |dk(  r |       S d|z  }t        |      )Nr   r)   zECan only concatenate cupy sparse matrices for axis in {0, 1}.  Got %s)r.   )Lr    msgr{   r|   s      r   _concat_cupy_sparsez+register_cupyx.<locals>._concat_cupy_sparse   sC    19!9QY!9"$()  S/!r   r   )cupyx.scipy.sparserz   r{   r|   ImportErrorr   rl   r   _tensordot_scipy_sparser   rw   )rz   er   r{   r|   s      @@r   register_cupyxr      sn     ,5
" *=>h(?@;/'  L
	s   A$ $	A>-A99A>sparsec                    dd l } t        j                  | j                  | j                         t        j                  | j                  | j                         t        j                  | j                  t               t        j                  | j                  t               t        j                  | j                  t        j                         y )Nr   )r   r   rl   COOr+   r   rn   r   _numel_ndarrayr
   _nannumel_sparser   r$   rm   )r   s    r   register_sparser      s~     

F,>,>?fjj&*:*:; &**n5VZZ)9:RWW-r   scipyc                    dd l dfd	} t        j                  j                  j                  |        t        j                  j                  j                  t               t        j                  j                  j                  t               	 ddl m	} t        j                  ||        t        j                  |t               t        j                  |t               y # t        $ r Y y w xY w)Nr   c                    |dk(  rj                   j                  |       S |dk(  rj                   j                  |       S d|z  }t        |      )Nr   r)   zFCan only concatenate scipy sparse matrices for axis in {0, 1}.  Got %s)r   r|   r{   r.   )r~   r    r   r   s      r   r5   z+register_scipy_sparse.<locals>._concatenate   sY    19<<&&q))QY<<&&q))"$()  S/!r   )sparrayr   )scipy.sparser   rl   r   rz   r   r   r   rw   r   r   )r5   r   r   s     @r   register_scipy_sparser      s     
"  5 5|Dell335LM..<3( 	##G\:!!'+BCWk2  s   C$ $	C0/C0c                   | j                   |j                   cxk(  rdk(  sJ  J t        |d         t        |d         cxk(  rdk(  sJ  J |d   \  }|d   \  }|dv r|dv sJ | j                  |   |j                  |   k(  sJ |dk(  r|dk(  r| j                  |z  S |dk(  r|dk(  r| j                  |j                  z  S |dk(  r
|dk(  r| |z  S |dk(  r|dk(  r| |j                  z  S y y )N   r   r)   )r   r)   )r=   r0   r<   T)r   rA   rB   a_axisb_axiss        r   r   r      s   66QVV q     tAw<3tAw<,1,,,,,QIVQIVV& 000776?aggfo---{v{ssQw	11ssQSSy	111u	11133w %r   c                T    t        j                  t        j                  |       fi |S )z'Numel implementation for masked arrays.)r   sumr$   	ones_likexr_   s     r   _numel_maskedr     s      99R\\!_///r   c                    t        | fddi|S )zJNumel implementation for arrays that want to return numel of type ndarray.coerce_np_ndarrayT_numelr   s     r   r   r     s     !6t6v66r   c                    t        | fddi|S )zKNumel implementation for arrays that want to return numel of the same type.r   Fr   r   s     r   ro   ro     s    !7u777r   c                   | j                   |j                  dd      }|j                  d      |j                  dt        j                        }ht        j                  |      }|du r|S |r$t        j
                  dt              z  ||      S t        j                  | |dt              z  |      S t        t        t        f      sgt        j                  fd	D              }|d
u r(t        fdt        t                    D              }n't        fdt        t                    D              }|r+t        j                  t        j                  ||      |      S t        j                  | |||      S )a	  
    A reduction to count the number of elements.

    This has an additional kwarg in coerce_np_ndarray, which determines
    whether to ensure that the resulting array is a numpy.ndarray, or whether
    we allow it to be other array types via `np.full_like`.
    keepdimsFr    dtype)r   )r)   )r<   r!   r   )r<   r   c              3  (   K   | ]	  }|     y wr    )r&   dimr<   s     r   r(   z_numel.<locals>.<genexpr>0  s     0CU3Z0s   Tc              3  4   K   | ]  }|vr|   nd   yw)r)   Nr   r&   r   r    r<   s     r   r(   z_numel.<locals>.<genexpr>2  s%      
58#T/E#Jq0
s   c              3  2   K   | ]  }|vs|     y wr   r   r   s     r   r(   z_numel.<locals>.<genexpr>6  s     USPT_%*Us   	
)r<   getr$   float64prodfullr0   	full_liker#   tupler:   mathr;   broadcast_tort   )	r   r   r_   r   r   r   	new_shaper    r<   s	          @@r   r   r     s?    GGEzz*e,H::fDJJw

+E|wwuE*uK77E
!2t5QQ<<4tc%j/@NNdUDM*v990400D4 
<A#e*<M
 
	 Uc%j0AUU	rxxE:IFF||At9EBBr   c                V    t        j                  t        j                  |        fi |S )z;A reduction to count the number of elements, excluding nans)r   r   r$   isnanr   s     r   rp   rp   >  s"     99rxx{^.v..r   c                V    t        | fi |}t        |d      r|j                         S |S )a  
    A reduction to count the number of elements in a sparse array, excluding nans.
    This will in general result in a dense matrix with an unpredictable fill value.
    So make it official and convert it to dense.

    https://github.com/dask/dask/issues/7169
    todense)rp   r,   r   )r   r_   ns      r   r   r   D  s/     	!vA "!Y/199;6Q6r   c                      e Zd ZdZed        Zed        Zedddd       Zedddd       Z	edddd       Z
edddd	       Zeddddd
       Zy)ArrayBackendEntrypointzjDask-Array version of ``DaskBackendEntrypoint``

    See Also
    --------
    NumpyBackendEntrypoint
    c                    t         )zReturn the backend-specific RandomState class

        For example, the 'numpy' backend simply returns
        ``numpy.random.RandomState``.
        NotImplementedErrorselfs    r   RandomStatez"ArrayBackendEntrypoint.RandomStateZ  
     "!r   c                    t         )z$Return the default BitGenerator typer   r   s    r   default_bit_generatorz,ArrayBackendEntrypoint.default_bit_generatorc  s
     "!r   N)r   metac                   t         )ztCreate an array of ones

        Returns a new array having a specified shape and filled
        with ones.
        r   r<   r   r   r_   s       r   oneszArrayBackendEntrypoint.onesh  r   r   c                   t         )zvCreate an array of zeros

        Returns a new array having a specified shape and filled
        with zeros.
        r   r   s       r   zeroszArrayBackendEntrypoint.zerosq  r   r   c                   t         )z`Create an empty array

        Returns an uninitialized array having a specified shape.
        r   r   s       r   emptyzArrayBackendEntrypoint.emptyz  s
     "!r   c                   t         )zCreate a uniformly filled array

        Returns a new array having a specified shape and filled
        with fill_value.
        r   )r<   r!   r   r   r_   s        r   r   zArrayBackendEntrypoint.full  r   r   c                  t         )zCreate an ascending or descending array

        Returns evenly spaced values within the half-open interval
        ``[start, stop)`` as a one-dimensional array.
        r   )startstopstepr   r   r_   s         r   arangezArrayBackendEntrypoint.arange  r   r   )Nr)   )__name__
__module____qualname____doc__propertyr   r   staticmethodr   r   r   r   r   r   r   r   r   r   R  s     " " " " ! " " " " " " " " )-D " " "T " "r   r   c                    | S r   r   )r^   r_   s     r   to_numpy_dispatch_from_numpyr     s    Kr   c                  N    e Zd Zed        Zedd       Zed        Zed        Zy)NumpyBackendEntrypointc                    t         S r   )r   )clss    r   to_backend_dispatchz*NumpyBackendEntrypoint.to_backend_dispatch  s      r   c                    t        |j                  t        j                        r|S  |j                  | j                         fi |S r   )r#   _metar$   r%   
map_blocksr   )r   r^   r_   s      r   
to_backendz!NumpyBackendEntrypoint.to_backend  s8    djj"**-Kts668CFCCr   c                6    t         j                  j                  S r   )r$   randomr   r   s    r   r   z"NumpyBackendEntrypoint.RandomState  s    yy$$$r   c                6    t         j                  j                  S r   )r$   r   PCG64r   s    r   r   z,NumpyBackendEntrypoint.default_bit_generator  s    yyr   N)r^   r   )	r   r   r   classmethodr   r   r   r   r   r   r   r   r   r     sR    ! ! D D % %  r   r   rt   numpyarray_creation_dispatch)module_namedefaultentrypoint_classname)linearr   )r   )r   bool)=
__future__r   r   r   r$   
dask.arrayr   dask.array.corer   dask.array.dispatchr   r   r   r	   r
   r   r   r   r   r   r   dask.array.numpy_compatr   	np_divider   dask.array.percentiler   dask.backendsr   r   rl   objectr%   r+   r*   masked_arrayrm   rn   ri   r   r   r5   rX   register_lazyrq   rw   r   r   r   r   r   r   ro   r   rp   r   r   r   r   r   register_backendr   r   r   <module>r      sP   "    !    8 - - A    VRZZ0".. A   fbjj"%%*<*<=rww G    62::. =   

+RYY 7   vrzz*BHH 5   bee(("%%++ 6   

+Y 7   ruu))9 5 BJJ'% (% RUU//0 1 255--.@$ /@$F  '!!!&)6"v&F#   (, ) $ ' # * (,4  (!!!'*0 + )06  )!!!(+x(H%8$
. % & ) , *

.  (!!!'*7#3 $ + )3:" ruu))*0 +0
 

+,7 -7
8
%CP 62::.// 0/
7@"2 @"F BJJ' (3 * ++	"	   ( (2H2J Kr   