
    Cd81                       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 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j                     ej        eej        fej!                    ej        eej        fej"                    ej        eej        fej#                    ej        ej$        j%        ej$        j#                    ej        eej        fe            ej        ej$        j%        e            ej        ej                  d)d            Z& e
j        ej$        j%                  d*d            Z' ej        ej$        j%                  d+d            Z( ej)        d           e
j)        d           ej)        d           ej)        d           ej)        d          d                                                             Z* ej)        d           e
j)        d          d                         Z+ ej)        d           e
j)        d           ej)        d           ej)        d          d                                                 Z, ej)        d           e
j)        d          d                         Z-d Z. ej        ej$        j%                  d             Z/ ej        eej        f          d             Z0d Z1d,dZ2 ej        eej        f          d             Z3d Z4 G d  d!e          Z5 ej        ej                  d"             Z6 G d# d$e5          Z7 ed%d&e5d'(          Z8e89                    d& e7                       dS )-    )annotationsN)chunk)Array)
concatenate_lookupdivide_lookupeinsum_lookupempty_lookupnannumel_lookupnumel_lookuppercentile_lookuptensordot_lookupto_cupy_dispatchto_numpy_dispatch)divide)	ma_divide_percentile)CreationDispatchDaskBackendEntrypointlinearc                $    t          | ||          S Nr   )aqmethods      3lib/python3.11/site-packages/dask/array/backends.py
percentiler   #   s    q!V$$$    c                   t           j                            | |          }d | D             }t          d |D                       rt	          d          |r4t          j        |          }t          |          dk    r|d         |_        |S )N)axisc                <    g | ]}t          |d           |j        S )
fill_value)hasattrr"   ).0is     r   
<listcomp>z _concatenate.<locals>.<listcomp>+   s)    LLLA71l3K3KL1<LLLr   c              3  J   K   | ]}t          |t          j                  V  d S r   )
isinstancenpndarray)r$   fs     r   	<genexpr>z_concatenate.<locals>.<genexpr>,   s.      
:
::a$$
:
:
:
:
:
:r   zADask doesn't support masked array's with non-scalar `fill_value`s   r   )r)   maconcatenateany
ValueErroruniquelenr"   )arraysr    outfill_valuess       r   _concatenater7   (   s    
%

F

.
.CLLLLLK

:
:k
:
:
::: 
O
 
 	
  ,i,,{q  (^CNJr      c                   	 t          |           |\  nK# t          $ r> t          t          | d                    t          t          d|                    Y nw xY w	 t	                    }t                    n# t          $ r gd}Y nw xY w	 t	                    }t                    n# t          $ r gd}Y nw xY w| j        | j        }|j        |j        }d}||k    rd}nlt          |          D ]\}|                  |                  k    rd} n9|         dk     r|xx         |z  cc<   |         dk     r|xx         |z  cc<   ]|st          d          fdt          |          D             }	|	z   }
d}D ]}||         z  }d|f}fd|	D             }fd	t          |          D             }	|	z   }d}D ]}||         z  }|df}fd
|	D             }|                     |
          	                    |          }|                    |          	                    |          }t          j                            ||          }|	                    ||z             S )Nr   r-   TFzshape-mismatch for sumc                    g | ]}|v|	S  r;   )r$   kaxes_as     r   r&   z_tensordot.<locals>.<listcomp>f       6661avooQooor   c                     g | ]
}|         S r;   r;   )r$   r    as_s     r   r&   z_tensordot.<locals>.<listcomp>l   s    ((($CI(((r   c                    g | ]}|v|	S r;   r;   )r$   r<   axes_bs     r   r&   z_tensordot.<locals>.<listcomp>n   r>   r   c                     g | ]
}|         S r;   r;   )r$   r    bss     r   r&   z_tensordot.<locals>.<listcomp>t   s    '''BtH'''r   )iter	TypeErrorlistranger3   shapendimr1   	transposereshaper)   r.   dot)r   baxesnanbndandbequalr<   notin	newaxes_aN2r    
newshape_aolda	newaxes_b
newshape_boldbatbtresrA   r=   rC   rE   s                        @@@@r   
_tensordotra   8   s   T



 	  & & &eTE1oo&&eAtnn%%&
[[f   [[f   
 'C
&C	
B
&CE	Rxxr 	! 	!A6!9~F1I..ay1}}q			S 			ay1}}q			S 			 31222 7666c

