U
    /evZ                  !   @   sX  d dl Z 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mZmZmZmZ d dlmZ d dlmZmZmZ d\ZZZZZZZdd	 e d
D \
Z!Z"Z#Z$Z%Z&Z'Z(Z)Z*d\Z+Z,Z-ej./dedeee!fiedfgfgedeee!fiedfgfgedeee!fiedfgfedeee!fiedfgfedeee!e"e#fiedfedfedfgfgedeedee!feedee!feee!eedeedfiedfgfgedeee!fiedfgfedeee!fiedfgfgedeedee!feeeedfiedfgfgedee0e!fiedfgfedeee!fiedfgfgedeede0e!feeeedfiedfgfgedeee!fiedfgfedeee!fiedfgfedeee!e"fiedfedfgfgedeeeedeedfeedee!feedee"fiedfedfgfgedeej1e!fiedfgfedeee!e"fiedfedfgfgedeee!eedfeedej1e"fiedfedfgfgedeee!e"fiedfedfgfedeee!fiedfgfgedeeeedfeedee!e"fiedfedfgfgedeej1e!fiedfgfedeej2e!e"fiedfedfgfgedeej2eede!feedej1e"fiedfedfgfgedeee!e"fiedfedfgfedeee!e"fiedfedfgfedeee!e"fiedfedfgfgedeeeedeedfeedee#e$feedee!e"fiee+fee+fee+fee+fgfgedeee!e"fiedfedfgfedeee!e"fiedfedfgfedeee!e"fiedfedfgfgedeeeedeedfeedee!e#feedee!e"fiedfedfedfgfgedee0e!fiedfgfedeee!fiedfgfgedeeeedfeede0e!fiedfgfgedeee!fiedfgfedeee!e"e#fiedfedfedfgfgedeee!e"eedfeedee"fiedfedfgfgedeee!e"fiedfdgfgedeee!e"fiedfdgfgedeee!e"fiedfdgfedeee!e"fiedfdgfgedeedee"e#feeeede!fidedfdgfgedeee!e"fiedfdgfedeee!e"fiedfdgfgedeedee"e#feeeede!fidedfdgfgedeee!e"fiedfdgfedeee!e"fiedfdgfgedeedee"e!feeeede!fidedfgfgedeee!e"fiedfdgfedeee!e"fiedfedfgfedeee!e"fiedfdgfgdddeeede!feedeeedeedfeedee"e#feedee$e#fidedfdedfgfgedeee!e"fiedfdgfedeee!e"fiedfedfgfedeee!e"e#fiedfedfedfgfgdddeeedeedeedfeedeeedeedfeedee!e"feedee#e"fiedfdedfgfggdd  Z3d!d" Z4d#d$ Z5d%d& Z6d'd( Z7d)d* Z8d+d, Z9d-d. Z:d/d0 Z;ej./d1d2d3d4d5d6gd7d8 Z<ej./d1d3d4d5d6d2gd9d: Z=d;d< Z>d=d> Z?d?d@ Z@ej./dAdBdCgdDdE ZAej./dAdBdCgdFdG ZBej./dAdBdCgdHdI ZCdJdK ZDdLdM ZEdNdO ZFdPdQ ZGdRdS ZHdTdU ZIdVdW ZJdXdY ZKdZd[ ZLej./d\d]e Md^d_d`gdadbgdcdd ZNdedf ZOdgdh ZPdidj ZQdkdl ZRdS )m    N)add)	assert_eq)_BLOCKWISE_DEFAULT_PREFIX	Blockwise_unique_dep
index_subsoptimize_blockwiserewrite_blockwise)HighLevelGraph)dechlg_layer_topologicalinc)abcdefgc                 c   s   | ]}t  | V  qd S N)r   ).0i r   >/tmp/pip-unpacked-wheel-dbjnr7gq/dask/array/tests/test_atop.py	<genexpr>   s    r   
   )r   jkzinputs,expectedr   r   ijr   ZkAjiZikZkjZkiZiA){   N)i  N)r   N)FNjk)   NZijkr   c                 C   sJ   dd | D } t | }|jd|j|jdd |jD f}||ksFtd S )Nc                 S   s(   g | ] }t |d dd |d D iqS )Z	numblocksc                 S   s&   i | ]\}}|d k	r|dt | qS )N   )len)r   r   vr   r   r   
