U
    /e!n                     @   s  d dl Z d dlZd dlmZ d dlmZmZmZ d dlm	Z	m
Z
 e jddgddd ZdQd
dZdd Zdd Zdd Zdd Ze jjdddd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Ze jjd*dd+d, Zd-d. Zd/d0 Z d1d2 Z!d3d4 Z"d5d6 Z#d7d8 Z$d9d: Z%d;d< Z&d=d> Z'd?d@ Z(dAdB Z)dCdD Z*dEdF Z+dGdH Z,dIdJ Z-dKdL Z.dMdN Z/dOdP Z0dS )R    N)get_deps)diagnosticsndependenciesorder)addincabcdeZedcba)paramsc                 C   s   | j S N)param)request r   9/tmp/pip-unpacked-wheel-dbjnr7gq/dask/tests/test_order.pyr   	   s    Fc                 C   s   t | |d| kS )N)reverse)sorted)Lr   r   r   r   issorted   s    r   c                  G   s   d S r
   r   argsr   r   r   f   s    r   c              	      sN  | \ }}}} fddt dD }||dft df dff|dft df dffi t|}t| df | df  dkstt| df | df  dkst fddt dD }||dft df dff|dft df dffi t|}t| df | df  dks$tt| df | df  dksJtd S )	Nc                    s   i | ]} |ft fqS r   r   .0iar   r   
<dictcomp>   s      z7test_ordering_keeps_groups_together.<locals>.<dictcomp>   r            c                    s   i | ]} |ft fqS r   r   r   r   r   r   r      s      )rangeupdater   r   absAssertionError)r   bcdeor   r   r   #test_ordering_keeps_groups_together   s    6$$6&r*   c                 C   sX  | \}}}}}|dft f|dft f|dft |dff|dft |dff|dft |dffi}t|}||df ||df k szt|dft f|dft f|dft |dff|dft |dff|dft |dffi}t|}||df ||df kst|dft f|dft f|dft |dff|dft |dff|dft |dffi}t|}||df ||df k sTtdS )zV

    b0    b1  b2
    |      \  /
    a0      a1

    a0 should be run before a1
    r   r   r   Nr   r   r$   r   r   r%   r&   r'   r(   dskr)   r   r   r   test_avoid_broker_nodes'   sP    	   
 
 
   
 
 
   
 
 
r.   c                    s   | \ }} fdddD }t dff| df< |fdddD  d|< t|}|df dkstt|df dkstd	S )
z
               a3
              /|
            a2 |
           /|  |
         a1 |  |
        /|  |  |
      a0 |  |  |
      |  |  |  |
      b0 b1 b2 b3
        \ \ / /
           c

    We really want to run b0 quickly
    c                    s(   i | ] } |ft  |d  f|ffqS r   r   r   r   r%   r   r   r   c   s      z1test_base_of_reduce_preferred.<locals>.<dictcomp>)r   r   r    r   c                    s   i | ]} |ft d fqS r/   r   r   )r%   r&   r   r   r   e   s      )r   r   r   r    r   r    N)r   r"   r   r$   )r   r'   r(   r-   r)   r   r   r%   r&   r   test_base_of_reduce_preferredR   s    r2   zCan't please 'em all)reasonc                 C   s   | \}}}}}|dft |dff|dft |dff|dft |df|dff|dft |dff|dft |dff|dft |dff|dft |dffi}t|}||df ||df k stdS )z
         a1
         |
         a2
         |
         a3    d1
        /  \  /
      b1    c1
      |     |
      b2    c2
            |
            c3

    Prefer b1 over c1 because it won't stick around waiting for d1 to complete
    r   r   r    Nr+   r,   r   r   r   test_avoid_upwards_branchingn   s$     
 
  
 
 
 

r4   c                 C   s,  | \}}}}}|dft |dff|dft |dff|dft |df|dff|dft |dff|dft f|dft |dff|dft |dff|dft f|dft |dff|dft |dff|dft |dff|dft |dff|dft |dffi}t|}||df ||df k stt||df ||df  dks(tdS )a  
         a1
         |
    e2   a2  d2  d3
    |    |    \  /
    e1   a3    d1
     \  /  \  /
      b1    c1
      |     |
      b2    c2
            |
            c3

    Prefer c1 over b1 because c1 will stay in memory less long while b1
    computes
    r   r   r    N)r   r   r$   r#   r,   r   r   r   $test_avoid_upwards_branching_complex   s>     
 
  
  
 
  
 
 
 
 
