o
    -wi)                     @   sv   d Z ddlZddlmZ ddlZddlmZmZmZ ddl	m
Z
 ddlmZ edZG d	d
 d
ZG dd dZdS )zconfig.    N)Optional)_is_artifact_representation#check_dict_contains_nested_artifactjson_friendly_val   )wandb_helper)config_utilwandbc                   @   s  e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zd<defddZdd Zdd ZeZdd Zd d! Zd=d#d$Zd>d%d&Zd'd( Zd)d* Zd+d, Zdefd-d.Zd=d/d0Zd=d1d2Zd3d4 Z	"	"d=d5ee  fd6d7Z!d>d8d9Z"d<d:d;Z#d"S )?Configa8  Config object.

    Config objects are intended to hold all of the hyperparameters associated
    with a wandb run and are saved with the run object when `wandb.init` is
    called.

    We recommend setting the config once when initializing your run by passing
    the `config` parameter to `init`:

    ```
    wandb.init(config=my_config_dict)
    ```

    You can create a file called `config-defaults.yaml`, and it will
    automatically be loaded as each run's config. You can also pass the name
    of the file as the `config` parameter to `init`:

    ```
    wandb.init(config="my_config.yaml")
    ```

    See https://docs.wandb.com/guides/track/config#file-based-configs.

    Examples:
        Basic usage
        ```
        with wandb.init(config={"epochs": 4}) as run:
            for x in range(run.config.epochs):
                # train
        ```

        Nested values
        ```
        with wandb.init(config={"train": {"epochs": 4}}) as run:
            for x in range(run.config["train"]["epochs"]):
                # train
        ```

        Using absl flags
        ```
        flags.DEFINE_string("model", None, "model to run")  # name, default, help
        with wandb.init() as run:
            run.config.update(flags.FLAGS)  # adds all absl flags to config
        ```

        Argparse flags
        ```python
        with wandb.init(config={"epochs": 4}) as run:
            parser = argparse.ArgumentParser()
            parser.add_argument(
                "-b",
                "--batch-size",
                type=int,
                default=8,
                metavar="N",
                help="input batch size for training (default: 8)",
            )
            args = parser.parse_args()
            run.config.update(args)
        ```

        Using TensorFlow flags (deprecated in tensorflow v2)
        ```python
        flags = tf.app.flags
        flags.DEFINE_string("data_dir", "/tmp/data")
        flags.DEFINE_integer("batch_size", 128, "Batch size.")

        with wandb.init() as run:
            run.config.update(flags.FLAGS)
        ```
    c                 C   s   t | dt  t | dt  t | dt  t | dt  t | dd t | dd  t | dd  t | d	d  |   d S )
N_items_locked_users
_users_inv
_users_cntr   	_callback	_settings_artifact_callback)object__setattr__dict_load_defaultsself r   S/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/wandb/sdk/wandb_config.py__init___   s   zConfig.__init__c                 C      t | d| d S )Nr   r   r   r   cbr   r   r   _set_callbackk      zConfig._set_callbackc                 C   r   )Nr   r   r   r   r   r   _set_artifact_callbackn   r!   zConfig._set_artifact_callbackc                 C   r   )Nr   r   )r   settingsr   r   r   _set_settingsq   r!   zConfig._set_settingsc                 C   s   t t| S N)strr   r   r   r   r   __repr__t      zConfig.__repr__c                 C      dd | j  D S )Nc                 S   s   g | ]	}| d s|qS _
startswith).0kr   r   r   
<listcomp>x   s    zConfig.keys.<locals>.<listcomp>)r   keysr   r   r   r   r1   w      zConfig.keysc                 C   s   | j S r%   r   r   r   r   r   _as_dictz   s   zConfig._as_dictc                 C   s   t | S r%   )r   r   r   r   r   as_dict}   s   zConfig.as_dictc                 C   
   | j | S r%   r3   r   keyr   r   r   __getitem__      
zConfig.__getitem__c                 C   
   t | jS r%   )iterr   r   r   r   r   __iter__   r:   zConfig.__iter__Freturnc                 C   sB   | j |}|d ur| j| }|std| d| d dS dS )NzConfig item 'z' was locked by 'z' (ignored update).TF)r   getr   r	   termwarn)r   r8   ignore_lockedlockedlocked_userr   r   r   _check_locked   s   
zConfig._check_lockedc                 C   s   |  |rd S tjjj }d|j_W d    n1 sw   Y  | j|dd | 	||\}}|| j
|< td||| j | jrK| j||d d S d S )NT)nestedzconfig set %s = %s - %s)r8   val)rD   r	   sdklib	telemetrycontextfeatureset_config_item%_raise_value_error_on_nested_artifact	_sanitizer   loggerinfor   )r   r8   rF   telr   r   r   __setitem__   s   


