
    CdH                    J   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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j         fdZ!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d"dZ)d Z*d"dZ+d  Z,dS )'    )annotationsN)concatfrequencies)Array)HighLevelGraph)has_keywordis_arraylikeis_cupy_typec                L    t          |           r|                                 S | S N)r
   getxs    0lib/python3.11/site-packages/dask/array/utils.pynormalize_to_arrayr      s"    A uuww    c           	     0   t          | d          rt          | t                    r| j        } || t	          d          t          j        |           rt          j        |           } | t
          j        } n|t          | d          r| j	        }t          | t                    r | d|pdz  |          } t          | t                    st          | t                    rLd | D             }d	 t          | |          D             }t          | t                    r|nt          |           S t          | d
          r*t          | d          rt          | j        t                    s| S || j        }	 | t          d t!          | j                  D                                }|j        |k    r|| j        k    ro|t"          ft          d t!          ||j        z
            D                       z            }|t          d t!          |j                  D                                }n3|dk    r|                                }n|                    d|z            }|t
          j        j        u r?t
          j                            t          j        d|z  |p| j	                  d          }n0# t.          $ r# t          j        d|z  |p| j	                  }Y nw xY wt          j        |          rt          j        |          }|r|j	        |k    r	 |                    |          }nj# t          $ r]t3          fddD                       r6|j	        j        dv r(t          j        g                               |          }nY dndww xY w|S )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   c                    g | ]D}t          |t          j                  rd n%t          |d          r|j        nt          |          ES )r   ndim)
isinstancenumbersNumberhasattrr   len).0as     r   
<listcomp>z#meta_from_array.<locals>.<listcomp>>   sb     
 
 
 	 !W^,,AA q&!!Q
 
 
r   c                D    g | ]\  }}|d k    r|nt          ||          S r   )meta_from_array)r   r    nds      r   r!   z#meta_from_array.<locals>.<listcomp>F   s2    QQQ%!R"''QQq"55QQQr   r   c              3  8   K   | ]}t          d d d          V  dS r   Nslicer   _s     r   	<genexpr>z"meta_from_array.<locals>.<genexpr>T   s.      @@QuQ4((@@@@@@r   c              3     K   | ]}d V  d S r    r)   s     r   r+   z"meta_from_array.<locals>.<genexpr>W   s"      /V/V/V/V/V/V/V/Vr   c              3  8   K   | ]}t          d d d          V  dS r&   r'   r)   s     r   r+   z"meta_from_array.<locals>.<genexpr>X   s.      !N!N%1d"3"3!N!N!N!N!N!Nr   r   T)maskc              3  :   K   | ]}|t                    v V  d S r   strr   ses     r   r+   z"meta_from_array.<locals>.<genexpr>j   sA         QK     r   )zinvalid literalz!could not convert string to floatSU)r   r   r   r   
ValueErrornpisscalararrayndarrayr   typelisttuplezipr   r   rangeEllipsissumreshapemamaskedempty	Exceptionastypeanykind)r   r   r   ndimsr    metar6   s         @r   r#   r#      s   & q' z!U33 G}JKKK	{1~~ HQKKyJ	71g..!T 5ADDIA&e444!T 
6jE22 
6
 
 
 
 
 RQ3q%==QQQq$''5qqU1XX5 Awq'"" !'5))
 |v=@@%--@@@@@A9af}}XK%/V/VeD49DT>U>U/V/V/V*V*VVWE!N!NU49=M=M!N!N!NNNOxxzz||D4K0025<5;;rxt5;KAGLLLSW;XXD = = =xt5+;AG<<<= 
{4 x~~ u$$	;;u%%DD 	 	 	         JOt++x||**511 	 Ks,   4D;J0 0*KKL, ,
N6ANNc                v   t          j        d          5  t          j                    5  t          j        dt
                     d |D             }d |                                D             }t          | t           j                  r | | }n	 t          | d          rd|d<    | |i |}n# t          $ r=t          fdd	D                       r Y d d d d            d d d            d S d wt          $ rSt          |          d
