
    bi#                    .	   d dl mZ d dl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 d dlmZ  ej                         r ej                   dd       d	 Zd
 Z G d dej&                  j(                  j*                        Z ej.                  e        G d dej&                  j(                  j*                        Zej2                  j5                  dej6                  ej8                  ej:                  ej<                  ej>                  ej@                  ejB                  ejD                  ejF                  ejH                  ejJ                  ejL                  ejN                  ej6                  ejP                  g      ej2                  j5                  d eejR                  jU                         jS                  d            ejR                  jU                         jS                  dd      fejR                  jU                         jS                  dd       eejR                  jU                         jS                  d            f eejR                  jU                         jS                  d             eejR                  jU                         jS                  d            fg      d               Z+ej2                  j5                  d e ejX                  d            df ejZ                   ejX                  d            df e ejX                  d            dfej\                  j_                   ejX                  d      g d      df ejX                  d      dfddddg	      d        Z0ej2                  j5                  dedfej                  dfedfej\                  jb                  dfejd                  dfe3dfe4dfg      d        Z5d  Z6 G d! d"ej&                  j(                  j*                        Z7ej2                  j5                  d# ejZ                  d$d%g       ejp                  d$d%g      g      d&        Z9 G d' d(      Z:ej2                  j5                  d# ejZ                  d$d%g       ejp                  d$d%g      g      d)        Z;d* Z<y)+    )annotationsN)Array)is_valid_array_chunkis_valid_chunk_type)	assert_eqz'parametrize using unsupported functionsT)allow_module_levelc                      fd}|S )z
    Wrap a function.
    c                     t        | j                        |i |}t        |t        j                        s|S  t        |       |      S N)getattrarr
isinstancenpndarraytype)selfakw	func_names      Y/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/dask/array/tests/test_dispatch.pywrappedzwrap.<locals>.wrapped   sA    (GDHHi(!2r2"1bjj1qDztDz!}D     )r   r   s   ` r   wrapr      s    
E Nr   c                $     t          fd       }|S )z!
    Wrap a simple property.
    c                0    t        | j                        S r   )r   r   )r   r   r   	prop_names      r   r   z"dispatch_property.<locals>.wrapped"   s    txx++r   )property)r   r   s   ` r   dispatch_propertyr      s    
 , , Nr   c                      e Zd ZdZdZd Zd Zd Z ed      Z	 ed      Z
d Z ed	      Z ed
      Z ed      Z ed      Z ed      Z ed      Z ed      Z ed      Zy)EncapsulateNDArraya  
    A class that "mocks" ndarray by encapsulating an ndarray and using
    protocols to "look like" an ndarray. Basically tests whether Dask
    works fine with something that is essentially an array but uses
    protocols instead of being an actual array. Must be manually
    registered as a valid chunk type to be considered a downcast type
    of Dask array in the type casting hierarchy.
       c                    || _         y r   r   )r   r   s     r   __init__zEncapsulateNDArray.__init__5   s	    r   c                H    t        j                  | j                  g|i |S r   r   asarrayr   r   argskwargss      r   	__array__zEncapsulateNDArray.__array__8       zz$((4T4V44r   c                4    t         fd|D              st        S t         fd|D              }t         fd|D              }t        |        j                  j                  ||||      }t        |t        j                        s|S  t               |      S )Nc              3     K   | ]:  }t        |t              t        j                  ft        j                  z          < y wr   )
issubclassr   r   r   
ScalarType.0tir   s     r   	<genexpr>z8EncapsulateNDArray.__array_function__.<locals>.<genexpr><   s3      
IKJrDJ

3bmmCD
   A Ac              3  d   K   | ]'  }t        |t                    s|n|j                   ) y wr   r   r   r   )r3   r   r   s     r   r5   z8EncapsulateNDArray.__array_function__.<locals>.<genexpr>@   s,      
DGz#tDz2C?
   -0c              3  N   K   | ]  }t        |t                    r|  y wr   )r0   r   r2   s     r   r5   z8EncapsulateNDArray.__array_function__.<locals>.<genexpr>C   s     C
2tDz(B"Cs   %%)
allNotImplementedtupleprintr   __array_function__r   r   r   r   )r   ftarrsr   r   s   `     r   r?   z%EncapsulateNDArray.__array_function__;   s     
OP
 
 "! 
