a
    d=ic6                     @   s   d Z ddlZddlmZ ddlZddlZdd Zdd ZG dd	 d	eZd
Z	dZ
dZdZdZdZG dd deZG dd deZdS )zProgress tracker for uploader.    N)datetimec                   C   s   t  dS )z1Get a human-readable time string for the present.z%Y-%m-%dT%H:%M:%S)r   nowstrftime r   r   t/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/tensorboard/uploader/upload_tracker.pyreadable_time_string   s    r   c                 C   s<   | dkrdt | d  S | dkr0dt | d  S d|  S dS )z0Get a human-readable string for number of bytes.i   z%.1f MBi   z%.1f kBz%d BN)float)bytesr   r   r   readable_bytes_string   s
    r
   c                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Ze	dd Z
e	dd Ze	dd Ze	dd Ze	dd Ze	dd Ze	dd Ze	dd Ze	dd Ze	dd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,S )-UploadStatszStatistics of uploading.c                 C   sR   t   | _d| _d| _d| _d| _d| _d| _d| _d| _	d| _
d| _t | _d S Nr   )time_last_summarized_timestamp_last_data_added_timestamp_num_scalars_num_tensors_num_tensors_skipped_tensor_bytes_tensor_bytes_skipped
_num_blobs_num_blobs_skipped_blob_bytes_blob_bytes_skippedset_plugin_namesselfr   r   r   __init__*   s    
zUploadStats.__init__c                 C   s   |    |  j|7  _dS )zpAdd a batch of scalars.

        Args:
          num_scalars: Number of scalars uploaded in this batch.
        N)"_refresh_last_data_added_timestampr   r   num_scalarsr   r   r   add_scalars8   s    zUploadStats.add_scalarsc                 C   sT   ||ksJ ||ksJ |    |  j|7  _|  j|7  _|  j|7  _|| _dS )aI  Add a batch of tensors.

        Args:
          num_tensors: Number of tensors encountered in this batch, including
            the ones skipped due to reasons such as large exceeding limit.
          num_tensors: Number of tensors skipped. This describes a subset of
            `num_tensors` and hence must be `<= num_tensors`.
          tensor_bytes: Total byte size of tensors encountered in this batch,
            including the skipped ones.
          tensor_bytes_skipped: Total byte size of the tensors skipped due to
            reasons such as size exceeding limit.
        N)r   r   r   r   r   )r   num_tensorsnum_tensors_skippedtensor_bytestensor_bytes_skippedr   r   r   add_tensorsA   s    zUploadStats.add_tensorsc                 C   sH   |    |  jd7  _|  j|7  _|rD|  jd7  _|  j|7  _dS )zAdd a blob.

        Args:
          blob_bytes: Byte size of the blob.
          is_skipped: Whether the uploading of the blob is skipped due to
            reasons such as size exceeding limit.
           N)r   r   r   r   r   )r   
blob_bytes
is_skippedr   r   r   add_blob\   s    zUploadStats.add_blobc                 C   s   |    | j| dS )zPAdd a plugin.

        Args:
          plugin_name: Name of the plugin.
        N)r   r   addr   Zplugin_namer   r   r   
add_plugink   s    zUploadStats.add_pluginc                 C   s   | j S N)r   r   r   r   r   r    t   s    zUploadStats.num_scalarsc                 C   s   | j S r.   )r   r   r   r   r   r"   x   s    zUploadStats.num_tensorsc                 C   s   | j S r.   )r   r   r   r   r   r#   |   s    zUploadStats.num_tensors_skippedc                 C   s   | j S r.   )r   r   r   r   r   r$      s    zUploadStats.tensor_bytesc                 C   s   | j S r.   )r   r   r   r   r   r%      s    z UploadStats.tensor_bytes_skippedc                 C   s   | j S r.   )r   r   r   r   r   	num_blobs   s    zUploadStats.num_blobsc                 C   s   | j S r.   )r   r   r   r   r   num_blobs_skipped   s    zUploadStats.num_blobs_skippedc                 C   s   | j S r.   )r   r   r   r   r   r(      s    zUploadStats.blob_bytesc                 C   s   | j S r.   )r   r   r   r   r   blob_bytes_skipped   s    zUploadStats.blob_bytes_skippedc                 C   s   | j S r.   )r   r   r   r   r   plugin_names   s    zUploadStats.plugin_namesc                 C   s   | j dkp| jdkp| jdkS )zHas any data been tracked by this instance.

        This counts the tensor and blob data that have been scanned
        but skipped.

        Returns:
          Whether this stats tracking object has tracked any data.
        r   )r   r   r   r   r   r   r   has_data   s
    

