
    bi                       d dl mZ d dlZd dlmZm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mZmZ d dlmZ d d	lmZ d!d
Zd Zd Zd Zd Zd Zd Zej@                  jC                  dg d      d        Z"ej@                  jG                  d      d        Z$d Z%d Z&d Z'd Z(d Z)d Z*ej@                  jC                  dddg      d         Z+y)"    )annotationsN)AliasDataNodenumpy)getitem)getter)
fuse_sliceoptimizeoptimize_blockwise)	assert_eq)HighLevelGraphc                   t        |       dk  st        |       t        |      k7  ry| d   }|d   }||k7  ryt        | dd |dd       D ]:  \  }}t        j                  j	                  |      rt        ||      r2 y||k7  s: y y)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zipdaskcoreistask_check_get_task_eq)ab
a_callable
b_callableaebes         ]/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/dask/array/tests/test_optimization.pyr   r      s     1vzSVs1v%1J1JZaeQqrU# B99B%b"-2X     c            	         dt         dt        dd      t        dd      fft         ddt        d	d
      ffd} t        | dg      }t        |d   t              sJ t        |      t        |       k  sJ y )Nz
some-arrayr   
      d      r      2   <   )r   r   cr&   )r   slicer
   
isinstancer   r   )dskresults     r   !test_optimize_with_getitem_fusionr+   +   sv    cE"bM5c?;<cAuR}-.C cC5!FfSk5)))v;S!!!r   c                    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        t        j                  t              5  t        d t        j                  ddg             d d d        y # 1 sw Y   MxY w# 1 sw Y   y xY w)Nr      r   r#      r!   r"   r    n   x   )r   N)r   Nr   )NN   N)r   NN   N)r	   r'   pytestraisesNotImplementedErrornparray r   r   test_fuse_slicer;   7   sg   eBmU1a^4b"a8HHHHuS#(4r2*?@c3E    uS#(5R=$*?@c3E    dG$	111q%B-(*?@ E    
*	+ )5R#R() 
*	+ +41a&)*+ +) )+ +s   !E"EEEc                 j   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 y )Nr   r    r.   r   r.   r2   )         )r   r       (   r$   )r2   r   r.   )rB   r    rA   r2   rB   r4   r$   r   r   r#   )r	   r'   r:   r   r   test_fuse_slice_with_listsrC   R   s2   eBA&	2lBBB*I6,FFF*A."444*B/2555*E!T1,=>2r(JJJ	teArlI.teAqk5QU;0W
4.%1+y	12 2 2 	teDk9-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 ]3  \  }}t        j                  t              5  t	        ||       d d d        5 y # 1 sw Y   @xY w)Nr=   r   r   r.   )r'   r5   r6   r7   r	   )nilcasesr   r   s       r   test_nonfusible_fancy_indexingrG   `   s    
+C
y#	C.
S#i-.
1vsC	 3S!"45E  1]]./ 	q!	 		 	s   A**A3	c                    t        j                  d      } dD ]h  }t        j                  | d      }|j	                  |j
                  |j                               }t        d |j                         D              dk(  rhJ  y )Nr   )r#   r   rJ   chunksc              3     K   | ]:  }t        |t              xr$ t        |j                  t        j                         < y wr1   r(   r   valuer8   ndarray.0vs     r   	<genexpr>z.test_dont_fuse_numpy_arrays.<locals>.<genexpr>v   s6       1h'KJqww

