B
    F.\o                 @   s*  d dl mZmZmZ d dlmZ d dlZd dlZd dlm	Z	 d dl
mZ d dlZd dlmZmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z# d dl$m%Z%m&Z& d d	l'm(Z( d d
l)m*Z* d dl+m,Z, d dl-m.Z. d dl/m0Z0 d dl1m2Z2m3Z3 d dl4m5Z5 yd dl6Z7W n e8k
rB   dZ7Y nX ddl9m:Z: ddl:m;Z;m<Z<m=Z=m>Z> ddl?m@Z@ ddlAmBZBmCZC ddlDmEZEmFZFmGZG ddlHmIZI ddlDmJZJmKZKmLZL ddlMmNZNmOZOmPZP ddlQmRZR ddlSmTZT ddlUmVZV y d dlWmXZXmYZYmZZZm[Z[m\Z\ W n2 e8k
rB   d dl]mXZXmYZYmZZZm[Z[m\Z\ Y nX e^e_Z`dZad dlbmcZcmdZd ecedejefejegehd d!Zid"d#d$d%d&d'd(giZje,ejefejegehd)Zkeld*Zmeld+ZneGd,d- ZoG d.d/ d/e;ZpG d0d1 d1e;ZqG d2d3 d3e;ZrG d4d5 d5e;ZsG d6d7 d7e;ZtG d8d9 d9e;ZuG d:d; d;e;ZvG d<d= d=e:jwZwG d>d? d?e;ZxG d@dA dAe;ZyG dBdC dCe;ZzG dDdE dEe;Z{dFdG Z|dHdI Z}dJdK Z~dLdM ZdNdO ZdPdQ ZdRdS ZdTdU ZdVdW ZdXdY ZdZd[ Zd\d] Zd^d_ Zd`da Zdbdc Zddde Zdfdg ZG dhdi die@ZdS )j    )print_functiondivisionabsolute_import)partialN)Number)add)columnrow)ColumnDataSourceDataRange1d	HoverTool	ResetToolPanToolWheelZoomToolTapToolOpenURLRange1dPlotQuadvalue
LinearAxisNumeralTickFormatterBasicTickerNumberFormatterBoxSelectToolGroupFilterCDSView)	DataTableTableColumn)figure)	Viridis11)Theme)factor_cmap)curdoc)pipemerge)escapeF   )
components)DashboardComponentProfileTimePlotProfileServeradd_periodic_callback)BokehServer)SystemMonitorcounters_doc)	transposeBOKEH_VERSIONwithout_property_validation   )time)
log_errorsformat_bytesformat_time)color_ofprogress_quads
nbytes_bar)AllProgress)GraphLayout)TaskStreamPlugin)mapconcatgroupbyvalmapfirst)EnvironmentFileSystemLoaderZ	templates)loaderZpagesZstatusworkerstaskssystemZprofilegraphz
theme.yamlnaninfc                s   t rtdd j D s*j|kr*dS t rt|t| dkri  xN| D ]<\}}t|t jk	rt	|d t
rt | |< qP| |< qPW n| trt  fdd nj  dS )a   Update source with data

    This checks a few things first

    1.  If the data is the same, then don't update
    2.  If numpy is available and the data is numeric, then convert to numpy
        arrays
    3.  If profiling then perform the update in another callback
    c             s   s   | ]}t |tjV  qd S )N)
isinstancenpndarray).0v rQ   :lib/python3.7/site-packages/distributed/bokeh/scheduler.py	<genexpr>I   s   zupdate.<locals>.<genexpr>N
   r   c                  s   j  S )N)dataupdaterQ   )dsourcerQ   rR   <lambda>X   s    zupdate.<locals>.<lambda>)rM   anyrU   valueslenrB   itemstyperN   rL   r   array	PROFILINGr#   add_next_tick_callbackrV   )rX   rU   krP   rQ   )rW   rX   rR   rV   >   s    
rV   c               @   s$   e Zd ZdZdd Zedd ZdS )	Occupancyz  Occupancy (in time) per worker c          
   K   s   t   || _tddgddgddgddgddgdd	gd