zUploadStats.has_datac                 C   s   t   | _g }|d| j  | j| j }| j| j }||sBdnd|t|f  | j	| j
 }| j| j }||sxdnd|t|f  |  r|  nd}d||fS )a  Get a summary string for actually-uploaded and skipped data.

        Calling this property also marks the "last_summarized" timestamp, so that
        the has_new_data_since_last_summarize() will be able to report the correct value
        later.

        Returns:
          A tuple with two items:
          - A string summarizing all data uploaded so far.
          - If any data was skipped, a string for all skipped data. Else, `None`.
        z
%d scalarsz	0 tensors%d tensors (%s)z0 binary objects%d binary objects (%s)N, )r   r   appendr   r   r   r   r   r
   r   r   r   r   _skipped_any_skipped_summaryjoin)r   string_piecesZuploaded_tensor_countZuploaded_tensor_bytesZuploaded_blob_countZuploaded_blob_bytesZskipped_stringr   r   r   	summarize   s8    
zUploadStats.summarizec                 C   s   | j p
| jS )zWhether any data was skipped.)r   r   r   r   r   r   r8      s    zUploadStats._skipped_anyc                 C   s   | j | jkS r.   )r   r   r   r   r   r   !has_new_data_since_last_summarize   s    z-UploadStats.has_new_data_since_last_summarizec                 C   sN   g }| j r$|d| j t| jf  | jrD|d| jt| jf  d|S )z&Get a summary string for skipped data.r4   r5   r6   )r   r7   r
   r   r   r   r:   )r   r;   r   r   r   r9      s$    zUploadStats._skipped_summaryc                 C   s   t   | _d S r.   )r   r   r   r   r   r   r      s    z.UploadStats._refresh_last_data_added_timestampN)__name__
__module____qualname____doc__r   r!   r&   r*   r-   propertyr    r"   r#   r$   r%   r/   r0   r(   r1   r2   r3   r<   r8   r=   r9   r   r   r   r   r   r   '   s@   		









.r   z[0mz[1mz[32mz[33mz[90mz[2Kc                   @   s   e Zd ZdZdZdddZdd Zefdd	Zd
d Z	dd Z
dd Zdd Zejdd Zejdd Zejdd Zejdd ZdS )UploadTrackerz)Tracker for uploader progress and status.)r   r'   Fc                 C   s:   || j vrtd|| j f || _t | _d| _|| _d S )Nz5Unsupported verbosity value %s (supported values: %s)r   )_SUPPORTED_VERBISITY_VALUES
ValueError
_verbosityr   _stats_send_count	_one_shot)r   	verbosityZone_shotr   r   r   r     s    
zUploadTracker.__init__c                 c   s   dV  q d S r   r   r   r   r   r   _dummy_generator  s    zUploadTracker._dummy_generatorc                 C   s<   | j s
dS |d7 }tjt| | t d  tj  dS )z3Overwrite the current line with a stylized message.Nz...)rF   sysstdoutwrite_STYLE_ERASE_LINE_STYLE_RESETflush)r   message
color_coder   r   r   _overwrite_line_message  s    z%UploadTracker._overwrite_line_messagec                 C   s6   | j s
dS dtt t|f }tj| tj  dS )z9Write a timestamped single line, with newline, to stdout.Nz%s[%s]%s %s
)rF   _STYLE_BOLDr   rQ   rM   rN   rO   rR   )r   rS   Zstart_messager   r   r   _single_line_message   s    z"UploadTracker._single_line_messagec                 C   s
   | j  S )zBDetermine if any data has been uploaded under the tracker's watch.)rG   r3   r   r   r   r   r3   -  s    zUploadTracker.has_datac                 C   sl   | j s