k    rdt                    v r	|d         }nY d d d d            d d d            d S Y d n*d wt          $ r Y d d d            d d d            d S w xY w|r[t!          |dd           |k    rFt#          j        t&                    5  |                    |          }d d d            n# 1 swxY w Y   t          j        |          rt          j        |          }|cd d d            cd d d            S # 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nignore)all)categoryc                N    g | ]"}t          |          rt          |          n|#S r-   r	   r#   )r   r   s     r   r!   z compute_meta.<locals>.<listcomp>~   s0    PPPa<??A_Q'''PPPr   c                V    i | ]&\  }}|t          |          rt          |          n|'S r-   rS   r   kvs      r   
<dictcomp>z compute_meta.<locals>.<dictcomp>   sC     
 
 
@D1A\!__;q!!!!
 
 
r   computing_metaTc              3  :   K   | ]}|t                    v V  d S r   r2   r4   s     r   r+   zcompute_meta.<locals>.<genexpr>   sA         QK     r   )zunexpected keyword argumentzis an invalid keyword forz'Did not understand the following kwargs   z&zero-size array to reduction operationr   r   )r9   errstatewarningscatch_warningssimplefilterRuntimeWarningitemsr   	vectorizer   	TypeErrorrJ   r8   r   r3   rH   getattr
contextlibsuppressAttributeErrorrI   r:   r;   )func_dtypeargskwargs	args_metakwargs_metarM   r6   s          @r   compute_metarn   z   s(   		"	"	" 0 0H$;$=$= 0 0h@@@@PP4PPP	
 
HN
 
 
 dBL)) 	4#DDt%566 948K 01tY6+66               
  444;0 0 0 0 0 0 0 0 0 0 0 0 0 0<         Cs1vvMM$Q<DD444K0 0 0 0 0 0 0 0 0 0 0 0 0 0F DDDD    O0 0 0 0 0 0 0 0 0 0 0 0 0 0L  	+gdGT22f<<$^44 + +{{6**+ + + + + + + + + + + + + + + ;t 	"8D>>Da0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0s   H.A&HB0/H0
E4:C2HH.2E4?-E,H0H.HE4HH.3E443H'G	=H	GHG,H=H.H	H.H	H..H25H2Fc                   t          |           } t          |          }t          | dd           dk    rOt          | d          st          |d          rt          j        j        | |fddi|S t          j        | |fd|i|S |rA| j        |j        k    o0t          d t          | j	        |j	                  D                       S | |k                                    S )Nr   Or0   masked_equalT	equal_nanc              3  x   K   | ]5\  }}t          j        |          rt          j        |          n||k    V  6d S r   )r9   isnan)r   r    bs      r   r+   zallclose.<locals>.<genexpr>   sT       *
 *
7=128A;;2BHQKKKAF*
 *
 *
 *
 *
 *
r   )
r   rd   r   r9   rE   allcloser   rP   r@   flat)r    ru   rr   rk   s       r   rv   rv      s    1A1Aq'4  C''1f 	DF!3!3 	D5>!QDDTDVDDD;q!CCyCFCCC 
w!'! 
c *
 *
ADQVQVATAT*
 *
 *
 '
 '
 	
 F<<>>r   c                d    d }t          | j        |          t          |j        |          k    S )Nc                <    t          | t                    r| dddfS | S )N)r   r3   )rV   s    r   keyzsame_keys.<locals>.key   s'    a 	r2r?"Hr   )r{   )sorteddask)r    ru   r{   s      r   	same_keysr~      s<       !&c"""fQV&=&=&===r   c                "    | j         od| j         vS Nr   )r   r   s    r   
