o
    xi6                     @  s&  U d dl mZ d dlZd dlZd dlZd dlmZmZ d dlZd dl	Zd dl
mZ er5d dlZd dlmZ dd id dddad	ed
< daded< dgZejdZejdp]ejdZercejndZd/ddZd0d1ddZd0d2ddZ	d0d3d"d#Zd4d%d&Z		 	d5d6d+d,Zd7d8d-d.ZdS )9    )annotationsN)TYPE_CHECKINGAny)	telemetry)	TBHistorystepr   last_log globalzdict[str, dict[str, Any]]STEPSzfloat | int | NoneRATE_LIMIT_SECONDSgraphsztensorboard.util.tensor_utilz$tensorboard.compat.proto.summary_pb2z%tensorflow.core.framework.summary_pb2tensorr   returnnp.ndarray | Nonec                 C  s.   t rt | }|jdkrd S |S td d S )NobjectzZCan't convert tensor summary, upgrade tensorboard with `pip install tensorboard --upgrade`)tensor_utilmake_ndarraydtypewandbtermwarn)r   res r   U/home/ubuntu/.local/lib/python3.10/site-packages/wandb/integration/tensorboard/log.pyr   '   s   

r   r   tagstr	namespacec                 C  s   |s| S |d |  S )N/r   )r   r   r   r   r   namespaced_tag7   s   r    keyc                 C  s   t tdd| |S )a\  Convert invalid filesystem characters to _ for use in History keys.

    Unfortunately this means currently certain image keys will collide silently. We
    implement this mapping up here in the TensorFlow stuff rather than in the History
    stuff so that we don't have to store a mapping anywhere from the original keys to
    the safe ones.
    z[/\\]_)r    resub)r!   r   r   r   r   history_image_key>   s   r%   tf_summary_str_or_pbdict[str, Any] | Nonec              
     s  i t | dr| j}| jtd < | jd< nEt| tttfr)t	 }|
|  n4t | dr[dd tt| D }t| D ]\}}|| 
| |dkrU|d ||  q=|d }n| }t |drit|jdkrkd	S d4 fdd}|jD ]}|d}|tv rqv|dkr|jt|j < qv|dkr|jjj}|dks|dkrt|jt|j < qv|dkr|jjdd	 }	||	| qv|dkrGt|j}
|
d	u rqv|
j}g }g }|d dkr||
d d  |
D ]}||d  ||d  qn|d dkr|
d d g}|
d d	d }t|dkrFztj||fdt|j < W qv tyE   tjdt|j  dtjj  ddd Y qvw qv|d krt|j}|d	u rWqv|d!d	d	f ! }|d"d	d	f ! }g }tt"t|t|D ]}|| dks|| dkr||| || f qxt#|d#d$ d%}tj$|d&d'gd(}t|j }t%d)|d&d'd*d+| d,i|< qv|d-kr|j&j'}||g| qv|d.krKt|j }t|j(j)d/kr@|j(j)d |j(j)d  |j(j)d  }|j(j)d! |j(j)d!  |j(j)d0  }t*|j(j+|g|j(j)d	d"  |g f}z
tj|d|< W qv ty?   tjd1|d2tjj  ddd Y qvw tjd1|d3dd qvS )5zConvert a Tensorboard Summary to a dictionary.

    Accepts a tensorflow.summary.Summary, one encoded as a string,
    or a list of such encoded as strings.
    summaryglobal_step
_timestamp__iter__c                 S  s   g | ]}t  qS r   )Summary).0r"   r   r   r   
<listcomp>Z       z&tf_summary_to_dict.<locals>.<listcomp>r   valueN	_img_strslist[bytes]_valuer   r   Nonec              
     s   zddl m} W n ty   tjddd Y d S w t| dkr"d S g }| D ]#}|dr;|tjt	
|dd q&|t|t	
| q&|jd	d
}t|d
kro|d
  ro|\}}t| g | d S |t|j < d S )Nr   )Imagez`Install pillow if you are logging images with Tensorboard. To install, run `pip install pillow`.Frepeats   GIFgif)formatr      )PILr5   ImportErrorr   r   len
startswithappendVideoioBytesIOopenr   rsplitisdigit
setdefaultr%   extend)r1   r3   r5   images_img_strtag_idxr   idxr   valuesr   r   encode_imagesg   s.   
z)tf_summary_to_dict.<locals>.encode_imagessimple_valuer   scalarsr   rH      
histogramsr:   )np_histogramzNot logging key "z#". Histograms must have fewer than z binsFr6   	pr_curvesc                 S  s   | d | d  fS )Nr   r:   r   )xr   r   r   <lambda>   r/   z$tf_summary_to_dict.<locals>.<lambda>)r!   recall	precision)datacolumnszwandb/line/v0)rW   ytitlez Precision v. Recallimagehisto   zNot logging key z". Histograms must have fewer than z%. Found a histogram with only 2 bins.)r1   r2   r3   r   r   r4   ),hasattrr(   r   r    	wall_time
isinstancer   bytes	bytearrayr,   ParseFromStringranger=   	enumerate	MergeFromr0   
WhichOneofIGNORE_KINDSrO   r   metadataplugin_dataplugin_namer   r   
string_valshaper?   r   	Histogram
ValueErrorr   
MAX_LENGTHtolistminsortedTable
plot_tabler_   encoded_image_stringr`   bucket_limitlistbucket)r&   r   
summary_pbir(   rN   r0   kindrp   img_strsndarrayrr   countsbinsvpr_curve_datarZ   rY   r[   
data_tablenameimg_strr   firstlastrS   r   rL   r   tf_summary_to_dictI   s   











	










r   r4   c                   C  s   ddidddda dS )z>Internal method for resetting state, called by wandb.finish().r   r   Nr   r
   )r   r   r   r   r   reset_state  s   r   historyTBHistory | Noneintkwargsc           	      K  sL  t |ddi}d}|d |k rd}t| |}|du rdS |dt }t d d du r3|t d d< |r?|t d d kr?d}|t d d krM|t d d< |d	krYt d d |d
< d|it |< |rtdu so|t d d  tkr|du rtjdur~tji  n|i  |t d d< |du rtjdurtjj|dd dS dS |	| dS )aK  Logs a tfsummary to wandb.

    Can accept a tf summary string or parsed event.  Will use wandb.run.history unless a
    history object is passed.  Can optionally namespace events.  Results are committed
    when step increases for this namespace.

    NOTE: This assumes that events being passed in are in chronological order
    r   r   FTNr*   r   r	   r   r)   )commit)
r   getr   timer   r   run_logadd_row_update)	r&   r   r   r   r   	last_stepr   log_dict	timestampr   r   r   r     s>   



r   c                 C  sV   t jd u r
t dt }d|j_W d    n1 sw   Y  t| ||d d S )NzBYou must call `wandb.init()` before calling `wandb.tensorflow.log`T)r   r   )r   r   Errorr   contextfeaturetensorboard_logr   )r&   r   r   telr   r   r   logX  s   


r   )r   r   r   r   )r   )r   r   r   r   r   r   )r!   r   r   r   r   r   )r&   r   r   r   r   r'   )r   r4   )Nr   r   )r&   r   r   r   r   r   r   r   r   r   r   r4   )r   r   )r&   r   r   r   r   r   r   r4   ) 
__future__r   rA   r#   r   typingr   r   r   
wandb.utilwandb.sdk.libr   numpynpwandb.sdk.internal.tb_watcherr   r   __annotations__r   rm   util
get_moduler   pbr,   r   r    r%   r   r   r   r   r   r   r   r   <module>   sF    

 
EE