r5   c              
   C   sl   | \}}}}}|t |||f|t ||f|t |f|d|di}t|}|| || k sTt|| || k shtdS )a{  
    It's not clear who should run first, e or d

    1.  d is nicer because it exposes parallelism
    2.  e is nicer (hypothetically) because it will be sooner released
        (though in this case we need d to run first regardless)

    Regardless of e or d first, we should run b before c.

            a
          / | \   .
         b  c |
        / \ | /
       e    d
    r   r   Nr+   r,   r   r   r   #test_deep_bases_win_over_dependents   s
    *r6   c                 C   sf   | \}}}}}|d|t |f|t |f|d|t |fi}t|}|| || k sNt|| || k sbtdS )zq
        c
        |
    e   b
    |   |
    d   a

    Prefer longer chains first so we should start with c
    r   Nr+   r,   r   r   r   test_prefer_deep   s
    
$r7   c                 C   s,   dd t dD }t|\}}t|| d S )Nc                 S   s"   i | ]}d |d  t d | fqS )zx%sr   r   r   r   r   r   r      s     
 z#test_stacklimit.<locals>.<dictcomp>i'  )r!   r   r   )r   r-   dependencies
dependentsr   r   r   test_stacklimit   s    r;   c           
      C   sl   | \}}}}}dd t dD }t|}t||d< t|}ddi}	|	dd t|D  ||	kshtd S )Nc                 S   s   i | ]}d |ft |fqS xr8   r   r   r   r   r      s      z*test_break_ties_by_str.<locals>.<dictcomp>
   yc                 S   s   i | ]\}}||qS r   r   )r   r   kr   r   r   r      s      )r!   r   listr   r"   	enumerater$   )
r   r   r%   r&   r'   r(   r-   Zx_keysr)   expectedr   r   r   test_break_ties_by_str   s    rD   c                 C   s"   t tdftdftddfd d S )Nr   r   r=   r?   r   )r=   rE   z)r   r   r   )r   r   r   r   )test_order_doesnt_fail_on_mixed_type_keys   s    rG   c            
         s8  t d} d\}}| jj||fdd }}tdD ]D}|d d d d d f |d d d d d f  jdd}|jdd}q2||d d d f  jdd}t| }t	|  fd	d
|
 D }	t fdd|	D t|	d kst fdd
|
 D }	t fdd|	D t|	d ks"tt|	|	ks4td S )N
dask.array)   c   )r   N)sizechunksr   r   Zaxis)r   r   c                    s   g | ]} | qS r   r   r   r@   r)   r   r   
<listcomp>  s     z test_gh_3055.<locals>.<listcomp>c                 3   s   | ]}|t  d  k V  qdS r   Nlenr   r=   rO   r   r   	<genexpr>  s     ztest_gh_3055.<locals>.<genexpr>r    c                    s   g | ]}|D ]} | qqS r   r   )r   kkr@   rO   r   r   rP     s       c                 3   s   | ]}|t  d  kV  qdS rQ   rR   rT   rO   r   r   rU     s     )pytestimportorskiprandomnormalr!   ZcumsumsumdictZ__dask_graph__r   Z__dask_keys__rS   r$   r   )
daABorigr=   _r?   wr-   r   r   rO   r   test_gh_3055   s    
4&(rc   c                 C   s4   | \}}}}}|d|dfd||dfdi}t | d S )Nr   r   r    r   )r   r   r%   r&   r'   r(   r-   r   r   r   test_type_comparisions_ok  s    re   c                 C   sl   | \}}}}}|t f|t |f|t |f|t |f|t |fi}t|}|| || k sTt|| || k shtdS )z

         a
         |
      d  b  e
       \ | /
         c

    Prefer to finish d and e before starting b.  That way c can be released
    during the long computations.
    Nr+   r,   r   r   r   test_prefer_short_dependents  s
    *rf   z#This is challenging to do preciselyc                    s   | \}}}}}dd ||||fD \}}}}	|||||||||	g	}