,KK   A Ar   )	r8   onesda
from_array__dask_optimize__r   __dask_keys__sumvalues)x_yr)   s       r   test_dont_fuse_numpy_arraysr`   o   sz    
A 

MM!E*!!!&&!//*;<   		


r   c                     t        j                  d      j                  d      t        dt	        dd      t	        dd      ffdt
        dt	        d       dffd} d	g}t        | |      }t        |      d
k(  sJ y )Nr@      rc   r]   r   rc   dxr   r   aliasr   r   )r]   rd   rf   dx2r   rh   r.   )r8   arangereshaper   r'   r   r
   r   )r)   keysdsk2s      r   test_fuse_slices_with_aliasrn   ~   su    YYr]""6*sU1a[%1+$>?%odQ/?@	C <DCDt9>>r   rL   )r   r#   r2   c                   t        j                  d      dz  }t        j                  d|       }||z   }|j                  |j                  |j                               }| dk(  r0t        |      dk(  r t        d |j                         D              s$J t        d |j                         D              sJ t        ||dz          y )Nr   iIrK   r.   c              3  <   K   | ]  }t        |t                y wr1   )r(   r   )rR   ts     r   rT   z0test_fuse_getter_with_asarray.<locals>.<genexpr>   s     $PaZ5%9$Ps   c              3     K   | ]:  }t        |t              xr$ t        |j                  t        j                         < y wr1   rN   rQ   s     r   rT   z0test_fuse_getter_with_asarray.<locals>.<genexpr>   s6      
 q(#G
177BJJ(GG
rU   r   )
r8   rV   rW   rY   r   rZ   r   anyr\   r   )rL   r]   r_   zr)   s        r   test_fuse_getter_with_asarrayru      s    
j A
6"A	AA


affaoo&7
8C|3x1}$P3::<$P!PPP 
ZZ\
 
 	
 
 aQr   z3blockwise fusion does not respect this, which is ok)reasonc                 J   t        j                  dd      } t        j                  | dz   dz   dz         }|j                  |j                  |j                               }t        j                  j                  ddi      5  |j                  |j                  |j                               }d d d        t	        j                  ||j                               t	        j                  |j                               k(  sJ t        |      t        |      k  sJ y # 1 sw Y   nxY w)	Nr   rI   rK   r   r.   r2   zoptimization.fuse.ave-widthr   )
rW   rV   r[   rY   r   rZ   configsetgetr   )r]   r_   r   r   s       r   test_turn_off_fusionr{      s    
4 A
q1uqy1}A	AFFAOO$56A	7;	< ;(9:; 88Aq()TXXa9J-KKKKq6CF??	; ;s   +DD"c                    t         j                  j                  ddi      5  t        j                  ddd      } | j
                  }| j                         } ||| j                               }t        |t              sJ t        |t              sJ ||k(  sJ | j                         } t        | j                         t              sJ t        | dgdz         ddd       y# 1 sw Y   yxY w)	zFCheck that by disabling fusion, the HLG survives through optimizationszoptimization.fuse.activeFr2   r2   int)rL   dtyper   N)r   rx   ry   rW   rV   rY   __dask_graph__rZ   r(   r   persistr   )r_   r
   dsk1rm   s       r   test_disable_lowlevel_fusionr      s     
4e<	= 
GGAd%0&&!aoo/0$///$///t||IIK!**,n===!aS1W
 
 
s   B7C""C+c                 V   t        j                  dd      } t        j                  dd      }t        j                  ddd      }| |z   |z   }|j	                         }t        |      dk(  sJ t        |      }t        |      dk(  sJ t        |t        j                  dd             y	)
z~
    Check that certain array creation routines work with blockwise and can be
    fused with other blockwise operations.
    r2   r}   rK   r.   )
fill_valuerL   r#   r         @N)	rW   rV   zerosfullr   r   r   r   r8   )r]   r_   rt   r   r   rm   s         r   $test_array_creation_blockwise_fusionr      s    
 	$A
4 A
a-A	A	ADt9>>d#Dt9>>aC!r   c                     t        j                  g dd      } t        j                  | | d   gf      } | j                  d      }t        j                  t
        j                  |ddi      }|j                          y )N)r   r.   r   r.   r4   r   r.   )rW   rX   concatenaterechunkcoarsenr8   r[   compute)r]   r_   s     r   test_gh3937r      s\    
k4(A
AbE7|$A			$A 	

2661q!f%AIIKr   c                     t        j                  d      j                  d      } t        j                  | d      }|dz   }t        j
                  ||j                        }t        |j                  d      |       y )N8   )      rb   rK   r   Foptimize_graph)	r8   rj   rk   rW   rX   dotTr   r   )r]   dXs      r   test_double_dependenciesr      s[    
		"f%A
a'A	AA
q!##Aaiiui-q1r   c                 B   t        j                  dd      } t        j                  dd      }| dz   d|dz  z  z   }t        j                  |      \  }t        t        t        j                  |j                  j                                     dk(  sJ t        ||       y )Nr   r   rK   r   r.   r#   )
rW   rV   r   r   r
   r[   mapr   r\   r   )r]   r_   rt   zzs       r   test_fuse_rootsr      s{    
4 A
D!A	
Q1q!t8AMM!ERs4;; 012a777b!r   c                 Z   t        j                  dd      } t        j                  dd      }t        j                  d      5  |dz  }d d d        | dz   d|z  z   }t        j
                  j                  |j                        }t        |j                        dk(  sJ d	di|j                  j                         D cg c]  }|j                   c}v sJ t        j                  ||j                  |j                  |j                        }t        ||       y # 1 sw Y   xY wc c}w )
Nr   r   rK   bar)foor.   r   r2   r   )rW   rV   r   r   annotate	blockwiser   r   layersr\   r   ArraynamerL   r   r   )r]   r_   rt   hlglzas         r   test_fuse_roots_annotationsr      s    
4 A
D!A	5	! qD 
Q1q5A
..
+
+AFF
3Cszz?a5>SZZ5F5F5HIammIIII	#qvvqxx	1Bb!  Js   D D(D%r   TFc                    t        j                  t        j                  ddgddgg      d      }|dz  }t        j                  ||      }|j                  |       }t        |ddgddgg      sJ y )Nr   r.   rK   r   r>      )rW   rX   r8   r9   matmulr   r   )r   xxrt   r*   s       r   ,test_optimize_blockwise_duplicate_dependencyr      sr     
rxx!Q!Q 01!	<B	aB
		"bA YYnY5FVr2hR1222r   )returnbool),
__future__r   r5   dask._task_specr   r   importorskipr   r8   r   
dask.arrayr9   rW   dask.array.chunkr   dask.array.corer   dask.array.optimizationr	   r
   r   dask.array.utilsr   dask.highlevelgraphr   r   r+   r;   rC   rG   r`   rn   markparametrizeru   xfailr{   r   r   r   r   r   r   r   r:   r   r   <module>r      s    "  +   G     $ " L L & ..	"+6*
	 :. / OP
 Q
 " 	2 )D%=9	3 :	3r   