d
gd| _tf dd
ddd|}|j| jdddddd}d |_d|j_d|j	_
d|j_
d|j_ttddd}t }d|_d|_||| || _W d Q R X d S )Nr   abg        g?r'   r3   redblue )	occupancyworkerxymscolorbokeh_addressrc   zbk-occupancy-plotdatetime)titletoolsidx_axis_typerk   rm   rl   rn   )rX   rk   widthrl   heightrn   Fzhttp://@bokeh_address/main)url)callbackz@worker : @occupancy s.follow_mouse)r5   	schedulerr
   rX   r   rectnonselection_glyphxaxisminor_tick_line_alphayaxisvisibleygridx_rangestartr   r   r   tooltipspoint_policy	add_toolsroot)selfrz   kwargsfigr{   taphoverrQ   rQ   rR   __init__`   s0    
zOccupancy.__init__c          	   C   sV  t  D t| jj }g }x6|D ].}| j|jd}||d k	rLd| nd q$W ttt	|}dd |D }dd |D }dd |D }t
|}	g }
xF|D ]>}|| jjkr|
d q|| jjkr|
d	 q|
d
 qW |	rdt|	t|	| jj f | jj_n
d| jj_|rH|dd |D ||
|||d}t| j| W d Q R X d S )Nbokehz%s:%drh   c             S   s   g | ]
}|j qS rQ   )ri   )rO   wsrQ   rQ   rR   
<listcomp>   s    z$Occupancy.update.<locals>.<listcomp>c             S   s   g | ]}|d  qS )i  rQ   )rO   occrQ   rQ   rR   r      s    c             S   s   g | ]}|d  qS )i  rQ   )rO   r   rQ   rQ   rR   r      s    rf   greenrg   z*Occupancy -- total time: %s  wall time: %src   c             S   s   g | ]
}|j qS rQ   )address)rO   r   rQ   rQ   rR   r      s    )ri   rj   rm   rn   ro   rk   rl   )r5   listrz   rF   r[   get_worker_service_addrr   appendranger\   sumidle	saturatedr7   Ztotal_ncoresr   rq   textrV   rX   )r   rF   bokeh_addressesr   addrrl   ri   rm   rk   Ztotalrn   resultrQ   rQ   rR   rV      s>    




zOccupancy.updateN)__name__
__module____qualname____doc__r   r2   rV   rQ   rQ   rQ   rR   rc   ]   s    rc   c               @   s$   e Zd ZdZdd Zedd ZdS )ProcessingHistogramz# How many tasks are on each worker c          	   K   s   t   d| _|| _tddgddgddgd| _tf dddd	|| _d| jj_d
| jj	_
d | jj_d | j_| jj| jdddddd W d Q R X d S )Nr   r'   r3   rT   )leftrighttopzTasks Processingzbk-nprocessing-histogram-plotprocessing_hist)rq   rs   nameFr   r   r   rg   )rX   r   r   bottomr   rn   )r5   lastrz   r
   rX   r   r   r}   r~   r   r   toolbarlogotoolbar_locationquad)r   rz   r   rQ   rQ   rR   r      s"    




zProcessingHistogram.__init__c             C   sR   dd | j j D }tj|dd\}}| jj|d d |dd  |d d S )Nc             S   s   g | ]}t |jqS rQ   )r\   
processing)rO   r   rQ   rQ   rR   r      s    z.ProcessingHistogram.update.<locals>.<listcomp>(   )binsr'   )r   r   r   )rz   rF   r[   rM   	histogramrX   rU   rV   )r   Lcountsrk   rQ   rQ   rR   rV      s
    
zProcessingHistogram.updateN)r   r   r   r   r   r2   rV   rQ   rQ   rQ   rR   r      s   r   c               @   s$   e Zd ZdZdd Zedd ZdS )NBytesHistogramz# How many tasks are on each worker c          	   K   s   t   d| _|| _tddgddgddgd| _tf dddd	|| _td
d| jjd _	t
j d | jj_d| jj_d| jj_d | jj_d | j_| jj| jdddddd W d Q R X d S )Nr   r'   r3   rT   )r   r   r   zBytes Storednbytes_histzbk-nbytes-histogram-plot)rq   r   rs   z0.0 b)format   Fr   r   r   rg   )rX   r   r   r   r   rn   )r5   r   rz   r
   rX   r   r   r   r}   	formattermathpimajor_label_orientationr~   r   r   r   r   r   r   )r   rz   r   rQ   rQ   rR   r      s&    




zNBytesHistogram.__init__c             C   sr   t dd | jj D }t j|dd\}}|d d |dd  |d}| jj| dt	|
  | jj_d S )	Nc             S   s   g | ]
}|j qS rQ   )nbytes)rO   r   rQ   rQ   rR   r      s    z*NBytesHistogram.update.<locals>.<listcomp>r   )r   r   r'   )r   r   r   zBytes stored: )rM   Zasarrayrz   rF   r[   r   rX   rU   rV   r6   r   r   rq   r   )r   r   r   rk   rW   rQ   rQ   rR   rV      s
    zNBytesHistogram.updateN)r   r   r   r   r   r2   rV   rQ   rQ   rQ   rR   r      s   r   c               @   s&   e Zd ZdZdddZedd ZdS )	CurrentLoadz# How many tasks are on each worker X  c       
      K   s  t   d| _|| _tddgddgddgddgddgddgd	d
gddgddgddgd
| _tf ddddt|d d|}|j| jdddddd}d|j_	d |_
tf dddt|d dd|}|j| jdddddd}d |_
tdddgdd |jd _td!d"|jd _tj d# |j_d|j_	xZ||gD ]N}d|j_d$|j_d$|j_ttd%d&d'}|| d |j_d |_d$|j_q4W t }	d(|	_d)|	_ ||	 t }	d*|	_d)|	_ ||	 || _!|| _"|j#|_#W d Q R X d S )+Nr   r'   r3   g      ?rf   rg   Z1BZ2Brd   re   rh   )
nprocessingznprocessing-halfznprocessing-colorr   znbytes-halfnbytes_textrj   rl   znbytes-colorro   zTasks Processingzbk-nprocessing-plotr   )rq   rr   rs   r   ru   znprocessing-halfrl   r   znprocessing-color)rX   rk   rl   ru   rv   rn   zBytes storedzbk-nbytes-worker-plotr   )rq   rr   rs   ru   r   znbytes-halfr   znbytes-color   i   i   )Z	mantissasbasez0.0 b)r   r   Fzhttp://@bokeh_address/main)rw   )rx   z@worker : @nprocessing tasksry   z@worker : @nbytes_text)$r5   r   rz   r
   rX   r   intr{   r   r   r|   r   ZaxisZtickerr   r}   r   r   r   r   r~   r   r   r   r   r   r   r   r   r   r   r   r   processing_figurenbytes_figurey_range)
r   rz   ru   r   r   r{   r   r   r   r   rQ   rQ   rR   r      sj    




zCurrentLoad.__init__c             C   s  t   t| jj }g }x6|D ].}| j|jd}||d k	rLd| nd q$W ttt	|}dd |D }g }xF|D ]>}|| jj
kr|d q~|| jjkr|d q~|d q~W d	d |D }d
d |D }	g }
d}xzt||D ]l\}}t| jj|j dtpt}||kr"|}||kr8|
d q||d krR|
d q|
d qW t }t|s| jd |k r|| _|dd |D ||dd |D |
|	|dd |D |d
}dtt| | jj_t| j| W d Q R X d S )Nr   z%s:%drh   c             S   s   g | ]}t |jqS rQ   )r\   r   )rO   r   rQ   rQ   rR   r   B  s    z&CurrentLoad.update.<locals>.<listcomp>rf   r   rg   c             S   s   g | ]}|j d  qS )memory)metrics)rO   r   rQ   rQ   rR   r   L  s    c             S   s   g | ]}t |qS rQ   )r6   )rO   nbrQ   rQ   rR   r   M  s    r   memory_limitr3   Zoranger'   c             S   s   g | ]}|d  qS )r3   rQ   )rO   rM   rQ   rQ   rR   r   a  s    c             S   s   g | ]}|d  qS )r3   rQ   )rO   r   rQ   rQ   rR   r   d  s    c             S   s   g | ]
}|j qS rQ   )r   )rO   r   rQ   rQ   rR   r   h  s    )
r   znprocessing-halfznprocessing-colorr   znbytes-halfznbytes-colorr   ro   rj   rl   zBytes stored: )r5   r   rz   rF   r[   r   r   r   r   r\   r   r   zipgetattrrK   r4   rZ   r   r6   r   r   rq   r   rV   rX   )r   rF   r   r   r   rl   r   Zprocessing_colorr   r   Znbytes_colorZ	max_limitr   limitZnowr   rQ   rQ   rR   rV   7  sV    




zCurrentLoad.updateN)r   )r   r   r   r   r   r2   rV   rQ   rQ   rQ   rR   r      s   
Ar   c               @   s    e Zd Zdd Zedd ZdS )StealingTimeSeriesc          	   K   s   || _ tt t d gddgddgd| _tdddd}tf dd	d
t|jd gdd|d|}|j| jdddd |j| jdddd d |j	_
|t tddtdd || _d S )Nr'   r   g?)r4   r   r   endi N  )followfollow_intervalrange_paddingz$Idle and Saturated Workers Over Timerp   g   rh   )rq   rt   r   rv   rr   r   r4   r   rf   )rX   rk   rl   rn   r   r   ru   )
dimensions)rz   r
   r4   rX   r   r   r\   rF   liner   Zminor_tick_line_colorr   r   r   r   r   )r   rz   r   r   r   rQ   rQ   rR   r   q  s     zStealingTimeSeries.__init__c          	      sh   t  X t d gtjjgtjjgd trLt  fdd nj	
 d W d Q R X d S )Ni  )r4   r   r   c                  s   j  dS )Ni'  )rX   streamrQ   )r   r   rQ   rR   rY     s    z+StealingTimeSeries.update.<locals>.<lambda>i'  )r5   r4   r\   rz   r   r   r`   r#   ra   rX   r   )r   rQ   )r   r   rR   rV     s    
zStealingTimeSeries.updateN)r   r   r   r   r2   rV   rQ   rQ   rQ   rR   r   p  s   r   c               @   s(   e Zd Zdd Zdd Zedd ZdS )StealingEventsc          	   K   s   || _ |jd | _d| _tt d t gddgddgddgddgddgddgd| _td	d
dd}tf ddddd|d|}|j	| jdddddd d|j
_t }d|_d|_||t tddtdd || _d S )NZstealingr         Zwhiter'   rT   )r4   levelrn   durationradiuscost_factorcountr   i N  )r   r   r   zStealing Eventsrp   log   rh   )rq   rt   Zy_axis_typerv   rr   r   r4   r   rn   r   g      ?)rX   rk   rl   rn   sizealphazCost MultiplierzLLevel: @level, Duration: @duration, Count: @count, Cost factor: @cost_factorry   ru   )r   )rz   
extensionsstealr   r
   r4   rX   r   r   circler   
