o
    ni2                     @  s  U d Z ddlmZ 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
 ddlZddlmZ ddlmZ ddlmZmZ erOdd	lmZ dd
lmZ ddlmZ G dd dZe
ejef Zdaded< d(ddZG dd dZG dd dZ		d)d*d d!Z d+d,d"d#Z!d+d-d&d'Z"dS ).a  Setup wandb session.

This module configures a wandb session which can extend to multiple wandb runs.

Functions:
    setup(): Configure wandb session.

Early logging keeps track of logger output until the call to wandb.init() when the
run_id can be resolved.

    )annotationsN)TYPE_CHECKINGAnyUnion)import_hooks   )wandb_settings)config_utilserver)ServiceConnection)Run)Settingsc                   @  sj   e Zd ZdZdddZdddZdddZdddZdddZdddZ	dddZ
dddZdddZdS ) _EarlyLoggerzKEarly logger which captures logs in memory until logging can be configured.returnNonec                 C  s   g | _ g | _| j| _d S N)_log
_exceptionwarningwarnself r   S/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/wandb/sdk/wandb_setup.py__init__%   s   z_EarlyLogger.__init__msgstrargsr   kwargsc                 O     | j tj|||f d S r   )r   appendloggingDEBUGr   r   r   r   r   r   r   debug+      z_EarlyLogger.debugc                 O  r   r   )r   r    r!   INFOr#   r   r   r   info.   r%   z_EarlyLogger.infoc                 O  r   r   )r   r    r!   WARNINGr#   r   r   r   r   1   r%   z_EarlyLogger.warningc                 O  r   r   )r   r    r!   ERRORr#   r   r   r   error4   r%   z_EarlyLogger.errorc                 O  r   r   )r   r    r!   CRITICALr#   r   r   r   critical7   r%   z_EarlyLogger.criticalc                 O  s   | j |||f d S r   )r   r    r#   r   r   r   	exception:   s   z_EarlyLogger.exceptionlevelc                 O  s   | j ||||f d S r   )r   r    r   r.   r   r   r   r   r   r   log=   s   z_EarlyLogger.logc                 C  st   | t usJ t d usJ | jD ]\}}}}t j||g|R i | q| jD ]\}}}t j|g|R i | q&d S r   )loggerr   r0   r   r-   r/   r   r   r   _flush@   s   z_EarlyLogger._flushNr   r   )r   r   r   r   r   r   r   r   )
r.   r   r   r   r   r   r   r   r   r   )__name__
__module____qualname____doc__r   r$   r'   r   r*   r,   r-   r0   r2   r   r   r   r   r   "   s    







r   Logger | Noner1   
log_objectLoggerr   r   c                 C  s   | a dS )zConfigure module logger.Nr1   )r9   r   r   r   _set_loggerO   s   r<   c                   @  s   e Zd ZdZ		d7d8ddZ		d7d9ddZd:d;ddZd<ddZd=ddZd>ddZ	e
d?ddZd@d d!Zd@d"d#ZdAd%d&Zd<d'd(ZdBd*d+Zd<d,d-Zd<d.d/Zd:dCd2d3Ze
dDd5d6ZdS )E_WandbSetup__WandbSetupzInner class of _WandbSetup.NpidintsettingsSettings | Noneenvirondict | Noner   r   c                 C  sx   d | _ |p	ttj| _d | _d | _d | _|| _g | _	t
 | _t| j | || j| _t| jt |   |   d S r   )_connectiondictosrB   _environ_sweep_config_config_server_pid_global_run_stackr   _early_loggerr<   _settings_setup	_settingswandb	termsetupr1   _check_setup)r   r>   r@   rB   r   r   r   r   X   s   
z _WandbSetup__WandbSetup.__init__early_logger_EarlyLogger | Nonewandb_settings.Settingsc                 C  s   t  }t }|r|dtj  |d|  ||_|jr,|r,|d|j  |	  |j
r>|r>|d|j
  |  |rI|d || j |  |rZ|| |S )NzCurrent SDK version is zConfigure stats pid to zLoading settings from z+Loading settings from environment variables)r   r   rF   getpidr'   rP   __version__x_stats_pidsettings_systemupdate_from_system_config_filesettings_workspace!update_from_workspace_config_fileupdate_from_env_varsrG   update_from_system_environmentupdate_from_settings)r   r@   rT   sr>   r   r   r   rN   u   s&   



