ó
ßüÚ\c           @` s  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 l m Z d  d l m Z m Z m Z m Z d  d l m Z m Z m Z m Z d  d l m Z m Z d  d	 l m Z d
 „  Z e d e d d" g d ƒ d „  ƒ Z d „  Z e e d d ƒ d „  ƒ ƒ Z e d e d d# g d d d ƒ d „  ƒ Z e d d ƒ d „  ƒ Z  e ƒ  d „  ƒ Z! e d d! ƒ d „  ƒ Z# e d d! ƒ d „  ƒ Z$ e d d ƒ d „  ƒ Z% d „  Z& e d d! ƒ d „  ƒ Z' e d d! ƒ d „  ƒ Z( e d e d g  ƒ d  „  ƒ Z) d! S($   i    (   t   print_functiont   divisiont   absolute_import(   t   sleep(   t   frequenciest   pluck(   t   gen(   t   IOLoop(   t   Clientt   waitt   Adaptivet   LocalCluster(   t   gen_clustert   gen_testt   slowinct   inc(   t   loopt   nodebug(   t   timec         C` sç   t  d d d d t d d  d |  ƒ½ } t | j | d d d d	 ƒ} | j ƒ  i d
 d 6k sd t ‚ t | d |  ƒe } | j d „  d
 ƒ } | j	 ƒ  d k s¦ t ‚ | j
 ƒ  s¸ t ‚ | j ƒ  i d	 d 6k s× t ‚ Wd  QXWd  QXd  S(   Ni    t   scheduler_portt   silence_logst   dashboard_addressR   t   intervalid   t   scale_factori   i   t   nc         S` s   |  d S(   Ni   (    (   t   x(    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyt   <lambda>   t    i   (   R   t   Falset   NoneR
   t	   schedulert   get_scale_up_kwargst   AssertionErrorR   t   submitt   resultt   ncores(   R   t   clustert   alct   ct   future(    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyt   test_get_scale_up_kwargs   s    !t   clientR#   s	   127.0.0.1i   i   c         g` sÝ   d t  f d „  ƒ  Y} d t f d „  ƒ  Y} | ƒ  } d | j d <d | j d <d | j d	 <|  j t d d d g d
 d d d g ƒ} x' t | j ƒ d k  r¯ t j d ƒ Vq‰ W| | | d d d d ƒ} t j d ƒ Vd  S(   Nt   TestAdaptivec           B` s   e  Z d  „  Z d „  Z RS(   c         S` s   t  s t ‚ d  S(   N(   R   R    (   t   self(    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyR   !   s    c         S` s   t  s t ‚ d  S(   N(   R   R    (   R+   (    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyt   _retire_workers$   s    (   t   __name__t
   __module__R   R,   (    (    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyR*       s   	t   TestClusterc           B` s   e  Z d  „  Z d „  Z RS(   c         [` s   t  s t ‚ d  S(   N(   R   R    (   R+   R   t   kwargs(    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyt   scale_up(   s    c         S` s   t  s t ‚ d  S(   N(   R   R    (   R+   t   workers(    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyt
   scale_down+   s    (   R-   R.   R1   R3   (    (    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyR/   '   s   	i   t   at   bi   R&   t   keys   a-4s   b-4s   c-1i   gü©ñÒMbP?R   id   R   i   g333333Ó?(	   R
   t   objectt   task_durationt   mapR   t   lent   rprocessingR   R   (   R&   t   sR2   R*   R/   R$   R'   t   ta(    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyt#   test_simultaneous_scale_up_and_down   s    	*c         C` s'  t  d d d d t d d  d |  ƒý } t | j | d d ƒ} t | d |  ƒÊ } | j ƒ  sg t ‚ | j d „  d	 ƒ } | j	 ƒ  d
 k s” t ‚ | j ƒ  s¦ t ‚ t
 d ƒ | j ƒ  sÂ t ‚ ~ t ƒ  } x3 | j j rt
 d ƒ t ƒ  | d k  sÑ t ‚ qÑ W| j ƒ  st ‚ Wd  QXWd  QXd  S(   Ni    R   R   R   R   R   id   c         S` s   |  d S(   Ni   (    (   R   (    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyR   E   R   i   i   gš™™™™™¹?g{®Gáz„?i   (   R   R   R   R
   R   R   R#   R    R!   R"   R   R   (   R   R$   R%   R&   R'   t   start(    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyt   test_adaptive_local_cluster>   s"    !
	
t   timeouti   c          c` s¥  t  d d d d t d t d d  d t ƒV}  z\d |  j _ |  j d d	 ƒ } t |  d t ƒV} | j t	 t
 d	 ƒ d
 d ƒ} t ƒ  } x@ |  j j sÈ t j d ƒ Vt ƒ  | d k  s‰ t | j ƒ ‚ q‰ W| j | ƒ V~ t ƒ  } x@ |  j j r%t j d ƒ Vt ƒ  | d k  sæ t | j ƒ ‚ qæ W|  j j s9t ‚ t j d ƒ V|  j j sZt ‚ | j t	 t
 d	 ƒ d
 d ƒ} | j | ƒ VWd  | j ƒ  V|  j ƒ  VXd  S(   Ni    R   R   t	   processesR   t   asynchronousiè  R   id   t   delayg{®Gáz„?i   gš™™™™™É?(   R   R   R   t   TrueR   t   allowed_failurest   adaptR   R9   R   t   rangeR   R2   R   R   R    t   logt   gathert   close(   R$   R%   R&   t   futuresR?   (    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyt)   test_adaptive_local_cluster_multi_workersV   s:    
	&	&i
   t   active_rpc_timeoutc      	   g` sž   d t  f d „  ƒ  Y} d t f d „  ƒ  Y} t | j ƒ d k sG t ‚ | ƒ  } | | | d d d d	 d
 d ƒ} t j d ƒ Vt | j ƒ d k sš t ‚ d  S(   NR*   c           B` s   e  Z d  „  Z d „  Z RS(   c         _` s,   | j  d d ƒ |  _ t j |  | | Ž d  S(   Nt   min_sizei    (   t   popRO   R
   t   __init__(   R+   t   argsR0   (    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyRQ   ‡   s    c         [` sU   t  |  j j ƒ } |  j j |   } | t  | ƒ |  j k  rQ | | |  j  } n  | S(   N(   R:   R   R2   t   workers_to_closeRO   (   R+   R0   t   num_workerst   to_close(    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyRS   ‹   s
    (   R-   R.   RQ   RS   (    (    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyR*   †   s   	R/   c           B` s   e  Z d  „  Z d „  Z RS(   c         [` s   t  s t ‚ d  S(   N(   R   R    (   R+   R   R0   (    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyR1   ”   s    c         S` s   t  s t ‚ d  S(   N(   R   R    (   R+   R2   (    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyR3   —   s    (   R-   R.   R1   R3   (    (    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyR/   “   s   	i
   RO   i   R   gš™™™™™¹?R   g333333Ó?(   R
   R7   R:   R2   R    R   R   (   R&   R<   R2   R*   R/   R$   R=   (    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyt!   test_adaptive_scale_down_override„   s    	!c          c` sÈ  t  j ƒ  }  t d d d d t d t d d  d |  d t ƒV} | j ƒ  Vzbt | j | d d	 d
 d d d d d ƒ} t	 | d t d |  ƒV} t
 ƒ  } x7 | j j sÐ t j d ƒ Vt
 ƒ  | d	 k  sš t ‚ qš Wt j d ƒ Vt | j j ƒ d	 k sý t ‚ t t d	 | j ƒ ƒ i d	 d 6k s(t ‚ | j t t d ƒ d d ƒ} t
 ƒ  } xC t | j j ƒ d k  r”t j d ƒ Vt
 ƒ  | d	 k  sRt ‚ qRWt | j j ƒ d k s³t ‚ t j d ƒ Vt | j j ƒ d k sßt ‚ t | j ƒ d k sút ‚ t t d	 | j ƒ ƒ i d d 6k s%t ‚ ~ t
 ƒ  } xC t | j j ƒ d	 k rvt j d ƒ Vt
 ƒ  | d k  s4t ‚ q4Wt t d	 | j ƒ ƒ i d d 6d	 d 6k s©t ‚ Wd  | j ƒ  V| j ƒ  VXd  S(   Ni    R   R   RB   R   R   RC   t   minimumi   t   maximumi   R   s   20 mst
   wait_counti
   g{®Gáz„?gš™™™™™É?t   upid   RD   gš™™™™™¹?g      à?t   down(   R   t   currentR   R   R   RE   t   _startR
   R   R   R   R2   R   R   R    R:   R   R   RI   R9   R   RH   RK   (   R   R$   RG   R&   R?   RL   (    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyt   test_min_max¥   sX    
		+	+	6c          c` så   t  d d t d t d d d t d d ƒV}  t |  d t ƒV} z‰ t |  j |  d d d	 d
 ƒ} x9 t d ƒ D]+ } | j t	 | d d ƒVt
 j d ƒ Vql Wt t d | j ƒ ƒ i d d 6k sÆ t ‚ Wd | j ƒ  V|  j ƒ  VXd S(   s»    We want to avoid creating and deleting workers frequently

    Instead we want to wait a few beats before removing a worker in case the
    user is taking a brief pause between work
    i    RC   RB   R   R   R   R   s   20 msRY   i   i
   RD   g{®Gáz¤?i   RZ   N(   R   RE   R   R   R   R
   R   RH   R!   R   R   R   R   R   RI   R    RK   (   R$   R)   RG   t   i(    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyt   test_avoid_churnß   s     
/c          c` so  t  d d t d t d d d t d d ƒV}  t |  d t ƒV} t |  j |  d d d	 d
 d d ƒ} zï| j t d d d ƒ} t	 | ƒ Vt
 | j ƒ d k s£ t ‚ | j t t d ƒ d d ƒ} x7 t t d | j ƒ ƒ i d d 6k rú t j d ƒ VqÄ Wt
 | j ƒ d k st ‚ d | j d k s/t ‚ g  | j d D] } t | t ƒ r=| ^ q=d } d | d k  o€| j k n s‹t ‚ x- t
 |  j j ƒ | j k  rºt j d ƒ VqŽW~ x* t
 |  j j ƒ d k rêt j d ƒ VqÁW| j d ƒ V} x& t d ƒ D] } | j t | ƒ } qWt j d ƒ Vt
 |  j j ƒ d k sPt ‚ Wd | j ƒ  V|  j ƒ  VXd S(   s»    We want to avoid creating and deleting workers frequently

    Instead we want to wait a few beats before removing a worker in case the
    user is taking a brief pause between work
    i    RC   RB   R   R   R   R   i   RY   i   RX   i
   i   RD   gš™™™™™¹?iè  RZ   g{®Gáz„?i   iÿÿÿÿR   id   N(   R   RE   R   R   R   R
   R   R!   R   R	   R:   RI   R    R9   RH   R   R   R   R   t
   isinstancet   dictRX   R2   t   scatterRK   (   R$   R)   RG   R'   RL   R   t   dR_   (    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyt   test_adapt_quicklyü   s@    
$(3)"c          c` s   t  d d t d t d d d t d d ƒV}  t |  d t ƒV} |  j d d d	 d
 ƒ z® | j t t d ƒ d d ƒ} x* t	 |  j
 j ƒ d
 k  r¡ t j d ƒ Vqx W|  j d	 d ƒ t ƒ  } xC t	 |  j
 j ƒ d k r t j d ƒ Vt ƒ  | d k  s¾ t ‚ q¾ WWd | j ƒ  V|  j ƒ  VXd S(   sC    Ensure that redefining adapt with a lower maximum removes workers i    RC   RB   R   R   R   R   t   20msRX   i   iè  RD   gš™™™™™¹?i   i   N(   R   RE   R   R   R   RG   R9   R   RH   R:   R   R2   R   R   R   R    RK   (   R$   R)   RL   R?   (    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyt   test_adapt_down/  s(    
	!c          c` sì   t  j ƒ  }  t d d d d t d t d d  d |  d t ƒV} | j ƒ  Vz† t | j | d d d	 d
 d d ƒ} t	 | d t d |  ƒV} d | j j
 d <| j t d d d ƒVt | j j ƒ d k sÍ t ‚ Wd  | j ƒ  V| j ƒ  VXd  S(   Ni    R   R   RB   R   R   RC   RW   RX   i   R   s   10 msiè  R   i   RD   gš™™™™™¹?(   R   R\   R   R   R   RE   R]   R
   R   R   R8   R!   R   R:   R2   R    RK   (   R   R$   RG   R)   (    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyt   test_no_more_workers_than_tasksM  s&    
!"c          C` s˜   z€ t  d d d d t d d  ƒ\ }  t |  ƒ > } |  j ƒ  | j d „  d ƒ } | j ƒ  d k sj t ‚ Wd  QX|  j } Wd  QXWd  | j	 | j
 ƒ Xd  S(   Ni    R   R   R   c         S` s   |  d S(   Ni   (    (   R   (    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyR   p  R   i   i   (   R   R   R   R   RG   R!   R"   R    R   t   add_callbackt   stop(   R$   R)   R'   R   (    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyt   test_basic_no_loopi  s    
c          c` sW  t  d d t d t d d d t d d ƒV}  t |  d t ƒV} |  j d d d	 d
 d d ƒ } d |  j j d <zÍ x* t |  j j	 ƒ d
 k  r› t
 j d ƒ Vqr W| j t t d ƒ d d ƒ} x' t | j ƒ d
 k  rã t
 j d ƒ Vq½ W| j d d d i d
 d 6f k st ‚ | j d d d i d d 6f k s8t ‚ Wd | j ƒ  V|  j ƒ  VXd S(   sC    Ensure that redefining adapt with a lower maximum removes workers i    RC   RB   R   R   R   R   Rf   RW   i   t   target_durationt   5si   R   g{®Gáz„?id   RD   g333333Ó?RZ   R   i   N(   R   RE   R   R   R   RG   R   R8   R:   R2   R   R   R9   R   RH   RI   R    RK   (   R$   R)   t   adaptiveRL   (    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyt   test_target_durationw  s(    
*.c          c` sY  t  d d t d t d d d t d d ƒV}  z|  j d d ƒ |  j d d	 ƒ |  j d d
 ƒ |  j d d ƒ g Vx* t |  j j ƒ d k r› t j	 d ƒ Vqr Wd „  } i | d 6|  _
 |  j d d ƒ } | j ƒ  Vx* t |  j j ƒ d k rþ t j	 d ƒ VqÕ Wd „  |  j j j ƒ  Dƒ } | d d	 h k sE| d
 d h k sEt ‚ Wd |  j ƒ  VXd S(   sC    Ensure that redefining adapt with a lower maximum removes workers i    RC   RB   R   R   R   t   names   a-1s   a-2s   b-1s   b-2i   g{®Gáz„?c         S` s   |  j  j d ƒ d S(   Nt   -i    (   Rp   t   split(   t   ws(    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyR6   ¯  s    t
   worker_keyRW   i   c         S` s   h  |  ] } | j  ’ q S(    (   Rp   (   t   .0Rs   (    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pys	   <setcomp>º  s   	 N(   R   RE   R   R   t   start_workerR:   R   R2   R   R   t   _adaptive_optionsRG   t   _adaptt   valuesR    RK   (   R$   R6   Rn   t   names(    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyt   test_worker_keys˜  s.    
	.c         c` si   t  d | ƒ } |  j t d ƒ } x | j s> t j d ƒ Vq$ W|  j j ƒ  V} | d d k se t ‚ d  S(   NR   i   g{®Gáz„?t   statusRZ   (	   R
   R!   R   t   tasksR   R   R   t   adaptive_recommendationsR    (   R&   R<   RG   R'   t   response(    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyt   test_without_clusterÀ  s    N(   s	   127.0.0.1i   (   s	   127.0.0.1i   (*   t
   __future__R    R   R   R   R   t   toolzR   R   t   tornadoR   t   tornado.ioloopR   t   distributedR   R	   R
   R   t   distributed.utils_testR   R   R   R   R   R   t   distributed.metricsR(   RE   R>   R@   RM   RV   R^   R`   R   Re   Rg   Rh   Rk   Ro   R{   R€   (    (    (    sE   lib/python2.7/site-packages/distributed/deploy/tests/test_adaptive.pyt   <module>   s.   ""	% 	-+!:3	!(