
    tf81                       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jB                          ej:                  eej>                  fejD                          ej:                  eej>                  fejF                          ej:                  ejH                  jJ                  ejH                  jF                          ej:                  eej>                  fe        ej:                  ejH                  jJ                  e        ej:                  ej>                        d%d
       Z& e
j:                  ejH                  jJ                        d&d       Z' ej:                  ejH                  jJ                        d'd       Z( ejR                  d       e
jR                  d       ejR                  d       ejR                  d       ejR                  d      d                                    Z* ejR                  d       e
jR                  d      d               Z+ ejR                  d       e
jR                  d       ejR                  d       ejR                  d      d                             Z, ejR                  d       e
jR                  d      d               Z-d Z. ej:                  ejH                  jJ                        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#$      Z8e8js                  d" e7              y))    )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DaskBackendEntrypointc                    t        | ||      S Nr   )aqmethods      ]/var/www/html/software/conda/envs/higlass/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   _concatenater4   (   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ranger/   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   
_tensordotrW   8   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                  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kwargsrX   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   r`   r   c                 p    |j                  dd        |j                  dd         j                  | i |S )Ncastingorder)popeinsum)argsr^   rX   s     r   _cupy_einsumz#register_cupy.<locals>._cupy_einsum   s7     	

9d#

7D!t{{D+F++r   )rX   r   registerr$   r*   r   	tensordotr   r   r   _numel_arrayliker
   	_nannumelr   r   r#   r   )r_   rc   rj   rX   s      @r   register_cupyro   |   s     d.>.>?dllDNN;t||Z8$,,(89T\\95-, ., rzz*, +, DLL), *,r   cupyxc                     ddl m}  	 ddl mm dfd	}t        j                  | |       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   msgrs   rt   s      r   _concat_cupy_sparsez+register_cupyx.<locals>._concat_cupy_sparse   sC    19!9QY!9"$()  S/!r   r   )	cupyx.scipy.sparserr   rs   rt   ImportErrorr   rk   r   _tensordot_scipy_sparse)rr   erx   rs   rt   s      @@r   register_cupyxr~      s^     ,5
" *=>h(?@%  L
	s   A
 
	A$AA$sparsec                 D   dd l } t        j                  | j                  | j                         t        j                  | j                  | j                         t        j                  | j                  t               t        j                  | j                  t               y )Nr   )r   r   rk   COOr*   r   rl   r   _numel_ndarrayr
   _nannumel_sparse)r   s    r   register_sparser      sf    
 

F,>,>?fjj&*:*:; &**n5VZZ)9:r   scipyc                     dd l dfd	} t        j                  j                  j                  |        t        j                  j                  j                  t               y )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   rt   rs   r-   )rv   r   rw   r   s      r   r4   z+register_scipy_sparse.<locals>._concatenate   sY    19<<&&q))QY<<&&q))"$()  S/!r   ry   )scipy.sparser   rk   r   rr   r   r|   )r4   r   s    @r   register_scipy_sparser      sD     
"  5 5|Dell335LMr   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<   r/   r;   T)r   r@   rA   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   rm   rm      s    !7u777r   c                   | j                   |j                  dd      }|j                  d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   Ndtype)r   )r(   )r;   r    r   )r;   r   c              3  (   K   | ]	  }|     y wr    )r%   dimr;   s     r   r'   z_numel.<locals>.<genexpr>  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>  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>  s     USPT_%*Us   	
)r;   getr#   float64prodfullr/   	full_liker"   tupler9   mathr:   broadcast_toarray)	r   r   r^   r   r   r   	new_shaper   r;   s	          @@r   r   r      sA    GGEzz*e,H::fd#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   rn   rn   %  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)rn   r+   r   )r   r^   ns      r   r   r   +  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.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   r;   r   r   r^   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   )r;   r    r   r   r^   s        r   r   zArrayBackendEntrypoint.fulli  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.aranger  r   r   )Nr(   )__name__
__module____qualname____doc__propertyr   r   staticmethodr   r   r   r   r   r   r   r   r   r   9  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   r   numpyarray_creation_dispatch)module_namedefaultentrypoint_classname)linearry   )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   dask.array.numpy_compatr   	np_divider   dask.array.percentiler   dask.backendsr   r   rk   objectr$   r*   rl   rh   r   r)   masked_arrayr   r4   rW   register_lazyro   r~   r   r   r|   r   r   rm   r   rn   r   r   r   r   r   register_backendr   r   r   <module>r      s   "    !   8 - - A    VRZZ0".. A    62::. =   

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

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

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