z'_WandbSetup__WandbSetup._settings_setupc                 C  s   |sd S | j | d S r   )rO   r`   )r   r@   r   r   r   _update   s   z_WandbSetup__WandbSetup._updatec                 C  s*   d | _ |  }|d ur| j| d S d S r   )rJ   _load_user_settingsrO   update_from_dict)r   user_settingsr   r   r   _update_user_settings   s
   z-_WandbSetup__WandbSetup._update_user_settings
new_loggerr:   c                 C  s    | j sd S t| | j   d S r   )rM   r<   r2   )r   rg   r   r   r   _early_logger_flush   s   z+_WandbSetup__WandbSetup._early_logger_flushr8   c                 C  s   t S r   r;   r   r   r   r   _get_logger   s   z#_WandbSetup__WandbSetup._get_loggerc                 C     | j S r   )rO   r   r   r   r   r@      s   z _WandbSetup__WandbSetup.settings
str | Nonec                 C  sD   | j r	| j jr	d S | jd u r|   | jd usJ | jjd}|S )NentityrO   _offlinerJ   _load_viewer_viewerget)r   rl   r   r   r   _get_entity   s   
z#_WandbSetup__WandbSetup._get_entityc                 C  s@   | j r	| j jr	d S | jd u r|   | jd usJ | jjdS )Nusernamerm   r   r   r   r   _get_username   s   
z%_WandbSetup__WandbSetup._get_username	list[str]c                 C  s^   | j r	| j jr	g S | jd u r|   | jd usJ | jjd}|r+dd |d D }|p.g S )Nteamsc                 S  s   g | ]}|d  d qS )nodenamer   ).0teamr   r   r   
<listcomp>   s    z6_WandbSetup__WandbSetup._get_teams.<locals>.<listcomp>edgesrm   )r   rv   r   r   r   
_get_teams   s   
z"_WandbSetup__WandbSetup._get_teamsc                 C  s2   | j r	| j jr	d S tj| j d}|  || _d S )Nr@   )rO   rn   r
   Serverquery_with_timeoutrJ   )r   ra   r   r   r   ro      s
   
z$_WandbSetup__WandbSetup._load_viewerdict[str, Any] | Nonec                 C  sb   | j d u r	|   | j d u rd S | j j}t }d|v r!|d |d< | j jdd }|r/||d< |S )Ncode_saving_enabled	save_codeemail)rJ   ro   _flagsrE   rp   rq   )r   flagsre   r   r   r   r   rc      s   

z+_WandbSetup__WandbSetup._load_user_settingsc                 C  sX   t tdrt t ur	 nt jdkrtdt j ttddr*td d S d S )Nmain_thread
MainThreadzbad thread2frozenFzfrozen, could be trouble)hasattr	threadingcurrent_threadr   rx   printgetattrsysr   r   r   r   rR      s   
z_WandbSetup__WandbSetup._checkc                 C  s   | j js| j jsddlm} || j | _| j j}|r#tj	|dd| _
| j jrG| j jD ]}t	|}|d u r7q+| jd urC| j| q+|| _q+d S d S )Nr   )service_connectionT)
must_exist)rO   _noopx_disable_servicewandb.sdk.libr   connect_to_servicerD   sweep_param_pathr	   dict_from_config_filerH   config_pathsrI   update)r   r   
sweep_pathconfig_pathconfig_dictr   r   r   rS      s$   