<dictcomp>$  s       z+test_rewrite.<locals>.<listcomp>.<dictcomp>)r   )r   inpr   r   r   
<listcomp>"  s   z test_rewrite.<locals>.<listcomp> c                 S   s*   g | ]"\}}||d k	r d |n|fqS )Nr+   )join)r   nameindr   r   r   r*   -  s   )r	   outputr,   Zoutput_indicesdskindicesAssertionError)inputsexpectedresultZresult2r   r   r   test_rewrite   s      
	r6   c                   C   s$   t tddddtdks td S )Nr   r   r   )r   r   r   )r   tupler2   r   r   r   r   test_index_subs5  s    r8   c                  C   sb   t jddd} | d d d d }t j|j}t|ts>ttdd	 |j	
 D dks^td S )
Nr      chunksr$   r"         c                 S   s   g | ]}t |tr|qS r   
isinstancer   r   layerr   r   r   r*   B  s     
 z+test_optimize_blockwise.<locals>.<listcomp>daonesoptimizationr   daskr@   r
   r2   r%   layersvalues)xyr0   r   r   r   test_optimize_blockwise9  s    rL   c               	   C   s  t jddd} | d }tjddddgd	d
 |d }W 5 Q R X tjddddgdd |d }W 5 Q R X tjddddd |d }W 5 Q R X tjddddd |d }W 5 Q R X tjdd |d }W 5 Q R X |d }t j|j}t|jdkstt	|d}	|	j
}
t|
dks&t|
d dks8t|
d dksJt|
d d	ks\tt|
d ddhksvt|
d dddksttjdd	i( t j|j}t|jdkstW 5 Q R X dS ) zq
    Can we fuse blockwise layers with different, but compatible
    annotations for retries, priority, etc.
    r   r9   r;   r$   r:   r   r   r   F)retriesworkersallow_other_workersr"   r   T)priorityrN   rO   r=   )ZGPUZMemory)rM   	resourcesr>   )rP   rQ   bar)foo   r   rP   rM   rO   rN   rQ   zoptimization.annotations.fuse   N)rD   rE   rG   annotaterF   r   r%   rH   r2   r   annotationssetconfig)r   r   r   r   r   r   r   hr0   rB   rW   r   r   r   +test_optimize_blockwise_control_annotationsG  s4    
r[   c            	   	   C   s   t jddd} | d }tjdd |d }|d }W 5 Q R X tjd	d |d
 }|d }W 5 Q R X |d }t j|j}dd |j D }t	dd |D }t
|dkst|d  dkst|d dkst|d dkstd S )Nr   r9   r;   r$   rS   )quxr"   r=   bazr>   r:   rT   c                 s   s   | ]}t |tr|jV  qd S r   )r@   r   rW   rA   r   r   r   r     s   
z=test_optimize_blockwise_custom_annotations.<locals>.<genexpr>c                 s   s*   | ]"}t |tkrt| n|V  qd S r   )typedictr7   itemsr   r   r   r   r   r     s    ))r\   r]   ))r\   rS   )rD   rE   rG   rV   rF   r   rH   rI   collectionsCounterr%   r2   )	r   r   r   r   r   r   r   r0   rW   r   r   r   *test_optimize_blockwise_custom_annotationsv  s(    
rd   c                  C   s   t jddd} | d d d }|d }|d }|| }|d d d }t j|j}t|tsbttdd |j	
 D dkstd S )	Nr   r9   r;   r$   r"   r=   c                 S   s   g | ]}t |tr|qS r   r?   rA   r   r   r   r*     s     
 z1test_blockwise_diamond_fusion.<locals>.<listcomp>rC   )rJ   rK   r   r   r   r   r0   r   r   r   test_blockwise_diamond_fusion  s    re   c                  C   s.  t jddd} | d d d }| }|d d d }t|jj|j j}t|\}t|jj|j j}||kszt	dt