666EI	
B  
c$ibJ((((%(((D6666c

666EI	
B  
bhbJ'''''''D	
Y			'	'
	3	3B	
Y			'	'
	3	3B
%))B

C;;td{###s4    AA#"A#'B BBB; ;CCcupyc                 (   dd l 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            }d S )Nr   c                      j         | fi |S r   )asnumpydatakwargsrb   s     r   cupy_to_numpyz$register_cupy.<locals>.cupy_to_numpy       t|D++F+++r   c                      j         | fi |S r   )asarrayrf   s     r   numpy_to_cupyz$register_cupy.<locals>.numpy_to_cupy   rj   r   c                 v    |                     dd            |                     dd             j        | i |S )Ncastingorder)popeinsum)argsrh   rb   s     r   _cupy_einsumz#register_cupy.<locals>._cupy_einsum   sD     	

9d###

7D!!!t{D+F+++r   )rb   r   registerr*   r/   r   	tensordotr   r   r   _numel_arrayliker
   	_nannumelr   r   r)   r   )ri   rm   rt   rb   s      @r   register_cupyry   |   s    KKKd.>???dlDN;;;t|Z888$,(8999T\9555--, , , , .-, rz**, , , , +*, DL)), , , , *), , ,r   cupyxc                     ddl m}  	 ddl mm n"# t          $ r}t	          d          |d }~ww xY wdfd	}t          j        | |           t          j        | t                     d S )Nr   )spmatrix)hstackvstackz>Stacking of sparse arrays requires at least CuPy version 8.0.0c                p    |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)r1   )Lr    msgr}   r~   s      r   _concat_cupy_sparsez+register_cupyx.<locals>._concat_cupy_sparse   sQ    1996!99QYY6!99"$()  S//!r   r   )	cupyx.scipy.sparser|   r}   r~   ImportErrorr   ru   r   _tensordot_scipy_sparse)r|   er   r}   r~   s      @@r   register_cupyxr      s     ,+++++555555555   L
 
	

" 
" 
" 
" 
" 
" 
" *=>>>h(?@@@@@s    
2-2sparsec                    dd l } t          j        | j        | j                   t          j        | j        | j                   t          j        | j        t                     t          j        | j        t                     d S )Nr   )r   r   ru   COOr/   r   rv   r   _numel_ndarrayr
   _nannumel_sparse)r   s    r   register_sparser      sp    
 MMM
F,>???fj&*:;;; &*n555VZ)9:::::r   scipyc                     dd l dfd	} t          j        j        j        |            t          j        j        j        t                     d S )Nr   c                    |dk    rj                             |           S |dk    rj                             |           S d|z  }t          |          )Nr   r-   zFCan only concatenate scipy sparse matrices for axis in {0, 1}.  Got %s)r   r~   r}   r1   )r   r    r   r   s      r   r7   z+register_scipy_sparse.<locals>._concatenate   sa    199<&&q)))QYY<&&q)))"$()  S//!r   r   )scipy.sparser   ru   r   r|   r   r   )r7   r   s    @r   register_scipy_sparser      sh     
" 
" 
" 
" 
" 
"  5|DDDel35LMMMMMr   c                   | j         |j         cxk    rdk    sn J t          |d                   t          |d                   cxk    rdk    sn 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 d S d S )Nr8   r   r-   )r   r-   )rK   r3   rJ   T)r   rO   rP   a_axisb_axiss        r   r   r      s.   6QV    q      tAw<<3tAw<<,,,,1,,,,,,QIVQIVV& 0 0 0 076?agfo----{{v{{sQw	11sQSy	111u	1113w 
r   c                J    t          j        t          j        |           fi |S )z'Numel implementation for masked arrays.)r   sumr)   	ones_likexrh   s     r   _numel_maskedr      s$     9R\!__/////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     !66t6v6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   rw   rw      s    !77u7777r   r   boolc                p   | j         |                    dd          }|                    dd          |                    dt          j                  }mt          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 r7t          fdt          t                              D                       }n6t          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    Ndtype)r   )r-   )rJ   r"   r   )rJ   r   c              3  (   K   | ]}|         V  d S r   r;   )r$   dimrJ   s     r   r,   z_numel.<locals>.<genexpr>  s'      00CU3Z000000r   Tc              3  4   K   | ]}|vr|         nd V  dS )r-   Nr;   r$   r   r    rJ   s     r   r,   z_numel.<locals>.<genexpr>  sD       
 
58#T//E#JJq
 
 
 
 
 
