
    &`i4                     D   d dl Z d dlZd dlZd dl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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mZ 	 d dlZd dl m!Z! d d	l"m#Z# ej$        j%        Z%n# e&$ r dZdZ!dZ#dZ%Y nw xY w ej'        e(          Z) G d
 de          Z*dS )    N)DictListOptionalSequenceTypeUnion)DEFAULT_METRIC)UNDEFINED_METRIC_MODEUNDEFINED_SEARCH_SPACEUNRESOLVED_SEARCH_SPACESearcher)CategoricalDomainFloatInteger
LogUniform	Quantized)parse_spec_vars)flatten_dictunflatten_dict)	Optimizer)ConfiguredOptimizerc                       e Zd ZdZ	 	 	 	 	 	 ddeeeee         ef                  dee	         deee	e
f                  dee         dee         dee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de	fdZdefdZdefdZede	de
fd            Z xZS )NevergradSearcha  Uses Nevergrad to optimize hyperparameters.

    Nevergrad is an open source tool from Facebook for derivative free
    optimization.  More info can be found at:
    https://github.com/facebookresearch/nevergrad.

    You will need to install Nevergrad via the following command:

    .. code-block:: bash

        $ pip install nevergrad

    Parameters:
        optimizer: Optimizer class provided from Nevergrad.
            See here for available optimizers:
            https://facebookresearch.github.io/nevergrad/optimizers_ref.html#optimizers
            This can also be an instance of a `ConfiguredOptimizer`. See the
            section on configured optimizers in the above link.
        optimizer_kwargs: Kwargs passed in when instantiating the `optimizer`
        space: Nevergrad parametrization
            to be passed to optimizer on instantiation, or list of parameter
            names if you passed an optimizer object.
        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.

    Tune automatically converts search spaces to Nevergrad's format:

    .. code-block:: python

        import nevergrad as ng

        config = {
            "width": tune.uniform(0, 20),
            "height": tune.uniform(-100, 100),
            "activation": tune.choice(["relu", "tanh"])
        }

        current_best_params = [{
            "width": 10,
            "height": 0,
            "activation": relu",
        }]

        ng_search = NevergradSearch(
            optimizer=ng.optimizers.OnePlusOne,
            metric="mean_loss",
            mode="min",
            points_to_evaluate=current_best_params)

        run(my_trainable, config=config, search_alg=ng_search)

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

    .. code-block:: python

        import nevergrad as ng

        space = ng.p.Dict(
            width=ng.p.Scalar(lower=0, upper=20),
            height=ng.p.Scalar(lower=-100, upper=100),
            activation=ng.p.Choice(choices=["relu", "tanh"])
        )

        ng_search = NevergradSearch(
            optimizer=ng.optimizers.OnePlusOne,
            space=space,
            metric="mean_loss",
            mode="min")

        run(my_trainable, search_alg=ng_search)

    N	optimizeroptimizer_kwargsspacemetricmodepoints_to_evaluatec                 X   t           
J d            |r|dv s
J d            t          t          |                               ||           d | _        d | _        d | _        |pi | _        |d | _        nIt          |t                    s t          dt          |           d          t          |          | _        t          |t                    ri|rgt          |          \  }}}	|s|	rPt                               t%          j        dt          |                                |                     |          }t          |t*                    rK|$t          |t                    st          d	          | j        rt          d
          || _        || _        nct/          j        |          rt3          |t*                    st          |t4                    r|| _        d | _        || _        nt          d          i | _        | j        s| j        r|                                  d S d S )NzyNevergrad must be installed!
            You can install Nevergrad with the command:
            `pip install nevergrad`.)minmaxz`mode` must be 'min' or 'max'.)r   r   z5Invalid object type passed for `points_to_evaluate`: z6. Please pass a list of points (dictionaries) instead.r   )parclszxIf you pass a configured optimizer to Nevergrad, either pass a list of parameter names or None as the `space` parameter.zmIf you pass in optimizer kwargs, either pass an `Optimizer` subclass or an instance of `ConfiguredOptimizer`.zlThe `optimizer` argument passed to NevergradSearch must be either an `Optimizer` or a `ConfiguredOptimizer`.)ngsuperr   __init___space_opt_factory_nevergrad_opt_optimizer_kwargs_points_to_evaluate
isinstancer   
ValueErrortypelistdictr   loggerwarningr   formatconvert_search_spacer   _parametersinspectisclass
issubclassr   _live_trial_mapping_setup_nevergrad)selfr   r   r   r   r   r    resolved_varsdomain_vars	grid_vars	__class__s             ~/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/ray/tune/search/nevergrad/nevergrad_search.pyr(   zNevergradSearch.__init__{   s    NN( NN  	L>)))+K)))ot$$--V$-GGG "!1!7R%'+D$$.99 	@G*++G G G   (,,>'?'?D$eT"" 	9u 	94CE4J4J1M;	 9i 9+2wDJJOOO   11%88i++ 	 E4)@)@  !  
 %  -    %D"+DOI&&
	+5i+K+K
		#677
	 !*D#DDKKD  
 $&  	$$+ 	$!!#####	$ 	$    c                 2   | j         r | j         | j        fi | j        | _        | j        dk    rd| _        n| j        dk    rd| _        | j        | j        rt          | _        t          | j        d          r| j        j	        j
        r7| j        j	        j        rt          d          | j        t          d          nG| j        t          d          t          | j        j	        j                  d	k    rt          d          | j        1| j        j        t          | j                  k    rt          d
          | j        rNt#          t          | j                  d	z
  dd          D ])}| j                            | j        |                    (d S d S )Nr#   g      r"   g      ?instrumentationz.Instrumented optimizers should use kwargs onlyz>Instrumented optimizers should provide None as parameter_nameszANon-instrumented optimizers should have a list of parameter_names   zTlen(parameters_names) must match optimizer dimension for non-instrumented optimizers)r*   r)   r,   r+   _mode
_metric_op_metricr	   hasattrrE   kwargsargsr/   r7   len	dimensionr-   rangesuggest)r=   is     rB   r<   z NevergradSearch._setup_nevergrad   s    	"3$"3# ##5# #D
 :"DOOZ5  !DO<DJ)DL4&(9:: 	W"29 W&6; W$%UVVV#/$2   0 #+$4   t*:?@@AEE$%UVVV'D,?,ISN
 N
 -
 -
 <  
 # 	I 3t7881<b"EE I I#++D,DQ,GHHHH		I 	II IrC   configreturnc                     | j         s| j        rdS |                     |          }|| _        |r|| _        |r|| _        |                                  dS )NFT)r+   r)   r6   rJ   rH   r<   )r=   r   r   rS   specr   s         rB   set_search_propertiesz%NevergradSearch.set_search_properties   sl      	$+ 	5))&11 	"!DL 	DJtrC   trial_idc           	         | j         s-t          t          j        | j        j        d                    | j        r| j        s8t          t          j        | j        j        | j        | j                            | j         	                                }|| j
        |<   |j        sU| j        r:t          t          t          | j        |j        d                                       S t          |j                  S t          |j                  S )Nr   )r%   r   )r%   r   r   r   )r+   RuntimeErrorr   r5   rA   __name__rJ   rH   r
   askr;   rL   r7   r   r2   ziprM   value)r=   rX   suggested_configs      rB   rQ   zNevergradSearch.suggest  s   " 	&-/w    
 | 	4: 	%,/4:      .2244-= *  & 	; %T-/?/DQ/GHHII   ""2"8999!"2"9:::rC   Fresulterrorc                 j    |r|                      ||           | j                            |           dS )zNotification for the completion of trial.

        The result is internally negated when interacting with Nevergrad
        so that Nevergrad Optimizers can "maximize" this value,
        as it minimizes on default.
        N)_process_resultr;   pop)r=   rX   r`   ra   s       rB   on_trial_completez!NevergradSearch.on_trial_complete$  s?      	3  6222 $$X.....rC   c                 |    | j         |         }| j                            || j        || j                 z             d S )N)r;   r+   tellrI   rJ   )r=   rX   r`   ng_trial_infos       rB   rc   zNevergradSearch._process_result2  s<    0:  &BV0VWWWWWrC   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)r=   ri   save_object
outputFiles       rB   savezNevergradSearch.save6  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)rm   rn   loadrl   update)r=   ri   	inputFilerp   s       rB   restorezNevergradSearch.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rV   c                     t          |           \  }}}|rt          d          t          | d          } t          |           \  }}}dt          dt          fdfd|D             }t          j        j        di |S )	NzUGrid search parameters cannot be automatically converted to a Nevergrad search space.T)prevent_delimiterdomainrT   c                 <   |                                  }t          |t                    r.t                              d           |                                 }t          | t
                    rvt          |t                    r6t          j        	                    | j
        | j        t          j                  S t          j                            | j
        | j                  S t          | t                    rt          |t                    rKt          j        	                    | j
        | j        dz
  t          j                                                  S t          j                            | j
        | j        dz
                                            S t          | t"                    r%t          j                            | j                  S t)          d                    t-          |           j        t-          | j                  j                            )Nz>Nevergrad does not support quantization. Dropped quantization.)lowerupperexponent)r}   r~   rF   )choiceszMNevergrad does not support parameters of type `{}` with samplers of type `{}`)get_samplerr.   r   r3   r4   r   r   r&   pLogr}   r~   matheScalarr   set_integer_castingr   Choice
categoriesr/   r5   r0   r[   sampler)r{   r   s     rB   resolve_valuez;NevergradSearch.convert_search_space.<locals>.resolve_valueN  s   ((**G'9-- 0T   "--//&%(( >gz22 488$l&, $    t{{V\{JJJFG,, >gz22 ,488$l$lQ.!% $   *)++	,
 t{{ , ,* #   &%''(
 FK00 >t{{6+<{===228&LL)4+?+?+H3 3  rC   c                 T    i | ]$\  }}d                      |           |          %S )/)join).0pathr{   r   s      rB   
<dictcomp>z8NevergradSearch.convert_search_space.<locals>.<dictcomp>t  s3    WWW<4$v!6!6WWWrC    )r   r/   r   r   	Parameterr&   r   r   )rV   r>   r?   r@   r   r   s        @rB   r6   z$NevergradSearch.convert_search_space@  s    0?0E0E-{I 	/   DD9990?0E0E-{I#	& #	Y #	 #	 #	 #	L XWWW;WWWty!!5!!!rC   )NNNNNN)NF)r[   
__module____qualname____doc__r   r   r   r   r   r   r   strr   r(   r<   boolrW   rQ   re   rc   rr   rx   staticmethodr6   __classcell__)rA   s   @rB   r   r   (   s$       P Pl +/26 $"37L$ L$)T)_.AAB
L$
 #4.L$ dIo./L$ L$ smL$ %T$Z0L$ L$ L$ L$ L$ L$\-I -I -I^sm+3C=BF	    ; ; ; ; ; ;: KP/ //%-d^/CG/ / / /X XT X X X X1C 1 1 1 1
*s * * * *
 5"4 5"I 5" 5" 5" \5" 5" 5" 5" 5"rC   r   )+r8   loggingr   rn   typingr   r   r   r   r   r   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   	nevergradr&   nevergrad.optimizationr   nevergrad.optimization.baser   r   r   ImportError	getLoggerr[   r3   r   r   rC   rB   <module>r      s       > > > > > > > > > > > > > > > > * * * * * *                           > = = = = = < < < < < < < <
000000??????II   	BIIII	 
	8	$	$N" N" N" N" N"h N" N" N" N" N"s   A/ /A?>A?