
    &`i0                        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mZmZ d dlmZmZmZmZmZmZ d dlmZ d dlmZ 	 d dlZd dlmZmZ n# e $ r	 dZdxZZY nw xY w ej!        e"          Z# G d	 d
e          Z$dS )    N)DictListOptionalTuple)DEFAULT_METRIC)UNDEFINED_METRIC_MODEUNDEFINED_SEARCH_SPACEUNRESOLVED_SEARCH_SPACESearcher)CategoricalDomainFloatInteger	QuantizedUniform)parse_spec_vars)unflatten_dict)Solution	ValueTypec                   `    e Zd ZdZdZ	 	 	 	 	 	 	 ddedee         dee         dee         d	ee         d
ee	e                  def fdZ
d Zdee         d	ee         dedefdZdedee         fdZ	 ddedee         defdZdefdZdefdZeddededeeef         fd            Z xZS ) ZOOptSearcha  A wrapper around ZOOpt to provide trial suggestions.

    ZOOptSearch is a library for derivative-free optimization. It is backed by
    the `ZOOpt <https://github.com/polixir/ZOOpt>`__ package. Currently,
    Asynchronous Sequential RAndomized COordinate Shrinking (ASRacos)
    is implemented in Tune.

    To use ZOOptSearch, install zoopt (>=0.4.1): ``pip install -U zoopt``.

    Tune automatically converts search spaces to ZOOpt"s format:

    .. code-block:: python

        from ray import tune
        from ray.tune.search.zoopt import ZOOptSearch

        "config": {
            "iterations": 10,  # evaluation times
            "width": tune.uniform(-10, 10),
            "height": tune.uniform(-10, 10)
        }

        zoopt_search_config = {
            "parallel_num": 8,  # how many workers to parallel
        }

        zoopt_search = ZOOptSearch(
            algo="Asracos",  # only support Asracos currently
            budget=20,  # must match `num_samples` in `tune.TuneConfig()`.
            dim_dict=dim_dict,
            metric="mean_loss",
            mode="min",
            **zoopt_search_config
        )

        tuner = tune.Tuner(
            my_objective,
            tune_config=tune.TuneConfig(
                search_alg=zoopt_search,
                num_samples=20
            ),
            run_config=tune.RunConfig(
                name="zoopt_search",
                stop={"timesteps_total": 10}
            ),
            param_space=config
        )
        tuner.fit()

    If you would like to pass the search space manually, the code would
    look like this:

    .. code-block:: python

        from ray import tune
        from ray.tune.search.zoopt import ZOOptSearch
        from zoopt import ValueType

        dim_dict = {
            "height": (ValueType.CONTINUOUS, [-10, 10], 1e-2),
            "width": (ValueType.DISCRETE, [-10, 10], False),
            "layers": (ValueType.GRID, [4, 8, 16])
        }

        "config": {
            "iterations": 10,  # evaluation times
        }

        zoopt_search_config = {
            "parallel_num": 8,  # how many workers to parallel
        }

        zoopt_search = ZOOptSearch(
            algo="Asracos",  # only support Asracos currently
            budget=20,  # must match `num_samples` in `tune.TuneConfig()`.
            dim_dict=dim_dict,
            metric="mean_loss",
            mode="min",
            **zoopt_search_config
        )

        tuner = tune.Tuner(
            my_objective,
            tune_config=tune.TuneConfig(
                search_alg=zoopt_search,
                num_samples=20
            ),
            run_config=tune.RunConfig(
                name="zoopt_search",
                stop={"timesteps_total": 10}
            ),
        )
        tuner.fit()

    Parameters:
        algo: To specify an algorithm in zoopt you want to use.
            Only support ASRacos currently.
        budget: Number of samples.
        dim_dict: Dimension dictionary.
            For continuous dimensions: (continuous, search_range, precision);
            For discrete dimensions: (discrete, search_range, has_order);
            For grid dimensions: (grid, grid_list).
            More details can be found in zoopt package.
        metric: The training result objective value attribute. If None
            but a mode was passed, the anonymous metric `_metric` will be used
            per default.
        mode: One of {min, max}. Determines whether objective is
            minimizing or maximizing the metric attribute.
        points_to_evaluate: Initial parameter suggestions to be run
            first. This is for when you already have some good parameters
            you want to run first to help the algorithm make better suggestions
            for future parameters. Needs to be a list of dicts containing the
            configurations.
        parallel_num: How many workers to parallel. Note that initial
            phase may start less workers than this number. More details can
            be found in zoopt package.
    Nasracos   algobudgetdim_dictmetricmodepoints_to_evaluateparallel_numc                 @   t           