axis_labelr   r   r   r   r   r   r   r   )r   rz   r   r   r   r   rQ   rQ   rR   r     s0    
zStealingEvents.__init__c          
   C   s   d}x(|D ] }|\}}}}}}	}
}||7 }q
W yt | }W n ttfk
rV   d}Y nX tt|dd d }|d |t||||td| jj| d}|S )z" Convert a log message to a glyph r   blackrT      r3   i  )r4   r   r   rn   r   r   r   )	r    KeyError
IndexErrorr   Zsqrtminr\   r   Zcost_multipliers)r   ZmsgsZtotal_durationmsgr4   r   keyr   ZsatZocc_satZidlZocc_idlrn   r   rW   rQ   rQ   rR   convert  s    

zStealingEvents.convertc          	      s   t   jj jjj } fddtd|d D  jj_ rt ttdtt	j
ttjtttrt fdd njd W d Q R X d S )Nc                s&   g | ]}t  |  tr |  qS rQ   )rL   r   )rO   i)r   rQ   rR   r     s    z)StealingEvents.update.<locals>.<listcomp>r'   c                  s   j  dS )Ni'  )rX   r   rQ   )newr   rQ   rR   rY     s    z'StealingEvents.update.<locals>.<lambda>i'  )r5   r   r   r   r   r   r$   r>   r@   dictr[   r?   r   r   r0   r`   r#   ra   rX   r   )r   nrQ   )r   r   r   rR   rV     s    
zStealingEvents.updateN)r   r   r   r   r   r2   rV   rQ   rQ   rQ   rR   r     s   !r   c               @   s"   e Zd ZdddZedd ZdS )Eventsr   c          	   K   s   || _ t | _d| _|| _tg g g g g d| _tddd}tf |d|d|d|}|j	| jd	d
ddddd d|j
_d|j_t }d|_d|_||t tddtdd || _d S )Nr   )r4   actionr   rl   rn   r   i@ )r   r   rp   rh   )rq   rt   rv   rr   r   r4   rl   rn   2   g      ?r   )rX   rk   rl   rn   r   r   legendZActionZtop_leftz@action<br>@hoverry   ru   )r   )rz   r   	action_ysr   r   r
   rX   r   r   r   r   r   r   locationr   r   r   r   r   r   r   r   )r   rz   r   rv   r   r   r   r   rQ   rQ   rR   r     s,    zEvents.__init__c       	   
      sT  t  B jjj  jjj j } rL fddtd|d D  jjj _ rFg }g }g }g }g }x D ]}||d d  |d }|| y|j|  W n4 t	k
r   t
jj|< |j|  Y nX |t| |d q|W |||||dtr8t fd	d
 njd W d Q R X d S )Nc                s   g | ]} |  qS rQ   rQ   )rO   r   )r   rQ   rR   r     s    z!Events.update.<locals>.<listcomp>r'   r4   i  r   ZTODO)r4   r   r   rl   rn   c                  s   j  dS )Ni'  )rX   r   rQ   )r   r   rQ   rR   rY     s    zEvents.update.<locals>.<lambda>i'  )r5   rz   eventsr   Zevent_countsr   r   r   r   r   r\   r8   r`   r#   ra   rX   r   )	r   r   ZactionstimesZhoversysZcolorsr   r   rQ   )r   r   r   rR   rV     s>    


zEvents.updateN)r   )r   r   r   r   r2   rV   rQ   rQ   rQ   rR   r     s   
r   c               @   s"   e Zd ZdddZedd ZdS )	
TaskStream  20sc             K   st   || _ d| _dd | j jD }|s0t| j | _n
|d | _td| jj| | _t | _t	j
j| f||d| d S )Nr   c             S   s   g | ]}t |tr|qS rQ   )rL   r=   )rO   prQ   rQ   rR   r   '  s    z'TaskStream.__init__.<locals>.<listcomp>)n_rectanglesclear_interval)rz   offsetpluginsr=   pluginmaxindexr   rF   r(   r   r   )r   rz   r  r  r   ZesrQ   rQ   rR   r   $  s    
zTaskStream.__init__c       	   	      s  j jj krd S t  j rftjjd rftjjd }tjjd }j| | d }nj}jj	j j
|d t d }jj _  d sd S ttt d  d }|jkrj}|_||jd  krt d _jjdd  D  fdd	 d D  d< |d
krntrnx4  D ](\}}t|d trBt| |< qBW trt  fdd nj j W d Q R X d S )Nr   r   i  )ZistartrF   Zstart_boundaryr   c             S   s   i | ]
}g |qS rQ   rQ   )rO   rb   rQ   rQ   rR   
<dictcomp>M  s    z%TaskStream.update.<locals>.<dictcomp>c                s   g | ]}| j  qS rQ   )r  )rO   rk   )r   rQ   rR   r   O  s    z%TaskStream.update.<locals>.<listcomp>rT   r   c                  s   j  jS )N)rX   r   r  rQ   )
rectanglesr   rQ   rR   rY   X  s    z#TaskStream.update.<locals>.<lambda>)r  r  r5   r\   rX   rU   r   r  r  r
  rF   r>   r   r   r  rV   rM   r]   rL   r   r_   r`   r#   ra   r   r  )	r   r   r   boundaryr   Z	first_endr   rb   rP   rQ   )r
  r   rR   rV   2  s<    


zTaskStream.updateN)r   r   )r   r   r   r   r2   rV   rQ   rQ   rQ   rR   r   #  s   
r   c               @   sF   e Zd ZdZdd Zedd ZedddZed	d
 Zdd Z	dS )	GraphPlotz
    A dynamic node-link diagram for the task graph on the scheduler

    See also the GraphLayout diagnostic at
    distributed/diagnostics/graph_layout.py
    c       	   	   K   s.  || _ t|| _d| _tg g g g g g d| _tg g g d| _t| jtdddgd}t| jtdddgd}t	dd	d
dddgdddddgd}t
f ddi|| _| jjdd| jd|ddd | jjddd|| j|dd}d | jj_d | jj_tdd|gd}ttd d!|gd"}d |_| j|| d S )#Nr   )rk   rl   r   stater   r   )rk   rl   r   r   True)Zcolumn_namegroup)rX   filtersr  Zwaitingr   r   releasederredgrayr   rf   rg   r   )ZfactorsZpaletterq   z
Task Graphrk   rl   r'   g333333?)Zxsr   rX   Z
line_widthviewrn   r   rT   )rk   rl   r   rn   rX   r  r   ry   z<b>@name</b>: @state)r   r   	rendererszinfo/task/@key.html)rw   )rx   r  )rz   r<   layoutinvisible_countr
   node_sourceedge_sourcer   r   r"   r   r   Z
multi_lineZsquarexgridZgrid_line_colorr   r   r   r   r|   r   )	r   rz   r   Z	node_viewZ	edge_viewZnode_colorsr{   r   r   rQ   rQ   rR   r   e  s:    





zGraphPlot.__init__c          	   C   s   t  t | jt| jjd d kr8| j  d| _d}nd}| jjg  }| j_| jj}g | j_| j	|||d | 
  W d Q R X d S )Nrk   r3   r   TF)rV   )r5   r  r\   r  rU   r  Zreset_indexr   	new_edgesadd_new_nodes_edgespatch_updates)r   rV   r   r  rQ   rQ   rR   rV     s    
zGraphPlot.updateFc          	   C   s  |s
|rg }g }g }g }g }g }	g }
| j j}| j j}| jj}x||D ]t}y|| }W n tk
rj   wDY nX || }|| }|t| || || ||j	 ||j
 qDW xX|D ]P\}}y0|	|| || g |
|| || g W q tk
r   Y qX qW |||||dgt| d}|	|
dgt|	 d}|s`t| jjd s~| jj| | jj| n| j| | j| d S )Nr  )rk   rl   r  r   r   r   )rk   rl   r   rk   )r  rk   rl   rz   rG   r   r   r&   Z
url_escaper  prefixr\   r  rU   rV   r  r   )r   r   r  rV   Znode_keyZnode_xZnode_yZ
node_stateZ	node_nameZedge_xZedge_yrk   rl   rG   r   ZtaskZxxZyyrd   re   ZnodeZedgerQ   rQ   rR   r    sV    




