
    >ie&D                       d dl mZ d dlZ ej        d           d dlZd dlZd dlmZ	 d dl
mZ d dlmZ d dlmZ d dl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mZ d dlm Z  d Z! ej"        ddg          d             Z ej"        ddg          d             Z ej"        ddg          d             Zd5dZ#d Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-d  Z.d! Z/ej0        1                    d"g d#          d$             Z2d% Z3ej0        1                    d&d'd(g          d)             Z4ej0        5                    d*+          d,             Z6d- Z7d. Z8d/ Z9d0 Z:d1 Z;d2 Z<ej0        1                    d3ddg          d4             Z=dS )6    annotationsNnumpy)getitem)getter)getter_nofancy)_is_getter_task
fuse_sliceoptimizeoptimize_blockwiseoptimize_slices)	assert_eq)HighLevelGraph)SubgraphCallablefuse)SerializableLockc                6    |rt          d| dfidd          S | S )z
    Getters generated from a Blockwise layer might be wrapped in a SubgraphCallable.
    Make sure that the optimization functions can still work if that is the case.
    keyindex)outkeyinkeys)r   )funcwraps     Blib/python3.11/site-packages/dask/array/tests/test_optimization.py_wrap_getterr      s/    
  w 8wWWWW    TF)paramsc              #  B   K   t          t          | j                  V  dS )z{
    Parameterized fixture for dask.array.core.getter both alone (False)
    and wrapped in a SubgraphCallable (True).
    N)r   	da_getterparamrequests    r   r   r   &   s&       y'-
0
000000r   c              #  B   K   t          t          | j                  V  dS )z}
    Parameterized fixture for dask.array.chunk.getitem both alone (False)
    and wrapped in a SubgraphCallable (True).
    N)r   
da_getitemr    r!   s    r   r   r   /   s&       z7=
1
111111r   c              #  B   K   t          t          | j                  V  dS )z
    Parameterized fixture for dask.array.chunk.getter_nofancy both alone (False)
    and wrapped in a SubgraphCallable (True).
    N)r   da_getter_nofancyr    r!   s    r   r   r   8   s'       ('-
8
888888r   returnboolc                   t          |           dk     s t          |           t          |          k    rdS t          | d         t                    r8t          | d         j                                                  d         d         n| d         }t          |d         t                    r8t          |d         j                                                  d         d         n|d         }||k    rdS t          | dd         |dd                   D ]A\  }}t          j        	                    |          rt          ||          s dS 8||k    r dS BdS )z
    Check that two tasks (possibly containing nested tasks) are equal, where
    equality is lax by allowing the callable in a SubgraphCallable to be the same
    as a non-wrapped task.
       Fr   NT)len
isinstancer   listdskvalueszipdaskcoreistask_check_get_task_eq)ab
a_callable
b_callableaebes         r   r4   r4   A   sU    1vvzzSVVs1vv%%u *4AaD:J)K)KUQqTX__"1%%QRSTQU  *4AaD:J)K)KUQqTX__"1%%QRSTQU  ZuaeQqrrU##  B9B 	%b"-- uu2XX55 4r   c                   |                                  |                                 k    sJ |                                 D ]G\  }}||         }t          j                            |          rt          ||          sJ ?||k    sJ HdS )au  
    Compare two getter dsks.

    TODO: this is here to support the fact that low-level array slice fusion needs to be
    able to introspect slicing tasks. But some slicing tasks (e.g. `from_array`) could
    be hidden within SubgraphCallables. This and _check_get_task_eq should be removed
    when high-level slicing lands, and replaced with basic equality checks.
    N)keysitemsr1   r2   r3   r4   )r5   r6   kavbvs        r   _assert_getter_dsk_eqrA   \   s     6688qvvxx  2qT9B 	%b"------88888 r   c                   | | dt          dd          ft          dd          f| dt          dd          ff|| dt          dd          t          dd	          fft          dd          t          d
