
    bi,M                    r   d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZ	d dl
mZmZ d dlmZ d dlmZ d dlmZmZ d dlmZ d dlmZmZmZmZ d	 Zd d
Zd Zd!dZd Zd Z d Z!d"dZ"d#dZ#	 	 	 	 	 d$dZ$	 	 	 	 	 	 	 	 	 d%dZ%ejL                  fdZ'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d!dZ/d Z0d!dZ1d Z2y)&    )annotationsN)concatfrequencies)convert_legacy_graph)	AxisError)is_dask_collectiontokenize)HighLevelGraph)has_keywordis_arraylikeis_cupy_typetypenamec                <    t        |       r| j                         S | S N)r   getxs    K/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/dask/array/utils.pynormalize_to_arrayr      s    Auuw    c           	        t        | d      r"t        |       rt        |       r| j                  } || t	        d      t        j                  |       rt        j                  |       } | t
        j                  } n|t        | d      r| j                  }t        | t              r | d|xs dz  |      } t        | t        t        f      r| D cg c]A  }t        |t        j                        rdn"t        |d      r|j                   n
t#        |      C }}t%        | |      D cg c]  \  }}|dk(  r|nt'        ||       c}}}t        | t              r|S t        |       S t        | d	      r&t        | d      rt        | j(                  t              s| S || j                   }	 | t        d
 t+        | j                         D                 }|j                   |k7  r|| j                   kD  r\|t,        ft        d t+        ||j                   z
        D              z      }|t        d t+        |j                         D                 }n*|dk(  r|j/                         }n|j1                  d|z        }|t
        j2                  j4                  u rGt
        j2                  j                  t        j6                  d|z  |xs | j                        d      }t        j                  |      rt        j                  |      }|r#|j                  |k7  r	 |j;                  |      }|S |S c c}w c c}}w # t8        $ r+ t        j6                  d|z  |xs | j                        }Y w xY w# t        $ r^t=        fddD              r=|j                  j>                  dv r%t        j                  g       j;                  |      }nY d|S dww xY w)a  Normalize an array to appropriate meta object

    Parameters
    ----------
    x: array-like, callable
        Either an object that looks sufficiently like a Numpy array,
        or a callable that accepts shape and dtype keywords
    ndim: int
        Number of dimensions of the array
    dtype: Numpy dtype
        A valid input for ``np.dtype``

    Returns
    -------
    array-like with zero elements of the correct dtype
    _metaNz/You must specify the meta or dtype of the arraydtype)r   r   )shaper   ndimr   c              3  6   K   | ]  }t        d d d        ywr   Nslice.0_s     r   	<genexpr>z"meta_from_array.<locals>.<genexpr>V   s     @QuQ4(@   c              3      K   | ]  }d   y wr    r    s     r   r#   z"meta_from_array.<locals>.<genexpr>Y   s     /V/Vs   c              3  6   K   | ]  }t        d d d        ywr   r   r    s     r   r#   z"meta_from_array.<locals>.<genexpr>Z   s     !N%1d"3!Nr$   r   T)maskc              3  8   K   | ]  }|t              v   y wr   strr!   ses     r   r#   z"meta_from_array.<locals>.<genexpr>l   s!       QK   )zinvalid literalz!could not convert string to floatSU) hasattrr   r   r   
ValueErrornpisscalararrayndarrayr   
isinstancetypelisttuplenumbersNumberr   lenzipmeta_from_arrayr   rangeEllipsissumreshapemamaskedempty	Exceptionastypeanykind)r   r   r   andimsndmetar/   s          @r   r@   r@      s8   & q'1!4aGG}JKK	{{1~HHQKyJJ	71g.!TDDIA&e4!dE]# 
  a0 &q&1QVVs1v>
 
 DGq%=Q%!R"'Qq"55Qq$'q5U1X5 Awq'"!''5)|vv=@%-@@A99aff}XK%/VeD499DT>U/V*VVWE!NU499=M!NNOxxz||D4K0255<<55;;rxxt5;KAGGLSW;XD 
{{4xx~u$	;;u%D  K4Ks
 R2  =xxt5+;AGG<=  	   JJOOt+xx|**51  K	s9   AL)(L.)D/L4 M+ 41M('M(+	O4AOOc           
     r  
 t        j                  d      5  t        j                         5  t        j                  dt
               |D cg c]  }t        |      rt        |      n| }}|j                         D ci c]  \  }}|t        |      rt        |      n|  }}}t        | t         j                        r | | }	n	 t        | d      rd|d<    | |i |}	|rCt%        |	dd       |k7  r3t'        j(                  t*              5  |	j-                  |      }	d d d        t        j.                  |	      rt        j0                  |	      }	|	cd d d        cd d d        S c c}w c c}}w # t        $ r/