_not_emptyr      s    7'q''r   c                V   t          | t                    sdS |                                  t          d | j        D                       sJ t          t          | j                                                            }d |                                D             }|r
J |            dS )z2Check that graph is well named and non-overlappingNc              3  N   K   | ] }t          |t          t          f          V  !d S r   )r   r?   r3   )r   rV   s     r   r+   z_check_dsk.<locals>.<genexpr>   s0      ??qz!eS\**??????r   c                &    i | ]\  }}|d k    ||S )r[   r-   rU   s      r   rX   z_check_dsk.<locals>.<dictcomp>   s#    8881aq!r   )	r   r   validaterP   layersr   r   valuesra   )dskfreqsnon_ones      r   
_check_dskr      s    c>** LLNNN??CJ????????sz00223344E88888Gr   Tc                8   |r"t          |           t          |          k    sJ t          | |          D ]d\  }}t          j        |          st          j        |          r/|r,t          j        |          t          j        |          k    sJ \||k    sJ ed S r   )r   r@   mathrt   )r    ru   
check_ndim	check_nanaabbs         r   assert_eq_shaper      s      1vvQa))  B:b>> 	TZ^^ 	 8z"~~B777788888 r   c                   |                      |          } t          j        d | j        D              D ]}| j        | j        f|z            }t          |d          r|                                }t          |d          st          j	        |d          }t          d t          | j        |          D                       }t          ||j        |d	           |j        | j        k    s
J d
            | S )N	schedulerc              3  N   K   | ] }t          t          |                    V  !d S r   )rA   r   )r   cs     r   r+   z _check_chunks.<locals>.<genexpr>   s.      "C"CQ5Q=="C"C"C"C"C"Cr   resultr   rp   r/   c              3  ,   K   | ]\  }}||         V  d S r   r-   )r   r   is      r   r+   z _check_chunks.<locals>.<genexpr>   s*      CC1qtCCCCCCr   F)r   r   z6maybe you forgot to pass the scheduler to `assert_eq`?)persist	itertoolsproductchunksr}   namer   r   r9   r;   r?   r@   r   r   r   )r   r   r   idxchunkexpected_shapes         r   _check_chunksr      s   			I	&&A "C"C!("C"C"CD D Dy3'5(## 	#LLNNEug&& 	/HU#...ECCAHc0B0BCCCCCEKJ%	
 	
 	
 	
 K17"""C #"""Hr   c                   | }d }d }t          | t                    r| j        J | j        }	|rt          | j                   t          | dd           }|rt          | ||          } |                     |          } | }t          | d          r| 	                                } t          | d          st          j        | d          } t          |           r| j        |j        k    sJ |rt          |j        | j        d	           n7t          | d          st          j        | d          } t          | dd           }	| |	||fS )