KO
 
 CqCCaHH''1dB7"1bjj1qDztDz!}Dr   __getitem____setitem__c                     t         fd|D              st        S t         fd|D              } t        ||      |i |}t	        |t
        j                        s|S  t               |      S )Nc              3     K   | ]:  }t        |t              t        j                  ft        j                  z          < y wr   )r   r   r   r   r1   r3   ir   s     r   r5   z5EncapsulateNDArray.__array_ufunc__.<locals>.<genexpr>M   s3      
HIJq4:rzz2R]]BC
r6   c              3  d   K   | ]'  }t        |t                    s|n|j                   ) y wr   r8   rG   s     r   r5   z5EncapsulateNDArray.__array_ufunc__.<locals>.<genexpr>Q   s'     U
1d4j 9qquuDUr9   )r;   r<   r=   r   r   r   r   r   )r   ufuncmethodinputsr+   r   s   `     r   __array_ufunc__z"EncapsulateNDArray.__array_ufunc__L   sj     
MS
 
 "!UfUU"GE6"F5f5"1bjj1qDztDz!}Dr   shapendimdtypeastypesumprodreshapesqueezeN)__name__
__module____qualname____doc____array_priority__r%   r,   r?   r   rC   rD   rM   r   rN   rO   rP   rQ   rR   rS   rT   rU   r   r   r   r!   r!   )   s     5E }%K}%KE g&EV$Dg&E(^F
u+C<D9oG9oGr   r!   c                  p    e Zd ZdZd Zd Zd Zd Zd Zd Z	 e
d      Z e
d	      Z e
d
      Zd Zd Zy)WrappedArraya  
    Another mock duck array class (like EncapsulateNDArray), but
    designed to be above Dask in the type casting hierarchy (that is,
    WrappedArray wraps Dask Array) and be even more minimal in API.
    Tests that Dask defers properly to upcast types.
    c                     || _         || _        y r   )r   attrs)r   r   r^   s      r   r%   zWrappedArray.__init__k   s    
r   c                H    t        j                  | j                  g|i |S r   r'   r)   s      r   r,   zWrappedArray.__array__o   r-   r   c              #     K   |D ]c  }t        |t        |             r|j                   't        |t        t        f      r# t        |      | j                  |             `| e y wr   )r   r   r   r=   list_downcast_args)r   r*   args      r   rb   zWrappedArray._downcast_argsr   s[      	C#tDz*ggC%/d3i 3 3C 899		s   A*A,c                    t        | j                  |            } t        |        t        ||      |i |fi | j                  S r   )r=   rb   r   r   r^   )r   rJ   rK   rL   r+   s        r   rM   zWrappedArray.__array_ufunc__{   sE    t**623tDz0'%0&CFCRtzzRRr   c                z    t        | j                  |            } t        |        ||i |fi | j                  S r   )r=   rb   r   r^   )r   functypesr*   r+   s        r   r?   zWrappedArray.__array_function__   s;    T((./tDz$//>4::>>r   c                     y)N.r   )r   s    r   __dask_graph__zWrappedArray.__dask_graph__   s     r   rN   rO   rP   c                T     t        |       | j                  |   fi | j                  S r   )r   r   r^   )r   keys     r   rC   zWrappedArray.__getitem__   s$    tDz$((3-64::66r   c                "    || j                   |<   y r   r$   )r   rk   values      r   rD   zWrappedArray.__setitem__   s    r   N)rV   rW   rX   rY   r%   r,   rb   rM   r?   ri   r   rN   rO   rP   rC   rD   r   r   r   r\   r\   c   sP    5S?
 g&EV$Dg&E7r   r\   opzarr_upcast, arr_downcast)
   ro   )   rp   )chunksc                v    t         | ||            t         | ||            cxk(  rt        |      k(  sJ  J y)z9Test proper dispatch on binary operators and NumPy ufuncsN)r   )rn   