J d            |
J d            |r|dv s
J d            |                                }	|	dv s
J d            |	| _        t          |t                    rk|rit          |          \  }
}}|s|rRt                              t          j	        dt          |                                |                     |d	
          }|| _        || _        || _        |dk    rd| _        n|dk    rd| _        t!          j        |          | _        i | _        g | _        i | _        g | _        d | _        || _        || _        t5          t6          |                               | j        |           | j        r|                                  d S d S )NzAZOOpt not found - please install zoopt by `pip install -U zoopt`.z`budget` should not be None!)minmaxz`mode` must be 'min' or 'max'.)r   sracosz1`algo` must be in ['asracos', 'sracos'] currentlyr   )parclsTjoinr#         r"         ?)r   r   )zooptlower_algo
isinstancedictr   loggerwarningr
   formattypeconvert_search_space	_dim_dict_budget_metric
_metric_opcopydeepcopy_points_to_evaluate_live_trial_mapping	_dim_keyssolution_dictbest_solution_list	optimizerkwargsr    superr   __init___setup_zoopt)selfr   r   r   r   r   r   r    rA   r-   resolved_varsdomain_vars	grid_vars	__class__s                v/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/ray/tune/search/zoopt/zoopt_search.pyrC   zZOOptSearch.__init__   s    N !!#A!!! 	L>)))+K)))

 
 
 
 
 ?
 
 

 
h%% 	J( 	J4CH4M4M1M;	 Ji J+2ztDzzRRR    44XD4II!5=="DOOU]]!DO#'=1C#D#D #% "$(k4  ))D)III> 	 	  	     c                      j          j        rt           _         g } j        D ]<} j                            |           |                     j        |                    =d } j        r-t                              d            fd j        D             }t          j
        |          }t          j         j        |          } j        dk    s j        dk    r#ddlm}  |d	|| j        d j         _        d S d S )
Nz>`points_to_evaluate` is ignored by ZOOpt in versions <= 0.4.1.c                 n    g | ]0t          t          fd j        D                                 1S )c              3   (   K   | ]}|         V  d S )N ).0dimpoints     rJ   	<genexpr>z6ZOOptSearch._setup_zoopt.<locals>.<listcomp>.<genexpr>   s'       F Fs F F F F F FrK   )x)r   tupler=   )rP   rR   rE   s    @rJ   
<listcomp>z,ZOOptSearch._setup_zoopt.<locals>.<listcomp>   sT        5 F F F Ft~ F F FFFGGG  rK   )r   init_samplesr$   r   r   )
SRacosTune)	dimension	parameterr    rO   )r7   _moder   r5   r=   appendr;   r0   r1   r+   
Dimension2	Parameterr6   r-   'zoopt.algos.opt_algorithms.racos.sracosrX   r    rA   r@   )rE   	_dim_listkrW   rQ   r%   rX   s   `      rJ   rD   zZOOptSearch._setup_zoopt   sK   <DJ)DL	 	0 	0AN!!!$$$T^A.////# 	NNP     !5  L y))oT\MMM:!!TZ9%<%<JJJJJJ'Z !.  +	 DNNN &=%<rK   configreturnc                     | j         rdS |                     |          }|| _         |r|| _        |r|| _        | j        dk    rd| _        n| j        dk    rd| _        |                                  dS )NFr#   r)   r"   r*   T)r5   r4   r7   r[   r8   rD   )rE   r   r   rb   specspaces         rJ   set_search_propertiesz!ZOOptSearch.set_search_properties   s     > 	5))&11 	"!DL 	DJ:"DOOZ5  !DOtrK   trial_idc                 R   | j         r| j        s-t          t          j        | j        j        d                    | j        r| j        s8t          t          j        | j        j        | j        | j                            | j        
                                }|dk    rt          j        dk    rt          j        S d S |rf|| j        t!          |          <   |                                }t%          t'          | j        |                    }|| j        |<   t-          |          S d S )Nr   )r&   rf   )r&   r   r   FINISHEDz0.8.7)r5   r@   RuntimeErrorr	   r2   rI   __name__r7   r[   r   suggestray__version__r   rj   r>   strget_xr/   zipr=   r<   r   )rE   rh   	_solution_x	new_trials        rJ   rm   zZOOptSearch.suggest  s5   ~ 	T^ 	&-/z    
 | 	4: 	%,/4:     N**,,	