|jttj| d	}t|tst	td
d |j D dkst	t
t|j|jttj| | gd	}t|tst	tdd |jj D dks*t	d S )Nr   r9   r;   r$   r"   r=   r>   zz_top mutated)keysc                 S   s   g | ]}t |tr|qS r   r?   rA   r   r   r   r*     s     
 z7test_blockwise_non_blockwise_output.<locals>.<listcomp>c                 S   s   g | ]}t |tr|qS r   r?   rA   r   r   r   r*     s     
 )rD   rE   sumr7   rG   rH   r-   r1   optimizer2   r   listcoreflattenZ__dask_keys__r@   r
   r%   rI   merge)rJ   rK   wzZz_top_beforezzZz_top_afterr0   r   r   r   #test_blockwise_non_blockwise_output  s.    rp   c                  C   sP   t jddd} | d d d f | d d d f  }|jj|j }t|dksLtd S )Nr   r9   r;   r>   )rD   rE   rG   rH   r-   r%   r2   )rJ   rK   r   r   r   r   test_top_len  s     rq   c                  C   s\   t jdddd d d } |  }| d d d }| }| d d }t| |||| d S )Nr   r9   r;   r$   r"   r=   r>   )rD   rE   rg   rG   compute)rJ   r   rK   r   rn   r   r   r   test_inner_compute  s    rs   r-   __0_1.z.0c              	   C   sP   t jdddgtd}tj|dd}tjtd|d| d td}||  }t|| d S )Nr   bbcccdtyper"   r;   r   )nparrayobjectrD   
from_array	blockwiser   r   r-   rJ   r   r5   r4   r   r   r   test_common_token_names_args  s
    r   c                 C   sR   t jdddgtd}tj|dd}tjdd d	|d	| td
}||  }t|| d S )Nr   rx   ry   rz   r"   r;   c                 S   s   | | S r   r   rJ   rK   r   r   r   <lambda>      z0test_common_token_names_kwargs.<locals>.<lambda>r   rK   r{   )r|   r}   r~   rD   r   r   r   r   r   r   r   test_common_token_names_kwargs  s
    r   c                  C   s8   t jddd} t jtd| d| jd}|jds4td S )Nr:   r"   r;   r   rz   r   )rD   rE   r   r   r{   r-   
startswithr2   r   r   r   r   test_blockwise_names  s    r   c               	   C   s   dd } t jddd}t j| d|ddd	id
|jd}|jdksBtt|td dd } t jddd}t j| d|ddd	id
|jd}|jdkstt|td dd } t jddd}t j| d|dddid
|jd}|jdkstt|tdd  d S )Nc                 S   s   | d d d f t d S )Nr$   rU   r|   rE   rJ   r   r   r   r     s    z"test_blockwise_new_axes.<locals>.fr:   r"   r;   aqr   qrU   Tnew_axesconcatenater{   r"   r"   r$   rU   r:   rU   c                 S   s   | d d d f t d S )N)rU   r$   r   r   r   r   r   r     s    qa)r   r   )rU   r:   c                 S   s&   | j dd}|d d d f td S )Nr$   axis)r$   r:   )rg   r|   rE   r   r   r   r   r     s    )r>   rT   r"   r"   ab)r   r9   )r>   r:   rT   rD   rE   r   r{   r<   r2   r   r|   r   rJ   rK   r   r   r   test_blockwise_new_axes  sN                      r   c               	   C   sB   t jddd} dd }t j|d| d| jdd	d
id}t|| d S )Nr   r$   r$   r;   c                 S   s   t j| |  gddS )Nr(   r   )r|   stackr   r   r   r   func  s    z'test_blockwise_new_axes_2.<locals>.func)rJ   rK   signr   Tr   r"   )r{   r   r   )rD   rE   r   r{   r   )rJ   r   rK   r   r   r   test_blockwise_new_axes_2  s    
r   r   TFc              	   C   st   dd }t jddd}t j|d|ddd	i| |jd
}t j|d|ddd	i| |jd
}|jdks`tt|td d S )Nc                 S   s   | d t d S N).Nr   r   r   r   r   r   r   '  s    z*test_blockwise_stacked_new_axes.<locals>.fr:   r"   r;   r   r   r   rU   r   Zabqr   )r   r   r   )r:   rU   rU   r   )r   r   rJ   rK   rn   r   r   r   test_blockwise_stacked_new_axes%  s,                r   c              	   C   s   dd }t jddd}t j|d|ddd	i| |jd
}t j|d|ddd	i| |jd
}|jdks`tt|td t jdd d|d|jdd}|jdkstt|td d S )Nc                 S   s:   t | trt| } | d tdtd fd| j    S )N)N.rU   r   )r@   ri   r|   r   rE   slicendimr   r   r   r   r   7  s    

