ó
ê™xTc           @   sO  d  d l  m Z d  d l m Z d  d l Z d  d l m Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ	 d	 e
 f d
 „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e
 f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d  „  ƒ  YZ d! e f d" „  ƒ  YZ d# e f d$ „  ƒ  YZ d% e f d& „  ƒ  YZ d' e f d( „  ƒ  YZ d) e f d* „  ƒ  YZ d+ e f d, „  ƒ  YZ d- e f d. „  ƒ  YZ d/ d0 „ Z d1 e f d2 „  ƒ  YZ d3 e f d4 „  ƒ  YZ  d5 e f d6 „  ƒ  YZ! d7 e f d8 „  ƒ  YZ" d9 e f d: „  ƒ  YZ# d; e f d< „  ƒ  YZ$ d= e f d> „  ƒ  YZ% d? e f d@ „  ƒ  YZ& dA „  Z' dB e f dC „  ƒ  YZ( dD „  Z) dE „  Z* dF „  Z+ dG „  Z, dH „  Z- dI „  Z. dJ e f dK „  ƒ  YZ/ dL „  Z0 dM e f dN „  ƒ  YZ1 dO e f dP „  ƒ  YZ2 dQ e f dR „  ƒ  YZ3 dS e f dT „  ƒ  YZ4 dU e f dV „  ƒ  YZ5 dW e f dX „  ƒ  YZ6 dY e f dZ „  ƒ  YZ7 d[ e f d\ „  ƒ  YZ8 d] „  Z9 d^ e f d_ „  ƒ  YZ: d` e f da „  ƒ  YZ; db e; f dc „  ƒ  YZ< dd e; f de „  ƒ  YZ= d S(f   iÿÿÿÿ(   t   division(   t   resultN(   t   dequet
   Identifierc           B   s    e  Z d  Z d „  Z d „  Z RS(   s   
  Job identifier
  c         C   s   | |  _  | |  _ | |  _ d  S(   N(   t   targett   argst   kwargs(   t   selfR   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   __init__   s    		c         C   s   d t  |  ƒ S(   Ns   Identifier(id = %s)(   t   id(   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   __repr__   s    (   t   __name__t
   __module__t   __doc__R   R
   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR      s   	t   Resultc           B   s)   e  Z d  Z d „  Z d „  Z d „  Z RS(   s   
  Empty calculation result
  c         C   s   | |  _  | |  _ d  S(   N(   t
   identifiert   value(   R   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR      s    	c         C   s   d t  |  j ƒ S(   Ns   Result(id = %s)(   R	   R   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR
   $   s    c         C   s
   |  j  ƒ  S(   N(   R   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   __call__)   s    (   R   R   R   R   R
   R   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR      s   		t   ProcessingExceptionc           B   s   e  Z d  Z RS(   sR   
  An exception signalling temporary error with post-processing, e.g. a timeout
  (   R   R   R   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   .   s   t   NullProcessorc           B   s;   e  Z d  Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z RS(   s*   
  A singleton class to not do anything
  c         C   s   |  S(   N(    (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   prepare9   s    c         C   s   t  d |  d t j d d  ƒ ƒ S(   NR   R   (   R   R   t   Successt   None(   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   finalize?   s    c           C   s   d  S(   N(    (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   resetE   s    (   R   R   R   t   staticmethodR   R   R   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   4   s   t   RetrieveTargetc           B   s    e  Z d  Z d „  Z d „  Z RS(   s   
  A simple mangled target
  c         C   s   | |  _  | |  _ d  S(   N(   t   queueR   (   R   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   P   s    	c         O   s&   |  j  | | Ž  } |  j j | ƒ d  S(   N(   R   R   t   put(   R   R   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   V   s    (   R   R   R   R   R   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   K   s   	t   RetrieveProcessorc           B   s;   e  Z d  Z e d d d „ Z d „  Z d „  Z d „  Z RS(   s   
  Adds a retrieve step
  c         C   s:   | |  _  | |  _ | |  _ t | | ƒ |  _ d  |  _ d  S(   N(   R   t   blockt   timeoutt   maxt   graceR   t   request_timeout(   R   R   R   R   R!   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   a   s
    			c         C   s   t  d |  j d | ƒ S(   NR   R   (   R   R   (   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   j   s    c         C   sÐ   d d l  m } y% |  j j d |  j d |  j ƒ } Wn‹ | k
 rÂ t j ƒ  } |  j d  k r| | |  _ t	 d |  j ‚ n  | |  j |  j
 k r¥ t	 d |  j ‚ n  |  j ƒ  t d |  j ‚ n Xd  |  _ | S(   Niÿÿÿÿ(   t   EmptyR   R   s   Timeout on %s(   t   QueueR#   R   t   getR   R   t   timeR"   R   R   R!   R   t   RuntimeError(   R   t   jobR#   t
   job_resultt   now(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   o   s    %	
	c         C   s   d  |  _ d  S(   N(   R   R"   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   ˆ   s    N(	   R   R   R   t   TrueR   R   R   R   R   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   \   s
   			t   FetchProcessorc           B   sG   e  Z d  Z d „  Z d „  Z d „  Z e d „  ƒ Z e d „  ƒ Z RS(   s„   
  Adds a fetch step. Only affects postprocessing. Can only be combined with
  job classes that save the return value as property
  c         C   s   | |  _  d  S(   N(   t   transformation(   R   R-   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   “   s    c         C   s   | S(   N(    (   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   ˜   s    c         C   s   |  j  | j ƒ S(   N(   R-   R   (   R   R(   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   ž   s    c         C   s   |  d d „  ƒ S(   NR-   c         S   s   |  ƒ  S(   N(    (   t   r(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   <lambda>¦   s    (    (   t   cls(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   Unpack£   s    c         C   s   |  d d „  ƒ S(   NR-   c         S   s   |  S(   N(    (   R.   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR/   ¬   s    (    (   R0   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   Identity©   s    (	   R   R   R   R   R   R   t   classmethodR1   R2   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR,   �   s   			t   ExecutionUnitc           B   sA   e  Z d  Z d e d „ Z d „  Z d „  Z d „  Z d „  Z RS(   s1   
  Wrapper to make factory functions countable
  i    c         C   s   | |  _  | |  _ | |  _ d  S(   N(   t   factoryt   priorityt	   processor(   R   R5   R6   R7   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   ´   s    		c         C   s;   |  j  d |  j j d | ƒ d | d | ƒ } | j ƒ  | S(   NR   R   R   (   R5   R7   R   t   start(   R   R   R   R   R(   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR8   »   s    		
c         C   s   |  j  j d | ƒ S(   NR(   (   R7   R   (   R   R(   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   Æ   s    c         C   s   |  j  j ƒ  d  S(   N(   R7   R   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   Ë   s    c         C   s   d |  j  j t |  ƒ f S(   Ns   %s(id = %s)(   t	   __class__R   R	   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   __str__Ð   s    (	   R   R   R   R   R   R8   R   R   R:   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR4   ¯   s   			t   WorkerProcessc           B   s   e  Z d  Z d „  Z RS(   s(   
  A class that runs a worker process
  c         C   s„   | j  d  ƒ xp t r | j ƒ  } | s9 | j  d  ƒ Pn  t | ƒ d k sQ t ‚ | \ } } } | | | Ž  } | j  | ƒ q Wd  S(   Ni   (   R   R   R+   R%   t   lent   AssertionError(   R   t   inqueuet   outqueuet   dataR   R   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   Ú   s    	(   R   R   R   R   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR;   Õ   s   t   TerminatedExceptionc           B   s   e  Z d  Z RS(   s6   
  Exception class signalling that process has died
  (   R   R   R   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRA   í   s   t   WorkerMaintenancec           B   sP   e  Z d  Z d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 RS(	   s'   
  Methods to create/destroy workers
  i
   c         C   s(   | |  _  | |  _ | |  _ | |  _ d  S(   N(   t   job_factoryt   queue_createt   queue_teardownR!   (   R   RC   RD   RE   R!   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   ø   s    			c         C   s4   |  j  d | d i | d 6| d 6ƒ } | j ƒ  | S(   NR   R   R>   R?   (   RC   R8   (   R   t   executorR>   R?   t   process(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   launch   s
    	
c         C   sC   |  j  ƒ  } |  j  ƒ  } |  j d | d | d | ƒ } | | | f S(   NRF   R>   R?   (   RD   RH   (   R   RF   t   q1t   q2RG   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   create
  s    c         C   s7   | j  ƒ  r3 | j d t ƒ } | d  k s3 t ‚ n  d  S(   NR   (   t   is_aliveR%   t   FalseR   R=   (   R   RG   R>   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   connect  s    c         C   s
   | j  ƒ  S(   N(   RL   (   R   RG   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt
   functional  s    c         C   s(   | j  ƒ  |  j | ƒ |  j | ƒ d  S(   N(   t   joinRE   (   R   RG   R>   R?   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   cleanup  s    
c         C   s�   | j  ƒ  ra | j d  ƒ d d l m } y | j d |  j ƒ Wqa | k
 r] | j ƒ  qa Xn  |  j d | d | d | ƒ d  S(   Niÿÿÿÿ(   R#   R   RG   R>   R?   (	   RL   R   R   R$   R#   R%   R!   t	   terminateRQ   (   R   RG   R>   R?   R#   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   shutdown%  s    (
   R   R   R   R   RH   RK   RN   RO   RQ   RS   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRB   ó   s   	
				t   Workerc           B   st   e  Z d  Z d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d	 „  Z
 d
 „  Z d „  Z d „  Z RS(   s(   
  An existing process that runs jobs
  i    c         C   s    | |  _  | |  _ |  j ƒ  d  S(   N(   t   maintenanceR6   t   startup(   R   RU   R6   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   :  s    		c         C   s7   |  j  j d t ƒ  ƒ \ |  _ |  _ |  _ t |  _ d  S(   NRF   (   RU   RK   R;   RG   R>   R?   RM   t	   connected(   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRV   A  s    c         C   s<   |  j  s t ‚ |  j j d |  j d |  j ƒ t |  _  d  S(   NRG   R>   (   RW   R=   RU   RN   RG   R>   R+   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRN   I  s    c         C   s,   |  j  j d |  j d |  j d |  j ƒ d  S(   NRG   R>   R?   (   RU   RS   RG   R>   R?   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRS   P  s    		c         C   s   |  j  ƒ  |  j ƒ  d  S(   N(   RS   RV   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   restartY  s    
c         C   s   |  j  j d |  j ƒ S(   NRG   (   RU   RO   RG   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRO   _  s    c         C   s&   |  j  j | | | f ƒ t d |  ƒ S(   Nt   worker(   R?   R   t	   WorkerJob(   R   R   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR8   d  s    c         C   sj   |  j  s |  j ƒ  n  y |  j j d | ƒ SWn6 t k
 re |  j ƒ  s_ |  j ƒ  t d ‚ qf ‚  n Xd  S(   NR   s   Worker died(   RW   RN   R>   R%   t	   ExceptionRO   RX   RA   (   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR%   j  s    	
c         C   s&   | j  ƒ  | j d k s t ‚ | j S(   Ni    (   RP   t   exitcodeR=   R   (   R   R(   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   {  s    
c         C   s   d  S(   N(    (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   ƒ  s    c         C   s   d |  j  j t |  ƒ f S(   Ns   %s(id = %s)(   R9   R   R	   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR:   ˆ  s    (   R   R   R   R   RV   RN   RS   RX   RO   R8   R%   R   R   R:   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRT   5  s   										RZ   c           B   s2   e  Z d  Z d „  Z d „  Z d „  Z d „  Z RS(   s*   
  A job that is dispatched to a worker
  c         C   s   | |  _  d  |  _ d  |  _ d  S(   N(   RY   R   R   R\   (   R   RY   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   ’  s    		c         C   s™   |  j  d  k r• d d l m } y% |  j j d | ƒ |  _ d |  _  Wq• | k
 rX t St k
 r‘ } t j	 d | ƒ |  _ d |  _  | |  _
 q• Xn  t S(   Niÿÿÿÿ(   R#   R   i    t	   exceptioni   (   R\   R   R$   R#   RY   R%   R   R+   R[   t   Errort   errRM   (   R   R   R#   t   e(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   poll™  s    	c         C   s   |  j  d t ƒ S(   NR   (   Ra   RM   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRL   ­  s    c         C   s   |  j  d t ƒ d  S(   NR   (   Ra   R+   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRP   ²  s    (   R   R   R   R   Ra   RL   RP   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRZ   �  s
   			t   RunningStatec           B   sD   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s%   
  A job that is currently running
  c         C   s   | |  _  d  S(   N(   R(   (   R   R(   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   ¼  s    c         C   s   |  j  j ƒ  S(   N(   R(   RL   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRL   Á  s    c         C   s‡   |  j  j ƒ  t |  j  d d ƒ } | d k rF t d |  j  ƒ | _ n= t |  j  d t d | ƒ ƒ } t d t j d | ƒ ƒ | _ d  S(   NR\   i    R(   R_   s   exit code = %sR   R]   (	   R(   RP   t   getattrt   PostprocessingStatet   statusR'   t
   ValueStateR   R^   (   R   R(   t	   exit_codeR_   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   initiate_postprocessingÆ  s    c         C   s   |  j  d | ƒ | j ƒ  d  S(   NR(   (   Rh   t   perform_postprocessing(   R   R(   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRi   Ô  s    c         C   s   |  j  d | ƒ | j ƒ  S(   NR(   (   Rh   R%   (   R   R(   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR%   Ú  s    c         C   s   d S(   Nt   running(    (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR:   à  s    (	   R   R   R   R   RL   Rh   Ri   R%   R:   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRb   ·  s   					Rd   c           B   sD   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s)   
  A job that is trying to postprocess
  c         C   s   | |  _  d  S(   N(   R(   (   R   R(   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   ê  s    c         C   s   t  S(   N(   RM   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRL   ï  s    c         C   s   t  d ‚ d  S(   Ns'   initiate_postprocess called second time(   R'   (   R   R(   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRh   ô  s    c         C   s{   y( t  j d | j j d |  j ƒ ƒ } Wn: t k
 r@ } ‚  n% t k
 rd } t  j d | ƒ } n Xt d | ƒ | _	 d  S(   NR   R(   R]   (
   R   R   t   unitR   R(   R   R[   R^   Rf   Re   (   R   R(   R   R`   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRi   ù  s    (c         C   s   |  j  d | ƒ | j ƒ  S(   NR(   (   Ri   R%   (   R   R(   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR%     s    c         C   s   d S(   Nt   postprocessing(    (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR:     s    (	   R   R   R   R   RL   Rh   Ri   R%   R:   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRd   å  s   					Rf   c           B   sD   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   sO   
  A job that either finished, exited with an error or failed postprocessing
  c         C   s   | |  _  d  S(   N(   R   (   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR     s    c         C   s   t  S(   N(   RM   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRL     s    c         C   s   t  d ‚ d  S(   Ns'   initiate_postprocess called second time(   R'   (   R   R(   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRh   !  s    c         C   s   d  S(   N(    (   R   R(   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRi   &  s    c         C   s   |  j  S(   N(   R   (   R   R(   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR%   +  s    c         C   s   d S(   Nt   finished(    (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR:   0  s    (	   R   R   R   R   RL   Rh   Ri   R%   R:   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRf     s   					t   ExecutingJobc           B   sD   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s'   
  A job that is executing on a Unit
  c      	   C   sL   | |  _  | |  _ t d |  j  j d | j d | j d | j ƒ ƒ |  _ d  S(   NR(   R   R   R   (   Rk   R   Rb   R8   R   R   R   Re   (   R   Rk   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   :  s    				c         C   s   |  j  j ƒ  S(   N(   Re   RL   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRL   G  s    c         C   s   |  j  j d |  ƒ d  S(   NR(   (   Re   Rh   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRh   L  s    c         C   s   |  j  j d |  ƒ d  S(   NR(   (   Re   Ri   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRi   Q  s    c         C   s%   t  d |  j d |  j j d |  ƒ ƒ S(   NR   R   R(   (   R   R   Re   R%   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR%   V  s    	c         C   s#   d |  j  j |  j |  j |  j f S(   Ns3   %s(
  unit = %s,
  identifier = %s,
  status = %s
)(   R9   R   Rk   R   Re   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR:   ^  s
    	(	   R   R   R   R   RL   Rh   Ri   R%   R:   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRn   5  s   					t	   Allocatedc           B   s2   e  Z d  Z d „  Z d „  Z d „  Z d „  Z RS(   s)   
  The number of units is know upfront
  c         C   s   t  | ƒ |  _ d  S(   N(   t   sett   units(   R   Rq   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   ‡  s    c         C   s   t  |  j ƒ S(   N(   t   boolRq   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   emptyŒ  s    c         C   s   |  j  j | ƒ d  S(   N(   Rq   t   add(   R   Rk   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   ‘  s    c         C   s,   t  |  j d d „  ƒ} |  j j | ƒ | S(   Nt   keyc         S   s   |  j  S(   N(   R6   (   t   s(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR/   ˜  s    (   R    Rq   t   remove(   R   Rk   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR%   –  s    (   R   R   R   R   Rs   R   R%   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRo   ‚  s
   			t	   Unlimitedc           B   s2   e  Z d  Z d „  Z d „  Z d „  Z d „  Z RS(   s/   
  No limit on the number of execution units
  c         C   s   | |  _  d  S(   N(   R5   (   R   R5   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   ¢  s    c         C   s   t  S(   N(   RM   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRs   §  s    c         C   s   d  S(   N(    (   R   Rk   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   ¬  s    c         C   s
   |  j  ƒ  S(   N(   R5   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR%   ±  s    (   R   R   R   R   Rs   R   R%   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRx   �  s
   			t   UnlimitedCachedc           B   s2   e  Z d  Z d „  Z d „  Z d „  Z d „  Z RS(   sS   
  No limit on the number of execution units. Created units are cached for reuse
  c         C   s   | |  _  t ƒ  |  _ d  S(   N(   R5   Rp   t   cache(   R   R5   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   »  s    	c         C   s   t  S(   N(   RM   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRs   Á  s    c         C   s   |  j  j | ƒ d  S(   N(   Rz   Rt   (   R   Rk   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   Æ  s    c         C   s7   y |  j  j ƒ  } Wn t k
 r2 |  j ƒ  } n X| S(   N(   Rz   t   popt   KeyErrorR5   (   R   Rk   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR%   Ë  s
    (   R   R   R   R   Rs   R   R%   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRy   ¶  s
   			t	   Schedulerc           B   sÂ   e  Z d  Z d d „ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z	 e d „  ƒ Z
 d i  d	 „ Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   sP   
  Pure scheduler
  Job startup and pulldown is delegated to a handler object
  g{®Gáz„?c         C   sF   | |  _  t ƒ  |  _ t ƒ  |  _ t ƒ  |  _ t ƒ  |  _ | |  _ d  S(   N(   t   handlerRp   t	   executingR   t   waiting_jobsRl   t   completed_resultst   polling_interval(   R   R~   R‚   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   Ü  s    	c         C   s   g  |  j  D] } | j ^ q
 S(   N(   R   R   (   R   t   ej(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   executing_jobsæ  s    c         C   s   g  |  j  D] } | j ^ q
 S(   N(   Rl   R   (   R   Rƒ   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   postprocessing_jobsì  s    c         C   s   |  j  |  j S(   N(   R„   R…   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   running_jobsò  s    c         C   s   g  |  j  D] } | j ^ q
 S(   N(   R�   R   (   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   completed_jobsø  s    c         C   s   t  |  j ƒ |  j |  j S(   N(   t   listR€   R†   R‡   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt
   known_jobsþ  s    c         c   s,   x% |  j  r' |  j ƒ  |  j j ƒ  Vq Wd  S(   N(   R‰   t   waitR�   t   popleft(   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   results  s    
c         C   s9   t  d | d | d | ƒ } |  j j | ƒ |  j ƒ  | S(   NR   R   R   (   R   R€   t   appendRa   (   R   R   R   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   submit  s    
c         C   s   |  j  p |  j S(   N(   R   Rl   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   is_empty  s    c         C   s   |  j  j ƒ  S(   N(   R~   Rs   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   is_full  s    c         C   s<   x5 |  j  r7 |  j ƒ  r7 |  j ƒ  t j |  j ƒ q Wd  S(   N(   R�   R�   Ra   R&   t   sleepR‚   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRŠ     s    
c         C   s\   | |  j  k r t d ‚ n  x: | |  j k rW |  j ƒ  rW |  j ƒ  t j |  j ƒ q Wd  S(   Ns   Job identifier not known(   R‰   R'   R‡   R�   Ra   R&   R‘   R‚   (   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   wait_for%  s
    
c         C   sC   |  j  d | ƒ |  j j | ƒ } |  j | } |  j j | ƒ | S(   NR   (   R’   R‡   t   indexR�   Rw   (   R   R   R“   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt
   result_for/  s
    c         C   s1   x* |  j  ƒ  s, |  j ƒ  t j |  j ƒ q Wd  S(   N(   R�   Ra   R&   R‘   R‚   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRP   9  s    
c         C   sD  xP t  |  j ƒ D]? } | j ƒ  s |  j j | ƒ | j ƒ  |  j j | ƒ q q WxŠ t t |  j ƒ ƒ D]s } |  j j	 ƒ  } y | j
 ƒ  Wn$ t k
 r² |  j j | ƒ qi n X|  j j | j ƒ  ƒ |  j j | j ƒ qi Wx] |  j ƒ  r?|  j r?|  j j	 ƒ  } |  j j ƒ  } t d | d | ƒ } |  j j | ƒ qã Wd  S(   NRk   R   (   Rˆ   R   RL   Rw   Rh   Rl   R�   t   rangeR<   R‹   Ri   R   R�   R%   R~   R   Rk   R�   R€   Rn   Rt   (   R   R(   t   iRƒ   R   Rk   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRa   @  s&    
(    (   R   R   R   R   t   propertyR„   R…   R†   R‡   R‰   RŒ   RŽ   R�   R�   RŠ   R’   R”   RP   Ra   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR}   Ö  s    
				
	
	g{®Gáz„?c         C   s   t  d t d |  ƒ d | ƒ S(   NR~   Rq   R‚   (   R}   Ro   (   Rq   R‚   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   Manager`  s    t   Adapterc           B   s¹   e  Z d  Z d „  Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z	 d i  d „ Z
 d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s+  
  Behaves like a manager, but uses an external resource to run the jobs

  Unintuitive feature:
    adapter.is_empty() == True and adapter.is_full() == True is possible
    simultaneously, even if the number of cpus is not zero. This is because
    adapter.is_empty() report the status of the adapter queue, while
    adapter.is_full() reports that of the manager. This gives the behaviour
    one normally expects, i.e. no submission if there are no free cpus, and
    empty status when jobs submitted through the adaptor have all been
    processed.
  c         C   s%   | |  _  t ƒ  |  _ t ƒ  |  _ d  S(   N(   t   managerR   R�   Rp   t   active_jobs(   R   Rš   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   v  s    	c         C   s,   g  |  j  j D] } | |  j k r | ^ q S(   N(   Rš   R€   R›   (   R   t   j(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR€   }  s    c         C   s,   g  |  j  j D] } | |  j k r | ^ q S(   N(   Rš   R†   R›   (   R   Rœ   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR†   ƒ  s    c         C   s   g  |  j  D] } | j ^ q
 S(   N(   R�   R   (   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR‡   ‰  s    c         C   s   |  j  |  j |  j S(   N(   R€   R†   R‡   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR‰   �  s    c         c   s,   x% |  j  r' |  j ƒ  |  j j ƒ  Vq Wd  S(   N(   R‰   RŠ   R�   R‹   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRŒ   •  s    
c         C   s5   |  j  j d | d | d | ƒ } |  j j | ƒ | S(   NR   R   R   (   Rš   RŽ   R›   Rt   (   R   R   R   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRŽ   �  s    !c         C   s   |  j  o |  j S(   N(   R†   R€   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR�   ¤  s    c         C   s   |  j  j ƒ  S(   N(   Rš   R�   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR�   ©  s    c         C   sI   |  j  ƒ  x8 |  j rD |  j ƒ  rD |  j ƒ  t j |  j j ƒ q Wd  S(   N(   t   transfer_finished_jobsR‡   R�   Ra   R&   R‘   Rš   R‚   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRŠ   ®  s    

c         C   s{   | |  j  k rb | |  j k r* t d ‚ n  | |  j j k sB t ‚ |  j j d | ƒ |  j ƒ  n  | |  j  k sw t ‚ d  S(   Ns   Job identifier not knownR   (   R‡   R‰   R'   Rš   R=   R’   R�   (   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR’   ·  s    c         C   sC   |  j  d | ƒ |  j j | ƒ } |  j | } |  j j | ƒ | S(   NR   (   R’   R‡   R“   R�   Rw   (   R   R   R“   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR”   Ä  s
    c         C   s4   x- |  j  ƒ  s/ |  j ƒ  t j |  j j ƒ q Wd  S(   N(   R�   Ra   R&   R‘   Rš   R‚   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRP   Î  s    
c         C   s   |  j  j ƒ  |  j ƒ  d  S(   N(   Rš   Ra   R�   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRa   Õ  s    c         C   sl   xe t  |  j j ƒ D]Q } | j |  j k r |  j j j | ƒ |  j j | j ƒ |  j j | ƒ q q Wd  S(   N(   Rˆ   Rš   R�   R   R›   Rw   R�   (   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR�   Û  s
    (    (   R   R   R   R   R—   R€   R†   R‡   R‰   RŒ   RŽ   R�   R�   RŠ   R’   R”   RP   Ra   R�   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR™   h  s    							
		t   MainthreadJobc           B   s2   e  Z d  Z d „  Z d „  Z d „  Z d „  Z RS(   s#  
  Adaptor object that behaves like a job factory, but executes the calculation
  on the main thread. This can be used for debugging, or when only one CPU is
  available, as it has the lowest startup overhead.
  It is possible to use more than one, but it does not necessarily makes sense
  c         C   s(   | |  _  | |  _ | |  _ d  |  _ d  S(   N(   R   R   R   R   R]   (   R   R   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   ì  s    			c         C   sF   y |  j  |  j |  j Ž  Wn% t k
 rA } d |  _ | |  _ n Xd  S(   Ni   (   R   R   R   R[   R\   R_   (   R   R`   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR8   ô  s
    	c         C   s   d  S(   N(    (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRP   þ  s    c         C   s   t  S(   N(   RM   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRL     s    (   R   R   R   R   R8   RP   RL   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRž   ä  s
   		
	t   MainthreadQueuec           B   s5   e  Z d  Z d „  Z e d d „ Z e d d „ Z RS(   s+   
  A queue to be used with MainthreadJob
  c         C   s   t  ƒ  |  _  d  S(   N(   R   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR     s    c         C   s   |  j  j | ƒ d  S(   N(   R   R�   (   R   t   objR   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR     s    c         C   s   |  j  j ƒ  S(   N(   R   R‹   (   R   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR%     s    N(   R   R   R   R   R+   R   R   R%   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRŸ     s   	t   MainthreadManagerc           B   s¿   e  Z d  Z d „  Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z	 e d „  ƒ Z
 d i  d „ Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   sZ   
  Dummy process queue executing on the main thread. Implements the Manager
  interface
  c         C   s4   t  ƒ  |  _ t  ƒ  |  _ t d t d | ƒ |  _ d  S(   NR5   R7   (   R   R€   R�   R4   Rž   Rk   (   R   R7   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   &  s    c         C   s   g  S(   N(    (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR„   .  s    c         C   s   g  S(   N(    (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR…   4  s    c         C   s   |  j  |  j S(   N(   R„   R…   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR†   :  s    c         C   s   g  |  j  D] } | j ^ q
 S(   N(   R�   R   (   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR‡   @  s    c         C   s   t  |  j ƒ |  j |  j S(   N(   Rˆ   R€   R†   R‡   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR‰   F  s    c         c   s,   x% |  j  r' |  j ƒ  |  j j ƒ  Vq Wd  S(   N(   R‰   RŠ   R�   R‹   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRŒ   L  s    
c         C   s/   t  d | d | d | ƒ } |  j j | ƒ | S(   NR   R   R   (   R   R€   R�   (   R   R   R   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRŽ   T  s    c         C   s   |  j  ƒ  S(   N(   R�   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR�   [  s    c         C   s   t  |  j ƒ S(   N(   Rr   R€   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR�   `  s    c         C   s   |  j  s |  j ƒ  n  d  S(   N(   R�   Ra   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRŠ   e  s    	c         C   sL   | |  j  k r t d ‚ n  x* | |  j k rG |  j ƒ  rG |  j ƒ  q Wd  S(   Ns   Job identifier not known(   R‰   R'   R‡   R�   Ra   (   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR’   k  s    c         C   sC   |  j  d | ƒ |  j j | ƒ } |  j | } |  j j | ƒ | S(   NR   (   R’   R‡   R“   R�   Rw   (   R   R   R“   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR”   t  s
    c         C   s!   x |  j  ƒ  s |  j ƒ  q Wd  S(   N(   R�   Ra   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRP   ~  s    c         C   s­   |  j  ƒ  s© |  j j ƒ  } t d |  j d | ƒ } | j ƒ  sF t ‚ | j ƒ  x= t r� y | j	 ƒ  Wn! t
 k
 rŠ t j d ƒ qS n XPqS W|  j j | j ƒ  ƒ n  d  S(   NRk   R   gš™™™™™¹?(   R�   R€   R‹   Rn   Rk   RL   R=   Rh   R+   Ri   R   R&   R‘   R�   R�   R%   (   R   R   R(   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRa   „  s    
	(    (   R   R   R   R   R—   R„   R…   R†   R‡   R‰   RŒ   RŽ   R�   R�   RŠ   R’   R”   RP   Ra   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR¡      s    							
	t   Immortalc           B   s)   e  Z d  Z d „  Z d „  Z d „  Z RS(   s*   
  A worker that is not supposed to die
  c         C   s   t  S(   N(   R+   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRL   ¹  s    c         C   s   d  S(   N(    (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt	   job_start¾  s    c         C   s   d  S(   N(    (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   job_doneÃ  s    (   R   R   R   RL   R£   R¤   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR¢   ´  s   		t   JobCountc           B   s2   e  Z d  Z d „  Z d „  Z d „  Z d „  Z RS(   s4   
  A worker that completes N jobs, and then exits
  c         C   s   | |  _  d  S(   N(   t
   jobs_to_go(   R   t   maxjobs(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   Í  s    c         C   s   d |  j  k  S(   Ni    (   R¦   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRL   Ò  s    c         C   s   d  S(   N(    (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR£   ×  s    c         C   s   |  j  d 8_  d  S(   Ni   (   R¦   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR¤   Ü  s    (   R   R   R   R   RL   R£   R¤   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR¥   È  s
   			t   MaxTimec           B   s2   e  Z d  Z d „  Z d „  Z d „  Z d „  Z RS(   s<   
  A worker that exits when a time limit has been reached
  c         C   s   t  j  ƒ  | |  _ d  S(   N(   R&   t   endtime(   R   t   seconds(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   æ  s    c         C   s   t  j  ƒ  |  j k  S(   N(   R&   R©   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRL   ë  s    c         C   s   d  S(   N(    (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR£   ð  s    c         C   s   d  S(   N(    (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR¤   õ  s    (   R   R   R   R   RL   R£   R¤   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR¨   á  s
   			t   MaxWallClockc           B   s2   e  Z d  Z d „  Z d „  Z d „  Z d „  Z RS(   sG   
  A worker that exits when a wall clock time limit has been reached
  c         C   s   t  j ƒ  | |  _ d  S(   N(   R&   t   clockt   maxtime(   R   Rª   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   ÿ  s    c         C   s   t  j ƒ  |  j k  S(   N(   R&   R¬   R­   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRL     s    c         C   s   d  S(   N(    (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR£   	  s    c         C   s   d  S(   N(    (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR¤     s    (   R   R   R   R   RL   R£   R¤   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR«   ú  s
   			c         C   s(  | ƒ  } | j  t |  f ƒ d d l m } xõ | j ƒ  ry | j d | ƒ } Wn | k
 rg q/ n X| | k r‹ | j  t |  f ƒ Pn  t | ƒ d k s£ t ‚ | \ }	 }
 } } | j  t	 |	 |  f f ƒ | j
 ƒ  |
 | | Ž  } | j  t |	 |  | f f ƒ | j ƒ  q/ W| j  t |  f ƒ d  S(   Niÿÿÿÿ(   R#   R   i   (   R   t   worker_startup_eventR$   R#   RL   R%   t   worker_shutdown_eventR<   R=   t   job_started_eventR£   t   job_finished_eventR¤   t   worker_termination_event(   t   pidR>   R?   t   waittimet   lifemant   sentinelRš   R#   R@   t   jobidR   R   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   pool_process_cycle  s&    	
t   ProcessRegisterc           B   se   e  Z d  Z d „  Z e d „  ƒ Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z d	 „  Z RS(
   s5   
  A simple class that encapsulates job management
  c         C   s1   i  |  _  t ƒ  |  _ t ƒ  |  _ t ƒ  |  _ d  S(   N(   t
   running_onR   t   terminatedst   requested_shutdownsRŒ   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   6  s    	c         C   s   t  |  j ƒ S(   N(   R<   Rº   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   process_count>  s    c         C   s,   | |  j  k r t d ‚ n  d  |  j  | <d  S(   Ns(   Existing worker with identical processID(   Rº   R'   R   (   R   R³   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   record_process_startupD  s    c         C   sK   | |  j  k r t d ‚ n  |  j  | d  k	 r: t d ‚ n  | |  j  | <d  S(   Ns   Unknown processIDs'   Attempt to start process on busy worker(   Rº   R'   R   (   R   R·   R³   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   record_job_startL  s
    c         C   sm   | |  j  k r t d ‚ n  |  j  | | k r: t d ‚ n  d  |  j  | <|  j j | t j d | ƒ f ƒ d  S(   Ns   Unknown processIDs5   Inconsistent register information: jobid/pid mismatchR   (   Rº   R'   R   RŒ   R�   R   R   (   R   R·   R³   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   record_job_finishW  s    c         C   s   |  j  d | d |  j ƒ d  S(   NR³   t	   container(   t   record_process_exitR¼   (   R   R³   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   record_process_shutdownc  s    c         C   s   |  j  d | d |  j ƒ d  S(   NR³   RÁ   (   RÂ   R»   (   R   R³   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   record_process_terminationh  s    c         C   sU   | |  j  k r t d ‚ n  |  j  | d  k	 r: t d ‚ n  | j | ƒ |  j  | =d  S(   Ns   Unknown processIDs   Shutdown of busy worker(   Rº   R'   R   R�   (   R   R³   RÁ   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRÂ   m  s    c         C   sw   | |  j  k r t d ‚ n  |  j  | } | d  k	 rY |  j j | t j d | ƒ f ƒ n  |  j  | =|  j j | ƒ d  S(   Ns   Unknown processIDR]   (   Rº   R'   R   RŒ   R�   R   R^   R»   (   R   R³   R]   R·   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   record_process_crashy  s    %
(   R   R   R   R   R—   R½   R¾   R¿   RÀ   RÃ   RÄ   RÂ   RÅ   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR¹   1  s   							c         C   s&   | \ } } |  j  d | d | ƒ d  S(   NR·   R³   (   R¿   (   t   registerR@   R·   R³   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR°   ˆ  s    c         C   s/   | \ } } } |  j  d | d | d | ƒ d  S(   NR·   R³   R   (   RÀ   (   RÆ   R@   R·   R³   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR±   Ž  s    c         C   s   |  j  d | ƒ d  S(   NR³   (   R¾   (   RÆ   R@   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR®   ”  s    c         C   s   |  j  d | ƒ d  S(   NR³   (   RÃ   (   RÆ   R@   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR¯   ™  s    c         C   s   |  j  d | ƒ d  S(   NR³   (   RÄ   (   RÆ   R@   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR²   ž  s    c         C   s&   | \ } } |  j  d | d | ƒ d  S(   NR³   R]   (   RÅ   (   RÆ   R@   R³   R]   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   worker_crash_event£  s    t   ConstantStrategyc           B   s    e  Z d  Z d „  Z d „  Z RS(   s   
  Keep pool size constant
  c         C   s   | |  _  d  S(   N(   t   capacity(   R   RÉ   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   ®  s    c         C   s   |  j  S(   N(   RÉ   (   R   t	   job_countR½   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   ³  s    (   R   R   R   R   R   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRÈ   ©  s   	c         C   s%   | | k  r! t  ƒ  |  _ | } n  | S(   N(   t   downsize_statet   state(   t   strategyR   R½   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   normal_state¸  s    	RË   c           B   s   e  Z d  „  Z d „  Z RS(   c         C   s   t  j  ƒ  |  _ d  S(   N(   R&   t	   starttime(   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   Ã  s    c         C   s>   | | k s( | j  t j ƒ  |  j k  r4 t | _ n | } | S(   N(   R!   R&   RÏ   RÎ   RÌ   (   R   RÍ   R   R½   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   È  s    ((   R   R   R   R   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRË   Á  s   	t   BreathingStrategyc           B   s2   e  Z d  Z d d „ Z e d „  ƒ Z d „  Z RS(   s(   
  Varies pool size according to load
  i   c         C   s1   | |  _  | |  _ | |  _ | |  _ t |  _ d  S(   N(   t   minimumt   maximumt	   bufferingR!   RÎ   RÌ   (   R   RÑ   RÒ   RÓ   R!   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   Ø  s
    				c         C   s   |  j  S(   N(   RÒ   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRÉ   á  s    c         C   sA   t  t |  j | |  j ƒ |  j ƒ } |  j d |  d | d | ƒ S(   NRÍ   R   R½   (   R    t   minRÒ   RÓ   RÑ   RÌ   (   R   RÊ   R½   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   ç  s    	(   R   R   R   R   R—   RÉ   R   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRÐ   Ó  s   	t   ProcessPoolc           B   s×   e  Z d  Z d Z d d d „ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z	 e d „  ƒ Z
 e d „  ƒ Z d i  d	 „ Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s   
  Process pool
  g{®Gáz„?i   c   	      C   sÀ   | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ t ƒ  |  _ d d l	 m
 } | ƒ  |  _ i  |  _ t ƒ  |  _ t ƒ  |  _ t ƒ  |  _ d |  _ i  |  _ t ƒ  |  _ |  j ƒ  d  S(   Niÿÿÿÿ(   t   counti    (   RC   t   loadmanagert   lifemanagerR>   R?   R´   R!   R¹   RÆ   t	   itertoolsRÖ   t   pid_assignert   process_numbered_asR   t	   recycledsRp   t   terminatingst   unreportedst   outstanding_shutdown_requestst   identifier_forR�   t   manage(	   R   R>   R?   RC   R×   RØ   R´   R!   RÖ   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   ü  s$    
										c         C   s   t  |  j ƒ S(   N(   R<   Rà   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRÊ   !  s    c         C   s   g  |  j  D] } | j ^ q
 S(   N(   R�   R   (   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR‡   '  s    c         C   s   |  j  j ƒ  |  j S(   N(   Rà   t   valuesR‡   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR‰   -  s    c         C   s*   t  t |  j ƒ t |  j ƒ |  j d ƒ S(   Ni    (   R    R<   RÛ   RÝ   Rß   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR½   3  s     c         c   s,   x% |  j  r' |  j ƒ  |  j j ƒ  Vq Wd  S(   N(   R‰   RŠ   R�   R‹   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRŒ   =  s    
c         C   sT   t  d | d | d | ƒ } t | ƒ } |  j j | | | | f ƒ | |  j | <| S(   NR   R   R   (   R   R	   R?   R   Rà   (   R   R   R   R   R   R·   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRŽ   E  s
    c         C   s   |  j  S(   N(   Rà   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR�   N  s    c         C   s   |  j  j |  j k S(   N(   R×   RÉ   RÊ   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR�   S  s    c         C   s<   x5 |  j  r7 |  j ƒ  r7 |  j ƒ  t j |  j ƒ q Wd  S(   N(   R�   R�   Ra   R&   R‘   R´   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRŠ   X  s    
c         C   sá  x© |  j  j ƒ  D]˜ \ } } | j ƒ  s | j ƒ  t | d d ƒ } | d k r‹ t | d t d | ƒ ƒ } |  j j t | | f f ƒ n  |  j	 j
 | ƒ |  j  | =q q Wd d l m } m } xS |  j ry$ |  j j |  j d d |  j ƒWn | k
 rPn X|  j j ƒ  qÅ WxW t rqy" |  j j d |  j ƒ \ } } Wn | k
 rWPn X| d |  j d	 | ƒ qWxn |  j j râ|  j j j ƒ  } y |  j	 j | ƒ Wn% t k
 rÎ|  j j j | ƒ Pn X|  j j | ƒ quWx’ |  j j rw|  j j j ƒ  } y |  j	 j | ƒ Wn% t k
 r?|  j j j | ƒ Pn X|  j j | ƒ d |  j k  set ‚ |  j d
 8_ qæWxX |  j j rÒ|  j j j ƒ  \ }	 }
 |  j j t  d |  j! |	 d |
 ƒ ƒ |  j! |	 =q{W|  j" ƒ  d  S(   NR\   i    R_   s   exit code = %siÿÿÿÿ(   R#   t   FullR   RÆ   R@   i   R   R   (#   RÛ   t   itemsRL   RP   Rc   R'   RÞ   R�   RÇ   RÝ   Rt   R$   R#   Rã   R>   R   R!   R‹   R+   R%   R´   RÆ   R»   Rw   R|   t
   appendleftRÜ   R¼   Rß   R=   RŒ   R�   R   Rà   Rá   (   R   R³   RG   Rg   R_   R#   Rã   t   eventR@   R·   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRa   _  sb    
$	"	c         C   sB   |  j  ƒ  x' |  j r3 |  j ƒ  t j |  j ƒ q W|  j ƒ  d  S(   N(   RS   RÛ   Ra   R&   R‘   R´   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRP   ª  s
    

c         C   s    t  d d ƒ |  _ |  j ƒ  d  S(   NRÉ   i    (   RÈ   R×   Rá   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRS   µ  s    c         C   s¹   |  j  ƒ  t j |  j ƒ |  j ƒ  x„ |  j j ƒ  D]s \ } } | j ƒ  r4 t | d ƒ rŠ y | j	 ƒ  | j
 ƒ  WqŠ t k
 r† qŠ Xn  |  j j | ƒ |  j | =q4 q4 W|  j ƒ  d  S(   NRR   (   RS   R&   R‘   R´   Ra   RÛ   Rä   RL   t   hasattrRR   RP   R[   RÝ   Rt   (   R   R³   RG   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRR   »  s    


c         C   s¢   y |  j  j ƒ  } Wn  t k
 r5 |  j j ƒ  } n X|  j d t d i | d 6|  j d 6|  j d 6|  j	 d 6|  j
 d 6|  j d 6ƒ } | j ƒ  | |  j | <d  S(	   NR   R   R³   R>   R?   R´   Rµ   R¶   (   RÜ   R‹   t
   IndexErrorRÚ   t   nextRC   R¸   R?   R>   R´   RØ   t   SENTINELR8   RÛ   (   R   R³   RG   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   start_processÒ  s    	




c         C   s&   |  j  j |  j ƒ |  j d 7_ d  S(   Ni   (   R?   R   Rê   Rß   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   stop_processê  s    c         C   s‰   |  j  } |  j j d |  j d | ƒ } | | k  rV xO |  j  | k  rR |  j ƒ  q6 Wn/ | | k  r… x  | |  j  k  r� |  j ƒ  qe Wn  d  S(   NRÊ   R½   (   R½   R×   R   RÊ   Rë   Rì   (   R   RÖ   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRá   ð  s    			N(    (   R   R   R   R   Rê   R   R—   RÊ   R‡   R‰   R½   RŒ   RŽ   R�   R�   RŠ   Ra   RP   RS   RR   Rë   Rì   Rá   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRÕ   õ  s(   
					K					t   MainthreadPoolc           B   s°   e  Z d  Z d „  Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z	 d i  d „ Z
 d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z RS(   s˜   
  Single process pool that executes on the main thread

  This is used for all single-CPU jobs, as it is more efficient than spawning a
  single job
  c         C   s   t  ƒ  |  _ t  ƒ  |  _ d  S(   N(   R   R€   R�   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   	  s    c         C   s   t  |  j ƒ S(   N(   R<   R€   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRÊ     s    c         C   s   g  |  j  D] } | j ^ q
 S(   N(   R�   R   (   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR‡     s    c         C   s   t  |  j ƒ |  j S(   N(   Rˆ   R€   R‡   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR‰     s    c         C   s   d S(   Ni   (    (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR½   !  s    c         c   s,   x% |  j  r' |  j ƒ  |  j j ƒ  Vq Wd  S(   N(   R‰   RŠ   R�   R‹   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRŒ   '  s    
c         C   s/   t  d | d | d | ƒ } |  j j | ƒ | S(   NR   R   R   (   R   R€   R�   (   R   R   R   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRŽ   /  s    c         C   s   |  j  S(   N(   R€   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR�   6  s    c         C   s   d |  j  k S(   Ni   (   RÊ   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR�   ;  s    c         C   s,   x% |  j  r' |  j ƒ  r' |  j ƒ  q Wd  S(   N(   R�   R�   Ra   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRŠ   @  s    c         C   s”   |  j  r� |  j  j ƒ  } y | j | j | j Ž  } Wn% t k
 r[ } t j d | ƒ } n Xt j d | ƒ } |  j	 j
 t d | d | ƒ ƒ n  d  S(   NR]   R   R   (   R€   R‹   R   R   R   R[   R   R^   R   R�   R�   R   (   R   t   currentR   R`   t   res(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRa   F  s    	c         C   s   x |  j  r |  j ƒ  q Wd  S(   N(   R€   Ra   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRP   W  s    c         C   s   d  S(   N(    (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRS   ]  s    c         C   s   d  S(   N(    (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRR   b  s    (    (   R   R   R   R   R—   RÊ   R‡   R‰   R½   RŒ   RŽ   R�   R�   RŠ   Ra   RP   RS   RR   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRí     s   							t   RechargeableIteratorc           B   s;   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s)   
  Allows new elements to be filled in
  c         C   s   t  ƒ  |  _ d  S(   N(   R   t   intermittent(   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   m  s    c         C   s/   y |  j  j ƒ  SWn t k
 r* t ‚ n Xd  S(   N(   Rñ   R‹   Rè   t   StopIteration(   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRé   r  s    c         C   s   t  |  j ƒ S(   N(   Rr   Rñ   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   has_next{  s    c         C   s   |  j  j | ƒ d  S(   N(   Rñ   R�   (   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR�   €  s    c         C   s   |  j  j | ƒ d  S(   N(   Rñ   t   extend(   R   t   iterable(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRô   …  s    (   R   R   R   R   Ré   Ró   R�   Rô   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRð   h  s   					t   NoPoolerc           B   s,   e  Z d  Z e d „  ƒ Z e d „  ƒ Z RS(   s   
  Does not group jobs
  c         C   s:   | j  ƒ  \ } } } | j d | d | d | ƒ } | g S(   NR   R   R   (   Ré   RŽ   (   R0   t	   calcsiterRš   R   R   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   pack�  s    		c         C   s   | j  | ƒ d  S(   N(   R�   (   R   R   t   resiter(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   unpack›  s    (   R   R   R   R3   Rø   Rú   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRö   Š  s   t	   PooledRunc           B   s)   e  Z d  Z d „  Z d „  Z d „  Z RS(   s   
  Runs multiple jobs
  c         C   s   | |  _  d  S(   N(   t   identifiers(   R   Rü   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   ¦  s    c         C   sv   g  } xi |  j  D]^ } y | j | j | j Ž  } Wn& t k
 rZ } | j t | f ƒ q X| j t | f ƒ q W| S(   N(   Rü   R   R   R   R[   R�   R+   RM   (   R   RŒ   t   idenRï   R`   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   «  s    c   	   
   C   s  g  } y | ƒ  } WnQ t  k
 rf } | j g  |  j D]' } t d | d t j d | ƒ ƒ ^ q5 ƒ n¤ Xt | ƒ t |  j ƒ k sˆ t ‚ x t |  j | ƒ D]k \ } \ } } | rÞ | j	 t d | d t j d | ƒ ƒ ƒ q› | j	 t d | d t j
 d | ƒ ƒ ƒ q› W| S(   NR   R   R]   (   R[   Rô   Rü   R   R   R^   R<   R=   t   zipR�   R   (	   R   t   rawRŒ   Rï   R`   R–   R   t   failureR@   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRŒ   ¼  s    9!%%&(   R   R   R   R   R   RŒ   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRû   ¡  s   		t   Poolerc           B   s)   e  Z d  Z d „  Z d „  Z d „  Z RS(   sR   
  Pools up a number of jobs and runs this way

  pool - number of jobs to pool
  c         C   s   d | k  s t  ‚ | |  _ d  S(   Ni    (   R=   t   size(   R   R  (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   æ  s    c      	   C   s‡   g  t  t |  j ƒ | ƒ D]0 \ } \ } } } t d | d | d | ƒ ^ q } | s^ t ‚ n  | j d t d | ƒ d d d i  ƒ | S(   NR   R   R   Rü   (    (   Rþ   R•   R  R   Rò   RŽ   Rû   (   R   R÷   Rš   R“   R   R   R   Rü   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRø   ì  s    L		c         C   s#   | j  | j j j d | ƒ ƒ d  S(   NRÿ   (   Rô   R   R   RŒ   (   R   R   Rù   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRú      s    (   R   R   R   R   Rø   Rú   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR  ß  s   		c         C   s:   |  d k r t  Sd |  k  r) t d |  ƒ St d |  ‚ d  S(   Ni   R  s   Invalid pool size: %s(   Rö   R  t
   ValueError(   R  (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt
   get_pooler  s
    t   ParallelForIteratorc           B   sG   e  Z d  Z d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s»   
  Creates an iterator that executes calls on a Manager-like object

  calculations - an iterable of calculations yielding ( target, args, kwargs ) tuples
  manager - execution manager
  i   c         C   sD   | |  _  t d | ƒ |  _ t ƒ  |  _ t | ƒ |  _ |  j ƒ  d  S(   NR  (   Rš   R  t   poolerRð   Rù   t   iterR÷   t   resume(   R   t   calculationsRš   t   pool(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR     s
    	c         C   s   xx |  j  j ƒ  sz y% |  j j d |  j d |  j  ƒ } Wn t k
 rU |  j ƒ  Pn Xx | D] } | j d | ƒ q] Wq Wd  S(   NR÷   Rš   R   (   Rš   R�   R  Rø   R÷   Rò   t   suspendt   job_submitted(   R   t   ordererRü   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   _ongoing#  s    	
c         C   s   d  S(   N(    (   R   R  (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   _terminating4  s    c         C   s�   |  j  j ƒ  s@ |  j j j ƒ  } |  j j d | d |  j  ƒ n  |  j d | ƒ |  j  j ƒ  se t ‚ |  j  j ƒ  } | j	 | f S(   NR   Rù   R  (
   Rù   Ró   Rš   RŒ   Ré   R  Rú   RG   R=   R   (   R   R  R   R.   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRé   9  s    c         C   s   |  j  |  _ d  S(   N(   R  RG   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR  E  s    c         C   s   |  j  |  _ d  S(   N(   R  RG   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR  J  s    (	   R   R   R   R   R  R  Ré   R  R  (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR    s   					t   Orderingc           B   s)   e  Z d  Z d „  Z d „  Z d „  Z RS(   s%   
  Base class for ordering classes
  c         C   s    | |  _  |  j  j d |  ƒ d  S(   NR  (   t   parallel_forRG   (   R   R  (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   T  s    	c         C   s/   |  j  j ƒ  x |  D] } q W|  j  j ƒ  d  S(   N(   R  R  R  (   R   t   elem(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   __del__Z  s    c         C   s   |  S(   N(    (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   __iter__e  s    (   R   R   R   R   R  R  (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR  O  s   		t   FinishingOrderc           B   s)   e  Z d  Z d „  Z d „  Z d „  Z RS(   s%   
  Results returned as jobs finish
  c         C   s   t  t |  ƒ j d | ƒ d  S(   NR  (   t   superR  R   (   R   R  (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   o  s    c         C   s   d  S(   N(    (   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR  t  s    c         C   s7   |  j  j d |  ƒ \ } } | j | j | j f | f S(   NR  (   R  Ré   R   R   R   (   R   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRé   y  s    (   R   R   R   R   R  Ré   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR  j  s   		t   SubmissionOrderc           B   s)   e  Z d  Z d „  Z d „  Z d „  Z RS(   s,   
  Results returned as they are submitted
  c         C   s2   t  ƒ  |  _ i  |  _ t t |  ƒ j d | ƒ d  S(   NR  (   R   t
   submittedsR”   R  R  R   (   R   R  (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR   „  s    	c         C   s   |  j  j | ƒ d  S(   N(   R  R�   (   R   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR  ‹  s    c         C   s‘   xL |  j  s# |  j  d |  j k rN |  j j d |  ƒ \ } } | |  j | <q W|  j  j ƒ  } |  j | } |  j | =| j | j | j f | f S(   Ni    R  (   R  R”   R  Ré   R‹   R   R   R   (   R   R   R   t   first(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyRé   �  s    #
(   R   R   R   R   R  Ré   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyR    s   		(>   t
   __future__R    t   libtbx.queuing_system_utilsR   R&   t   collectionsR   t   objectR   R   R[   R   R   R   R   R,   R4   R;   RA   RB   RT   RZ   Rb   Rd   Rf   Rn   Ro   Rx   Ry   R}   R˜   R™   Rž   RŸ   R¡   R¢   R¥   R¨   R«   R¸   R¹   R°   R±   R®   R¯   R²   RÇ   RÈ   RÎ   RË   RÐ   RÕ   Rí   Rð   Rö   Rû   R  R  R  R  R  R  (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/scheduling.pyt   <module>   sr   1"&BX*.-#M Š|$”	W								"ÿ g">&	=