ó
¦–Õ\c           @` s   d  d l  m Z m Z m Z d  d l Z d  d l m Z d  d l m Z d  d l	 m
 Z
 d  d l m Z m Z d d l m Z m Z d d	 l m Z d d
 l m Z d Z d Z d „  Z d d „ Z d „  Z d e e d „ Z d „  Z d d d „ Z d d „ Z d „  Z  d d d „ Z! d S(   i    (   t   absolute_importt   divisiont   print_functionN(   t   bisect_left(   t   LooseVersion(   t   cycle(   t
   itemgettert   addi   (   t   funcnamet   import_required(   t   istask(   t   applys1   Diagnostics plots require `bokeh` to be installeds1   Diagnostics plots require `toolz` to be installedc         C` s˜   t  |  ƒ r” |  d t t t f k r@ |  d t t |  d ƒ ƒ S|  d t k r” t |  d t ƒ r” t |  d d t ƒ r” t t t |  d ƒ ƒ Sn  |  S(   Ni    i   (   R
   t   tuplet   listt   sett   mapt   unquotet   dictt
   isinstance(   t   expr(    (    sA   lib/python2.7/site-packages/dask/diagnostics/profile_visualize.pyR      s    i<   c   	      ` sË  t  |  ƒ ró|  d } | t k r‹ t |  d ƒ } d } t |  ƒ d k rZ t |  d ƒ n d } t |  ƒ d k r‚ t |  d ƒ n i  } ng t | d ƒ rÌ d j d „  | j Dƒ ƒ } d t | j ƒ } n t |  d ƒ } d } |  d } i  } | sþ | rGt | t | ƒ t | ƒ t | ƒ t | ƒ ƒ ‰ ‡  ‡ f d	 †  ‰ n  | r„ˆ d
 k r{d j ‡ f d †  | Dƒ ƒ } qŠd } n d } | r×ˆ d
 k rÎd d j ‡ f d †  t	 | j
 ƒ  ƒ Dƒ ƒ } qÝd } n d } d j | | | | ƒ St |  t ƒ rš|  sd St |  ƒ d k r@t |  d  ˆ  | ƒ } | d  d St | d d t |  ƒ t |  ƒ ƒ ‰ d j ‡  ‡ f d †  |  Dƒ ƒ } d j | ƒ Sn- y |  ˆ  k r­d Sd SWn t k
 rÆd SXd S(   s?  Return a nicely formatted string for a task.

    Parameters
    ----------
    task:
        Value within dask graph to render as text
    keys: iterable
        List of keys within dask graph
    label_size: int (optional)
        Maximum size of output label, defaults to 60

    Examples
    --------
    >>> from operator import add, mul
    >>> dsk = {'a': 1,
    ...        'b': 2,
    ...        'c': (add, 'a', 'b'),
    ...        'd': (add, (mul, 'a', 'b'), 'c'),
    ...        'e': (sum, ['a', 'b', 5]),
    ...        'f': (add,),
    ...        'g': []}

    >>> pprint_task(dsk['c'], dsk)
    'add(_, _)'
    >>> pprint_task(dsk['d'], dsk)
    'add(mul(_, _), _)'
    >>> pprint_task(dsk['e'], dsk)
    'sum([_, _, *])'
    >>> pprint_task(dsk['f'], dsk)
    'add()'
    >>> pprint_task(dsk['g'], dsk)
    '[]'
    i    i   t   )i   i   t   funcst   (c         s` s   |  ] } t  | ƒ Vq d  S(   N(   R   (   t   .0t   f(    (    sA   lib/python2.7/site-packages/dask/diagnostics/profile_visualize.pys	   <genexpr>H   s    c         ` s   t  |  ˆ  ˆ ƒ S(   N(   t   pprint_task(   t   t(   t   keyst   label_size2(    sA   lib/python2.7/site-packages/dask/diagnostics/profile_visualize.pyt   <lambda>R   t    i   s   , c         3` s   |  ] } ˆ  | ƒ Vq d  S(   N(    (   R   R   (   t   pprint(    sA   lib/python2.7/site-packages/dask/diagnostics/profile_visualize.pys	   <genexpr>U   s    s   ...R   c         3` s-   |  ]# \ } } d  j  | ˆ  | ƒ ƒ Vq d S(   s   {0}={1}N(   t   format(   R   t   kt   v(   R   (    sA   lib/python2.7/site-packages/dask/diagnostics/profile_visualize.pys	   <genexpr>\   s   s   , ...s   {0}({1}{2}{3}s   []iÿÿÿÿs   , ...]c         3` s!   |  ] } t  | ˆ  ˆ ƒ Vq d  S(   N(   R   (   R   R   (   R   R   (    sA   lib/python2.7/site-packages/dask/diagnostics/profile_visualize.pys	   <genexpr>k   s    s   [{0}]t   _t   *N(    (   R
   R   R   t   lenR   t   hasattrt   joinR   t   intt   sortedt   itemsR    R   R   R   t	   TypeError(	   t   taskR   t
   label_sizet   funct   headt   tailt   argst   kwargst   result(    (   R   R   R   sA   lib/python2.7/site-packages/dask/diagnostics/profile_visualize.pyR      sZ    "
(+
"		("c         C` s  t  d t ƒ } t  d t ƒ } t t | j | ƒ ƒ ƒ } t | ƒ } | j |  } t t | j ƒ  ƒ ƒ } | t	 t
 | | ƒ t | ƒ d ƒ } | | }  t | j |  ƒ ƒ }  t |  ƒ | k rÚ t j d ƒ j |  ƒ n  t t | t |  ƒ ƒ ƒ }	 g  | D] }
 |	 |
 ^ qü S(   s  Get a dict mapping funcs to colors from palette.

    Parameters
    ----------
    palette : string
        Name of the bokeh palette to use, must be a member of
        bokeh.palettes.all_palettes.
    funcs : iterable
        Iterable of function names
    s   bokeh.palettest   toolzi   i*   (   R	   t   _BOKEH_MISSING_MSGt   _TOOLZ_MISSING_MSGR   R)   t   uniqueR%   t   all_palettesR   t   minR   t   randomt   Randomt   shuffleR   t   zipR   (   t   paletteR   t   palettest   tzt   unique_funcst   n_funcst   palette_lookupR   t   indext   color_lookupt   n(    (    sA   lib/python2.7/site-packages/dask/diagnostics/profile_visualize.pyt
   get_colorsw   s    &
c         K` sì  t  d t ƒ } d d l } t | j ƒ d k rR d d l m } | j ƒ  j } n d d l m	 }	 |	 j
 } | s | pz d } | j | ƒ n  t |  t ƒ s¨ |  g }  n  g  |  D] }
 |
 j |   ^ q¯ } t | ƒ d k ré | d } nÍ | d } x? | d D]3 } | j | _ d | _ d	 | _ | j d
 8_ qþ Wx6 | d  D]* } d | j _ d	 | _ | j d
 8_ q@Wx  | D] } d | _ d | _ quW| j g  | D] } | g ^ qžƒ } | rÌ| j | ƒ n  | rè| rè| j | ƒ n  | S(   s  Visualize the results of profiling in a bokeh plot.

    If multiple profilers are passed in, the plots are stacked vertically.

    Parameters
    ----------
    profilers : profiler or list
        Profiler or list of profilers.
    file_path : string, optional
        Name of the plot output file.
    show : boolean, optional
        If True (default), the plot is opened in a browser.
    save : boolean, optional
        If True (default), the plot is saved to disk.
    **kwargs
        Other keyword arguments, passed to bokeh.figure. These will override
        all defaults set by visualize.

    Returns
    -------
    The completed bokeh plot object.
    s   bokeh.plottingi    Ns   0.12.10(   t   state(   t   _states   profile.htmli   i   i   iÿÿÿÿiK   (   R	   R5   t   bokehR   t   __version__t   bokeh.ioRH   t   curstatet   notebookRI   t	   _notebookt   output_fileR   R   t   _plotR%   t   x_ranget   Nonet   titlet   min_border_topt   plot_heightt   xaxist
   axis_labelt   min_border_bottomt   min_border_leftt   min_border_rightt   gridplott   showt   save(   t	   profilerst	   file_pathR]   R^   R2   t   bpRJ   RH   t   in_notebookRI   t   proft   figst   pt   topR   (    (    sA   lib/python2.7/site-packages/dask/diagnostics/profile_visualize.pyt	   visualize”   sD    	"
				%c          C` s/   t  d t ƒ }  |  j j ƒ  } | j d ƒ | S(   Ns   bokeh.plottingt   tools(   R	   R5   t   Figuret
   propertiesR   (   Ra   t   o(    (    sA   lib/python2.7/site-packages/dask/diagnostics/profile_visualize.pyt   _get_figure_keywordsÕ   s    t   Viridisc         K` sG  t  d t ƒ } d d l m } t  d t ƒ } t d d d d d	 d
 d d d d ƒ } | j d „  | j ƒ  Dƒ ƒ |  r¦t |  Œ  \ }	 }
 } } } | j	 t
 d ƒ |  ƒ } t d „  | j ƒ  Dƒ ƒ } t d „  t t | j ƒ  d t
 d ƒ d t ƒƒ Dƒ ƒ } t | ƒ } t | ƒ } | j d g  t t | ƒ ƒ D] } t | ƒ ^ q5d d | | g |  } i  } g  t | | ƒ D] \ } } | | ^ qy| d <} g  t | | ƒ D] \ } } | d | | ^ q­| d <g  | D] } | | d ^ qÜ| d <g  |
 D] } t | | | ƒ ^ q| d <} t | | ƒ | d <g  |	 D] } t | ƒ ^ qA| d <| j d | ƒ } | j d | d d d d d  d d d d d d! d" ƒ n@ | j d g  t d# ƒ D] } t | ƒ ^ q¼d d d$ g |  } d) | j _ d) | j _ d) | j _ d% | j _ d& | j  _ | j! | ƒ } d' | _" d( | _# | S(*   se  Visualize the results of profiling in a bokeh plot.

    Parameters
    ----------
    results : sequence
        Output of Profiler.results
    dsk : dict
        The dask graph being profiled.
    palette : string, optional
        Name of the bokeh palette to use, must be a member of
        bokeh.palettes.all_palettes.
    label_size: int (optional)
        Maximum size of output labels in plot, defaults to 60
    **kwargs
        Other keyword arguments, passed to bokeh.figure. These will override
        all defaults set by visualize.

    Returns
    -------
    The completed bokeh plot object.
    s   bokeh.plottingi    (   t	   HoverToolR4   RT   s   Profile ResultsRh   s!   hover,save,reset,xwheel_zoom,xpant   toolbar_locationt   abovet
   plot_widthi   RV   i,  c         s` s0   |  ]& \ } } | t  ƒ  k r | | f Vq d  S(   N(   Rl   (   R   R!   R"   (    (    sA   lib/python2.7/site-packages/dask/diagnostics/profile_visualize.pys	   <genexpr>ú   s    i   c         s` s>   |  ]4 \ } } | g  | D] } | j  | j ^ q f Vq d  S(   N(   t   end_timet
   start_time(   R   R!   R"   t   i(    (    sA   lib/python2.7/site-packages/dask/diagnostics/profile_visualize.pys	   <genexpr>  s    c         s` s%   |  ] \ } } | d  | f Vq d S(   i    N(    (   R   RF   R   (    (    sA   lib/python2.7/site-packages/dask/diagnostics/profile_visualize.pys	   <genexpr>  s    t   keyi   t   reverset   y_rangeRR   t   widthi   t   xt   yt   functiont   colort   datat   sourcet   heightt
   line_colort   grayi   i
   s	   Worker IDs   Time (s)ss  
    <div>
        <span style="font-size: 14px; font-weight: bold;">Key:</span>&nbsp;
        <span style="font-size: 10px; font-family: Monaco, monospace;">@key</span>
    </div>
    <div>
        <span style="font-size: 14px; font-weight: bold;">Task:</span>&nbsp;
        <span style="font-size: 10px; font-family: Monaco, monospace;">@function</span>
    </div>
    t   follow_mouseN($   R	   R5   t   bokeh.modelsRn   R6   R   t   updateR*   R=   t   groupbyR   t	   enumerateR)   t   TrueR9   t   maxt   figuret   rangeR%   t   strR   RG   t   ColumnDataSourcet   rectRS   t   gridt   grid_line_colort   axist   axis_line_colort   major_tick_line_colort   yaxisRX   RW   t   selectt   tooltipst   point_policy(   t   resultst   dskR>   R-   R2   Ra   Rn   R@   t   defaultsR   t   taskst   startst   endst   idst   id_groupt   timingst   id_lkt   leftt   rightRt   Re   R}   t   st   eRx   t   wR   R~   t   hover(    (    sA   lib/python2.7/site-packages/dask/diagnostics/profile_visualize.pyt
   plot_tasksÜ   sP    	448%-#'7	
		c         K` s  t  d t ƒ } d d l m } d d l m } m } t d d d d d	 d
 d d d d ƒ } | j d „  | j	 ƒ  Dƒ ƒ |  r
t
 |  Œ  \ } }	 }
 t | ƒ t | ƒ } } g  | D] } | | ^ q´ } | j d t d t |
 ƒ d ƒ d t d | | d ƒ |  } n) g  } }	 }
 | j d d" d d# |  } | j | d } | j | |
 d | d d d d d ƒd | j _ i | t |	 r‘t |	 ƒ n d |	 r¦t |	 ƒ n d d ƒ Œ  d 6| _ | j | |	 d | d d d d d d d ƒ| j | d d d d ƒ d  ƒ d! | j _ | S($   sÐ  Plot resource usage in a bokeh plot.

    Parameters
    ----------
    results : sequence
        Output of ResourceProfiler.results
    palette : string, optional
        Name of the bokeh palette to use, must be a member of
        bokeh.palettes.all_palettes.
    **kwargs
        Other keyword arguments, passed to bokeh.figure. These will override
        all defaults set by plot_resources.

    Returns
    -------
    The completed bokeh plot object.
    s   bokeh.plottingi    (   R?   (   t
   LinearAxist   Range1dRT   s   Profile ResultsRh   s   save,reset,xwheel_zoom,xpanRo   Rp   Rq   i   RV   i,  c         s` s0   |  ]& \ } } | t  ƒ  k r | | f Vq d  S(   N(   Rl   (   R   R!   R"   (    (    sA   lib/python2.7/site-packages/dask/diagnostics/profile_visualize.pys	   <genexpr>K  s    Rw   id   RR   i   i   R|   t
   line_widthi   t   legends   % CPUt   memoryi   t   y_range_namet   MemoryRX   s   Memory (MB)R¢   s   Time (s)(   i    id   (   i    i   (   R	   R5   RJ   R?   Rƒ   R¨   R©   R   R„   R*   R=   R9   Rˆ   R‰   t
   fix_boundsR8   t   lineR“   RX   t   extra_y_rangest
   add_layoutRW   (   R—   R>   R2   Ra   R?   R¨   R©   R™   R   t   memt   cpuR¡   R¢   Rt   Re   t   colors(    (    sA   lib/python2.7/site-packages/dask/diagnostics/profile_visualize.pyt   plot_resources1  s:    !&%c         C` s   |  t  | |  | ƒ f S(   s6   Adjust end point to ensure span of at least `min_span`(   Rˆ   (   t   startt   endt   min_span(    (    sA   lib/python2.7/site-packages/dask/diagnostics/profile_visualize.pyR¯   e  s    c         ` s¸  t  d t ƒ } d d l m } t  d t ƒ }	 t d d d d d	 d
 d d d d ƒ }
 |
 j d „  | j ƒ  Dƒ ƒ |  rTt t	 |  Œ  ƒ d \ } } t t
 |	 j | | ƒ ƒ ƒ } |	 j ‡  ‡ f d †  |  ƒ } i  } x¤ | j ƒ  D]– \ } } t j | d ƒ } x: | D]2 } | | j c | j 7<| | j c | j 8<q	Wd g t |	 j t |	 j d t
 | j ƒ  ƒ ƒ ƒ ƒ | | <qä Wd g g  | D] } | | ^ q‹} | j d d t | ƒ g |
  } xµ t	 | j ƒ  t | | j ƒ  ƒ ƒ D]e \ \ } } } | j d d d | d d d | j i | d 6| d 6g  | D] } | ^ q3d 6ƒ ƒqèWn' | j d d d g d d d g |
  } d j | ƒ | j _ d | j _ | j | ƒ } d | _ | S(   sç  Visualize the results of profiling in a bokeh plot.

    Parameters
    ----------
    results : sequence
        Output of CacheProfiler.results
    dsk : dict
        The dask graph being profiled.
    start_time : float
        Start time of the profile.
    metric_name : string
        Metric used to measure cache size
    palette : string, optional
        Name of the bokeh palette to use, must be a member of
        bokeh.palettes.all_palettes.
    label_size: int (optional)
        Maximum size of output labels in plot, defaults to 60
    **kwargs
        Other keyword arguments, passed to bokeh.figure. These will override
        all defaults set by visualize.

    Returns
    -------
    The completed bokeh plot object.
    s   bokeh.plottingi    (   Rn   R4   RT   s   Profile ResultsRh   s    hover,save,reset,wheel_zoom,xpanRo   Rp   Rq   i   RV   i,  c         s` s0   |  ]& \ } } | t  ƒ  k r | | f Vq d  S(   N(   Rl   (   R   R!   R"   (    (    sA   lib/python2.7/site-packages/dask/diagnostics/profile_visualize.pys	   <genexpr>  s    i   c         ` s   t  |  d ˆ  ˆ ƒ S(   Ni   (   R   (   t   d(   R˜   R-   (    sA   lib/python2.7/site-packages/dask/diagnostics/profile_visualize.pyR   “  R   i   RR   Ry   Rz   R€   Rª   R~   t   labelRw   i
   s   Cache Size ({0})s   Time (s)s¼   
    <div>
        <span style="font-size: 14px; font-weight: bold;">Task:</span>&nbsp;
        <span style="font-size: 10px; font-family: Monaco, monospace;">@label</span>
    </div>
    (    R	   R5   Rƒ   Rn   R6   R   R„   R*   R   R=   R)   R7   R…   t   fromkeyst
   cache_timet   metrict	   free_timet
   accumulateR   t   pluckR‰   Rˆ   RG   R   R°   RŒ   R    R“   RX   RW   R”   R•   (   R—   R˜   Rs   t   metric_nameR>   R-   R2   Ra   Rn   R@   R™   R›   Rœ   t   ticst   groupsR}   R!   t   valst   cntsR"   Rt   Re   Ru   t   valR|   R¦   (    (   R˜   R-   sA   lib/python2.7/site-packages/dask/diagnostics/profile_visualize.pyt
   plot_cachej  s>    ?$!7('	("   t
   __future__R    R   R   R:   t   bisectR   t   distutils.versionR   t	   itertoolsR   t   operatorR   R   t   utilsR   R	   t   coreR
   t   compatibilityR   R5   R6   R   R   RG   RS   R‡   Rg   Rl   R§   R¶   R¯   RÈ   (    (    (    sA   lib/python2.7/site-packages/dask/diagnostics/profile_visualize.pyt   <module>   s(   	Z	A	U4	