t        
fddD              r Y d 

d d d        d d d        y d 

wt        $ rA
t        |      dk(  rd	t!        
      v r|d
   }	nY d 

d d d        d d d        y Y d 

	d 

wt"        $ r Y d d d        d d d        y w xY w# 1 sw Y   xY w# 1 sw Y   nxY wd d d        y # 1 sw Y   y xY w)Nignore)all)categorycomputing_metaTc              3  8   K   | ]  }|t              v   y wr   r+   r-   s     r   r#   zcompute_meta.<locals>.<genexpr>   s!       QKr0   )zunexpected keyword argumentzis an invalid keyword forz'Did not understand the following kwargs   z&zero-size array to reduction operationr   r   )r4   errstatewarningscatch_warningssimplefilterRuntimeWarningr   r@   itemsr8   	vectorizer   	TypeErrorrJ   r3   r>   r,   rH   getattr
contextlibsuppressAttributeErrorrI   r5   r6   )func_dtypeargskwargsr   	args_metakvkwargs_metarO   r/   s             @r   compute_metark   |   s   		" 0H$;$;$= 0h@KOPa<?_Q'AP	PHN
@D1A\!_q!!;
 
 dBLL)#Dt%5648K 01Y6+60 gdGT2f<$$^4 +{{6*+ ;;t88D>Da0 0 0 Q
      ;0 0 0<   Cs1vM$Q<DK0 0 0F   O0 0 0L+ +U0 0 0 0 0s   H- HE$,H#E)
$#HE/!+HH3H	H-$H/	H	8F"HH-"H	.!G*HH-$H*H	6H7H-H		HHHH!	H--H6c                   t        |       } t        |      }t        | dd       dk7  rTt        | d      st        |d      r#t        j                  j
                  | |fddi|S t        j
                  | |fd|i|S |rK| j                  |j                  k(  xr0 t        d t        | j                  |j                        D              S | |k(  j                         S )Nr   Or)   masked_equalT	equal_nanc              3     K   | ]6  \  }}t        j                  |      rt        j                  |      n||k(   8 y wr   )r4   isnan)r!   rL   bs      r   r#   zallclose.<locals>.<genexpr>   s4      *
7=1288A;BHHQKAF2*
s   <>)
r   r_   r2   r4   rE   allcloser   rR   r?   flat)rL   rr   ro   rf   s       r   rs   rs      s    1A1Aq'4 C'1fF!355>>!QDTDVDD;;q!CyCFCCww!''! 
c *
ADQVVQVVAT*
 '
 	
 F<<>r   c                f    d }t        | j                  |      t        |j                  |      k(  S )Nc                2    t        | t              r| dddfS | S )N)r8   r,   )rh   s    r   keyzsame_keys.<locals>.key   s    ar2r?"Hr   )rx   )sorteddask)rL   rr   rx   s      r   	same_keysr{      s*     !&&c"fQVV&===r   c                :    | j                   xr d| j                   vS Nr   )r   r   s    r   
_not_emptyr~      s    77'q''r   c                *   t        | t              sy| j                          t        d | j                  D              sJ t        t        | j                  j                                     }|j                         D ci c]  \  }}|dk7  s|| }}}t               }t               }t        |       }| j                  j                         D cg c]  }t        ||       }	}|j                         D ]V  }|	D ]   }	 |j                  t        ||                " t        |      dk\  r|j                  |       |j!                          X t        |      dk(  sJ |D ci c]  }|||   
 c}       yc c}}w c c}w # t        $ r Y w xY wc c}w )z2Check that graph is well named and non-overlappingNc              3  H   K   | ]  }t        |t        t        f        y wr   )r8   r;   r,   )r!   rh   s     r   r#   z_check_dsk.<locals>.<genexpr>   s     ?qz!eS\*?s    "rV      r   )r8   r
   validaterR   layersr   r   valuesr\   setr   keysaddr	   KeyErrorr>   clear)
dskfreqsrh   ri   non_onekey_collisions
collisionsall_keyslayerr   s
             r   