dS | j sdS | j \}}dtt t|f }tj	| |r^tj	dt
|tf  tj  dS )z>Write an update summarizing the data uploaded since the start.Nz%s[%s]%s Total uploaded: %s
z%sTotal skipped: %s
%s)rF   rG   r=   r<   rV   r   rQ   rM   rN   rO   _STYLE_DARKGRAYrR   )r   Zuploaded_strZskipped_strZuploaded_messager   r   r   _update_cumulative_status1  s&    
z'UploadTracker._update_cumulative_statusc                 C   s   | j | d S r.   )rG   r-   r,   r   r   r   add_plugin_nameH  s    zUploadTracker.add_plugin_namec              
   c   s   |  j d7  _ | j dkr"| d z<| d dV  W |   | jrP| d q| jdtd n*|   | jrz| d n| jdtd 0 dS )z5Create a context manager for a round of data sending.r'   zStarted scanning logdir.zData upload startingNzDone scanning logdir.z Listening for new data in logdir)rT   )rH   rW   rU   rY   rI   _STYLE_YELLOWr   r   r   r   send_trackerK  s(    


zUploadTracker.send_trackerc              	   c   s8   |  d|  zdV  W | j| n| j| 0 dS )zCreate a context manager for tracking a scalar batch upload.

        Args:
          num_scalars: Number of scalars in the batch.
        zUploading %d scalarsN)rU   rG   r!   r   r   r   r   scalars_tracker_  s    zUploadTracker.scalars_trackerc                 c   sv   |r&d|| t || |t |f }nd|t |f }| | zdV  W | j|||| n| j|||| 0 dS )a  Create a context manager for tracking a tensor batch upload.

        Args:
          num_tensors: Total number of tensors in the batch.
          num_tensors_skipped: Number of tensors skipped (a subset of
            `num_tensors`). Hence this must be `<= num_tensors`.
          tensor_bytes: Total byte size of the tensors in the batch.
          tensor_bytes_skipped: Byte size of skipped tensors in the batch (a
            subset of `tensor_bytes`). Must be `<= tensor_bytes`.
        z3Uploading %d tensors (%s) (Skipping %d tensors, %s)zUploading %d tensors (%s)N)r
   rU   rG   r&   )r   r"   r#   r$   r%   rS   r   r   r   tensors_trackerl  s2    

zUploadTracker.tensors_trackerc                 c   s,   |  dt|  zt| j|V  W n0 dS )zCreates context manager tracker for uploading a blob.

        Args:
          blob_bytes: Total byte size of the blob being uploaded.
        zUploading binary object (%s)N)rU   r
   _BlobTrackerrG   )r   r(   r   r   r   blob_tracker  s    
zUploadTracker.blob_trackerN)F)r>   r?   r@   rA   rD   r   rK   _STYLE_GREENrU   rW   r3   rY   rZ   
contextlibcontextmanagerr\   r]   r^   r`   r   r   r   r   rC     s"   




(rC   c                   @   s   e Zd Zdd Zdd ZdS )r_   c                 C   s   || _ || _d S r.   )_upload_statsr   )r   Zupload_statsr(   r   r   r   r     s    z_BlobTracker.__init__c                 C   s   | j j| j| d d S )N)r)   )rd   r*   r   )r   Zis_uploadedr   r   r   mark_uploaded  s    z_BlobTracker.mark_uploadedN)r>   r?   r@   r   re   r   r   r   r   r_     s   r_   )rA   rb   r   rM   r   r   r
   objectr   rQ   rV   ra   r[   rX   rP   rC   r_   r   r   r   r   <module>   s"   
 S %