zGraphPlot.add_new_nodes_edgesc                s   t | jjd t | jjd  | jjrZ| jj}g | j_fdd|D }| jd|i | jjr| jj}fdd|D }g | _| jd|i |  jt |7  _| jj	r| jj	} fdd|D }g | _| jd|i dS )	zV
        Small updates like color changes or lost nodes from task transitions
        rk   c                s    g | ]\}}| k r||fqS rQ   rQ   )rO   r   c)r   rQ   rR   r     s    z+GraphPlot.patch_updates.<locals>.<listcomp>r  c                s    g | ]\}}| k r||fqS rQ   rQ   )rO   r   r  )r   rQ   rR   r     s    r   c                s    g | ]\}}| k r||fqS rQ   rQ   )rO   r   r  )mrQ   rR   r     s    N)
r\   r  rU   r  r  state_updatesZpatchZvisible_updatesr  Zvisible_edge_updates)r   r!  ZupdatesrQ   )r   r   rR   r    s$    zGraphPlot.patch_updatesc             C   s   | j | j d S )N)rz   Zremove_pluginr  )r   rQ   rQ   rR   __del__  s    zGraphPlot.__del__N)F)
r   r   r   r   r   r2   rV   r  r  r"  rQ   rQ   rQ   rR   r  ^  s   %4r  c               @   s$   e Zd ZdZdd Zedd ZdS )TaskProgressz Progress bars per task type c             K   s  || _ dd |jD }|r&|d | _n
t|| _tti i i i i d}t|d| _tdd}t	dd}t
f dd	d
||d d|| _| jjddgddgddd | jj| jddddddddd	 | jj| jdddddddd | jj| jdddddddd | jj| jddddd d!dd" | jj| jdddd#d$d%dd" | jj| jd&ddd'td(d) | jj| jd*ddd+dtd(d, d-| jj_d| jj_d-| jj_d-| jj_d| jj_d-| jj_td.d/d0}| j| d S )1Nc             S   s   g | ]}t |tr|qS rQ   )rL   r;   )rO   r  rQ   rQ   rR   r     s    z)TaskProgress.__init__.<locals>.<listcomp>r   )allr   r  r  r   )rU   )r   izbk-task-progress-plotZProgresstask_progress)rs   rq   r   r   r   r   g?r   z#FFFFFFg        )rk   rl   
line_colorr   r   r   r   r   z#aaaaaag?g333333?)	rX   r   r   r   r   
fill_colorr&  
fill_alpha
line_alphazreleased-locrn   g333333?)rX   r   r   r   r   r'  r&  r(  z
memory-locg      ?z	erred-locr   g      ?)rX   r   r   r   r   r'  r(  r)  zprocessing-locr  gffffff?z	show-name   Z10pt)rX   r   rl   rk   x_offsettext_font_sizeZdone)rX   r   rl   rk   r+  Z
text_alignr,  Fry   a  
                <div>
                    <span style="font-size: 14px; font-weight: bold;">Name:</span>&nbsp;
                    <span style="font-size: 10px; font-family: Monaco, monospace;">@name</span>
                </div>
                <div>
                    <span style="font-size: 14px; font-weight: bold;">All:</span>&nbsp;
                    <span style="font-size: 10px; font-family: Monaco, monospace;">@all</span>
                </div>
                <div>
                    <span style="font-size: 14px; font-weight: bold;">Memory:</span>&nbsp;
                    <span style="font-size: 10px; font-family: Monaco, monospace;">@memory</span>
                </div>
                <div>
                    <span style="font-size: 14px; font-weight: bold;">Erred:</span>&nbsp;
                    <span style="font-size: 10px; font-family: Monaco, monospace;">@erred</span>
                </div>
                <div>
                    <span style="font-size: 14px; font-weight: bold;">Ready:</span>&nbsp;
                    <span style="font-size: 10px; font-family: Monaco, monospace;">@processing</span>
                </div>
                )r   r   )rz   r  r  r;   r9   r   r
   rX   r   r   r   r   r   r   r   r   r   r   r   r~   r  r}   r   r   )r   rz   r   psrU   r   r   r   rQ   rQ   rR   r     sr    











