o
    xi6                     @   s   d dl Z d dl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 dlmZ dZdZed	Zed
ZG dd dZG dd deZdddZdddZG dd deZG dd deZdS )    N)gql)util)Api)val_to_json)	filenameszwandb.h5)znumpy.ndarrayztensorflow.Tensorztorch.Tensorh5pynumpyc                   @   s   e Zd ZdZd(ddZdd Zdd	 Zd
d Zdd Zdd Z	d)ddZ
dd Zd*ddZdd Zdd Zdd Zdd Zdd  Zd!d" Zd+d$d%Zd&d' ZdS ),SummarySubDictzNested dict-like object that proxies read and write operations through a root object.

    This lets us do synchronous serialization and lazy loading of large values.
    N c                 C   sZ   t || _|d u r| | _i | _n|| _|j}|D ]}||i }q|| _i | _t | _d S N)tuple_path_root
_json_dictget_dictset_locked_keys)selfrootpath	json_dictkr
   r
   E/home/ubuntu/.local/lib/python3.10/site-packages/wandb/old/summary.py__init__   s   
zSummarySubDict.__init__c                 C   s0   |  }|drt| || d S || |< d S N_)strip
startswithobject__setattr__)r   r   vr
   r
   r   r    ,   s   
zSummarySubDict.__setattr__c                 C   s&   |  }|drt| |S | | S r   )r   r   r   __getattribute__r   r   r
   r
   r   __getattr__3   s   
zSummarySubDict.__getattr__c                 C      t )aP  Load a value at a particular path from the root.

        This should only be implemented by the "_root" child class.

        We pass the child_dict so the item can be set on it or not as
        appropriate. Returning None for a nonexistent path wouldn't be
        distinguishable from that path being set to the value None.
        NotImplementedError)r   r   
child_dictr
   r
   r   	_root_get:   s   	zSummarySubDict._root_getc                 C   r%   )z{Set a value at a particular path in the root.

        This should only be implemented by the "_root" child class.
        r&   )r   r   new_keys_valuesr
   r
   r   	_root_setE      zSummarySubDict._root_setc                 C   r%   )z~Delete a value at a particular path in the root.

        This should only be implemented by the "_root" child class.
        r&   r   r   r
   r
   r   	_root_delL   r,   zSummarySubDict._root_delFc                 C   r%   r   r&   )r   commitr
   r
   r   _writeS   s   zSummarySubDict._writec                 C   s
   | j  S r   )r   keysr   r
   r
   r   r1   W   s   
zSummarySubDict.keysc                 C   sB   t |tr	| }|| jvr| j| j|f | j | j||S r   )
isinstancestrr   r   r   r)   r   r   )r   r   defaultr
   r
   r   r   \   s
   

zSummarySubDict.getc                 c   s"    |   D ]	}|| | fV  qd S r   )r1   r#   r
   r
   r   itemsc   s   zSummarySubDict.itemsc                 C   s*   t |tr	| }| | | j| }|S r   )r3   r4   r   r   r   )r   r   resr
   r
   r   __getitem__i   s
   


zSummarySubDict.__getitem__c                 C   s   t |tr	| }|| jv S r   )r3   r4   r   r   r#   r
   r
   r   __contains__r   s   

zSummarySubDict.__contains__c                 C   s   t |tr	| }| j}t |tr0t| j||f | j|< | j||i fg | j| 	| n|| j|< | j|||fg | j
| | j  |S r   )r3   r4   r   r   dictr	   r   r   r+   updater   addr0   )r   r   r!   r   r
   r
   r   __setitem__x   s   



zSummarySubDict.__setitem__c                 C   s2   |  }| j|= | j| j|f  | j  d S r   )r   r   r   r.   r   r0   r#   r
   r
   r   __delitem__   s   zSummarySubDict.__delitem__c                 C   s^   t | j}| jD ]"}| j| }||vr$t|t r$|dtv r$d||< q| | ||< qt|S )N_typez...)r:   r   r   r3   r   H5_TYPESrepr)r   	repr_dictr   r!   r
   r
   r   __repr__   s   