d          ff| dt          dd          t          dd          fff||dt          dd          t          dd	          fft          dd          t          d
d          ff|dt          dd          t          dd          fff| | dt          dd          fdf| ddff|| dt          dd          dfft          dd          ff| dt          dd          dfff||dt          dd          dfft          dd          ff|dt          dd          dfff| | ddt          dd          fft          dd          ff| ddt          dd          fff| | dt          dd          t          dd	          fft          d d           t          d
d          ff| dt          dd          t          dd          fff| | dd t          d d           fft          d d           dff| ddff| | dt          dd          t          dd          fft          dd          ff| dt          dd          t          dd          fff||dt          dd          fft          dd          t          dd          ff|dt          dd          t          dd          fff| | dt          dd          ddft          dd          f| dt          dd          ff| | dt          dd          ft          dd          ddf| dt          dd          ff| |dt          dd          ddft          dd          ddf|dt          dd          ddffg}|D ](\  }}t          d|i          }t          |d|i           )d S )Nx              d      2   <         
   i     NrQ   i  Fy)slicer   rA   )r   r   r   pairsinpexpectedresults          r   test_fuse_getitemrY   n   s    fc5t#4#45uR}}ES%d++,	
 uT400%S//BCr2b".
 S5t,,eCoo>?	
 uT4'8'8%S//&JKr2b".
 S5t#4#4eCoo"FG	
 63dD 1 12B	7&#t9LMvsU4%6%6$;<uR}}>NOS5t,,b12	

 ~sU4->->,CDuRQS}}FVWS5t#4#4b"9:	

 fcBdD(9(9#:;eBmm=MNS2uT40012	
 uT400%S//BCtT""E"bMM2
 S5t,,eCoo>?	
 fcD%d*;*;#<=dD@Q@QST?UVS)$	
 uT400%B--@Aq"
 S5t,,eBmm<=	
 #dD 1 134q"uR}}-
 cE$--uR}}=>	
 fc5t#4#4eUCU2r]]SS%d++,	

 fc5t#4#45uR}}eUSS%d++,	
 eD$&7&7Fb" S%d"3"3UEB		
MPEd  7 7X #s,,fsHo66667 7r   c                R   t                      }t                      }| | dt          dd          d|ft          dd          f| dt          dd          d|ff|| dt          dd          t          d	d
          fd|ft          dd          t          dd          ff| dt          dd          t          dd          fd|ff||dt          dd          t          d	d
          fd|ft          dd          t          dd          ff|dt          dd          t          dd          fd|ff| | dt          dd          d|ft          dd          d|f| | dt          dd          d|ft          dd          d|ffg}|D ](\  }}t          d|i          }t          |d|i           )d S )NrC   rD   rE   TrF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rS   )r   rT   r   rA   )	r   r   r   lock1lock2rU   rV   rW   rX   s	            r   test_fuse_getitem_lockr]      s   EE fc5t#4#4dEBE"bMMRS%d++T59	
 uT400%S//BD%Pr2b".
 S5t,,eCoo>eL	
 "4&&c38 r2b".
 S5t#4#4eCoo"FeT	
  eD$//u=b" eD$//u=b"	
7+EZ  7 7X #s,,fsHo66667 7r   c           	     j   d| dt          dd          t          dd          ff| ddt          d	d
          ffd}t          |dg          }| ddt          dd          fft          fd|                                D                       sJ t	          |          t	          |          k     sJ d S )Nz
