U
    /e'"                     @   st   d Z ddlZddlZddlmZmZ ddlmZm	Z	m
Z
 ddlmZ ddlmZmZ ddlmZ dd	 Zd
d ZdS )z Dataframe optimizations     N)configcore)	Blockwise
fuse_rootsoptimize_blockwise)HighLevelGraph)cullfuse)ensure_dictc                 K   s   t |ttfs|g}tt|}t | tsBtjt| | dd} n$t| |d} t	| |d} t
| |d} | t|} tds| S |  }t| } td}|d krd}t| |||d\} }t| |\} }| S )N )dependencies)keyszoptimization.fuse.activezoptimization.fuse.subgraphsT)r   fuse_subgraphs)
isinstancelistsetr   flattenr   Zfrom_collectionsidoptimize_dataframe_getitemr   r   r   r   getZget_all_dependenciesr
   r	   )dskr   kwargsr   r   _r   r   ;/tmp/pip-unpacked-wheel-dbjnr7gq/dask/dataframe/optimize.pyoptimize   s0    



r   c              
      s  ddl m   fddj D }dd dd j j }|D ]^t }tfd	d
|D rrqLj }t	fdd
|D rLfdd|D dhddhfkrqLfdd|D }|| }t
|dkrqLfdd|r| }t
j| dkrqLjtj| d  }	|	rL|	dkrL|	jd d }
|tt|
tr`|
n|
gO }nqLt	fdd
|D sqL|D ]8}j| jd d }
|tt|
tr|
n|
gO }qfdd|D } }||}|j|jkrt
|st| D ]l\}}|j|jd d f|jd f}|j|j|j i}t|j|j|j|||j|j}||< |jh||< q|||j< ||j< |j|jkrL|j= qLt|}|S )Nr   DataFrameIOLayerc                    s   g | ]\}}t | r|qS r   )r   ).0kvr   r   r   
<listcomp>:   s     
 z.optimize_dataframe_getitem.<locals>.<listcomp>c                 S   s,   t | tsdS | j| j d tjkr(dS dS )NFr   T)r   r   r   outputoperatorgetitem)layerr   r   r   _is_selection<   s
    
z1optimize_dataframe_getitem.<locals>._is_selectionc                 S   s<   | j d \}}|d kr8t|ttttjfs4t|r8dS dS )N   column-selectionrow-selection)indicesr   tuplestrr   npZndarrayZisscalar)r$   keyindr   r   r   _kindI   s
    z)optimize_dataframe_getitem.<locals>._kindc                 3   s*   | ]"}t |tr  j|d  kV  qdS )r   N)r   r*   name)r   x)io_layer_namelayersr   r   	<genexpr>_   s    
 z-optimize_dataframe_getitem.<locals>.<genexpr>c                 3   s   | ]} j | V  qd S Nr3   r   r   )r%   r   r   r   r4   z   s     c                    s   h | ]} j | qS r   r6   r7   r/   r   r   r   	<setcomp>z   s    z-optimize_dataframe_getitem.<locals>.<setcomp>r'   r(   c                    s"   h | ]} j | d kr|qS )r(   r6   r7   r8   r   r   r9      s      r&   c                    s:   |krdS  | }|r2t  fdd|D S dS d S )NTc                 3   s   | ]} |V  qd S r5   r   r   dep)
_walk_deps
dependentssuccessr   r   r4      s    zAoptimize_dataframe_getitem.<locals>._walk_deps.<locals>.<genexpr>F)all)r=   r-   r>   deps)r<   )r=   r>   r   r<      s    z.optimize_dataframe_getitem.<locals>._walk_depsc                 3   s   | ]} j ||V  qd S r5   )r=   )r   col_select_layer)r<   r   r   r   r4      s   c                    s   i | ]}| j | qS r   r6   r:   )r   r   r   
<dictcomp>   s      z.optimize_dataframe_getitem.<locals>.<dictcomp>)Zdask.layersr   r3   itemscopyr   r   anyr=   r?   lenpopr   r)   r   Zproject_columnsr0   AssertionError	numblocksr   r!   Zoutput_indicesr   ZconcatenateZnew_axesr   )r   r   Z	io_layersr   columnsr@   Zrow_select_layersZcol_select_layersZrow_select_layerZ_layerZ	selectionrA   Zupdate_blocksoldnewZ	block_keyblockZnew_indicesrI   Z	new_blockZnew_hlgr   )r   r%   r/   r<   r   r2   r3   r   r   1   s    



$
"
	


r   )__doc__r"   Znumpyr,   Zdaskr   r   Zdask.blockwiser   r   r   Zdask.highlevelgraphr   Zdask.optimizationr   r	   Z
dask.utilsr
   r   r   r   r   r   r   <module>   s   $