zConfig.__setitem__c                 C   r)   )Nc                 S   s"   g | ]\}}| d s||fqS r*   r,   r.   r/   vr   r   r   r0      s   " z Config.items.<locals>.<listcomp>)r   itemsr   r   r   r   rU      r2   zConfig.itemsc              
   C   s<   z|  |W S  ty } zt| jd||d }~ww )Nz object has no attribute )r9   KeyErrorAttributeError	__class__)r   r8   ker   r   r   __getattr__   s   zConfig.__getattr__c                 C   s
   || j v S r%   r3   r7   r   r   r   __contains__   r:   zConfig.__contains__Nc                 C   sV   t |}t }t|D ]}| j||dr|| q| j|||d}| j| |S )N)rA   )ignore_keys)	r   parse_configsetlistrD   add_sanitize_dictr   update)r   dallow_val_changerA   parsed_dictlocked_keysr8   	sanitizedr   r   r   _update   s   

zConfig._updatec                 C   s&   |  ||}| jr| j|d d S d S )Ndata)rh   r   )r   rc   rd   rg   r   r   r   rb      s   zConfig.updatec                 G   s   | j j| S r%   )r   r?   )r   argsr   r   r   r?      r(   z
Config.getc                 C   s   | j r| j |  d dS dS )zCall the callback if it's set.ri   N)r   r4   r   r   r   r   persist   s   zConfig.persistc                    sP   t |} fdd| D } |} j|  jr& j|d d S d S )Nc                    s    i | ]\}}| j vr||qS r   r3   rS   r   r   r   
<dictcomp>   s     z&Config.setdefaults.<locals>.<dictcomp>ri   )r   r]   rU   ra   r   rb   r   )r   rc   r   r   r   setdefaults   s   

zConfig.setdefaultsc                 C   s@   || j vr| j| j |< || j| j< t| d| jd  | j | S )Nr   r   )r   r   r   r   r   )r   userr   r   r   _get_user_id   s
   

zConfig._get_user_idc                 C   s^   |  |}| D ]\}}| j|||d\}}|| j|< || j|< q	| jr-| j|d dS dS )zCShallow-update config with `d` and lock config updates on d's keys.rd   ri   N)rp   rU   rN   r   r   r   )r   rc   ro   _allow_val_changenumr/   rT   r   r   r   update_locked   s   

zConfig.update_lockedc                 C   s   |  |}i }| D ]>\}}| j|||d\}}|| j|< || jv r=t| j| tr=t|tr=t| j| || j|< n|| j|< | j| ||< q| j	rU| j	|d dS dS )zMRecursively merge-update config with `d` and lock config updates on d's keys.rq   ri   N)
rp   rU   rN   r   r   
isinstancer   r   merge_dictsr   )r   rc   ro   rr   rs   
callback_dr/   rT   r   r   r   merge_locked   s    



zConfig.merge_lockedc                 C   s$   t d}|d ur| | d S d S )Nzconfig-defaults.yaml)r   dict_from_config_filerb   )r   	conf_dictr   r   r   r      s   
zConfig._load_defaultsr\   c                 C   sL   i }|  | | D ]\}}|r||v rq| |||\}}|||< q|S r%   )rM   rU   rN   )r   config_dictrd   r\   rg   r/   rT   r   r   r   ra      s   

zConfig._sanitize_dictc              	   C   s   t |tjjjjjrtd| jr| jj	r|d u rd}|
d}t|r*| ||}t |tjs4t|}|sT|| jv rT|| j| krTtd| d| j|  d| d||fS )Nz1WBValue objects cannot be added to the run configT-z"Attempted to change value of key "z" from z to zM
If you really want to do this, pass allow_val_change=True to config.update())ru   r	   rG   
data_types
base_typeswb_valueWBValue	TypeErrorr   _jupyterstripr   r   Artifactr   r   r   ConfigError)r   r8   rF   rd   r   r   r   rN     s&   
zConfig._sanitizec                 C   s$   t |trt||rtdd S d S )NzHInstances of wandb.Artifact can only be top level keys in a run's config)ru   r   r   
ValueError)r   rT   rE   r   r   r   rM   (  s
   z,Config._raise_value_error_on_nested_artifact)F)NNr%   )$__name__
__module____qualname____doc__r   r    r"   r$   r'   r1   r4   r5   r9   r=   boolrD   rR   rU   r   rZ   r[   rh   rb   r?   rl   rn   intrp   rt   rx   r   r   r^   ra   rN   rM   r   r   r   r   r
      sD    H

	



r
   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )ConfigStaticc                 C   s   t | dt| d S )N__dict__)r   r   r   )r   configr   r   r   r   3  s   zConfigStatic.__init__c                 C      t dNz-Error: run.config_static is a readonly objectrW   )r   namevaluer   r   r   r   6     zConfigStatic.__setattr__c                 C   r   r   r   )r   r8   rF   r   r   r   rR   9  r   zConfigStatic.__setitem__c                 C   s
   | j  S r%   )r   r1   r   r   r   r   r1   <  r:   zConfigStatic.keysc                 C   r6   r%   )r   r7   r   r   r   r9   ?  r:   zConfigStatic.__getitem__c                 C   r;   r%   )r&   r   r   r   r   r   __str__B  r:   zConfigStatic.__str__N)	r   r   r   r   r   rR   r1   r9   r   r   r   r   r   r   2  s    r   )r   loggingtypingr   r	   
wandb.utilr   r   r    r   rH   r   	getLoggerrO   r
   r   r   r   r   r   <module>   s    
  