zTaskProgress.__init__c          	      s   t   tt| jj| jjd x"dD ]}tt| jj|  |< q&W  d s`t| jjd s`d S t	 }t
| j|  fdddD }|d tdd | D  |d	< d
| | jj_W d Q R X d S )N)r$  r   )r   r  r  r   r$  c                s   i | ]}t  |  |qS rQ   )r   r[   )rO   rb   )r  rQ   rR   r	  `  s   z'TaskProgress.update.<locals>.<dictcomp>)r$  r   r  r  c             s   s   | ]\}}|d kr|V  qdS )r$  NrQ   )rO   rb   rP   rQ   rQ   rR   rS   b  s    z&TaskProgress.update.<locals>.<genexpr>r   z_Progress -- total: %(all)s, in-memory: %(memory)s, processing: %(processing)s, erred: %(erred)s)r5   rA   r\   r  r$  r   r  rX   rU   r9   rV   r   r]   r   rq   r   )r   rb   rW   ZtotalsrQ   )r  rR   rV   R  s    

zTaskProgress.updateN)r   r   r   r   r   r2   rV   rQ   rQ   rQ   rR   r#    s   ^r#  c               @   s$   e Zd ZdZdd Zedd ZdS )	MemoryUsez; The memory usage across the cluster, grouped by task type c             K   s   || _ dd |jD }|r&|d | _n
t|| _ttg g g g g g g g dd| _tf dt t d d d|| _	| j	
| jtddd	d
ddd | j	t d	 | j	t d tddd}| j	| d S )Nc             S   s   g | ]}t |tr|qS rQ   )rL   r;   )rO   r  rQ   rQ   rR   r   o  s    z&MemoryUse.__init__.<locals>.<listcomp>r   )r   r   r   centerrn   ZpercentZMBr   )rU   zbk-nbytes-plot)rs   r   r   r   Zoutline_line_colorr'   r   r   rn   )r   r   r   r   r'  r(  Zbelowry   a  
                <div>
                    <span style="font-size: 14px; font-weight: bold;">Name:</span>&nbsp;
                    <span style="font-size: 10px; font-family: Monaco, monospace;">@name</span>
                </div>
                <div>
                    <span style="font-size: 14px; font-weight: bold;">Percent:</span>&nbsp;
                    <span style="font-size: 10px; font-family: Monaco, monospace;">@percent</span>
                </div>
                <div>
                    <span style="font-size: 14px; font-weight: bold;">MB:</span>&nbsp;
                    <span style="font-size: 10px; font-family: Monaco, monospace;">@MB</span>
                </div>
                )r   r   )rz   r  r  r;   r
   r   rX   r   r   r   Z	add_glyphr   Z
add_layoutr   r   r   )r   rz   r   r.  r   rQ   rQ   rR   r   m  s*    



zMemoryUse.__init__c          	   C   sL   t  < t| jj}t| j| dt| jj d  | jj	_
W d Q R X d S )NzMemory Use: %0.2f MBg    .A)r5   r:   r  r   rV   rX   r   r[   r   rq   r   )r   r   rQ   rQ   rR   rV     s    zMemoryUse.updateN)r   r   r   r   r   r2   rV   rQ   rQ   rQ   rR   r/  j  s   .r/  c               @   s4   e Zd ZdZdddddhZddd	Zed
d ZdS )WorkerTablez Status of the current workers

    This is two plots, a text-based table for each host and a thin horizontal
    plot laying out hosts by their current memory use.
    Z	executingZ	in_flightZ	in_memoryZreadyr4      c          
      s  |_ ddddddddd	d
g
_j j }tfdd|D j _ddddddddd	g	}tdd jD _dd |D  t	ddt	ddt	ddt	ddt	ddt	ddt	ddt	ddd}t
dk rddi}ndd i}tf j fdd|D dd|d|}x.|D ]&}	|	|kr||	 |j||	 _qW dgj }
dd |
D tf jfdd|
D dd|d|}tdd d!}tf d"d d#d$d%|d&d'|}|jjdd(d)d*d+ d|j_d(|j_d|j_d|j_||t  tdd,d!}tf d-d d#d$d%|d&d'|}|jjd
d(d)d*d+ d|j_d(|j_d|j_d|j_||t  |_d.|kr|d.|d. i}ni }|||g}jr|| t|d/d0i|_d S )1Nrj   ncorescpur   r   memory_percentnum_fds
read_byteswrite_bytescpu_fractionc                s&   h | ]}|j D ]}| jkr|qqS rQ   )r   names)rO   r   r   )r   rQ   rR   	<setcomp>  s    
z'WorkerTable.__init__.<locals>.<setcomp>c             S   s   i | ]
}g |qS rQ   rQ   )rO   rb   rQ   rQ   rR   r	    s    z(WorkerTable.__init__.<locals>.<dictcomp>c             S   s"   i | ]}t ||d dd|qS )_percentz %)fieldrq   )r   replace)rO   r   rQ   rQ   rR   r	    s   z0.0 %)r   z0 b0)r4  r5  r   r   r7  r8  r6  r3  z0.12.15Zrow_headersFZindex_positionc                s   g | ]} | qS rQ   rQ   )rO   r   )columnsrQ   rR   r     s    z(WorkerTable.__init__.<locals>.<listcomp>T)rX   r@  ZreorderableZsortableru   c             S   s"   i | ]}t ||d dd|qS )r<  %)r=  rq   )r   r>  )rO   r   rQ   rQ   rR   r	    s   c                s   g | ]} | qS rQ   rQ   )rO   r   )extra_columnsrQ   rR   r     s    ry   a  
                <div>
                  <span style="font-size: 10px; font-family: Monaco, monospace;">@worker: </span>
                  <span style="font-size: 10px; font-family: Monaco, monospace;">@memory_percent</span>
                </div>
                )r   r   zMemory Use (%))r   r'   )gg?<   rh   )rq   r   r   r   rv   ru   rr   r   rT   g      ?)rX   rk   rl   r   r(  z
                <div>
                  <span style="font-size: 10px; font-family: Monaco, monospace;">@worker: </span>
                  <span style="font-size: 10px; font-family: Monaco, monospace;">@cpu</span>
                </div>
                zCPU Use (%)sizing_moders   zbk-worker-table)rz   r:  rF   r[   sortedexcluded_namesextra_namesr
   rX   r   r1   r   r@  r  r   r   r   r   r   r   r   r~   r}   r   r   cpu_plotr   r   r   )r   rz   ru   r   rF   Ztable_namesZ
formattersZ	dt_kwargstabler   rG  Zextra_tabler   Zmem_plotrH  rD  r(   rQ   )r@  rB  r   rR   r     s    









zWorkerTable.__init__c             C   s   dd | j | j D }xt| jj D ]\}}x,| j | j D ]}|| |j|d  q>W |j	|d d< |j
r|jd |j
 |d d< nd|d d< |j
|d d< |jd	 d
 |d	 d< |jd	 d
 |j |d d< |j|d d< q(W | jj| d S )Nc             S   s   i | ]
}g |qS rQ   rQ   )rO   r   rQ   rQ   rR   r	    s    z&WorkerTable.update.<locals>.<dictcomp>rj   r   r   r5  rh   r   r4  g      Y@r9  r3  )r:  rG  rE  rz   rF   r]   r   r   getr   r   r3  rX   rU   rV   )r   rU   r   r   r   rQ   rQ   rR   rV     s    zWorkerTable.updateN)r2  )r   r   r   r   rF  r   r2   rV   rQ   rQ   rQ   rR   r1    s   
lr1  c          	   C   sn   t  ^ t| dd}d|_t||d x|jjD ]}|| q0W td|_	|j
| t|_W d Q R X d S )Nstretch_both)rD  zDask: Scheduler System Monitori  zsystem.html)r5   r.   rq   r,   r   Zchildrenadd_rootenvget_templatetemplatetemplate_variablesrV   BOKEH_THEMEtheme)rz   extradocZsysmonZsubdocrQ   rQ   rR   systemmonitor_doc+  s    rU  c          	   C   s   t   t| ddd}t| dd}t| dd}|jj|j_d|_t||d t||d t||d |t	|j|j|jdd t
d|_|j| t|_W d Q R X d S )N   scale_width)rv   rD  )rD  zDask: Work Stealingi  zsimple.html)r5   rc   r   r   r   r   rq   r,   rL  r   rM  rN  rO  rP  rV   rQ  rR  )rz   rS  rT  ri   Zstealing_tsZstealing_eventsrQ   rQ   rR   stealing_doc8  s    
rX  c          	   C   sp   t  ` t| ddd}|  t||d d|_|t|jdd t	d|_
|j| t|_W d Q R X d S )	Nr$  r   )rv   i  zDask: Scheduler EventsrW  )rD  zsimple.html)r5   r   rV   r,   rq   rL  r   r   rM  rN  rO  rP  rQ  rR  )rz   rS  rT  r   rQ   rQ   rR   
events_docL  s    rY  c          	   C   sb   t  R t| }|  t||d d|_||j td|_	|j
| t|_W d Q R X d S )Ni  zDask: Workerszsimple.html)r5   r1  rV   r,   rq   rL  r   rM  rN  rO  rP  rQ  rR  )rz   rS  rT  rI  rQ   rQ   rR   workers_docX  s    rZ  c          	   C   sj   t  Z t| dddd}|  t||d d|_||j td|_	|j
| t|_W d Q R X d S )Ni Z60srK  )r  r  rD  i  zDask: Task Streamzsimple.html)r5   r   rV   r,   rq   rL  r   rM  rN  rO  rP  rQ  rR  )rz   rS  rT  ZtsrQ   rQ   rR   	tasks_docd  s    r[  c          	   C   sf   t  V t| dd}d|_|  t||d ||j td|_	|j
| t|_W d Q R X d S )NrK  )rD  zDask: Task GraphrV  zsimple.html)r5   r  rq   rV   r,   rL  r   rM  rN  rO  rP  rQ  rR  )rz   rS  rT  rI   rQ   rQ   rR   	graph_docq  s    r\  c       	   	   C   sP  t  > t| dddd}|  t||d t| dd}|  t||d t| jdk rt| dd}|  t||d ||j	 ||j
 njt| dd}|  t| dd}|  t||d t||d t|j|jdd}||j ||j d|_||j ||j t|_td	|_|j| t|_W d Q R X d S )