arr_upcastarr_downcasts      r   %test_binary_operation_type_precedenceru      sI    P 	R
L)*<,-	
			r   zarr, result   F)TFTF)NT)g        F)r   F) Fc                "    t        |       |u sJ y)z)Test is_valid_array_chunk for correctnessN)r   )r   results     r   test_is_valid_array_chunkrz      s    &  $...r   zarr_type, resultc                "    t        |       |u sJ y)z(Test is_valid_chunk_type for correctnessN)r   )arr_typery   s     r   test_is_valid_chunk_typer}      s     x(F222r   c                    t        j                  t        j                  d            } t	        t        j                  d            }| j                  |      t        u sJ d|_        | t        j                  |      z   }t        |t         j                        sJ t        |dt        j                  d      z  d       y)zPDirectly test Dask deferring to an upcast type and the ability to still wrap it.rv   N   F)
check_type)da
from_arrayr   aranger\   __add__r<   ri   r   r   r   )r   bress      r   &test_direct_deferral_wrapping_overrider      s    
biil#ARYYq\"A99Q<>)))A
bmmA
Cc288$$$c1ryy|#6r   c                      e Zd Zd Zy)$UnknownScalarThatUnderstandsArrayOpsc                    |j                  dd      }||z   D ]<  }t        |d      st        |t        j                  t
        t        f      r6t        c S  t               S )Noutr   rM   )gethasattrr   r   r   r   r   r<   )r   rJ   rK   rL   r+   outputsitems          r   rM   z4UnknownScalarThatUnderstandsArrayOps.__array_ufunc__   s\    **UB'W$ 	&Dt./
rzz5*NO9 &%		& 455r   N)rV   rW   rX   rM   r   r   r   r   r      s    6r   r   r      r   c                   t               }t        | |z        t         k(  sJ t        || z        t         k(  sJ t        t        j                  ||             t         k(  sJ t        t        j                  | |            t         k(  sJ y r   )r   r   r   multiplyr   ss     r   7test_delegation_unknown_scalar_that_understands_arr_opsr      sv    ,.Aa=@@@@C=@@@@As#$(LLLLC#$(LLLLr   c                      e Zd ZdZd ZeZy)UnknownScalarNc                     y)N*   r   )r   others     r   __mul__zUnknownScalar.__mul__  s    r   )rV   rW   rX   rM   r   __rmul__r   r   r   r   r   
  s    O Hr   r   c                    t               }| |z  dk(  sJ || z  dk(  sJ t        j                  t        d      5  t	        j
                  ||        d d d        y # 1 sw Y   y xY w)Nr   z/operand 'UnknownScalar' does not support ufuncs)match)r   pytestraises	TypeErrorr   r   r   s     r   test_delegation_unknown_scalarr     s`    A7b==s7b==	J
  	As  s   AA#c                     t        j                  g d      } t        | dk(  g d       t        d| k(  g d       d| v sJ y )N)r   r   .dr   )FFTFr   )r   r   r   )r   s    r   test_delegation_specific_casesr     s:    
*+Aa3h34cQh34!8O8r   )=
__future__r   operatornumpyr   r   
dask.arrayarrayr   r   dask.array.chunk_typesr   r   dask.array.utilsr   _array_expr_enabledskipr   r   libmixinsNDArrayOperatorsMixinr!   register_chunk_typer\   markparametrizeaddeqgtgeltlemodmulnepowsubtruedivfloordivsubtractrandomdefault_rngru   r   r   mamasked_arrayrz   MaskedArrayr   floatintr}   r   r   r(   r   r   r   r   r   r   r   <module>r      s   "      L &2FKK9dS		4<< 4n   ) *-266==66 -` 

(  ..077ABII!!#**8F*C	

 II!!#**8F*Cryy446==hGH	

 ..077ABryy446==hGH	
"#)J 	ibiil	#U+	yryy|	$e,	IBIIaL	)40			IBIIaL*D	EtL	1t 	"/#"/
 	u	5	T"			D!	T		e33
	7	6266==+N+N 	6 1v!6


Aq68J KLM MM  1v!6


Aq68J KL Mr   