_check_dskr      si   c>*LLN?CJJ????szz00234E %81aq!t8G8UNJ3xHADARARATU"5(3UFU\\^  	E""8E!H#56	
 ~!#NN1 z?aD!DA!WQZ-!DD! 9
 V
   "Es*   ?E6E6E<>F!F	FFc                &   |rt        |       t        |      k(  sJ t        | |      D ]g  \  }}t        j                  |      st        j                  |      r1|s3t        j                  |      t        j                  |      k(  r_J ||k(  rgJ  y r   )r>   r?   mathrq   )rL   rr   
check_ndim	check_nanaabbs         r   assert_eq_shaper      su    1vQa) B::b>TZZ^zz"~B7778O8r   c                   | j                  |      } t        j                  d | j                  D         D ]  }| j                  | j
                  f|z      }t        |d      r|j                         }t        |d      st        j                  |d      }t        d t        | j                  |      D              }t        ||j                  |d	       |j                  | j                  k(  rJ d
        | S )N	schedulerc              3  D   K   | ]  }t        t        |              y wr   )rA   r>   )r!   cs     r   r#   z _check_chunks.<locals>.<genexpr>   s     "CQ5Q="Cs    resultr   rm   r(   c              3  ,   K   | ]  \  }}||     y wr   r&   )r!   r   is      r   r#   z _check_chunks.<locals>.<genexpr>   s     C1qtCs   F)r   r   z6maybe you forgot to pass the scheduler to `assert_eq`?)persist	itertoolsproductchunksrz   namer2   r   r4   r6   r;   r?   r   r   r   )r   r   r   idxchunkexpected_shapes         r   _check_chunksr      s    			I	&A  "C!(("CD Dy3'5(#LLNEug&HHU#.ECAHHc0BCCEKKJ%	
 KK177"	DC	D"D Hr   c                ~   | }d }d }t        |       rt        |       r| j                  J | j                  }	|rt        | j                         t        | dd       }|rt        | ||      } | j                  |      } | }t        | d      r| j                         } t        | d      st        j                  | d      } t        |       r| j                  |j                  k(  sJ |rSt        |j                  | j                  d	       n0t        | d      st        j                  | d      } t        | dd       }	| |	||fS )