Ni  10srK  )r  r  rD  d   )rD  r   zDask: Statuszstatus.html)r5   r   rV   r,   r#  r\   rF   r   rL  r   r   r   r   r	   r   rq   rQ  rR  rM  rN  rO  rP  )	rz   rS  rT  task_streamr%  current_loadr   r   Zcurrent_load_figrQ   rQ   rR   
status_doc~  s>    


ra  c             C   s:   t | dddd}|  t||d ||j t|_d S )Ni  r]  rK  )r  r  rD  r^  )r   rV   r,   rL  r   rQ  rR  )rz   rS  rT  r_  rQ   rQ   rR   individual_task_stream_doc  s    
rb  c             C   s6   t | dd}|  t||d ||j t|_d S )NrK  )rD  r^  )r   rV   r,   rL  r   rQ  rR  )rz   rS  rT  r`  rQ   rQ   rR   individual_nbytes_doc  s
    rc  c             C   s6   t | dd}|  t||d ||j t|_d S )NrK  )rD  r^  )r   rV   r,   rL  r   rQ  rR  )rz   rS  rT  r`  rQ   rQ   rR   individual_nprocessing_doc  s
    rd  c             C   s8   t | ddd}|  t||d ||j t|_d S )N   rK  )rv   rD  r^  )r#  rV   r,   rL  r   rQ  rR  )rz   rS  rT  r%  rQ   rQ   rR   individual_progress_doc  s
    rf  c          	   C   sH   t  8 t| dd}|  t||d ||j t|_W d Q R X d S )NrK  )rD  rV  )r5   r  rV   r,   rL  r   rQ  rR  )rz   rS  rT  rI   rQ   rQ   rR   individual_graph_doc  s    rg  c          	   C   s>   t  . t| d|d}||j |  t|_W d Q R X d S )NrW  )rD  rT  )r5   r*   rL  r   trigger_updaterQ  rR  )rz   rS  rT  profrQ   rQ   rR   individual_profile_doc  s
    rj  c          	   C   s>   t  . t| d|d}||j |  t|_W d Q R X d S )NrW  )rD  rT  )r5   r+   rL  r   rh  rQ  rR  )rz   rS  rT  ri  rQ   rQ   rR   individual_profile_server_doc  s
    rk  c          	   C   sD   t  4 t| }|  t||d ||j t|_W d Q R X d S )Ni  )r5   r1  rV   r,   rL  r   rQ  rR  )rz   rS  rT  rI  rQ   rQ   rR   individual_workers_doc  s    rl  c          	   C   s\   t  L d|_t| d|d}||j td|_|j	| t
