
    &`i                          d dl Z d dlZd dlmZmZmZmZ d dlZd dl	m
Z
 d dlmZ d dlmZmZ d dlmZ erd dlmZ  ej        e          Ze G d d	e                      ZdS )
    N)TYPE_CHECKINGDictListOptional)Trial)DEFAULT_METRIC)FIFOSchedulerTrialScheduler)	PublicAPI)TuneControllerc                   T    e Zd ZdZ	 	 	 	 	 	 	 d!ded	ee         d
ee         dedededef fdZ	d	ee         d
ee         defdZ
dddef fdZdddededefdZdddedefdZdefdZdddededefdZdedee         fdZdee         defdZdededej        fdZd  Z xZS )"MedianStoppingRuleaN  Implements the median stopping rule as described in the Vizier paper:

    https://research.google.com/pubs/pub46180.html

    Args:
        time_attr: The training result attr to use for comparing time.
            Note that you can pass in something non-temporal such as
            `training_iteration` as a measure of progress, the only requirement
            is that the attribute should increase monotonically.
        metric: The training result objective value attribute. Stopping
            procedures will use this attribute. If None but a mode was passed,
            the `ray.tune.result.DEFAULT_METRIC` will be used per default.
        mode: One of {min, max}. Determines whether objective is
            minimizing or maximizing the metric attribute.
        grace_period: Only stop trials at least this old in time.
            The mean will only be computed from this time onwards. The units
            are the same as the attribute named by `time_attr`.
        min_samples_required: Minimum number of trials to compute median
            over.
        min_time_slice: Each trial runs at least this long before
            yielding (assuming it isn't stopped). Note: trials ONLY yield if
            there are not enough samples to evaluate performance for the
            current result AND there are other trials waiting to run.
            The units are the same as the attribute named by `time_attr`.
        hard_stop: If False, pauses trials instead of stopping
            them. When all other trials are complete, paused trials will be
            resumed and allowed to run FIFO.
    time_total_sN      N@   r   T	time_attrmetricmodegrace_periodmin_samples_requiredmin_time_slice	hard_stopc                 "   t                                                       t                      | _        || _        || _        || _        || _        d | _        d | _	        || _
        |rZ|dv s
J d            | j
        dk    rt          d          nt          d          | _        | j
        dk    rt          nt          | _	        || _        || _        i | _        t#          j        d           | _        t#          j        t(                    | _        d S )N)minmaxz`mode` must be 'min' or 'max'.r   -infinfc                       t          d          S )Nr   )float     |/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/ray/tune/schedulers/median_stopping_rule.py<lambda>z-MedianStoppingRule.__init__.<locals>.<lambda>M   s    5== r!   )super__init__set_stopped_trials_grace_period_min_samples_required_min_time_slice_metric_worst_compare_op_moder   r   r   
_time_attr
_hard_stop_trial_statecollectionsdefaultdict_last_pauselist_results)	selfr   r   r   r   r   r   r   	__class__s	           r"   r%   zMedianStoppingRule.__init__1   s     	"uu)%9"-
 	C>)))+K)))+/:+>+>%---E%LLDK&*jE&9&9sssD##&23H3HII#/55r!   returnc                 "   | j         r|rdS | j        r|rdS |r|| _         |r|| _        | j        dk    rt          d          nt          d          | _        | j        dk    rt          nt
          | _        | j         | j        rt          | _         dS )NFr   r   r   T)r+   r.   r   r,   r   r   r-   r   )r7   r   r   specs       r"   set_search_propertiesz(MedianStoppingRule.set_search_propertiesP   s     < 	F 	5: 	$ 	5 	"!DL 	DJ'+zU':':eFmmme"&*"5"5333<DJ)DLtr!   tune_controllerr   trialc                     | j         r| j        r| j        s8t          d                    | j        j        | j         | j                            t          t          |           
                    ||           d S )Nz{} has been instantiated without a valid `metric` ({}) or `mode` ({}) parameter. Either pass these parameters when instantiating the scheduler, or pass them as parameters to `tune.TuneConfig()`)r+   r,   r-   
ValueErrorformatr8   __name__r.   r$   r   on_trial_add)r7   r=   r>   r8   s      r"   rC   zMedianStoppingRule.on_trial_addf   s    | 	4; 	d6F 	) *0N+T\4:* *	   	 $''44_eLLLLLr!   resultc                 H   | j         |vs	| j        |vrt          j        S || j        v r| j        rJ t          j        S || j                  }| j        |                             |           || j        k     rt          j        S | 	                    |          }|
                    |           t          |          | j        k     rz|                     |||          }|t          j        k    r|| j        |<   d}nd}t                               d                    t          |          |j        ||                     |S |                     ||          }|                     |          }	t                               d                    ||	||                     |                     ||	          |	k    rft                               d                    |                     | j                            |           | j        rt          j        S t          j        S t          j        S )a  Callback for early stopping.

        This stopping rule stops a running trial if the trial's best objective
        value by step `t` is strictly worse than the median of the running
        averages of all completed trials' objectives reported up to step `t`.
        zYielding time to other trials.zContinuing anyways.zLMedianStoppingRule: insufficient samples={} to evaluate trial {} at t={}. {}z-Trial {} best res={} vs median res={} at t={}z%MedianStoppingRule: early stopping {})r/   r+   r
   CONTINUEr'   r0   r6   appendr(   _trials_beyond_timeremovelenr)   _on_insufficient_samplesPAUSEr4   loggerdebugrA   trial_id_median_result_best_resultr-   addSTOP)
r7   r=   r>   rD   timetrialsaction
action_strmedian_resultbest_results
             r"   on_trial_resultz"MedianStoppingRule.on_trial_results   s    ?&((DL,F,F!**D(((&&&!**do&e##F+++$$$$!**))$//ev;;33322?E4PPF---*. '=

2
LL''-vKKz( (   M++FD99''..;BB{M4 	
 	
 	
 M;77;FFLL@GGNNOOO $$U+++ ,%**%++!**r!   c                 F    | j         |                             |           d S )N)r6   rG   )r7   r=   r>   rD   s       r"   on_trial_completez$MedianStoppingRule.on_trial_complete   s%     	e##F+++++r!   c                 P    d                     t          | j                            S )Nz)Using MedianStoppingRule: num_stopped={}.)rA   rJ   r'   )r7   s    r"   debug_stringzMedianStoppingRule.debug_string   s(    :AA$%%
 
 	
r!   rT   c                     || j         |         z
  | j        k    }|od |                                D             }|rt          j        nt          j        S )Nc                 P    g | ]#}|j         t          j        t          j        fv !|$S r    )statusr   PENDINGPAUSED).0ts     r"   
<listcomp>z?MedianStoppingRule._on_insufficient_samples.<locals>.<listcomp>   s8     
 
 
xEM5<888 888r!   )r4   r*   get_live_trialsr
   rL   rF   )r7   r=   r>   rT   pauses        r"   rK   z+MedianStoppingRule._on_insufficient_samples   sh     t'..1EE 
 
 
$4466
 
 

 (-I~##.2IIr!   c                 2      fd j         D             }|S )Nc                 X    g | ]&}j         |         d          j                 k    $|'S ))r6   r/   rd   r>   r7   rT   s     r"   rf   z:MedianStoppingRule._trials_beyond_time.<locals>.<listcomp>   sA     
 
 
}U#B'8D@@ @@@r!   )r6   )r7   rT   rU   s   `` r"   rH   z&MedianStoppingRule._trials_beyond_time   s:    
 
 
 
 

 
 

 r!   rU   c                 H     t          j         fd|D                       S )Nc                 <    g | ]}                     |          S r    )_running_meanrl   s     r"   rf   z5MedianStoppingRule._median_result.<locals>.<listcomp>   s)    NNNe$,,UD99NNNr!   )npmedian)r7   rU   rT   s   ` `r"   rP   z!MedianStoppingRule._median_result   s,    yNNNNNvNNNOOOr!   c                 ~      j         |         } fd|D             }t          j         fd|D                       S )Nc                 T    g | ]$}j         |j                 cxk    rk    n n|%S r    )r(   r/   )rd   rr7   rT   s     r"   rf   z4MedianStoppingRule._running_mean.<locals>.<listcomp>   sK     
 
 
$"4$/8J"R"R"R"Rd"R"R"R"R"RA"R"R"Rr!   c                 *    g | ]}|j                  S r    r+   rd   rt   r7   s     r"   rf   z4MedianStoppingRule._running_mean.<locals>.<listcomp>   s    @@@A$,@@@r!   )r6   rp   mean)r7   r>   rT   resultsscoped_resultss   ` `  r"   ro   z MedianStoppingRule._running_mean   sd    -&
 
 
 
 

 
 
 w@@@@@@@AAAr!   c                 `      j         |         }                      fd|D                       S )Nc                 *    g | ]}|j                  S r    rv   rw   s     r"   rf   z3MedianStoppingRule._best_result.<locals>.<listcomp>   s     B B BQ4< B B Br!   )r6   r-   )r7   r>   ry   s   `  r"   rQ   zMedianStoppingRule._best_result   s8    -& B B B B' B B BCCCr!   )r   NNr   r   r   T)rB   
__module____qualname____doc__strr   r   intboolr%   r<   r   rC   r   rZ   r\   r^   rK   r   rH   rP   rp   ndarrayro   rQ   __classcell__)r8   s   @r"   r   r      sj        > ( $""$%6 66 6 sm	6
 6 "6 6 6 6 6 6 6 6>sm+3C=	   ,M,< MU M M M M M M9+/9+8=9+GK9+	9+ 9+ 9+ 9+v,/,8=,GK, , , ,

c 
 
 
 

	J/	J8=	JEJ	J		J 	J 	J 	J $u+    PT%[ P P P P PB5 B B"* B B B BD D D D D D Dr!   r   )r2   loggingtypingr   r   r   r   numpyrp   ray.tune.experimentr   ray.tune.resultr   #ray.tune.schedulers.trial_schedulerr	   r
   ray.util.annotationsr   "ray.tune.execution.tune_controllerr   	getLoggerrB   rM   r   r    r!   r"   <module>r      s        6 6 6 6 6 6 6 6 6 6 6 6     % % % % % % * * * * * * M M M M M M M M * * * * * * BAAAAAA		8	$	$ FD FD FD FD FD FD FD FD FD FDr!   