z_WandbSetup__WandbSetup._setup	exit_code
int | Nonec                 C  sB   t   | js	d S | j|pd}d | _|dkrt| d S d S )Nr   )r    unregister_all_post_import_hooksrD   teardownr   exit)r   r   internal_exit_coder   r   r   	_teardown  s   z!_WandbSetup__WandbSetup._teardownServiceConnection | Nonec                 C  rj   ):Returns a connection to the service process, if it exists.)rD   r   r   r   r   service  s   z_WandbSetup__WandbSetup.service)NN)r>   r?   r@   rA   rB   rC   r   r   )r@   rA   rT   rU   r   rV   r   r@   rA   r   r   r3   )rg   r:   r   r   )r   r8   )r   rV   )r   rk   )r   ru   )r   r   r   r   r   r   r   r   )r4   r5   r6   r7   r   rN   rb   rf   rh   ri   propertyr@   rr   rt   r}   ro   rc   rR   rS   r   r   r   r   r   r   r=   U   s0    &




	




	r=   c                   @  sB   e Zd ZU dZdZded< ddd	d
ZedddZdddZ	dS )_WandbSetupzWandb singleton class.

    Note: This is a process local singleton.
    (Forked processes will get a new copy of the object)
    Nz_WandbSetup__WandbSetup | None	_instancer@   rA   r   r   c                 C  s>   t  }tjrtjj|krtjj|d d S t||dt_d S )Nr~   )r@   r>   )rF   rW   r   r   rK   rb   r=   )r   r@   r>   r   r   r   r   (  s
   z_WandbSetup.__init__r   c                 C  s   | j sdS | j jS )r   N)r   r   r   r   r   r   r   /  s   z_WandbSetup.servicerx   r   r   c                 C  s   t | j|S r   )r   r   )r   rx   r   r   r   __getattr__6  s   z_WandbSetup.__getattr__r   r   r   )rx   r   r   r   )
r4   r5   r6   r7   r   __annotations__r   r   r   r   r   r   r   r   r     s   
 r   Fr@   rA   _resetbool_WandbSetup | Nonec                 C  s   |rt   dS t| d}|S )zSet up library context.Nr~   )r   r   )r@   r   wlr   r   r   rS   :  s
   
rS   c                 C  s   t | d}|S )a  Prepares W&B for use in the current process and its children.

    You can usually ignore this as it is implicitly called by `wandb.init()`.

    When using wandb in multiple processes, calling `wandb.setup()`
    in the parent process before starting child processes may improve
    performance and resource utilization.

    Note that `wandb.setup()` modifies `os.environ`, and it is important
    that child processes inherit the modified environment variables.

    See also `wandb.teardown()`.

    Args:
        settings: Configuration settings to apply globally. These can be
            overridden by subsequent `wandb.init()` calls.

    Example:
        ```python
        import multiprocessing

        import wandb


        def run_experiment(params):
            with wandb.init(config=params):
                # Run experiment
                pass


        if __name__ == "__main__":
            # Start backend and set global config
            wandb.setup(settings={"project": "my_project"})

            # Define experiment parameters
            experiment_params = [
                {"learning_rate": 0.01, "epochs": 10},
                {"learning_rate": 0.001, "epochs": 20},
            ]

            # Start multiple processes, each running a separate experiment
            processes = []
            for params in experiment_params:
                p = multiprocessing.Process(target=run_experiment, args=(params,))
                p.start()
                processes.append(p)

            # Wait for all processes to complete
            for p in processes:
                p.join()

            # Optional: Explicitly shut down the backend
            wandb.teardown()
        ```
    r~   )rS   )r@   retr   r   r   setupG  s   
8r   r   r   c                 C  s$   t j}dt _|r|j| d dS dS )a  Waits for wandb to finish and frees resources.

    Completes any runs that were not explicitly finished
    using `run.finish()` and waits for all data to be uploaded.

    It is recommended to call this at the end of a session
    that used `wandb.setup()`. It is invoked automatically
    in an `atexit` hook, but this is not reliable in certain setups
    such as when using Python's `multiprocessing` module.
    N)r   )r   r   r   )r   setup_instancer   r   r   r     s
   r   )r9   r:   r   r   )NF)r@   rA   r   r   r   r   r   )r@   rA   r   r   r   )#r7   
__future__r   r!   rF   r   r   typingr   r   r   rP   r   r    r   libr	   r
    wandb.sdk.lib.service_connectionr   wandb.sdk.wandb_runr   wandb.sdk.wandb_settingsr   r   r:   r1   r   r<   r=   r   rS   r   r   r   r   r   r   <module>   s6   '
 K<