ó
‡ˆ\c           @` sy  d  d l  m Z m Z m Z d  d l Z d  d l m Z d  d l Z d d l m	 Z	 m
 Z
 m Z d d l m Z y d  d l Z Wn e k
 r™ d Z n Xe d k	 r!d  d l m Z m 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 d  d l m Z n  d „  Z d d d „  ƒ  YZ  d „  Z! d e" f d „  ƒ  YZ# d e
 e	 f d „  ƒ  YZ$ d S(   i    (   t   print_functiont   divisiont   absolute_importN(   t   uuid4i   (   t   AutoBatchingMixint   ParallelBackendBaset   BatchedCalls(   t   parallel_backend(   t   Clientt   _wait(   t   funcnamet
   itemgetter(   t
   get_clientt   secedet   rejoin(   t   thread_state(   t   sizeof(   t   genc         C` s.   y t  j |  ƒ t SWn t k
 r) t SXd  S(   N(   t   weakreft   reft   Truet	   TypeErrort   False(   t   obj(    (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyt   is_weakrefable   s
    t   _WeakKeyDictionaryc           B` s;   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s«  A variant of weakref.WeakKeyDictionary for unhashable objects.

    This datastructure is used to store futures for broadcasted data objects
    such as large numpy arrays or pandas dataframes that are not hashable and
    therefore cannot be used as keys of traditional python dicts.

    Futhermore using a dict with id(array) as key is not safe because the
    Python is likely to reuse id of recently collected arrays.
    c         C` s   i  |  _  d  S(   N(   t   _data(   t   self(    (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyt   __init__,   s    c         C` s;   |  j  t | ƒ \ } } | ƒ  | k	 r7 t | ƒ ‚ n  | S(   N(   R   t   idt   KeyError(   R   R   R   t   val(    (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyt   __getitem__/   s    c         ` s   t  | ƒ ‰  y5 ˆ j ˆ  \ } } | ƒ  | k	 r@ t | ƒ ‚ n  Wn5 t k
 rx ‡  ‡ f d †  } t j | | ƒ } n X| | f ˆ j ˆ  <d  S(   Nc         ` s   ˆ j  ˆ  =d  S(   N(   R   (   t   _(   t   keyR   (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyt
   on_destroyA   s    (   R   R   R   R   R   (   R   R   t   valueR   R!   R#   (    (   R"   R   s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyt   __setitem__6   s    c         C` s   t  |  j ƒ S(   N(   t   lenR   (   R   (    (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyt   __len__F   s    c         C` s   |  j  j ƒ  d  S(   N(   R   t   clear(   R   (    (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyR(   I   s    (   t   __name__t
   __module__t   __doc__R   R    R%   R'   R(   (    (    (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyR   !   s   					c         C` sE   y' t  |  t ƒ r& |  j d d }  n  Wn t k
 r: n Xt |  ƒ S(   Ni    (   t
   isinstanceR   t   itemst	   ExceptionR
   (   t   x(    (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyt	   _funcnameM   s    t   Batchc           B` s#   e  Z d  „  Z d „  Z d „  Z RS(   c         C` s   | |  _  d  S(   N(   t   tasks(   R   R2   (    (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyR   W   s    c      
   ` s    g  } t  d ƒ ˆ x€ |  j D]u \ } } } g  | D]' } t | t ƒ rT | ˆ  ƒ n | ^ q3 } ‡  f d †  | j ƒ  Dƒ } | j | | | Ž  ƒ q WWd  QX| S(   Nt   daskc         ` s:   i  |  ]0 \ } } t  | t ƒ r- | ˆ  ƒ n | | “ q S(    (   R,   R   (   t   .0t   kt   v(   t   data(    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pys
   <dictcomp>`   s   	(   R   R2   R,   R   R-   t   append(   R   R7   t   resultst   funct   argst   kwargst   a(    (   R7   s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyt   __call__Z   s    1 c         C` s   t  |  j f f S(   N(   R1   R2   (   R   (    (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyt
   __reduce__e   s    (   R)   R*   R   R>   R?   (    (    (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyR1   V   s   		t   DaskDistributedBackendc           B` s˜   e  Z d  Z d Z d d d d d „ Z d „  Z d „  Z d d d „ Z d „  Z	 d „  Z
 d	 „  Z d
 „  Z d d „ Z e d „ Z e j d „  ƒ Z RS(   gš™™™™™É?g      ð?c         K` s9  | d  k rc | r- t | d | d t ƒ} qc y t ƒ  } Wqc t k
 r_ d } t | ƒ ‚ qc Xn  | |  _ | d  k	 rª t | t t f ƒ rª t	 d t
 | ƒ j ƒ ‚ n  | d  k	 rt | ƒ d k rt | ƒ |  _ |  j j | d t ƒ} d „  t | | ƒ Dƒ |  _ n g  |  _ i  |  _ t ƒ  |  _ | |  _ d  S(   Nt   loopt   set_as_defaults¢   To use Joblib with Dask first create a Dask Client

    from dask.distributed import Client
    client = Client()
or
    client = Client('scheduler-address:8786')s&   scatter must be a list/tuple, got `%s`i    t	   broadcastc         S` s%   i  |  ] \ } } | t  | ƒ “ q S(    (   R   (   R4   R/   t   f(    (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pys
   <dictcomp>‰   s   	 (   t   NoneR   R   R   t
   ValueErrort   clientR,   t   listt   tupleR   t   typeR)   R&   t   _scattert   scatterR   t   zipt   data_futurest   sett   task_futurest   submit_kwargs(   R   t   scheduler_hostRL   RG   RA   RQ   t   msgt	   scattered(    (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyR   m   s*    	"		c         C` s
   t  d f S(   N(    (   R@   (   R   (    (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyR?      s    c         C` s   t  d |  j ƒ d f S(   NRG   iÿÿÿÿ(   R@   RG   (   R   (    (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyt   get_nested_backend“   s    i   c         K` s   |  j  | ƒ S(   N(   t   effective_n_jobs(   R   t   n_jobst   parallelt   backend_args(    (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyt	   configure–   s    c         C` s   t  ƒ  |  _ d  S(   N(   R   t   call_data_futures(   R   (    (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyt
   start_call™   s    c         C` s   |  j  j ƒ  d  S(   N(   R[   R(   (   R   (    (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyt	   stop_callœ   s    c         C` s   t  |  j j ƒ  j ƒ  ƒ S(   N(   t   sumRG   t   ncorest   values(   R   RW   (    (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyRV   ¡   s    c         ` sË   g  ‰ t  ƒ  ‰ t ˆ d d  ƒ ‰  ‡  ‡ ‡ ‡ f d †  } g  } xi | j D]^ \ } } } t | | ƒ ƒ } t  t | j ƒ  | | j ƒ  ƒ ƒ ƒ } | j | | | f ƒ qI Wˆ s» | d f St	 | ƒ ˆ f S(   NR[   c         3` s  x|  D]} t  | ƒ } | ˆ k r4 ˆ | Vq n  ˆ j j | d  ƒ } | d  k rÉ ˆ  d  k	 rÉ y ˆ  | } WqÉ t k
 rÅ t | ƒ rÆ t | ƒ d k rÆ ˆ j j | g ƒ \ } | ˆ  | <qÆ qÉ Xn  | d  k	 rt	 t
 ˆ ƒ ƒ } ˆ j | ƒ | ˆ | <| } n  | Vq Wd  S(   Ng     @@(   R   RN   t   getRE   R   R   R   RG   RL   R   R&   R8   (   R;   t   argt   arg_idRD   t   getter(   R[   t   collected_futurest   itemgettersR   (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyt   maybe_to_futures¬   s&    	
	(    (
   t   dictt   getattrRE   R-   RH   RM   t   keysR`   R8   R1   (   R   R:   Rg   R2   RD   R;   R<   (    (   R[   Re   Rf   R   s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyt   _to_func_args¤   s    	
c         ` s¾   d t  | ƒ t ƒ  j f } ˆ j | ƒ \ } } ˆ j j | d | | ˆ j Ž‰ ˆ j j ˆ ƒ t	 j
 ‡  ‡ ‡ f d †  ƒ } ˆ j j j | ƒ t j ˆ ƒ ‰ ‡ f d †  } | ˆ _ ˆ S(   Ns   %s-batch-%sR"   c          3` s=   t  ˆ g ƒ V}  ˆ j j ˆ ƒ ˆ  d  k	 r9 ˆ  |  ƒ n  d  S(   N(   R	   RP   t   removeRE   (   t   result(   t   callbackt   futureR   (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyt   callback_wrapperÚ   s    c           ` s   ˆ  ƒ  j  ƒ  S(   N(   Rm   (    (   R   (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyRa   å   s    (   R0   R   t   hexRk   RG   t   submitRQ   RP   t   addR   t	   coroutineRA   t   add_callbackR   R   Ra   (   R   R:   Rn   R"   R;   Rp   Ra   (    (   Rn   Ro   R   R   s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyt   apply_asyncÓ   s    !	c         C` s$   |  j  j |  j ƒ |  j j ƒ  d S(   s    Tell the client to cancel any task submitted via this instance

        joblib.Parallel will never access those results
        N(   RG   t   cancelRP   R(   (   R   t   ensure_ready(    (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyt   abort_everythingë   s    c         c` s;   t  t d ƒ r t ƒ  n  d Vt  t d ƒ r7 t ƒ  n  d S(   sÙ   Override ParallelBackendBase.retrieval_context to avoid deadlocks.

        This removes thread from the worker's thread pool (using 'secede').
        Seceding avoids deadlock in nested parallelism settings.
        t   execution_stateN(   t   hasattrR   R   R   (   R   (    (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyt   retrieval_contextó   s
    	
N(   R)   R*   t   MIN_IDEAL_BATCH_DURATIONt   MAX_IDEAL_BATCH_DURATIONRE   R   R?   RU   RZ   R\   R]   RV   Rk   Rv   R   Ry   t
   contextlibt   contextmanagerR|   (    (    (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyR@   i   s   "						/(    (%   t
   __future__R    R   R   R   t   uuidR   R   RX   R   R   R   R   t   distributedt   ImportErrorRE   t   distributed.clientR   R	   t   distributed.utilsR
   R   R   R   R   t   distributed.workerR   t   distributed.sizeofR   t   tornadoR   R   R   R0   t   objectR1   R@   (    (    (    s=   lib/python2.7/site-packages/sklearn/externals/joblib/_dask.pyt   <module>   s*   
	,		