Nr   )r   r   r   todenser   rm   r(   F)r   )r   r   r   r   rz   r_   r   computer2   r   r4   r6   r~   r   r   )
r   check_shapecheck_graphcheck_chunksr   r   
x_originalx_meta
x_computedadts
             r   _get_dt_meta_computedr     s    JFJ!aww"""ggqvvGT*aJ)LAII	I*
1i 		Aq'"#&Aa=77j.....J,,aggGq'"#&Aa$'c6:%%r   c                N   | }|}t        | t        t        t        f      rt	        j
                  |       } t        |t        t        t        f      rt	        j
                  |      }t        | |||||
      \  } }}}t        ||||||
      \  }}}}|r)t        |      t        |      k7  rt        d| d| d      	 | j                  |j                  k(  s"J d| j                   d|j                   d       |rs| j                  r| n| j                         }|j                  r|n|j                         }t        |      t        |      k(  s J dt        |       dt        |       d       |rXt        | d      r,t        |d      r t        | j                  |j                         t        |d      rd|j                  j                   d	| j                   d}|j                  j                  | j                  k(  sJ |       |d
t        |j                         d	t        |       d}t        |j                        t        |      k(  sJ |       t	        j                   |      sNt	        j                   |      s9dt        |       dt        |       d}t        |      t        |      k(  sJ |       t        |d      rd|j                  j                   d	|j                   d}|j                  j                  |j                  k(  sJ |       |dt        |j                         d	t        |       d}t        |j                        t        |      k(  sJ |       t	        j                   |      sNt	        j                   |      s9dt        |       dt        |       d}t        |      t        |      k(  sJ |       d}t#        | |fd|	i|sJ |       y# t$        $ r Y nw xY w| |k(  }t        |t        j&                        r|j)                         sJ y|sJ y)N)r   r   r   r   r   z#a and b have different dtypes: (a: z, b: )z"a and b have different shapes (a: z!a and b have different types (a: r   z<compute()-ing 'a' changes its number of dimensions (before: z	, after: z,compute()-ing 'a' changes its type (before: zRcompute()-ing 'a' results in a different type than implied by its metadata (meta: z, computed: z<compute()-ing 'b' changes its number of dimensions (before: z,compute()-ing 'b' changes its type (before: zRcompute()-ing 'b' results in a different type than implied by its metadata (meta: zHfound values in 'a' and 'b' which differ by more than the allowed amountro   T)r8   r:   intfloatr4   r6   r   r,   AssertionErrorr   itemr9   r2   	assert_eqr   r   r5   rs   r^   r7   rR   )rL   rr   r   r   
check_metar   r   
check_typecheck_dtypero   r   rf   
a_original
b_originalr   a_meta
a_computedbdtb_meta
b_computed_a_bmsgr   s                           r   r   r   -  s,    JJ!dC'(HHQK!dC'(HHQK!6	!"AsFJ "7	!"AsFJ s3x3s8+B3%uSEQRSTT5GGqww	I/yaggYaH	Igg1668Bgg1668B8t   N248*E$r(1MN  q'"wq'':!''177+z7+  * 0 0 5 56ixqJ  "'',,6;;6%$$()9)9$:#;9T&\NRSU   
 0 01T&\AF3FAKK/2;;z3J&&*6l^<Z@P?QQRT   $F|tJ/??DD?z7+  * 0 0 5 56ixqJ  "'',,6;;6%$$()9)9$:#;9T&\NRSU   
 0 01T&\AF3FAKK/2;;z3J&&*6l^<Z@P?QQRT   $F|tJ/??DD?X1<	<V<AcA<  	
QA!RZZ uuww  qs   =L#O! !	O-,O-c                `     t         fd|D              rt        j                   |      S d S )zkLike functools.wraps, but safe to use even if wrapped is not a function.

    Only needed on Python 2.
    c              3  6   K   | ]  }t        |        y wr   )r2   )r!   attrwrappeds     r   r#   zsafe_wraps.<locals>.<genexpr>  s     
7d77D!
7   )assignedc                    | S r   r&   r   s    r   <lambda>zsafe_wraps.<locals>.<lambda>  s     r   )rR   	functoolswraps)r   r   s   ` r   
safe_wrapsr     s*    
 
7h
77w::r   c                x    	 | j                   S # t        $ r" t        j                  |       j                   cY S w xY w)z!Determine dtype of an array-like.)r   rb   r4   
asanyarray)rL   s    r   	_dtype_ofr     s6    & ww &}}Q%%%&s    (99c                    | t        j                  |i |S 	 t        j                  |dt        |       i|S # t        $ r t        j                  |i |cY S w xY w)z
    Use the `like=` from `np.arange` to create a new array dispatching
    to the downstream library. If that fails, falls back to the
    default NumPy behavior, resulting in a `numpy.ndarray`.
    like)r4   aranger@   r^   )r   re   rf   s      r   arange_safer     sc     |yy$)&))	.99dI)>I&II 	.99d-f--	.s   9 AAc                   ddl m} ||u rt        |d      r|S t        ||      r	 ||fi |S t        ||      r't	        |j
                        r|j                  d      }t        |d      r | |fd|i|S t        |      j                  j                  d      rO|j                  dd        t        j                  |      rt        j                  |g      } t        |      |fi |S  | |fi |S )	Nr   )Array__array_function__syncr   r   zscipy.sparseorder)
dask.arrayr   r2   r8   r   r   r   r9   
__module__
startswithpopr4   r5   r6   )np_funcda_funcrL   r   rf   r   s         r   _array_like_safer     s     qyWQ 45$q#F##!UQWW 5III't)*q.t.v..Dz''7

7D!;;q>!AtDz!&v&&
 1r   c                H    ddl m} t        t        j                  || |fi |S )a  
    If `a` is `dask.array`, return `dask.array.asarray(a, **kwargs)`,
    otherwise return `np.asarray(a, like=like, **kwargs)`, dispatching
    the call to the library that implements the like array. Note that
    when `a` is a `dask.Array` backed by `cupy.ndarray` but `like`
    isn't, this function will call `a.compute(scheduler="sync")`
    before `np.array`, as downstream libraries are unlikely to know how
    to convert a `dask.Array` and CuPy doesn't implement `__array__` to
    prevent implicit copies to host.
    r   )r6   )dask.array.routinesr6   r   r4   )rL   r   rf   r6   s       r   
array_safer     s!     *BHHeQ???r   c                H    ddl m} t        t        j                  || |fi |S )a  
    If a is dask.array, return dask.array.asarray(a, **kwargs),
    otherwise return np.asarray(a, like=like, **kwargs), dispatching
    the call to the library that implements the like array. Note that
    when a is a dask.Array but like isn't, this function will call
    a.compute(scheduler="sync") before np.asarray, as downstream
    libraries are unlikely to know how to convert a dask.Array.
    r   )asarray)dask.array.corer   r   r4   )rL   r   rf   r   s       r   asarray_safer     s!     (BJJDCFCCr   c                H    ddl m} t        t        j                  || |fi |S )a  
    If a is dask.array, return dask.array.asanyarray(a, **kwargs),
    otherwise return np.asanyarray(a, like=like, **kwargs), dispatching
    the call to the library that implements the like array. Note that
    when a is a dask.Array but like isn't, this function will call
    a.compute(scheduler="sync") before np.asanyarray, as downstream
    libraries are unlikely to know how to convert a dask.Array.
    r   )r   )r   r   r   r4   )rL   r   rf   r   s       r   asanyarray_safer     s!     +BMM:q$I&IIr   c                    t        | t        t        f      rt        fd| D              S t        | t        j                        st        d| z        |  k  s| k\  rt        d| fz        | dk  r| z  } | S )z#Validate an input to axis= keywordsc              3  6   K   | ]  }t        |        y wr   )validate_axis)r!   axr   s     r   r#   z validate_axis.<locals>.<genexpr>  s     <]2t,<r   z%Axis value must be an integer, got %sz2Axis %d is out of bounds for array of dimension %dr   )r8   r;   r:   r<   Integralr^   r   )axisr   s    `r   r   r     s    $&<t<<<dG,,-?$FGGte|tt|@D$<O
 	
 axKr   c                   |r%| j                   }t        j                  | dd      }n.|j                   }t        j                  |dd      j                  }d|dk\  dz
  j	                  |      z  }| |z  ||j                  z  }} | |fS )a  Sign correction to ensure deterministic output from SVD.

    This function is useful for orienting eigenvectors such that
    they all lie in a shared but arbitrary half-space. This makes
    it possible to ensure that results are equivalent across SVD
    implementations and random number generator states.

    Parameters
    ----------

    u : (M, K) array_like
        Left singular vectors (in columns)
    v : (K, N) array_like
        Right singular vectors (in rows)
    u_based_decision: bool
        Whether or not to choose signs based
        on `u` rather than `v`, by default False

    Returns
    -------

    u : (M, K) array_like
        Left singular vectors with corrected sign
    v:  (K, N) array_like
        Right singular vectors with corrected sign
    r   T)r   keepdimsrV   g       @g      ?)r   r4   rC   TrI   )uri   u_based_decisionr   signss        r   svd_flipr     s    < qq40qq4022EQJ#%--e44Eu9a%''kqAa4Kr   c                    |d   }t        |      r%dd l}t        |j                  j                  |       }ndd l}t        |j                  |       } ||i |S r}   )r   cupyx.scipy.linalgr_   scipylinalgscipy.linalg)	func_namere   rf   rL   cupyxrc   r   s          r   scipy_linalg_safer  =  sP     	QAA!u{{))95u||Y/   r   c                     t        d| ||      S )Nsolve_triangular)lower)r  )rL   rr   r  s      r   solve_triangular_safer  M  s    /AUCCr   c                    | dk(  r3t        j                  dt        t               dt        d       t        S t        dt         d|        )Nr   zeAxisError was deprecated after version 2021.10.0 and will be removed in a future release. Please use z	 instead.r   )rS   
stacklevelzmodule z has no attribute )rX   warnr   r   FutureWarningrb   __name__)r   s    r   __getattr__r  Q  sU    {**29*=)>iI"		
 wxj0B4&IJJr   )NN)F)TT)TN)TTTTN)	TTTTTTTTr   )3
__future__r   r`   r   r   r   r<   rX   numpyr4   tlzr   r   dask._task_specr   dask.array.numpy_compatr   	dask.baser   r	   dask.highlevelgraphr
   
dask.utilsr   r   r   r   r   r@   rk   rs   r{   r~   r   r   r   r   r   WRAPPER_ASSIGNMENTSr   r   r   r   r   r   r   r   r   r  r  r  r&   r   r   <module>r     s    "        # 0 - 2 . H H^B1h>(E6	( $&T hV "+!>!> &. 8@ DJ'T! DKr   