z0test_blockwise_stacked_new_axes_front.<locals>.fr:   r"   r;   r   r   r   rU   r   Zqabr   )r   r   r   )rU   rU   r:   c                 S   s   | d d ddf S )Nr   r   r   r   r   r   r   G  r   z7test_blockwise_stacked_new_axes_front.<locals>.<lambda>abcT)r{   r   )r   r   r   )r   r   rJ   rK   rn   rm   r   r   r   %test_blockwise_stacked_new_axes_front5  s@                     r   c              	   C   s   dd }t jddd}t jddd}t j|d|ddd	i| |jd
}t j|d|ddd	i| |jd
}|| }|jdksvtt|td d S )Nc                 S   s   | d t d S r   r   r   r   r   r   r   O  s    z3test_blockwise_stacked_new_axes_same_dim.<locals>.fr:   r"   r;   r   r   r   rU   r   r   r   )	rD   rE   zerosr   r{   r<   r2   r   r|   )r   r   rJ   rK   r   r   r   r   r   r   (test_blockwise_stacked_new_axes_same_dimM  s0                r   c                  C   s|   dd } t jddddtjd}t j| d|d	d
di|jd}|jdksHtt|t	ddddddgddddddggtj d S )Nc                 S   s   | d d d f d S Nr"   r   r   r   r   r   r   `  s    z*test_blockwise_new_axes_chunked.<locals>.fr   rT   r$   r"   )r<   r{   r   r   r   r   r   r{   )r   )r"   r"   r"   r>      r   )
rD   aranger|   Zint32r   r{   r<   r2   r   r}   r   r   r   r   test_blockwise_new_axes_chunked_  s
    r   c                  C   sH   dd } t j| ddddtjd}|jdks0tt|td	tj d S )
Nc                   S   s   t dt jS N)r"   r=   )r|   rE   float32r   r   r   r   r   j  s    z!test_blockwise_no_args.<locals>.fr   r"   r=   r=   r   r   r   r   r   r"   rT   rD   r   r|   r   r<   r2   r   rE   r   rJ   r   r   r   test_blockwise_no_argsi  s    r   c                  C   sN   dd } t j| dtjd dddtjd}|jdks6tt|td	tj d S )
Nc                 S   s   t d| S r   r   rz   r   r   r   r   s  s    z'test_blockwise_no_array_args.<locals>.fr   r"   r   r   r   r   r   r   r   r   r   r   test_blockwise_no_array_argsr  s         r   c                  C   sH   d
dd} t jddd}t j| d|dd|jd	}t|tdd  d S )Nr   c                 S   s   | | S r   r   r   r   r   r   r   ~  s    z test_blockwise_kwargs.<locals>.fr:   r   r;   r   r   )r   r{   )r   )rD   rE   r   r{   r   r|   r   r   r   r   test_blockwise_kwargs}  s    
r   c               	   C   s$  t jddd} ddd}t j|d| ddd	d
 id| jd}|jdksHtt|td t j|d| dddd
 id| jd}|jdkstt|td t jddd} t j|d| ddddi| jd}|jdkstt|td t j|d| ddddi| jd}|jdkstt|td d S )Nr:   r:   )r"   r$   r"   r=   r"   r;   r   c                 S   s   t j| | g|dS )Nr   )r|   r   )r   r   r   r   r   double  s    z%test_blockwise_chunks.<locals>.doubler   r   c                 S   s   d|  S r   r   nr   r   r   r     r   z'test_blockwise_chunks.<locals>.<lambda>)adjust_chunksr   r{   ))r>   r"   r>   r   )r   r:   r   c                 S   s   d|  S r   r   r   r   r   r   r     r   r$   )r   )rT   r>   )r:   r   r   r   r   )r   r   r{   )r   r   )   r   )r   r   )rJ   r   rK   r   r   r   test_blockwise_chunks  s^    

	
	            r   c                  C   s   t jddd} td}| dd d} | dd d	} | d
d |} | dd d	} | dd d} | dd d	tjddgtd} t| td d S )Nr   r9   r;   i  c                 S   s   | S r   r   r   r   r   r   r     r   z*test_blockwise_numpy_arg.<locals>.<lambda>g      ?c                 S   s   | S r   r   r   r   r   r   r     r   r   c                 S   s   | S r   r   r   r   r   r   r     r   c                 S   s   | S r   r   r   r   r   r   r     r   c                 S   s   | S r   r   r   r   r   r   r     r   c                 S   s   | S r   r   rJ   rK   rn   r   r   r   r     r   r   r   rz   )rD   r   r|   Z
map_blocksr}   r~   r   r   r   r   r   test_blockwise_numpy_arg  s    
 r   c                  C   sb   dd l m}  | jddd}|tj \}dd |fD \}t|g}t	|t
