o
    NrfJ                     @  s  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	d
 Zd:ddZdd Zd;ddZdd Zdd Z dd Z!d<ddZ"d=ddZ#					d>ddZ$									d?d d!Z%ej&fd"d#Z'd$d% Z(d&d' Z)d(d) Z*d*d+ Z+d,d- Z,d.d/ Z-d0d1 Z.d;d2d3Z/d4d5 Z0d;d6d7Z1d8d9 Z2dS )@    )annotationsN)concatfrequencies)Array)	AxisError)is_dask_collectiontokenize)HighLevelGraph)has_keywordis_arraylikeis_cupy_typetypenamec                 C  s   t | r|  S | S N)r   getx r   Y/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/dask/array/utils.pynormalize_to_array   s   r   c              
     s  t | drt| rt| r| j} |du r| du rtdt| r&t| } | du r.tj} n|du r:t | dr:| j	}t
| trI| d|pDd |d} t
| tsSt
| trodd	 | D }d
d	 t| |D }t
| trk|S t| S t | drt | drt
| jts| S |du r| j}zd| tdd t| jD  }|j|kr|| jkr|tftdd t||j D   }|tdd t|jD  }n|dkr| }n|d| }|tjju rtjjtjd| |p| j	ddd}W n ty   tjd| |p| j	d}Y nw t|rt|}|rR|j	|krRz||}W |S  tyQ   z%t fdddD rD|j	jdv rDtg |}n W Y d  |S d  w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                 S  s4   g | ]}t |tjrd nt|dr|jnt|qS )r   ndim)
isinstancenumbersNumberhasattrr   len).0ar   r   r   
<listcomp>@   s    
z#meta_from_array.<locals>.<listcomp>c                 S  s&   g | ]\}}|d kr|nt ||qS r   )meta_from_array)r   r    ndr   r   r   r!   H   s   & r   c                 s      | ]	}t d d dV  qdS r   Nslicer   _r   r   r   	<genexpr>V       z"meta_from_array.<locals>.<genexpr>c                 s  s    | ]}d V  qd S r   r   r(   r   r   r   r*   Y   s    c                 s  r$   r%   r&   r(   r   r   r   r*   Z   r+   r   T)maskc                 3      | ]	}|t  v V  qd S r   strr   ser   r   r*   l   
    

)zinvalid literalz!could not convert string to floatZSU)r   r   r   r   
ValueErrornpisscalararrayndarrayr   r   typelisttuplezipr   r   rangeEllipsissumZreshapemaZmaskedempty	Exceptionastypeanykind)r   r   r   Zndimsr    metar   r3   r   r"      sz   





&
$

r"   c                   s  t jdd t  tjdtd dd |D }dd | D }t| t jr.| | }nzt	| dr8d	|d< | |i |}W nu t
yk   zt fd
ddD rT W Y d   W d    W d    d S d   w ty   z*t|dkrdt v r|d }nW Y d   W d    W d    d S W Y d   nd   w ty   Y W d    W d    d S w |rt|dd |krtt ||}W d    n1 sw   Y  t |rt |}|W  d    W  d    S 1 sw   Y  W d    d S 1 sw   Y  d S )Nignore)all)categoryc                 S  s    g | ]}t |rt|n|qS r   r   r"   )r   r   r   r   r   r!      s     z compute_meta.<locals>.<listcomp>c                 S  s&   i | ]\}}|t |rt|n|qS r   rL   r   kvr   r   r   
<dictcomp>   s    z compute_meta.<locals>.<dictcomp>Zcomputing_metaTc                 3  r.   r   r/   r1   r3   r   r   r*      r5   zcompute_meta.<locals>.<genexpr>)zunexpected keyword argumentzis an invalid keyword forz'Did not understand the following kwargs   z&zero-size array to reduction operationr   r   )r7   Zerrstatewarningscatch_warningssimplefilterRuntimeWarningitemsr   Z	vectorizer
   	TypeErrorrF   r6   r   r0   rD   getattr
contextlibsuppressAttributeErrorrE   r8   r9   )funcZ_dtypeargskwargsZ	args_metaZkwargs_metarH   r   r3   r   compute_meta|   sX   




#&

