o
    2wi}                     @   s   d dl mZ d dlmZmZ d dlmZ d dlZd dlm	Z	 d dl
ZddlmZ ddlmZ dd	lmZ d
ejej defddZeddG dd dZG dd dZe ZdefddZdefddZdS )    )contextmanager)	dataclassfield)sha1N)Path   )
DoraConfig)Link)jsonabledeltareturnc                 C   s(   t | }tt|d d d S )Nutf8   )sortedr   jsondumpsencode	hexdigest)r   sorted_delta r   D/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/dora/xp.py_get_sig   s    r   F)initc                   @   s  e Zd ZU dZeed< ejed< eje	 ed< e	ed< ej
ejeje	ejf   ed< eddZeed	< 	
	
d%dedejdeje	 dej
ejeje	ejf   dej
e	 f
ddZedefddZedefddZedefddZedefddZedefddZedefddZedefddZedefddZedej
e fddZedej
e fd d!Zed&d"efd#d$Zd
S )'XPz
    Represent a single experiment, i.e. a specific set of parameters
    that is linked to a unique signature.

    One XP can have multiple runs.
    doracfgargvsigr   F)comparelinkNc                    sp    | _ || _|| _|d urt fdd|D }|| _|d u r)|d us%J t|}|| _t| j| j j	 | _
d S )Nc                    s"   g | ]\}}  |s||fqS r   )is_excluded).0kvr   r   r   
<listcomp>/   s   " zXP.__init__.<locals>.<listcomp>)r   r   r   r
   r   r   r   r	   folderhistoryr   )selfr   r   r   r   r   r   r$   r   __init__(   s   zXP.__init__r   c                 C   s$   | j d usJ | jj| jj | j  S N)r   r   dirxpsr(   r   r   r   r&   7   s   z	XP.folderc                 C   s   | j jr	| jd S tdS )Ncode.)r   git_saver&   r   r-   r   r   r   code_folder<   s   
zXP.code_folderc                 C      | j | jjj S r*   )r&   r   shepsubmitit_folderr-   r   r   r   _xp_submititC      zXP._xp_submititc                 C   r2   r*   )r&   r   r3   latest_submititr-   r   r   r   _latest_submititG   r6   zXP._latest_submititc                 C   s   | j  r| j S | jS r*   )r8   existsr5   r-   r   r   r   submititK   s   
zXP.submititc                 C      | j | jj S r*   )r&   r   rendezvous_filer-   r   r   r   r<   R      zXP.rendezvous_filec                 C   r;   r*   )r&   r   r'   r-   r   r   r   r'   V   r=   z
XP.historyc                 C   s
   | j d S Nz
.argv.json)r&   r-   r   r   r   _argv_cacheZ      
zXP._argv_cachec                 C   s&   | j jd ur| j j| j j | j S d S r*   )r   sharedr,   r   r-   r   r   r   _shared_folder^   s   zXP._shared_folderc                 C   s   | j d ur
| j d S d S r>   )rB   r-   r   r   r   _shared_argv_cached   s   

zXP._shared_argv_cachestackc                 c   s:    t | | dV  W d   dS 1 sw   Y  dS )a!  Context manager, fake being in the XP for its duration.

        Set `stack=True` if you want to allow this to happen from within
        another experiment.

        ..Warning:: For hydra experiment, this will not convert any path
            automatically, or setup loggers etc.
        N)_contextenter_xp)r(   rD   r   r   r   enterj   s   
"zXP.enter)NNF)__name__
__module____qualname____doc__r   __annotations__tpAnyListstrOptionalTupler   r   r	   r)   propertyr   r&   r1   r5   r8   r:   r<   r'   r?   rB   rC   r   boolrG   r   r   r   r   r      sJ   
 
 
r   c                   @   s.   e Zd Zd
ddZeddedefdd	ZdS )_Contextr   Nc                 C   s
   g | _ d S r*   )_xpsr-   r   r   r   r)   {   s   
z_Context.__init__FxprD   c              	   c   sH    | j r
|s
td| j | zd V  W | j d d S | j d w )NzAlready in a xp.)rW   RuntimeErrorappendpop)r(   rX   rD   r   r   r   rF   ~   s   
z_Context.enter_xp)r   NrH   )rI   rJ   rK   r)   r   r   rU   rF   r   r   r   r   rV   x   s    
rV   c                   C   s   t jstdt jd S )z_When running from within an XP, returns the XP object.
    Otherwise, raises RuntimeError.
    zNot in a xp!rY   )rE   rW   rZ   r   r   r   r   get_xp   s   
r]   c                   C   s
   t tjS )z$Return True if running within an XP.)rU   rE   rW   r   r   r   r   is_xp   r@   r^   )
contextlibr   dataclassesr   r   hashlibr   r   pathlibr   typingrN   confr   r   r	   utilsr
   rP   rO   rQ   r   r   rV   rE   r]   rU   r^   r   r   r   r   <module>   s    ^