zSummarySubDict.__repr__Tc                 C   s2   |r|  ||}| j| j| | jjdd dS )zLocked keys will be overwritten unless overwrite=False.

        Otherwise, written keys will be added to the "locked" list.
        T)r/   N)_updater   r+   r   r0   )r   key_vals	overwritewrite_itemsr
   r
   r   r;      s   zSummarySubDict.updatec                    s    sd S dd    D  |rt   }| j   nt  | j } fdd|D }|D ]%\}}t|trRt| j	| j
|f | j|< | j| || q2|| j|< q2|S )Nc                 S   s   i | ]	\}}|  |qS r
   )r   ).0r   r!   r
   r
   r   
<dictcomp>   s    z*SummarySubDict._update.<locals>.<dictcomp>c                    s   g | ]}| | fqS r
   r
   )rH   r   rE   r
   r   
<listcomp>   s    z*SummarySubDict._update.<locals>.<listcomp>)r6   listr   r;   r1   r   r3   r:   r	   r   r   r   rD   )r   rE   rF   rG   
write_keyskeyvaluer
   rJ   r   rD      s   
zSummarySubDict._update)Nr
   Fr   )NT)__name__
__module____qualname____doc__r   r    r$   r)   r+   r.   r0   r1   r   r6   r8   r9   r=   r>   rC   r;   rD   r
   r
   r
   r   r	      s&    


	

r	   c                       sl   e Zd ZdZd fdd	Zdd Zdd Zd	d
 Zdd Zdd Z	dddZ
dd Zdd Zdd Z  ZS )SummaryzStore summary metrics (eg. accuracy) during and after a run.

    You can manipulate this as if it's a Python dictionary but the keys
    get mangled. .strip() is called on them, so spaces at the beginning
    and end are removed.
    Nc                    sF   t    || _tj| jjt| _d | _	i | _
|d ur!|| _
d S d S r   )superr   _runosr   joindirDEEP_SUMMARY_FNAME_h5_path_h5r   )r   runsummary	__class__r
   r   r      s   

zSummary.__init__c                 C      d S r   r
   r-   r
   r
   r   	_json_get      zSummary._json_getc                 C   sL   | j }|d d D ]}|| }q	|d }||v r$| ||| ||< d S d S )N)r   _decode)r   r   r(   r   rN   r
   r
   r   r)      s   
zSummary._root_getc                 C   s   | j }|d d D ]}|| }q	||d  }||d = t|trF|dtv rHts0td d S |   dd	| }| j
|= | j
  d S d S d S )Nre   r?   z)Deleting tensors in summary requires h5pysummary/.)r   r3   r:   r   r@   r   wandb	termerroropen_h5rY   r]   flush)r   r   r   rN   valh5_keyr
   r
   r   r.      s   

zSummary._root_delc                 C   s@   | j }|D ]}|| }q|D ]\}}| |||f ||< qd S r   )r   _encode)r   r   r*   r   rN   new_key	new_valuer
   r
   r   r+      s   
zSummary._root_setc                 C   sh   |    | jstd d S z| jdd| = W n	 ty"   Y nw || jdd| < | j  d S )Nz(Storing tensors in summary requires h5pyrg   rh   )rk   r]   ri   rj   rY   KeyErrorrl   r   r   rm   r
   r
   r   write_h5   s   zSummary.write_h5c                 C   s4   |    | jstd d S | jdd| |S )Nz*Reading tensors from summary requires h5pyrg   rh   )rk   r]   ri   rj   r   rY   rs   r
   r
   r   read_h5  s   zSummary.read_h5c                 C   s*   | j strtj| jddd| _ d S d S d S )Nalatest)libver)r]   r   Filer\   r2   r
   r
   r   rk     s   
zSummary.open_h5c                 C   sN   t |tr%|dtv r| ||S |ddkr td dS t| |S |S )zDecode a `dict` encoded by `Summary._encode()`, loading h5 objects.

        h5 objects may be very large, so we won't have loaded them automatically.
        r?   z
data-framezUThis data frame was saved via the wandb data API. Contact support@wandb.com for help.N)r3   r:   r   r@   ru   ri   rj   r	   )r   r   
json_valuer
   r
   r   rf     s   