|_|  W d Q R X d S )NzDask: ProfilerW  )rD  rT  zsimple.html)r5   rq   r*   rL  r   rM  rN  rO  rP  rV   rQ  rR  rh  )rz   rS  rT  ri  rQ   rQ   rR   profile_doc  s    rm  c          	   C   s\   t  L d|_t| d|d}||j td|_|j	| t
|_|  W d Q R X d S )NzDask: Profile of Event LooprW  )rD  rT  zsimple.html)r5   rq   r+   rL  r   rM  rN  rO  rP  rV   rQ  rR  rh  )rz   rS  rT  ri  rQ   rQ   rR   profile_server_doc  s    rn  c                   s>   e Zd ZdddZedd Zedd Z fd	d
Z  ZS )BokehSchedulerNrh   c                s    _ |pd}|d}|r.|ds.d| }|_|_|p@d jd< ttttt	t
ttttttttttttd_ fddj D _|p j_d _d S )Nrh   /r  )z/systemz	/stealingz/workersz/eventsz	/countersz/tasksz/statusz/profilez/profile-serverz/graphz/individual-task-streamz/individual-progressz/individual-graphz/individual-profilez/individual-profile-serverz/individual-nbytesz/individual-nprocessingz/individual-workersc                s    i | ]\}}t | j|qS rQ   )r   rS  )rO   rb   rP   )rz   r   rQ   rR   r	  #  s   z+BokehScheduler.__init__.<locals>.<dictcomp>)rz   rstrip
startswithr  Zserver_kwargsrU  rX  rZ  rY  r/   r[  ra  rm  rn  r\  rb  rf  rg  rj  rk  rc  rd  rl  Zappsr]   Zloopserver)r   rz   Zio_loopr  r   rQ   )rz   r   rR   r     s<    

