o
    nih*                     @   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 )?Configa  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 `wandb.config` once at the top of your training experiment or
    setting the config as a parameter to init, ie. `wandb.init(config=my_config_dict)`

    You can create a file called `config-defaults.yaml`, and it will automatically be
    loaded into `wandb.config`. See https://docs.wandb.com/guides/track/config#file-based-configs.

    You can also load a config YAML file with your custom name and pass the filename
    into `wandb.init(config="special_config.yaml")`.
    See https://docs.wandb.com/guides/track/config#file-based-configs.

    Examples:
        Basic usage
        ```
        wandb.config.epochs = 4
        wandb.init()
        for x in range(wandb.config.epochs):
            # train
        ```

        Using wandb.init to set config
        ```
        wandb.init(config={"epochs": 4, "batch_size": 32})
        for x in range(wandb.config.epochs):
            # train
        ```

        Nested configs
        ```
        wandb.config['train']['epochs'] = 4
        wandb.init()
        for x in range(wandb.config['train']['epochs']):
            # train
        ```

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

        Argparse flags
        ```python
        wandb.init()
        wandb.config.epochs = 4

        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()
        wandb.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.")
        wandb.config.update(flags.FLAGS)  # adds all of the tensorflow flags to config
        ```
    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   T/home/ubuntu/SoloSpeech/.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
ValueErrorr   _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 )NzFInstances of wandb.Artifact can only be top level keys in wandb.config)ru   r   r   r   )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   2  s   zConfigStatic.__init__c                 C      t dNz3Error: wandb.run.config_static is a readonly objectrW   )r   namevaluer   r   r   r   5     zConfigStatic.__setattr__c                 C   r   r   r   )r   r8   rF   r   r   r   rR   8  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__A  r:   zConfigStatic.__str__N)	r   r   r   r   r   rR   r1   r9   r   r   r   r   r   r   1  s    r   )r   loggingtypingr   r	   
wandb.utilr   r   r    r   rH   r   	getLoggerrO   r
   r   r   r   r   r   <module>   s    
  