o
    e6                     @   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   SD:\Projects\ConvertPro\env\Lib\site-packages\tensorboard/uploader/upload_tracker.pyreadable_time_string   s   r   c                 C   s8   | dkrdt | d  S | dkrdt | d  S d|  S )z0Get a human-readable string for number of bytes.i   z%.1f MBi   z%.1f kBz%d B)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   sL   |    |  jd7  _|  j|7  _|r$|  jd7  _|  j|7  _dS 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      | j S N)r   r   r   r   r   r   t      zUploadStats.num_scalarsc                 C   r-   r.   )r   r   r   r   r   r!   x   r/   zUploadStats.num_tensorsc                 C   r-   r.   )r   r   r   r   r   r"   |   r/   zUploadStats.num_tensors_skippedc                 C   r-   r.   )r   r   r   r   r   r#      r/   zUploadStats.tensor_bytesc                 C   r-   r.   )r   r   r   r   r   r$      r/   z UploadStats.tensor_bytes_skippedc                 C   r-   r.   )r   r   r   r   r   	num_blobs   r/   zUploadStats.num_blobsc                 C   r-   r.   )r   r   r   r   r   num_blobs_skipped   r/   zUploadStats.num_blobs_skippedc                 C   r-   r.   )r   r   r   r   r   r'      r/   zUploadStats.blob_bytesc                 C   r-   r.   )r   r   r   r   r   blob_bytes_skipped   r/   zUploadStats.blob_bytes_skippedc                 C   r-   r.   )r   r   r   r   r   plugin_names   r/   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 }||s!dnd|t|f  | j	| j
 }| j| j }||s<dnd|t|f  |  rM|  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   r9      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r"|d| jt| jf  d|S )z&Get a summary string for skipped data.r5   r6   r7   )r   r8   r
   r   r   r   r;   )r   r<   r   r   r   r:      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$   r0   r1   r'   r2   r3   r4   r=   r9   r>   r:   r   r   r   r   r   r   '   sB    		









.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)NTr   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...)rG   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
)rG   _STYLE_BOLDr   rR   rN   rO   rP   rS   )r   rT   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.)rH   r4   r   r   r   r   r4   -  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)rG   rH   r>   r=   rW   r   rR   rN   rO   rP   _STYLE_DARKGRAYrS   )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.   )rH   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r*| d dS | jdtd dS |   | jr@| d w | jdtd w )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)rU   )rI   rX   rV   rZ   rJ   _STYLE_YELLOWr   r   r   r   send_trackerK  s*   



zUploadTracker.send_trackerc              	   c   s8    |  d|  zdV  W | j| dS | j| w )zCreate a context manager for tracking a scalar batch upload.

        Args:
          num_scalars: Number of scalars in the batch.
        zUploading %d scalarsN)rV   rH   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|||| dS | j|||| w )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
   rV   rH   r%   )r   r!   r"   r#   r$   rT   r   r   r   tensors_trackerl  s4   

zUploadTracker.tensors_trackerc                 c   s,    |  dt|  z
t| j|V  W dS w )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)rV   r
   _BlobTrackerrH   )r   r'   r   r   r   blob_tracker  s   
zUploadTracker.blob_trackerN)F)r?   r@   rA   rB   rE   r   rL   _STYLE_GREENrV   rX   r4   rZ   r[   
contextlibcontextmanagerr]   r^   r_   ra   r   r   r   r   rD     s$    




(rD   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(   )re   r)   r   )r   Zis_uploadedr   r   r   mark_uploaded  s   
z_BlobTracker.mark_uploadedN)r?   r@   rA   r   rf   r   r   r   r   r`     s    r`   )rB   rc   r   rN   r   r   r
   objectr   rR   rW   rb   r\   rY   rQ   rD   r`   r   r   r   r   <module>   s$   
 S %