zBokehScheduler.__init__c             C   s   t d| jitS )Nr  )r%   r  rP  )r   rQ   rQ   rR   rS  )  s    zBokehScheduler.extrac             C   s   | j S )N)rz   )r   rQ   rQ   rR   	my_server-  s    zBokehScheduler.my_serverc                sD   t t j|| ddlm}  fdd|D } jjd| d S )Nr'   )routesc                s.   g | ]&\}} j d  | | j jdfqS )rp  )rs  rS  )r  rt  rS  )rO   rw   cls)r   rQ   rR   r   5  s   z)BokehScheduler.listen.<locals>.<listcomp>z.*)superro  listenZscheduler_htmlru  rs  Z_tornadoZadd_handlers)r   argsr   ru  Zhandlers)	__class__)r   rR   rx  1  s
    
zBokehScheduler.listen)Nrh   )	r   r   r   r   propertyrS  rt  rx  __classcell__rQ   rQ   )rz  rR   ro    s   
'ro  )Z
__future__r   r   r   	functoolsr   Zloggingr   Znumbersr   operatorr   osZbokeh.layoutsr   r	   Zbokeh.modelsr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zbokeh.models.widgetsr   r   Zbokeh.plottingr   Zbokeh.palettesr    Zbokeh.themesr!   Zbokeh.transformr"   Zbokeh.ior#   Ztoolzr$   r%   Ztornador&   ZnumpyrM   ImportErrorrh   r(   r)   r*   r+   r,   Zcorer-   rj   r.   r/   Zutilsr0   r1   r2   r   r4   r5   r6   r7   Zdiagnostics.progress_streamr8   r9   r:   Zdiagnostics.progressr;   Zdiagnostics.graph_layoutr<   Zdiagnostics.task_streamr=   Zcytoolz.curriedr>   r?   r@   rA   rB   Ztoolz.curriedZ	getLoggerr   Zloggerr`   Zjinja2rC   rD   pathjoindirname__file__rM  rP  rQ  floatrJ   rK   rV   rc   r   r   r   r   r   r   r   r  r#  r/  r1  rU  rX  rY  rZ  r[  r\  ra  rb  rc  rd  rf  rg  rj  rk  rl  rm  rn  ro  rQ   rQ   rQ   rR   <module>   s   T
 "
 M#&}$HG; y: '	
	