ddd d S )	Nr   r   r$   )Znpartitionsc                 s   s   | ]}t j|d tdV  qdS ))r   )shaper{   N)rD   Zfrom_delayedintra   r   r   r   r     s     z,test_bag_array_conversion.<locals>.<genexpr>F)Zcheck_graph)Zdask.bagZbagrangeZmap_partitionsr|   ZasarrayZ
to_delayedrD   r   r   r   )dbr   rJ   rn   r   r   r   test_bag_array_conversion  s    r   c                  C   s>   t jddd} | d }t j|\}}}|| }t|| d S )Nr   r;   r"   )rD   rE   ZlinalgZsvdr   )rJ   rK   usr&   rn   r   r   r   test_svd  s
    r   c               	   C   s   t jddd} tdd  }t jtd| d|d | jd}t|tdd  t jd	d d| d|| jd
}t|tdd  d S )Nr   r9   r;   c                   S   s   dS )Nd   r   r   r   r   r   r     r   z#test_args_delayed.<locals>.<lambda>r   rz   r   c                 S   s   | | S r   r   r   r   r   r   r     r   r   )	rD   r   rG   Zdelayedr   r   r{   r   r|   r   r   r   r   test_args_delayed  s    r   tup)r$   r"   rS   r   r   r$   r"   c                 C   s>   t jjddd}dd }t j|d|d| |jd}t|| d S )Nr   r   r   r;   c                 S   s   | S r   r   )datarJ   r   r   r   r     s    ztest_namedtuple.<locals>.f)d1Zd2)rJ   r{   )rD   randomr   r{   r   )r   Ar   Br   r   r   test_namedtuple  s    r   c               	   C   s   t jjddd} tt}t jtd| d| jd W 5 Q R X dt|j	
 ksRtdt|j	ksdtd	t|j	ksvttt}t jtd
| d| jd W 5 Q R X dt|j	
 kstdt|j	kstd S )Nr   r   r;   r!   r   rz   zunknown dimensionr   r   iiZrepeatedr   )rD   r   pytestZraises
ValueErrorr   r   r{   strvaluelowerr2   )r   infor   r   r   test_validate_top_inputs  s      r   c                  C   s   t jddd} t jtd| d| jd}t jtd|d|jd}t jtd|d|jd}t|j}tdd |j	
 D d	kszt|  d S )
Nr   r9   r;   r   rz   r+   c                 S   s   g | ]}t |tr|qS r   r?   )r   r   r   r   r   r*     s     
 z5test_dont_merge_before_reductions.<locals>.<listcomp>r"   )rD   rE   r   r   r{   rg   r   rG   r%   rH   rI   r2   rr   )rJ   rK   rn   rm   r0   r   r   r   !test_dont_merge_before_reductions  s    
 r   c               	   C   sr   t jddd} tjtdd t jtd| d| jd}W 5 Q R X t jtd| d| jd}t	|| |j
|j
ksntd S )Nr   r9   r;   z.The da.atop function has moved to da.blockwise)matchr   rz   )rD   rE   r   ZwarnsUserWarningZatopr   r{   r   r   r-   r2   r   r   r   r   test_atop_legacy  s      
r   c                  C   sR   t jtdtjdd} t| j| _t jtdtjdd}| | }t||  d S )Nr$   r#   r;   )	rD   r   r|   rE   Zfloat64r_   rG   r   r   )r   r   rJ   r   r   r   test_non_hlg  s
    r   )Srb   operatorr   Znumpyr|   r   rG   Z
dask.arrayr}   rD   Zdask.array.utilsr   Zdask.blockwiser   r   r   r   r   r	   Zdask.highlevelgraphr
   Zdask.utils_testr   r   r   r   r   r   r   r   r   r   r   ru   rv   Z_2Z_3Z_4Z_5Z_6Z_7Z_8Z_9r   r   r   markZparametrizerg   Z	transposedotr6   r8   rL   r[   rd   re   rp   rq   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   
namedtupler   r   r   r   r   r   r   r   r   <module>   s"   
4(            "              (""""
    
 (     
/




!



		,
 