Nr   )r   r   r   todenser   rp   r/   F)r   )r   r   r   r   r}   rd   r   computer   r   r9   r;   r   r   r   )
r   check_shapecheck_graphcheck_chunksr   r   
x_originalx_meta
x_computedadts
             r   _get_dt_meta_computedr      sk    JFJ!U (w"""g 	qvGT** 	MaJ)LLLAII	I**
1i   			Aq'"" 	'#&&&Aa== 	/7j..... 	HJ,agGGGGq'"" 	'#&&&Aa$''c6:%%r   syncc                   | }|}t          | t          t          t          f          rt	          j        |           } t          |t          t          t          f          rt	          j        |          }t          | |||||
          \  } }}}t          ||||||
          \  }}}}|r6t          |          t          |          k    rt          d| d| d          	 | j	        |j	        k    sJ d| j	         d|j	         d            |r| j	        r| n| 
                                }|j	        r|n|
                                }t          |          t          |          k    s+J dt          |           dt          |           d            |rft          | 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        |          sat	          j        |          sMd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        |          sat	          j        |          sMdt          |           dt          |           d}t          |          t          |          k    s
J |            d}t#          | |fd|	i|s
J |            dS # t$          $ r Y nw xY w| |k    }t          |t          j                  r|                                sJ n|sJ dS )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 amountrr   T)r   r>   intfloatr9   r;   r   r3   AssertionErrorr   itemr=   r   	assert_eqr   r   r:   rv   rc   r<   rP   )r    ru   r   r   
check_metar   r   
check_typecheck_dtyperr   r   rk   
a_original
b_originalr   a_meta
a_computedbdtb_meta
b_computed_a_bmsgr   s                           r   r   r     su    JJ!dC'(( HQKK!dC'(( HQKK!6	!" " "AsFJ "7	!" " "AsFJ  Us3xx3s88++S3SSSSSSTTT5GqwHHHagHHH  	Ng+16688Bg+16688B88t      M488MM$r((MMM    &	Eq'"" ,wq'':': ,!'17+++z7++ EJ * 0 5J J@AJ J J  "',666666%U$()9$:$:U UEI&\\U U U   
 011T&\\AAA3AAAK// E2;z3J3J ET&*6llT T@DZ@P@PT T T   $F||tJ/?/???????z7++ EJ * 0 5J J@AJ J J  "',666666%U$()9$:$:U UEI&\\U U U   
 011T&\\AAA3AAAK// E2;z3J3J ET&*6llT T@DZ@P@PT T T   $F||tJ/?/???????X1<<	<V<<AAcAAAt    	
QA!RZ   uuww4s   L7P 
P$#P$c                l     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  8   K   | ]}t          |          V  d S r   )r   )r   attrwrappeds     r   r+   zsafe_wraps.<locals>.<genexpr>  s-      
7
7d77D!!
7
7
7
7
7
7r   )assignedc                    | S r   r-   r   s    r   <lambda>zsafe_wraps.<locals>.<lambda>  s     r   )rP   	functoolswraps)r   r   s   ` r   
safe_wrapsr     sG    
 
7
7
7
7h
7
7
777 w::::{r   c                d    	 | j         S # t          $ r t          j        |           j         cY S w xY w)z!Determine dtype of an array-like.)r   rg   r9   
asanyarray)r    s    r   	_dtype_ofr     sD    & w & & &}Q%%%%&s   	 #//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`.
    Nlike)r9   aranger#   rc   )r   rj   rk   s      r   arange_safer     s{     |y$)&)))	.9dI)>)>I&III 	. 	. 	.9d-f-----	.s   5 AAc                L   ||u rt          |d          r|S t          |t                    r	 ||fi |S t          |t                    r*t          |j                  r|                    d          }	  | |fdt          |          i|S # t          $ r  | |fi |cY S w xY w)N__array_function__r   r   r   )r   r   r   r
   r   r   r#   rc   )np_funcda_funcr    r   rk   s        r   _array_like_safer     s    qyyWQ 455y$ ,wq##F###	Au		 ,   	,		F	++A$wq??t44???? $ $ $wq##F#####$s   5B B#"B#c                B    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   )r;   )dask.array.routinesr;   r   r9   )r    r   rk   r;   s       r   
array_safer     s4     *)))))BHeQ?????r   c                B    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   r9   )r    r   rk   r   s       r   asarray_safer     s4     ('''''BJDCCFCCCr   c                B    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   r9   )r    r   rk   r   s       r   asanyarray_safer     s4     +*****BM:q$II&IIIr   c                0   t          | t          t          f          rt          fd| D                       S t          | t          j                  st          d| z            |  k     s| k    rt          j        d| fz            | dk     r| z  } | S )z#Validate an input to axis= keywordsc              3  8   K   | ]}t          |          V  d S 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   )r   r?   r>   r   Integralrc   r9   	AxisError)axisr   s    `r   r   r     s    $&& =<<<<t<<<<<<dG,-- H?$FGGGte||tt||l@D$<O
 
 	
 axxKr   c                    |r| j         }t          j        | dd          }n#|j         }t          j        |dd          j        }d|dk    dz
                      |          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   keepdimsr[   g       @g      ?)r   r9   rC   TrI   )urW   u_based_decisionr   signss        r   svd_flipr     s    <  3qq4000qq40002EQJ#%--e4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.linalgrd   scipylinalgscipy.linalg)	func_namerj   rk   r    cupyxrh   r   s          r   scipy_linalg_safer      so     	QAA 0!!!!u{)955u|Y//4    r   c                (    t          d| ||          S )Nsolve_triangular)lower)r   )r    ru   r   s      r   solve_triangular_safer   0  s    /AUCCCCr   c                    | dk    r(t          j        dt          d           t          j        S t          dt           d|            )Nr   z}AxisError was deprecated after version 2021.10.0 and will be removed in a future release. Please use numpy.AxisError instead.   )rQ   
stacklevelzmodule z has no attribute )r]   warnFutureWarningr9   r   rg   __name__)r   s    r   __getattr__r  4  s[    {B"		
 	
 	
 	
 |IxII4IIJJJr   )NN)F)TT)TN)TTTTN)	TTTTTTTTr   )-
__future__r   re   r   r   r   r   r]   numpyr9   tlzr   r   r   r   dask.highlevelgraphr   
dask.utilsr   r	   r
   r   r#   rn   rv   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   " " " " " "                    # # # # # # # # ! ! ! ! ! ! . . . . . . > > > > > > > > > >  ^ ^ ^ ^B1 1 1h   > > >( ( (	  	  	 	 	 	 	   ( $& $& $& $&T h h h hV "+!>    & & &. . .$ $ $ @ @ @ D D DJ J J  ' ' ' 'T! ! ! D D D DK K K K Kr   