Tr_   Fc                 K  s   t | } t |}t| dd dkr3t| dst|dr'tjj| |fddi|S tj| |fd|i|S |rI| j|jkoHtdd t| j	|j	D S | |k S )	Nr   Or-   Zmasked_equalT	equal_nanc                 s  s0    | ]\}}t |rt |n||kV  qd S r   )r7   isnan)r   r    br   r   r   r*      s     
zallclose.<locals>.<genexpr>)
r   rX   r   r7   rB   allcloser   rJ   r>   Zflat)r    rc   ra   r^   r   r   r   rd      s   rd   c                 C  s$   dd }t | j|dt |j|dkS )Nc                 S  s   t | tr| dddfS | S )N)r   r0   )rN   r   r   r   key   s   
zsame_keys.<locals>.key)rf   )sorteddask)r    rc   rf   r   r   r   	same_keys   s   ri   c                 C  s   | j od| j vS Nr   )r   r   r   r   r   
_not_empty      rk   c              
   C  s   t | tsdS |   tdd | jD sJ tt| j }dd | D }t	 }|
 D ]}| j D ]}z|t||  W q7 tyM   Y q7w q0t|dk sYJ |dS )z2Check that graph is well named and non-overlappingNc                 s  s    | ]
}t |ttfV  qd S r   )r   r=   r0   )r   rN   r   r   r   r*      s    z_check_dsk.<locals>.<genexpr>c                 S  s   i | ]\}}|d kr||qS )rQ   r   rM   r   r   r   rP      s    z_check_dsk.<locals>.<dictcomp>   )r   r	   validaterJ   Zlayersr   r   valuesrV   setkeysaddr   KeyErrorr   )ZdskZfreqsZnon_oneZkey_collisionsrN   layerr   r   r   
_check_dsk   s    
ru   Tc                 C  sn   |rt | t |ksJ t| |D ]#\}}t|st|r.|r-t|t|ks-J q||ks4J qd S r   )r   r>   mathrb   )r    rc   
check_ndim	check_nanZaaZbbr   r   r   assert_eq_shape   s   ry   c                 C  s   | j |d} tjdd | jD  D ]@}| j| jf|  }t|dr%| }t|ds1tj	|dd}t
dd t| j|D }t||j|d	d
 |j| jksQJ dq| S )N	schedulerc                 s  s    | ]	}t t|V  qd S r   )r?   r   )r   cr   r   r   r*      r+   z _check_chunks.<locals>.<genexpr>resultr   r`   r,   c                 s  s    | ]	\}}|| V  qd S r   r   )r   r|   ir   r   r   r*      r+   F)rw   rx   z6maybe you forgot to pass the scheduler to `assert_eq`?)Zpersist	itertoolsproductchunksrh   namer   r}   r7   r9   r=   r>   ry   r   r   )r   rw   r{   idxchunkZexpected_shaper   r   r   _check_chunks   s   


r   c           
      C  s   | }d }d }t | rct| rc| jd usJ | j}	|rt| j t| dd }|r.t| ||d} | j|d} | }t| dr?| 	 } t| dsKt
j| dd} t| rW| j|jksWJ |rbt|j| jdd	 nt| dsot
j| dd} t| dd }	| |	||fS )
Nr   )rw   r{   rz   todenser   r`   r,   F)rx   )r   r   r   ru   rh   rX   r   computer   r   r7   r9   rk   ry   r   )
r   check_shapecheck_graphcheck_chunksrw   r{   Z
x_originalZx_metaZ
x_computedadtr   r   r   _get_dt_meta_computed   s4   



r   syncc                 K  sJ  | }|}t | tttfrt| } t |tttfrt|}t| |||||
d\} }}}t||||||
d\}}}}|rOt|t|krOtd| d| dz/| j	|j	ksdJ d| j	 d|j	 d|r| j	rk| n| 
 }|j	rt|n|
 }t|t|ksJ dt| dt| d|rkt| drt|drt| j|j t|drd|jj d	| j d}|jj| jksJ ||d urd