some-arrayr5   rP   rG   rJ   rK   r6   rQ   rL   rM   )r5   r6   cr_   rF   rN   rO   c              3  8   K   | ]}t          |          V  d S N)r4   ).0vexpected_tasks     r   	<genexpr>z4test_optimize_with_getitem_fusion.<locals>.<genexpr>  s.      MM!!]33MMMMMMr   )rT   r   anyr/   r+   )r   r.   rX   rd   s      @r   !test_optimize_with_getitem_fusionrg      s    cE"bMM5c??;<cAuR}}-. C cC5!!F\Bc3+@AMMMMMV]]__MMMMMMMMv;;S!!!!!!r   c                \   t           df| dt          d d d           ff| dt          d d d           ff| dt          ddd           ff| dt          d d d           ffd}d	| t           dft          ddd           ffi}t          t          |g d
          d                   }t	          ||           | t           dft          dd d           ff| dt          ddd           ff| dt          d d d           ffd}t          t          |g dd
          d                   }t	          ||           d S )NrP   r5   r6   r_   r   rQ   d)r5   r6   r_   ri   erj   F)rename_keys)r_   ri   rj   )rangerT   r   r   rA   )r   r.   rW   rX   s       r   test_optimize_slicingrm   	  sj   R[cE$d3356cE$d3356cE!Q--/0cE$d3356 C fubkE!Q,=,=+?@AHT#ru===a@AAF&(+++ ubkE!T4$8$8#:;cE!Q--/0cE$d3356 H
 T#EJJJ1MNNF&(+++++r   c                 b   t          t          dd          t          ddd                    t          ddd          k    sJ t          t          dd          fd t          dd          f          d t          d	d
          fk    sJ t          t          dd          ft          dd          d f          t          d	d
          d fk    sJ t          dd          dk    sJ t          dt          dd          fd          dk    sJ t          j        t                    5  t          t          ddd          d           d d d            n# 1 swxY w Y   t          j        t                    5  t          d t          j        ddg                     d d d            d S # 1 swxY w Y   d S )NrP   rF   r   rQ      rJ   rK   rG   n   x   )r*   ra   )r*   Nr*   )NN   N)r*   NN   N)r
   rT   pytestraisesNotImplementedErrornparray r   r   test_fuse_slicer{   !  sB   eBmmU1a^^44b"a8H8HHHHHuS#(4r2*?@@c3E     uS#(5R==$*?@@c3E     dG$$	1111q%B--(*?@@ E     
*	+	+ ) )5R##R((() ) ) ) ) ) ) ) ) ) ) ) ) ) ) 
*	+	+ + +41a&))***+ + + + + + + + + + + + + + + + + +s$   " EEE2%F$$F(+F(c                 *   t          t          ddd          g d          g dk    sJ t          g dg d          g dk    sJ t          g dd	          d
k    sJ t          g dd          dk    sJ t          g dt          dd d                    dd
gk    sJ t          t          d           t          dd          g dft          d           t          dd          t          d           f          t          dd           t          dd          g dfk    sJ t          t          d           t          d           g dft          d           t          dd          df          t          dd           t          dd          dfk    sJ d S )NrP   rG   ro   r*   ro   rr   )         )rP   rG      (   rL   )rr   r*   ro   )r   rG   r   rr   r   rt   rL   r*   r   rQ   )r
   rT   rz   r   r   test_fuse_slice_with_listsr   <  s   eBA&&			22lllBBBB***III66,,,FFFF***A.."4444***B//25555***E!T1,=,=>>2r(JJJJ	teArllIII.teAqkk5QU;;0W 
4..%1++yyy	12 2 2 2 	teDkk999-dU1a[[!/L 
4..%1++q	)* * * * * *r   c                     t          d           } | g d| fd| | ffd| | f| g d| ff| ddg| | f| | | dffg}|D ]F\  }}t          j        t                    5  t	          ||           d d d            n# 1 swxY w Y   Gd S )Nr}   r   r*   ro   )rT   ru   rv   rw   r
   )nilcasesr5   r6   s       r   test_nonfusible_fancy_indexingr   J  s    