g   fdd}|||f|||f|||f|||f|||||f|||||f||||f|||||f|	||	|fi	}t ||||	g  |
kstdS )z
            aa
           / |
      b   d  bb dd
     / \ /|  | /
    a   c e  cc

    Prefer to run acb first because then we can get that out of the way
    c                 s   s   | ]}|d  V  qdS rQ   r   rT   r   r   r   rU   1  s     z,test_run_smaller_sections.<locals>.<genexpr>c                    s    fdd}|S )Nc                     s      d S r
   appendr   logr=   r   r   ra   8  s    z/test_run_smaller_sections.<locals>.f.<locals>._r   r=   ra   rj   r<   r   r   7  s    z$test_run_smaller_sections.<locals>.fN)daskgetr$   )r   r   r%   r&   r'   r(   ZaaZbbccddrC   r   r-   r   rl   r   test_run_smaller_sections%  s4           
  
rq   c                    s  | \ }} fdddD \}}}fdddD \}}}fdddD \}	}
}||||||||
|	g	}g fdd}|||f||||f||||f|||f|||||f||||f|||f|
||
||f|	||	|
fi	}t | t||||	g |kstdS )	z

            c1
            |
        b1  c2
        |  /|
    a1  b2  c3
    |  /|
    a2  b3
    |
    a3

    Prefer to finish a1 stack before proceeding to b2
    c                 3   s   | ]} | V  qd S r
   r   r   r   r   r   rU   ^  s     z2test_local_parents_of_reduction.<locals>.<genexpr>Z123c                 3   s   | ]} | V  qd S r
   r   r   r%   r   r   rU   _  s     c                 3   s   | ]} | V  qd S r
   r   r   )r&   r   r   rU   `  s     c                    s    fdd}|S )Nc                     s      d S r
   rg   r   ri   r   r   ra   g  s    z5test_local_parents_of_reduction.<locals>.f.<locals>._r   rk   rl   r<   r   r   f  s    z*test_local_parents_of_reduction.<locals>.fN)r   rm   rn   r$   )r   r'   r(   a1a2a3b1b2b3Zc1c2c3rC   r   r-   r   )r   r%   r&   rj   r   test_local_parents_of_reductionN  s:      
 
   
   
r{   c                    s@  | \ }}} fdddD \	}}}}}}}	}
}fdddD \}}}}|t f|t f|t f|t f|t |f|t |f|t ||f|t |f|t ||f|t |f|	t ||f|
t |f|t |fi}t|dt fdddD   k rdk sn td	tfd
ddD   k rdk sn tt||||g dks<tdS )z

    a1  a2  a3  a4  a5  a6  a7 a8  a9
     \  |  /  \ |  /  \ |  / \ |  /
        b1      b2      b3     b4

    Want to finish off a local group before moving on.
    This is difficult because all groups are connected.
    c                 3   s   | ]} | V  qd S r
   r   r   r   r   r   rU     s     z(test_nearest_neighbor.<locals>.<genexpr>Z	123456789c                 3   s   | ]} | V  qd S r
   r   r   rr   r   r   rU     s     Z1234r    c                 3   s&   | ]} |  t d  k V  qdS rQ   rR   r   )r   r)   r   r   rU     s        r   c                 3   s&   | ]} |  t d  k V  qdS rQ   rR   r   )r%   r)   r   r   rU     s     r   r   N)r   r   r[   r$   min)r   r&   ra   rs   rt   ru   Za4Za5Za6Za7Za8Za9rv   rw   rx   Zb4r-   r   )r   r%   r)   r   test_nearest_neighbor~  sD    
$             .2r~   c                  C   s2   t ft ft fd} t| }|ddddks.tdS )z#Prefer ordering tasks by name first)r   r   r   r   r   r    r   r   r   Nr+   r-   r)   r   r   r   test_string_ordering  s    r   c                  C   s>   t dft dft dft fd} t| }|dddddks:tdS )	z=Prefer ordering tasks by name first even when in dependenciesr%   )r   r   r   r%   r   r   r   r    )r%   r   r   r   Nr+   r   r   r   r   test_string_ordering_dependents  s    r   c                 C   s   | \}}}}}|dfd|dfd|dfd|dft |df|df|dff|dfd|dfd|dft |df|df|dffi}t|}||df ||df k st||df ||df k st||df ||df k std S )Nr   r   r   r+   )r   r   r%   r&   ra   r-   r)   r   r   r   test_prefer_short_narrow  s(           	r   c                 C   s:  | \}}}}}|| }|d|dft |ddf|dft |ddf|dfd|dft |df|df|dff|dft |ddf|dft |ddf|dft |df|df|dffi}t|}||df ||df k st||df ||df k st||df ||df k st||df ||df k st||df ||df k s6tdS )a  
    From https://github.com/dask/dask-ml/issues/206#issuecomment-395869929

    Two cases, one where chunks of an array are independent, and one where the
    chunks of an array have a shared source. We handled the independent one
    "well" earlier.

    Good:

                    c2
                   / \ \
                  /   \ \
                c1     \ \
              / | \     \ \
            c0  a0 b0   a1 b1

    Bad:

                    c2
                   / \ \
                  /   \ \
                c1     \ \
              / | \     \ \
            c0  a0 b0   a1 b1
                   \ \   / /
                    \ \ / /
                      a-b


    The difference is that all the `a` and `b` tasks now have a common
    ancestor.

    We would like to choose c1 *before* a1, and b1 because

    * we can release a0 and b0 once c1 is done
    * we don't need a1 and b1 to compute c1.
    r   r   r   Nr+   )r   r   r%   r&   ra   abr-   r)   r   r   r   test_prefer_short_ancestor  s2    &  
 
   
 
 
r   c              #   C   sh  | \}}}}}|dft f|dft |dff|dft |dff|dft |df|dff|dft f|dft |df|df|dff|dft f|dft |dff|dft |dff|dft |df|df|dff|dft f|dft |df|df|dff|dft f|dft |dff|dft |dff|dft |df|dffi}t|}||df ||df k sd||df ||df k sdtdS )z
      b1      b3      b5
       |\    / | \  / |
      c1  c2  c3  c4  c5
       |/  | \ | / | \|
      d1  d2  d3  d4  d5
       |       |      |
      e1      e2      e5

    Want to finish b1 before we start on e5
    r   r   r    r      Nr+   r,   r   r   r   test_map_overlap  sH      
 
     
 
     
 
 r   c              ,      sf  | \ }}} dft f dft f dft f dft f dft f dft f dft f dft f d	ft f d
ft fdft  dffdft  df dffd
ft  df df dffdft  df df dffdft  d
f df dffdft  df d
f dffdft  df df d
ffd	ft  df df dffdft  d	f df dffdft  df d	f dffi}t|}t fdd| D }tfdd| D }|d dkst|d dkr|dddddd	ddddg
kst|dddd
ddddddg
ksbtnD|ddddd	dddddg
ks@t|ddddd
dddddg
ksbtdS )zSee https://github.com/dask/dask/issues/5584#issuecomment-554963958

    We were using key names to infer structure, which could result in funny behavior.
    r   r   r   r    r   r      r|      	   c                 3   s"   | ]\\}}}| kr|V  qd S r
   r   r   letterra   valr   r   r   rU   A  s    
  z.test_use_structure_not_keys.<locals>.<genexpr>c                 3   s"   | ]\\}}}| kr|V  qd S r
   r   r   rr   r   r   rU   B  s    
  >   r   r    r>                              Nr   r   r   itemsr$   )r   ra   r-   r)   ZAsZBsr   r0   r   test_use_structure_not_keys$  sf               
         "$"r   c                    s   | \}}} }d}|dfd|dfd|dfd dft |df|df|dffi}td|D ]P}t |dff|||f< t |dff|||f< t  |d f||f||ff| |f< qTt|}ddddd	d
ddddg
}	t fdd| D }
|	|
kstdS )zFFrom https://github.com/dask/dask-ml/issues/206#issuecomment-395873372r>   r   r   r   r    r   r   r   r   r               c                 3   s"   | ]\\}}}| kr|V  qd S r
   r   )r   r   numvr'   r   r   rU   W  s    
  z9test_dont_run_all_dependents_too_early.<locals>.<genexpr>N)r   r!   r   r   r   r$   )r   r   r%   r&   r(   depthr-   r   r)   rC   actualr   r   r   &test_dont_run_all_dependents_too_earlyL  s    8&r   c              (      s  | \}}}     |dfd|dft |dff|dft |dff|dft |dff|dft |dff|dft |dff dft |dff dft  dffdft |dffdft dffdft  dfdffdft |dffdft dffdft |dffdft dffdft dfdff|dft |df|df|dfdfdffi}t|}dddddddd	d
dg
}t fdd| D }||kst||df ||df d kstdS )a=  From https://github.com/dask/dask/pull/5646#issuecomment-562700533

    Sometimes we need larger or wider DAGs to test behavior.  This test
    ensures we choose the branch with more work twice in successtion.
    This is important, because ``order`` may search along dependencies
    and then along dependents.

    r   r   r   r    r   r   r   r|   r   r   r>   c                 3   s*   | ]"\\}}}| hkr|V  qd S r
   r   )r   r   ra   r   r'   rp   r(   eer   r   rU   }  s    
  z7test_many_branches_use_ndependencies.<locals>.<genexpr>Nr   )r   r   r%   r&   r-   r)   rC   r   r   r   r   $test_many_branches_use_ndependencies[  sV    	  
 
 
 
 
 
 
 
 
  
 
 
 
  " r   c                	   C   s4  t jtdd tdtdfid W 5 Q R X t jtdd tdtdfi W 5 Q R X t jtdd tdtdfi W 5 Q R X t jtdd" ttdftdftdfd W 5 Q R X t jtdd& ttdftdftddfd	d
 W 5 Q R X t jtdd* ttdftdftddftdfd
 W 5 Q R X d S )NzCycle detected)matchr   r   r   r%   r&   r1   r'   r   )r   r%   r&   r'   )rW   ZraisesRuntimeErrorrm   rn   r   r   r   r   r   r   test_order_cycle  s    &*r   c                   C   s   t i i kstd S r
   )r   r$   r   r   r   r   test_order_empty  s    r   c              $   C   s  | \}}}}}|dfd|dft |dff|dft |dff|dft |dff|dft |df|dff|dft |dff|dft |dff|dft |dff|d	ft |dff|dfd|dft |dff|dft |dff|dft |dff|dft |dff|dft |dff|dft |dff|dft |dffi}t|}||df dks6t||df ||df ksTt||df ||df ksrt||df ||df kstd
S )ax  

    a7 a8  <-- do these last
    | /
    a6                e6
    |                /
    a5   c5    d5  e5
    |    |    /   /
    a4   c4 d4  e4
    |  \ | /   /
    a3   b3---/
    |
    a2
    |
    a1
    |
    a0  <-- start here

    Test that we are able to switch to better dependents.
    In this graph, we expect to start at a0.  To compute a4, we need to compute b3.
    After computing b3, three "better" paths become available.
    Confirm that we take the better paths before continuing down `a` path.

    This test is pretty specific to how `order` is implemented
    and is intended to increase code coverage.
    r   r   r   r    r   r   r   r|   r   Nr+   r,   r   r   r   test_switching_dependents  sR      
 
 
  
 
 
 
  
 
 
 
 
 
 
r   c                 C   sp  | \}}}}}i }||||g}|D ]}| |dfd|dft|dff|ddft|dff|ddft|dffi t|D ]\}	}
| |d|	ft|ddf|
ddff|d|	ft|d|	ff|d|	dft|d|	ff|d|	dft|d|	ff|d|	dft|d|	dff|d|	dft|d|	dffi qtq"t|}d}|D ]P}tt|D ]<}	||d|	df ||d|	df  }|dksht||7 }q6q&|dkstt|}|D ]6}tt|D ]"}	t|d|	dff||d	|	df< qqt|}d}|D ]P}tt|D ]<}	||d	|	df ||d|	df  }|dkst||7 }qq|d
ks:tt|}|D ](}tt|D ]}	||d|	df= qVqFt|}d}|D ]P}tt|D ]<}	||d|	df ||d|	df  }|dkst||7 }qq|dkstt|}|D ](}tt|D ]}	||d|	df= qqt|}d}|D ]D}tt|D ]0}	||d|	df ||d|	df  dks6tq6q&dS )zFrom https://github.com/dask/dask/issues/5859#issuecomment-608422198

    See the visualization of `(maxima, argmax)` example from the above comment.

    This DAG has enough structure to exercise more parts of `order`

    r   r   r   r    r   r   r   n   r|      b   N)r"   r   rB   r   r!   rS   r$   r\   )r   r   r%   r&   r'   r(   r-   abcr=   r   r?   r)   totalr   Zdsk2Zdsk3Zdsk4r   r   r    test_order_with_equal_dependents  s      
 
 
  
 
 
 
 
 $  r   c                  C   sf   dddt ddft ddfddd	d
dt ddft ddfddt ddddfd} t| }|d |d k sbtdS )a  
    https://github.com/dask/dask/issues/6745

    We have

    1. A terminal node that depends on the entire graph ('s')
    2. Some shared dependencies near the roots ('a1', 'a4')
    3. But the left and right halves are disconnected, other
       than the terminal node.

                       s
               /   /       \   \
              /   /         \   \
            s00  s10       s01  s11
             |    |         |    |
            b00  b10       b01  b11
            / \  / \       / \ / \
           a0  a1  a2    a3  a4  a5

    Previously we started at 'a', and worked up to 's00'. We'd like to finish
    's00' completely, so we progress to 's' and work through its dependencies.

    Ideally, we would choose 's10', since we've already computed one of its
    (eventual) dependencies: 'a1'. However, all of 's00' through 's11' had
    equal metrics so we fell back to the name tie-breaker and started on
    's01' (via 'a3', a4', 'b01', ...).
    )r   r/   )r   r   r   r   r%   r   r%   r   )r    )r   )r   r   r   r   r   r   r%   r   r%   r    storer   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Nr+   r   r   r   r   test_terminal_node_backtrack  s.    r   c                    s  t dt d}dd lfddtdD }j|ddd}|| }|j|d	d
}|jd||j	d	d}|j
|ddd}t|jdd D }t|fdddfdd|D  fdd|D t fdd D }	tfdd D }
|	|
k std S )NrH   zarrr   c                    s    g | ]} j d ddqS ))r   r   d   r   )rL   )Z
from_arrayZonesr   )r]   npr   r   rP   ]  s     z0test_array_store_final_order.<locals>.<listcomp>r   rM   r   T)	overwritedest)namedatarL   r   F)lockZcomputec                 S   s(   g | ] }t |tr|d  dr|qS )r   z
store-map-)
isinstancetuple
startswithrN   r   r   r   rP   g  s     
  c                    s    |  S r
   r   )r@   rO   r   r   <lambda>h      z.test_array_store_final_order.<locals>.<lambda>)keyc                    s    g | ]}|d   d  kr|qS r   rN   first_storer   r   rP   i  s      c                    s    g | ]}|d   d  kr|qS r   r   rN   r   r   r   rP   j  s      c                 3   s   | ]\}}| kr|V  qd S r
   r   r   r@   r   )connected_storesr   r   rU   l  s      z/test_array_store_final_order.<locals>.<genexpr>c                 3   s   | ]\}}| kr|V  qd S r
   r   r   )disconnected_storesr   r   rU   m  s      )rW   rX   Znumpyr!   ZconcatenateZrechunkZDirectoryStoregroupZ
empty_like	chunksizer   r   rm   r}   maxr   r$   )Ztmpdirr   Zarraysr=   r   rootr   r'   ZstoresZconnected_maxZdisconnected_minr   )r   r]   r   r   r   r)   r   test_array_store_final_orderU  s"    



r   c               I      s^  t ddft ddft ddft ddft d	d
ft ddft ddft ddft ddft dft dft dft dft dft dft dft dft dft dft dft dft dft d ft d!ft d"ft d#ft d$ft d%ft d&ft d'ft d(ft d)ft d*d+ft d'ft d,d-ft d ft d%ft d$ft d.d/ft d0d1ft d2d3ft d4d5ft d!ft dft dft d6d7ft d8d9ft d"ft d&ft d#ft d:d;ft d<d=ft d>ft d?ft d@ft dAft dBft dCft dDft dEft dFft dGft t ft t ft t ft t ft t ft t ft t ft t ft t ft t fdHH} t| \t| fdIdJ D }fdKdL  fdMdN|D }t| }t|dOdP dQksZt|dRksZtdOS )Sa  https://github.com/dask/dask/pull/7929

    This graph begins with many motifs like the following:

    |      |
    c1    c2
      \ /
       b
       |
       a

    We want to compute c2 and c3 pretty close together, because if we choose to
    compute c1, then we should also compute c2 so we can release b.  Being
    greedy here allows us to release memory sooner and be more globally optimal.
    a06a08a28a26a24a21a22a25a29a20a23a27a04a02a00a01a05a03a43a36a33a47a44a42a37a48a49a35a46a55a53a60a54a59a56a61a52a57a58a19a07a30a31a11a09a14a10a38a40a18a17a34a50a16a15a51a45a12a13a41a39a62a68a70a67a71a64a65a63a69a66)Hr   r   r   r   r   r   r   r  r   r  r
  r  r  r  r	  r  r  r  r  r  r   r   r   r   r   r   r   r   r   r   r  r  Za32r   r  r   r   r   r  r  r  r  r   r   r   r  r   r   r   r   r  r  r   r   r   r   r   r  r  r   r   r   r  r   r  r  r"  r  r  r!  r  r  c                    s    h | ]\}} | s|  qS r   )pop)r   r   deps)r9   r   r   	<setcomp>  s      zAtest_eager_to_compute_dependent_to_free_parent.<locals>.<setcomp>c                    s   | \}}t  |  |  S r
   )r#   )r$  r   r%   rO   r   r   cost  s    z<test_eager_to_compute_dependent_to_free_parent.<locals>.costc                    s   i | ]}| | qS r   r   )r   r   )r&  r:   r   r   r     s      zBtest_eager_to_compute_dependent_to_free_parent.<locals>.<dictcomp>Nr         )r   r   r   r   r   valuesr[   r$   )r-   parentsZcost_of_pairsZcostsr   )r&  r9   r:   r)   r   .test_eager_to_compute_dependent_to_free_parentq  s    Jr+  c           	      C   s
  | \}}}}}|dft f|dft f|dft f|dft f|dft f|dft |df|df|dff|dft |df|df|dff|dft |df|df|dff|dft |df|dff|dft |dffi
}t|\}}|ddddddddddg
kstdd | D |dfd|dfd|dfd|dfd|dfd|dfd|dfd	|dfd
|dfd|dfdi
ksVtdd | D |dfd|dfd|dfd	|dfd|dfd|dfd|dfd|dfd|dfd|dfdi
kstdd | D |dfd|dfd|dfd|dfd|dfd|dfd|dfd|dfd|dfd|dfdi
ks.tdd | D |dfd|dfd|dfd|dfd|dfd|dfd|dfd|dfd|dfd|dfdi
kstdd | D |dfd|dfd|dfd|dfd|dfd|dfd|dfd|dfd|dfd|dfdi
kstdS )z
        a1  b1  c2  d1  e1
        /|\ /|\ /|\ /|  /
       / | X | X | X | /
      /  |/ \|/ \|/ \|/
    a0  b0  c0  d0  e0
    r   r   r   r    c                 S   s   i | ]\}}||j qS r   rd   r   r   r   r   r   r   r     s      z$test_diagnostics.<locals>.<dictcomp>r   r   r   r|   r   r   c                 S   s   i | ]\}}||j qS r   )Zager,  r   r   r   r     s      c                 S   s   i | ]\}}||j qS r   )Znum_dependencies_freedr,  r   r   r   r     s      c                 S   s   i | ]\}}||j qS r   )Znum_data_when_runr,  r   r   r   r     s      c                 S   s   i | ]\}}||j qS r   )Znum_data_when_releasedr,  r   r   r   r      s      N)r   r   r$   r   )	r   r   r%   r&   r'   r(   r-   infoZmemory_over_timer   r   r   test_diagnostics  s             
                                                   r.  )F)1rW   rm   Z	dask.corer   Z
dask.orderr   r   r   Zdask.utils_testr   r   Zfixturer   r   r   r*   r.   r2   markZxfailr4   r5   r6   r7   r;   rD   rG   rc   re   rf   rq   r{   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r+  r.  r   r   r   r   <module>   sT   

+
 '
(0%<%('7P9h