t|j d	t| d}t|jt|ksJ |t|st|sdt| dt| d}t|t|ksJ |t|drkd|jj d	|j d}|jj|jks$J ||d urkdt|j d	t| d}t|jt|ksEJ |t|skt|skdt| dt| d}t|t|kskJ |d}t| |fd|	i|s}J |W dS  ty   Y nw | |k}t |tjr| sJ dS |sJ dS )N)r   r   r   rw   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 amountra   T)r   r<   intfloatr7   r9   r   r0   AssertionErrorr   itemr;   r   	assert_eqr   r   r8   rd   rW   r:   rJ   )r    rc   r   r   Z
check_metar   rw   Z
check_typeZcheck_dtypera   r{   r^   Z
a_originalZ
b_originalr   Za_metaZ
a_computedZbdtZb_metaZ
b_computed_a_bmsgr|   r   r   r   r   &  s   

	

 
r   c                   s,   t  fdd|D rtj |dS dd S )zkLike functools.wraps, but safe to use even if wrapped is not a function.

    Only needed on Python 2.
    c                 3  s    | ]}t  |V  qd S r   )r   )r   attrwrappedr   r   r*         zsafe_wraps.<locals>.<genexpr>)assignedc                 S  s   | S r   r   r   r   r   r   <lambda>  s    zsafe_wraps.<locals>.<lambda>)rJ   	functoolswraps)r   r   r   r   r   
safe_wraps  s   r   c                 C  s(   z| j W S  ty   t| j  Y S w )z!Determine dtype of an array-like.)r   r[   r7   
asanyarray)r    r   r   r   	_dtype_of  s
   r   c                 O  sV   | du rt j|i |S zt j|dt| i|W S  ty*   t j|i | Y S 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)r7   Zaranger"   rW   )r   r]   r^   r   r   r   arange_safe  s   r   c                 K  s   ||u rt |dr|S t|tr||fi |S t|tr(t|jr(|jdd}z| |fdt|i|W S  tyF   | |fi | Y S w )NZ__array_function__r   rz   r   )r   r   r   r   r   r   r"   rW   )Znp_funcZda_funcr    r   r^   r   r   r   _array_like_safe  s   


r   c                 K  $   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   )r9   )Zdask.array.routinesr9   r   r7   )r    r   r^   r9   r   r   r   
array_safe  s   r   c                 K  r   )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   r7   )r    r   r^   r   r   r   r   asarray_safe     	r   c                 K  r   )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   r7   )r    r   r^   r   r   r   r   asanyarray_safe  r   r   c                   sr   t | ttfrt fdd| D S t | tjstd|  |   k s'|  kr/td|  f | dk r7|  7 } | S )z#Validate an input to axis= keywordsc                 3  s    | ]}t | V  qd S r   )validate_axis)r   axr   r   r   r*     r   z validate_axis.<locals>.<genexpr>z%Axis value must be an integer, got %sz2Axis %d is out of bounds for array of dimension %dr   )r   r=   r<   r   IntegralrW   r   )axisr   r   r   r   r     s   
r   c                 C  sf   |r| j }tj| ddd}n|j }tj|dddj}d|dkd | }| | ||j } }| |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   ZkeepdimsrQ   g       @g      ?)r   r7   rA   TrE   )urO   Zu_based_decisionr   Zsignsr   r   r   svd_flip   s   r   c                 O  sJ   |d }t |rdd l}t|jj| }n
dd l}t|j| }||i |S rj   )r   Zcupyx.scipy.linalgrX   scipyZlinalgZscipy.linalg)	func_namer]   r^   r    Zcupyxr\   r   r   r   r   scipy_linalg_safe*  s   r   c                 C  s   t d| ||dS )NZsolve_triangular)lower)r   )r    rc   r   r   r   r   solve_triangular_safe:  rl   r   c                 C  s<   | dkrt jdtt dtd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.rm   )rK   
stacklevelzmodule z has no attribute )rR   warnr   r   FutureWarningr[   __name__)r   r   r   r   __getattr__>  s   r   )NN)F)TT)TN)TTTTN)	TTTTTTTTr   )3
__future__r   rY   r   r   rv   r   rR   numpyr7   Ztlzr   r   r   r   Zdask.array.numpy_compatr   Z	dask.baser   r   Zdask.highlevelgraphr	   Z
dask.utilsr
   r   r   r   r   r"   r_   rd   ri   rk   ru   ry   r   r   r   WRAPPER_ASSIGNMENTSr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sf    
a
4



*
k

*