r   c              3  0   K   | ]}|v|         V  d S r   r;   r   s     r   r,   z_numel.<locals>.<genexpr>  s,      UUSPT__%*____UUr   )rJ   getr)   float64prodfullr3   	full_liker(   tuplerH   mathrI   broadcast_toarray)	r   r   rh   r   r   r   	new_shaper    rJ   s	          @@r   r   r      s    GEzz*e,,H::fd##DJJw
++E|wuE***uK 	O7E

!2t5QQQQ<4tc%jj/@NNNNdUDM** v90000400000D4 
 
 
 
 
<A#e**<M<M
 
 
 
 
		 UUUUUc%jj0A0AUUUUU	 CrxE:::IFFF|At9EBBBBr   c                L    t          j        t          j        |            fi |S )z;A reduction to count the number of elements, excluding nans)r   r   r)   isnanr   s     r   rx   rx   %  s&     9rx{{^..v...r   c                h    t          | fi |}t          |d          r|                                n|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)rx   r#   r   )r   rh   ns      r   r   r   +  s<     	!vA "!Y//6199;;;Q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dS )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.RandomStateA  
     "!r   c                    t           )z$Return the default BitGenerator typer   r   s    r   default_bit_generatorz,ArrayBackendEntrypoint.default_bit_generatorJ  s
     "!r   N)r   metac                   t           )ztCreate an array of ones

        Returns a new array having a specified shape and filled
        with ones.
        r   rJ   r   r   rh   s       r   oneszArrayBackendEntrypoint.onesO  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.zerosX  r   r   c                   t           )z`Create an empty array

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

        Returns a new array having a specified shape and filled
        with fill_value.
        r   )rJ   r"   r   r   rh   s        r   r   zArrayBackendEntrypoint.fulli  r   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   rh   s         r   arangezArrayBackendEntrypoint.aranger  r   r   )Nr-   )__name__
__module____qualname____doc__propertyr   r   staticmethodr   r   r   r   r   r;   r   r   r   r   9  s*         " " X" " " X" ! " " " " \" " " " " " \" " " " " " \" )-D " " " " \" "T " " " " \" " "r   r   c                    | S r   r;   )rg   rh   s     r   to_numpy_dispatch_from_numpyr   |  s    Kr   c                  h    e Zd Zed             Zedd            Zed             Zed             ZdS )	NumpyBackendEntrypointc                    t           S r   )r   )clss    r   to_backend_dispatchz*NumpyBackendEntrypoint.to_backend_dispatch  s      r   rg   r   c                    t          |j        t          j                  r|S  |j        |                                 fi |S r   )r(   _metar)   r*   
map_blocksr   )r   rg   rh   s      r   
to_backendz!NumpyBackendEntrypoint.to_backend  sC    dj"*-- 	Kts6688CCFCCCr   c                $    t           j        j        S r   )r)   randomr   r   s    r   r   z"NumpyBackendEntrypoint.RandomState  s    y$$r   c                $    t           j        j        S r   )r)   r   PCG64r   s    r   r   z,NumpyBackendEntrypoint.default_bit_generator  s    yr   N)rg   r   )	r   r   r   classmethodr   r   r   r   r   r;   r   r   r   r     s        ! ! [! D D D [D % % X%   X  r   r   r   numpyarray_creation_dispatch)module_namedefaultentrypoint_classname)r   r   )r8   )r   r   ):
__future__r   r   r   r)   
dask.arrayr   dask.array.corer   dask.array.dispatchr   r   r   r	   r
   r   r   r   r   r   dask.array.numpy_compatr   	np_divider   dask.array.percentiler   dask.backendsr   r   ru   objectr*   r/   rv   rr   r   r.   masked_arrayr   r7   ra   register_lazyry   r   r   r   r   r   r   rw   r   rx   r   r   r   r   r   register_backendr;   r   r   <module>r      s   " " " " " "            ! ! ! ! ! !                        8 7 7 7 7 7 - - - - - - - - - - - - A A A A A A A A   VRZ0". A A A   62:. = = =  
+RY 7 7 7  vrz*BH 5 5 5  be("%+ 6 6 6  
+Y 7 7 7  ru)9 5 5 5 BJ''% % % ('% RU/00   10 25-..@$ @$ @$ /.@$F  ''!!&))v&&F##  ((, , )( $# '& *) ('
,2  ((!!'**A A +* )(A4  ))!!(++x((H%%	; 	; &% )( ,+ *)	;  ((!!'**N N +* )(N&  " ru)**0 0 +*0
 
+,,7 7 -,7
8 8 8
%C %C %C %CP 62:./// / 0//
7 7 7@" @" @" @" @"2 @" @" @"F BJ''  ('    3   * +*+	"	     ( (2H2H2J2J K K K K Kr   