zSummary._decodec           	      C   s   t |tri }| D ]\}}| |||f ||< q|S d|}tt| j||dd\}}t	|t
|\}}|rC| || |S )a  Normalize, compress, and encode sub-objects for backend storage.

        value: Object to encode.
        path_from_root: `tuple` of key strings from the top-level summary to the
            current `value`.

        Returns:
            A new tree of dict's with large objects replaced with dictionaries
            with "_type" entries that say which type the original data was.
        rh   r_   )	namespace)r3   r:   r6   ro   rY   r   json_friendlyr   rW   maybe_compress_summaryget_h5_typenamert   )	r   rO   path_from_rootrz   rN   r   friendly_value	converted
compressedr
   r
   r   ro   -  s   


zSummary._encoder   )rQ   rR   rS   rT   r   rc   r)   r.   r+   rt   ru   rk   rf   ro   __classcell__r
   r
   r`   r   rU      s    	
	rU   c                 C   sp   t  }|j|p|dt|p|d| d}|r2d|v r4|d d ur6td |j||d\}}|S d S d S d S )Nprojectentity)r   r^   md5zDownloading summary data...)out_dir)r   download_urlsettingsr[   ri   termlogdownload_write_file)run_idr   r   r   apimetar   r7   r
   r
   r   download_h5O  s   
r   c                 C   s^   t  }td t| d}|jtj| |i|||d W d    d S 1 s(w   Y  d S )NzUploading summary data...rb)r^   r   r   )r   ri   r   openpushrX   r   basename)filer   r   r   r   fr
   r
   r   	upload_h5^  s   
"r   c                       s.   e Zd Z fddZdd ZdddZ  ZS )	FileSummaryc                    s,   t  | tj|jtj| _| 	  d S r   )
rV   r   rX   r   rY   rZ   r   SUMMARY_FNAME_fnameload)r   r^   r`   r
   r   r   h  s   zFileSummary.__init__c              	   C   s`   z t | j}t|| _W d    W d S 1 sw   Y  W d S  ttfy/   i | _Y d S w r   )r   r   jsonr   r   OSError
ValueError)r   r   r
   r
   r   r   m  s   &zFileSummary.loadFc                 C   s|   t | jd!}|t| j |d |  t|	  W d    n1 s*w   Y  | j
r<| j
  d | _
d S d S )Nw
)r   r   writer   json_dumps_saferr   rl   rX   fsyncfilenor]   close)r   r/   r   r
   r
   r   r0   t  s   


zFileSummary._writerP   )rQ   rR   rS   r   r   r0   r   r
   r
   r`   r   r   g  s    r   c                       sD   e Zd Zd fdd	Zdd Zdd Z fdd	ZdddZ  ZS )HTTPSummaryNc                    s*   t  j||d || _|| _t | _d S )N)r_   )rV   r   rW   _clienttime_started)r   r^   clientr_   r`   r
   r   r     s   zHTTPSummary.__init__c                 C   s   || j vr	t|| j |= d S r   )r   rr   )r   rN   r
   r
   r   r>     s   
zHTTPSummary.__delitem__c                 C   rb   r   r
   r2   r
   r
   r   r     rd   zHTTPSummary.loadc                    s8   | j strt| jj| jj| jj| jjd t 	  d S )N)r   r   r   )
r]   r   r   rW   idr   r   rZ   rV   rk   r2   r`   r
   r   rk     s   
zHTTPSummary.open_h5Fc                 C   s   t d}|rS| jr| j  d | _| jj|| jjt| j	dd}|d d d s,J | jj
\}}}tj
| jrOtj
| j| jkrQt| j|||d d S d S d S dS )	Nz
        mutation UpsertBucket( $id: String, $summaryMetrics: JSONString) {
            upsertBucket(input: { id: $id, summaryMetrics: $summaryMetrics}) {
                bucket { id }
            }
        }
        )r   summaryMetrics)variable_valuesupsertBucketbucketr   )r   r   F)r   r]   r   r   executerW   
storage_idr   r   r   r   rX   existsr\   getmtimer   r   )r   r/   mutationr7   r   r   r^   r
   r
   r   r0     s,   	

zHTTPSummary._writer   rP   )	rQ   rR   rS   r   r>   r   rk   r0   r   r
   r
   r`   r   r     s    
r   )NNN)NN)r   rX   r   	wandb_gqlr   ri   r   wandb.apis.internalr   wandb.sdk.data_types.utilsr   wandb.sdk.libr   r[   r@   
get_moduler   npr	   rU   r   r   r   r   r
   r
   r
   r   <module>   s*    

 3 

	