o
    xi)                     @  sv   d Z ddlmZ ddl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.    )annotationsN)_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@ddZdd Zdd ZeZdd  Zd!d" ZdAd$d%ZdBd&d'Zd(d) Zd*d+ Zd,d- ZdCd/d0ZdAd1d2ZdAd3d4Zd5d6 Z	#	#dAdDd9d:ZdBd;d<Zd?d=d>Zd#S )E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   J/home/ubuntu/.local/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_callbackl      zConfig._set_callbackc                 C  r   )Nr   r   r   r   r   r   _set_artifact_callbacko   r!   zConfig._set_artifact_callbackc                 C  r   )Nr   r   )r   settingsr   r   r   _set_settingsr   r!   zConfig._set_settingsc                 C  s   t t| S N)strr   r   r   r   r   __repr__u      zConfig.__repr__c                 C  s   dd | j D S )Nc                 S  s   g | ]	}| d s|qS _
startswith).0kr   r   r   
<listcomp>y   s    zConfig.keys.<locals>.<listcomp>r   r   r   r   r   keysx   s   zConfig.keysc                 C  s   | j S r%   r0   r   r   r   r   _as_dict{   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%   r0   r   keyr   r   r   __getitem__      
zConfig.__getitem__c                 C  
   t | jS r%   )iterr   r   r   r   r   __iter__   r8   zConfig.__iter__Freturnboolc                 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   r6   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)r6   val)rC   r	   sdklib	telemetrycontextfeatureset_config_item%_raise_value_error_on_nested_artifact	_sanitizer   loggerinfor   )r   r6   rE   telr   r   r   __setitem__   s   


zConfig.__setitem__c                 C  s   dd | j  D S )Nc                 S  s"   g | ]\}}| d s||fqS r)   r+   r-   r.   vr   r   r   r/      s   " z Config.items.<locals>.<listcomp>)r   itemsr   r   r   r   rT      s   zConfig.itemsc              
   C  s<   z|  |W S  ty } zt| jd||d }~ww )Nz object has no attribute )r7   KeyErrorAttributeError	__class__)r   r6   ker   r   r   __getattr__   s   zConfig.__getattr__c                 C  s
   || j v S r%   r0   r5   r   r   r   __contains__   r8   zConfig.__contains__Nc                 C  sV   t |}t }t|D ]}| j||dr|| q| j|||d}| j| |S )N)r@   )ignore_keys)	r   parse_configsetlistrC   add_sanitize_dictr   update)r   dallow_val_changer@   parsed_dictlocked_keysr6   	sanitizedr   r   r   _update   s   

zConfig._updatec                 C  s&   |  ||}| jr| j|d d S d S )Ndata)rg   r   )r   rb   rc   rf   r   r   r   ra      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.rh   N)r   r2   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   r0   rR   r   r   r   
<dictcomp>   s     z&Config.setdefaults.<locals>.<dictcomp>rh   )r   r\   rT   r`   r   ra   r   )r   rb   r   r   r   setdefaults   s   

zConfig.setdefaultsintc                 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.rc   rh   N)rp   rT   rM   r   r   r   )r   rb   ro   _allow_val_changenumr.   rS   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   rh   N)
rp   rT   rM   r   r   
isinstancer   r   merge_dictsr   )r   rb   ro   rr   rs   
callback_dr.   rS   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_filera   )r   	conf_dictr   r   r   r      s   
zConfig._load_defaultsr[   
set | Nonec                 C  sL   i }|  | | D ]\}}|r||v rq| |||\}}|||< q|S r%   )rL   rT   rM   )r   config_dictrc   r[   rf   r.   rS   r   r   r   r`     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	   rF   
data_types
base_typeswb_valueWBValue	TypeErrorr   _jupyterstripr   r   Artifactr   r   r   ConfigError)r   r6   rE   rc   r   r   r   rM     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   rS   rD   r   r   r   rL   ,  s
   z,Config._raise_value_error_on_nested_artifact)F)r<   r=   )NNr%   )r<   rn   )r[   r{   ) __name__
__module____qualname____doc__r   r    r"   r$   r'   r1   r2   r3   r7   r;   rC   rQ   rT   r   rY   rZ   rg   ra   r>   rk   rm   rp   rt   rx   r   r`   rM   rL   r   r   r   r   r
      s@    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   7  s   zConfigStatic.__init__c                 C     t dNz-Error: run.config_static is a readonly objectrV   )r   namevaluer   r   r   r   :     zConfigStatic.__setattr__c                 C  r   r   r   )r   r6   rE   r   r   r   rQ   =  r   zConfigStatic.__setitem__c                 C  s
   | j  S r%   )r   r1   r   r   r   r   r1   @  r8   zConfigStatic.keysc                 C  r4   r%   )r   r5   r   r   r   r7   C  r8   zConfigStatic.__getitem__c                 C  r9   r%   )r&   r   r   r   r   r   __str__F  r8   zConfigStatic.__str__N)	r   r   r   r   r   rQ   r1   r7   r   r   r   r   r   r   6  s    r   )r   
__future__r   loggingr	   
wandb.utilr   r   r    r   rG   r   	getLoggerrN   r
   r   r   r   r   r   <module>   s    
  !