""'))((t 	-09Ds8}}-""BS4455I1:D$X.!),,,	- 	-rK   Fresulterrorc                     |rd| j         t          |                   }| j                            || j        || j                 z            }|r| j                            |           | j        |= dS )z)Notification for the completion of trial.N)	r>   rp   r@   completer8   r7   r?   r\   r<   )rE   rh   rv   rw   rs   _best_solution_so_fars         rJ   on_trial_completezZOOptSearch.on_trial_complete)  s      	F*3x==9I$(N$;$;4?VDL-AA% %! % F'../DEEE$X...rK   checkpoint_pathc                     | j         }t          |d          5 }t          j        ||           d d d            d S # 1 swxY w Y   d S )Nwb)__dict__openpickledump)rE   r|   save_object
outputFiles       rJ   savezZOOptSearch.save7  s    m/4(( 	1JKZ000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1s   ;??c                     t          |d          5 }t          j        |          }d d d            n# 1 swxY w Y   | j                            |           d S )Nrb)r   r   loadr   update)rE   r|   	inputFiler   s       rJ   restorezZOOptSearch.restore<  s    /4(( 	1I +i00K	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1[)))))s   266re   r(   c                     t          j        |           } t          |           \  }}}|s|si S |rt          d          dt          dt
          fdfd|D             }|r|                     |           | }|S )NzQGrid search parameters cannot be automatically converted to a ZOOpt search space.domainrc   c                    d }|                                  }t          |t                    r|j        }|j        }t          | t
                    r5|pd}t          |t                    rt          j        | j	        | j
        g|fS nt          | t                    r4t          |t                    rt          j        | j	        | j
        dz
  gdfS n=t          | t                    r(t          |t                    rt          j        | j        fS t!          d                    t%          |           j        t%          | j                  j                            )Ng-q=r   TzIZOOpt does not support parameters of type `{}` with samplers of type `{}`)get_samplerr.   r   qsamplerr   r   r   
CONTINUOUSr,   upperr   DISCRETEr   GRID
categories
ValueErrorr2   r3   rl   )r   quantizer   	precisions       rJ   resolve_valuez7ZOOptSearch.convert_search_space.<locals>.resolve_valueO  sO   H((**G'9-- *"9!/&%(( ?$-	gw// !,v|4!  FG,, 
?gw// X%.v|a?O0PRVWWX FK00 ?
 gw// ?%NF,=>>228&LL)4+?+?+H3 3  rK   c                 T    i | ]$\  }}d                      |           |          %S )/r'   )rP   pathr   r   s      rJ   
<dictcomp>z4ZOOptSearch.convert_search_space.<locals>.<dictcomp>s  s@     
 
 
6BdFCHHTNNMM&11
 
 
rK   )r9   r:   r   r   r   r   r   )re   r(   rF   rG   rH   	conv_specr   s         @rJ   r4   z ZOOptSearch.convert_search_spaceA  s    }T""0?0E0E-{I 	9 	I 	+  
"	& "	U "	 "	 "	 "	H
 
 
 
FQ
 
 
	  	KK	"""IrK   )r   NNNNNr   )NF)F)rl   
__module____qualname____doc__r@   rp   r   intr   r   rC   rD   boolrg   rm   r{   r   r   staticmethodr   r4   __classcell__)rI   s   @rJ   r   r   #   s       t tl I  $#' $"37:  : :  :  4.	: 
 :  sm:  %T$Z0:  :  :  :  :  :  : x  >sm+3C=BF	   *- - - - - -< KP/ //%-d^/CG/ / / /1C 1 1 1 1
*s * * * *
 9 94 9t 9S%Z@P 9 9 9 \9 9 9 9 9rK   r   )%r9   loggingtypingr   r   r   r   rn   ray.cloudpicklecloudpickler   ray.tune.resultr   ray.tune.searchr   r	   r
   r   ray.tune.search.sampler   r   r   r   r   r   !ray.tune.search.variant_generatorr   ray.tune.utils.utilr   r+   r   r   ImportError	getLoggerrl   r0   r   rO   rK   rJ   <module>r      s     . . . . . . . . . . . . 



             * * * * * *                           > = = = = = . . . . . . LLL)))))))))      EHyyy  
	8	$	$X X X X X( X X X X Xs   A A)(A)