++C
yyy#	C.
S#iii-.
1vsC	 3S!"45E   1].// 	 	q!	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 s   A22A6	9A6	c           	         d| | dd t          d d           fft          d d           dffi}t          t          |          d| ddfi           d S )NrC   rQ   rR   rT   rA   r   )r   r.   s     r   test_hard_fuse_slice_casesr   Y  sg    fvsT5t+<+<$=>tTARARTU@VWC /#..vsI6N0OPPPPPr   c                     t          j        d          } dD ]v}t          j        | d          }|                    |j        |                                          }t          d |                                D                       dk    sJ wd S )NrP   )rQ   rP   r   chunksc              3  J   K   | ]}t          |t          j                  V  d S ra   )r,   rx   ndarrayrb   rc   s     r   re   z.test_dont_fuse_numpy_arrays.<locals>.<genexpr>f  s.      CC:a,,CCCCCCr   r*   )	rx   onesda
from_array__dask_optimize__r1   __dask_keys__sumr/   )rC   _rS   r.   s       r   test_dont_fuse_numpy_arraysr   `  s    
A I IM!E***!!!&!//*;*;<<CCcjjllCCCCCqHHHHH	I Ir   c           	        t          j        d                              d          | dt          dd          t          dd          ffd|dt          d           dffd}d	g}t	          ||          }t          |          d
k    sJ |                                dd	hz
                                  }t          ||         | dt          dd          dff          sJ d S )Nr      r   rC   r   r   dxr   r   aliasr   r   )rC   r   r   dx2r   r   rr   )	rx   arangereshaperT   r   r+   r<   popr4   )r   r   r.   r<   dsk2	fused_keys         r   test_fuse_slices_with_aliasr   i  s    Yr]]""6**sU1a[[%1++$>?%odQ/?@	 C <DCDt99>>>>Z005577Id9oeAqkk1=M/NOOOOOOOr   c           
        d| |dt          ddd           t          ddd           ffddgt          d	d
d           ffi}t          t          |          |           d| |dg dfdfi}t          t          |          |           d S )Nr5   rC   rP   rG   rJ   rK   r*   rr   rL   rM   r}   r   r   )r   r   r.   s      r   /test_dont_fuse_fancy_indexing_in_getter_nofancyr   w  s    S5R#6#6c38M8M"NOVU2r4(()
C /#..444>3			:A>
?C/#..44444r   r   )rP   rQ   rr   c                   t          j        d          dz  t          j        d|           }|z   }|                    |j        |                                          }t          fd|                                D                       sJ |                                D ]L}t          |          }|	                    d          |	                    d          z   dk    sJ |urd|vsJ Mt          d	 |                                D                       }|j        dk    r||j        k    sJ n|d
k    sJ t          |dz              d S )NrP   iIr   c              3      K   | ]}|u V  	d S ra   rz   )rb   rc   rC   s     r   re   z0test_fuse_getter_with_asarray.<locals>.<genexpr>  s'      ,,!qAv,,,,,,r   r   r   r*   
1234567890c                0    g | ]}t          |          |S rz   )r	   r   s     r   
<listcomp>z1test_fuse_getter_with_asarray.<locals>.<listcomp>  s%    CCC10B0BCQCCCr   r   )rx   r   r   r   r1   r   rf   r/   strcountr+   npartitionsr   )r   rS   zr.   rc   s	n_gettersrC   s          @r   test_fuse_getter_with_asarrayr     s]   
j A
6"""A	AA


afaoo&7&7
8
8C,,,,szz||,,,,,,,,ZZ\\ ) )FFwwy!!AGGH$5$55::::A::q((((CC

CCCDDI}qAM)))))A~~~~aQr   c                    t          dd           }| d|ddfdf| | d|ddf|fdf| | d||fddfdfdfg}|D ]&\  }}t          t          d|i          d|i           'd S )Nr   rC   Frz   r5   r   )r   nulloptsorigfinals        r   $test_remove_no_op_slices_for_getitemr     s    D>>D
3eU	+S1
GS$u5t	<cB
GS4,u=r	BCHD
  J JeosDk::S%LIIIIJ Jr   whichr   r   c                    | dk    r|}n|}t          dd           }|d|ddf|d|ddff||d|ddf|f|d|ddff||d||fddfdf|d||fddffg}|D ]&\  }}t          t          d|i          d|i           'd S )Nr   r   rC   Frz   r5   r   )	r   r   r   r   getr   r   r   r   s	            r   :test_dont_remove_no_op_slices_for_getter_or_getter_nofancyr     s     D>>D #tUE*#tUE*	

 sCue4d;#tUE*	

 sC$ue<bA#d|UE2	
D  J JeosDk::S%LIIIIJ Jr   z3blockwise fusion does not respect this, which is ok)reasonc                 z   t          j        dd          } t          j        | dz   dz   dz             }|                    |j        |                                          }t          j                            ddi          5  |                    |j        |                                          }d d d            n# 1 swxY w Y   t	          j        ||                                          t	          j        ||                                          k    sJ t          |          t          |          k     sJ d S )	NrP   r   r   r*   ro   rr   zoptimization.fuse.ave-widthr   )
r   r   r   r   r1   r   configsetr   r+   )rC   rS   r5   r6   s       r   test_turn_off_fusionr     s>   
4   A
q1uqy1}A	AFAOO$5$566A	7;	<	< ; ;(9(9::; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 8Aq(())TXa9J9J-K-KKKKKq66CFF??????s   .B<<C C c                 (   t           j                            ddi          5  t          j        ddd          } | j        }|                                 } |||                                           }t          |t                    sJ t          |t                    sJ ||k    sJ | 
                                } t          |                                 t                    sJ t          | dgdz             ddd           dS # 1 swxY w Y   dS )	zFCheck that by disabling fusion, the HLG survives through optimizationszoptimization.fuse.activeFrr   rr   int)r   dtyper*   N)r1   r   r   r   r   r   __dask_graph__r   r,   r   persistr   )rS   r   dsk1r   s       r   test_disable_lowlevel_fusionr     sJ    
4e<	=	= 
 
GAd%000&!!xaoo//00$/////$/////t||||IIKK!**,,n=====!aS1W
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s   CDDDc                 |   t          j        dd          } t          j        dd          }t          j        ddd          }| |z   |z   }|                                }t          |          dk    sJ t          |          }t          |          dk    sJ t          |t          j        dd                     d	S )
z~
    Check that certain array creation routines work with blockwise and can be
    fused with other blockwise operations.
    rr   r   r   ro   )
fill_valuer   rQ   r*         @N)	r   r   zerosfullr   r+   r   r   rx   )rC   rS   r   r5   r   r   s         r   $test_array_creation_blockwise_fusionr     s    
 	$A
4   A
a---A	A	ADt99>>>>d##Dt99>>>>aC!!!!!r   c                    t          j        g dd          } t          j        | | d         gf          } |                     d          }t          j        t
          j        |ddi          }|                                 d S )N)r*   ro   r   ro   rt   r   ro   )r   r   concatenaterechunkcoarsenrx   r   compute)rC   rS   s     r   test_gh3937r     sk    
kkk4((A
AbE7|$$A			$A 	
261q!f%%AIIKKKKKr   c                    t          j        d                              d          } t          j        | d          }|dz   }t          j        ||j                  }t          |                    d          |           d S )N8   )      r   r   r*   Foptimize_graph)	rx   r   r   r   r   dotTr   r   )rC   ri   Xs      r   test_double_dependenciesr      so    
	"f%%A
a'''A	AA
q!#Aaiiui--q11111r   c                 N   t          j        dd          } t          j        dd          }| dz   d|dz  z  z   }t          j        |          \  }t          t          t          j        |j                                                            dk    sJ t          ||           d S )NrP   r   r   r*   ro   rQ   )
r   r   r   r1   r   r   mapr3   r/   r   )rC   rS   r   zzs       r   test_fuse_rootsr   	  s    
4   A
D!!!A	
Q1q!t8AM!ERs4; 0 01122a7777b!r   c                    t          j        dd          } t          j        dd          }t          j        d          5  |dz  }d d d            n# 1 swxY w Y   | dz   d|z  z   }t          j                            |j                  }t          |j                  dk    sJ d	did
 |j        	                                D             v sJ t          j
        ||j        |j        |j                  }t          ||           d S )NrP   r   r   bar)fooro   r*   rr   r   c                    g | ]	}|j         
S rz   r   )rb   ls     r   r   z/test_fuse_roots_annotations.<locals>.<listcomp>  s    IIIamIIIr   )r   r   r   r1   annotate	blockwiser   r+   layersr/   Arraynamer   r   r   )rC   rS   r   hlgzas        r   test_fuse_roots_annotationsr     sB   
4   A
D!!!A	5	!	!	!  qD               
Q1q5A
.
+
+AF
3
3Csz??a5>IISZ5F5F5H5HIIIIIII	#qvqx	1	1Bb!s   AAAr   c                    t          j        t          j        ddgddgg          d          }|dz  }t          j        ||          }|                    |           }t          |ddgddgg          sJ d S )Nr*   ro   r   r   r~      )r   r   rx   ry   matmulr   r   )r   xxr   rX   s       r   ,test_optimize_blockwise_duplicate_dependencyr   "  s     
rx!Q!Q 011!	<	<	<B	aB
	"bA YYnY55FVr2hR12222222r   )r'   r(   )>
__future__r   ru   importorskipr   rx   r1   
dask.arrayry   r   dask.array.chunkr   r$   dask.array.corer   r   r   r&   dask.array.optimizationr	   r
   r   r   r   dask.array.utilsr   dask.highlevelgraphr   dask.optimizationr   r   
dask.utilsr   r   fixturer4   rA   rY   r]   rg   rm   r{   r   r   r   r   r   r   markparametrizer   r   r   xfailr   r   r   r   r   r   r   r   rz   r   r   <module>r
     s   " " " " " "   G               2 2 2 2 2 2 / / / / / / ? ? ? ? ? ?              ' & & & & & . . . . . . 4 4 4 4 4 4 4 4 ' ' ' ' ' '   e}%%%1 1 &%1 e}%%%2 2 &%2 e}%%%9 9 &%9   6  $U7 U7 U7p37 37 37l
" 
" 
", , ,0+ + +6* * *  Q Q QI I IP P P5 5 5 :::..  /.(J J J 8-=">??J J @?J@ OPP
 
 QP
   " " " 	 	 	2 2 2     )D%=99	3 	3 :9	3 	3 	3r   