
    &VfoW                     T   d Z ddlZddl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dlmZ ddlmZ dd	lmZ dd	lmZ dd	lmZ dd	lmZ d
dddddZdZ eej        ej        g          Z eej        g          Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$ G d dej%                  Z&dS )zThe TensorBoard metrics plugin.    N)wrappers)errors)plugin_util)	http_util)provider)base_plugin)metadataz	image/bmpz	image/gifz
image/jpegz	image/pngzimage/svg+xml)bmpgifjpegpngsvgzapplication/octet-streamc                 n   t          j        t                    }t          j        t                    }|                                 D ]k\  }}|                                D ]Q\  }}|j        }t          |          r6||                             |           ||                             |           Rl||fS )a  Gets maps from tags to descriptions, and descriptions to runs.

    Args:
        mapping: a nested map `d` such that `d[run][tag]` is a time series
          produced by DataProvider's `list_*` methods.

    Returns:
        A tuple containing
            tag_to_descriptions: A map from tag strings to a set of description
                strings.
            description_to_runs: A map from description strings to a set of run
                strings.
    )collectionsdefaultdictsetitemsdescriptionlenadd)mappingtag_to_descriptionsdescription_to_runsruntag_to_contenttag	metadatumr   s           g/var/www/html/software/conda/lib/python3.11/site-packages/tensorboard/plugins/metrics/metrics_plugin.py_get_tag_description_infor   4   s     &1#66%1#66!( : :n . 4 4 6 6 	: 	:S)#/K; :#C(,,[999#K044S999		:  333    c                    g }| D ]i}t          ||                   }t          |          dk    rdnd}d|z   dz   d                    |          z   }|dz   |z   }|                    |           jd}|d                    |          z   S )	a  Creates a single description from a set of descriptions.

    Descriptions may be composites when a single tag has different descriptions
    across multiple runs.

    Args:
        descriptions: A list of description strings.
        description_to_runs: A map from description strings to a set of run
            strings.

    Returns:
        The combined description string.
       runsr   z## For z: z, 
z# Multiple descriptions
)sortedr   joinappend)	descriptionsr   prefixed_descriptionsr   r#   run_or_runs
run_headerdescription_htmlheaders	            r   _build_combined_descriptionr.   N   s     # 7 7)+677 #D		Aff5,t3diiooE
%,{:$$%56666(FDII34444r    c                     t          |           \  }}i }|D ]Z}t          ||                   }t          |          dk    r	|d         }nt          ||          }t	          j        |          ||<   [|S )a  Returns a map of tags to descriptions.

    Args:
        mapping: a nested map `d` such that `d[run][tag]` is a time series
          produced by DataProvider's `list_*` methods.

    Returns:
        A map from tag strings to description HTML strings. E.g.
        {
            "loss": "<h1>Multiple descriptions</h1><h2>For runs: test, train
            </h2><p>...</p>",
            "loss2": "<p>The lossy details</p>",
        }
    r"   r   )r   r%   r   r.   r   markdown_to_safe_html)r   r   r   resultr   r(   r   s          r   _get_tag_to_descriptionr2   h   s     0I0 0,, F" E E1#677|!!&q/KK51 K "7DDsMr    c                        fd D             S )aM  Returns a map of run names to a list of tag names.

    Args:
        mapping: a nested map `d` such that `d[run][tag]` is a time series
          produced by DataProvider's `list_*` methods.

    Returns:
        A map from run strings to a list of tag strings. E.g.
            {"loss001a": ["actor/loss", "critic/loss"], ...}
    c                 <    i | ]}|t          |                   S  )r%   ).0r   r   s     r   
<dictcomp>z%_get_run_tag_info.<locals>.<dictcomp>   s'    999#C%%999r    r5   r   s   `r   _get_run_tag_infor9      s     :9999999r    c                 @    t          |           t          |           dS )a  Prepares a scalar or histogram mapping for client consumption.

    Args:
        mapping: a nested map `d` such that `d[run][tag]` is a time series
          produced by DataProvider's `list_*` methods.

    Returns:
        A dict with the following fields:
            runTagInfo: the return type of `_get_run_tag_info`
            tagDescriptions: the return type of `_get_tag_to_description`
    )
runTagInfotagDescriptions)r9   r2   r8   s    r   _format_basic_mappingr=      s)     (0027;;  r    c                     |dz   }g }| D ]N}t          |j                  |k    r|                    |j        |j        |j        |         j        d           O|S )a  Formats image metadata from a list of BlobSequenceDatum's for clients.

    This expects that frontend clients need to access images based on the
    run+tag+sample.

    Args:
        sorted_datum_list: a list of DataProvider's `BlobSequenceDatum`, sorted by
            step. This can be produced via DataProvider's `read_blob_sequences`.
        sample: zero-indexed integer for the requested sample.

    Returns:
        A list of `ImageStepDatum` (see http_api.md).
       )stepwallTimeimageId)r   valuesr'   r@   	wall_timeblob_key)sorted_datum_listsampleindex	step_datadatums        r   !_format_image_blob_sequence_datumrK      s      QJEI" 

 

u|%%
!O <.7 	
 	
 	
 	
 r    c                     t          j        t                    }|                                 D ]4\  }}|                                D ]\  }}d|j        dz
  i||         |<   5t          |          S )a
  Returns a map of tag names to run information.

    Args:
        mapping: the result of DataProvider's `list_blob_sequences`.

    Returns:
        A nested map from run strings to tag string to image info, where image
        info is an object of form {"maxSamplesPerStep": num}. For example,
        {
            "reshaped": {
                "test": {"maxSamplesPerStep": 1},
                "train": {"maxSamplesPerStep": 1}
            },
            "convolved": {"test": {"maxSamplesPerStep": 50}},
        }
    maxSamplesPerStepr?   )r   r   dictr   
max_length)r   tag_run_image_infor   r   r   r   s         r   _get_tag_run_image_inforQ      s    " %066!(  n . 4 4 6 6 	 	S)#Y%9A%=,s#C((	 "###r    c                 @    t          |           t          |           dS )aV  Prepares an image mapping for client consumption.

    Args:
        mapping: the result of DataProvider's `list_blob_sequences`.

    Returns:
        A dict with the following fields:
            tagRunSampledInfo: the return type of `_get_tag_run_image_info`
            tagDescriptions: the return type of `_get_tag_description_info`
    )r<   tagRunSampledInfo)r2   rQ   r8   s    r   _format_image_mappingrT      s)     37;;4W==  r    c                       e Zd ZdZej        Zd Zd Zd Z	d Z
d Zej        j        d             Zdd	Zd
 Zej        j        d             Zd Zd Zd Zd Zd Zd Zd Zd Zej        j        d             Zd ZdS )MetricsPluginzMetrics Plugin for TensorBoard.c                    |j         | _        |j        pi }|                    t          j        d          |                    t          j        d          |                    t          j        d          d| _        t          j
        dd          | _        t          j
        dd          | _        t          j
        d	d          | _        d
S )zInstantiates MetricsPlugin.

        Args:
            context: A base_plugin.TBContext instance. MetricsLoader checks that
                it contains a valid `data_provider`.
        i  3   
   )scalars
histogramsimageszscalar time seriesr   )	data_kindlatest_known_versionzhistogram time serieszimage time seriesN)data_provider_data_providersampling_hintsgetscalar_metadataPLUGIN_NAMEhistogram_metadataimage_metadata_plugin_downsamplingr   _MetadataVersionChecker_scalar_version_checker_histogram_version_checker_image_version_checker)selfcontextra   s      r   __init__zMetricsPlugin.__init__   s     &3
 !/52%))/*EtLL(,,".  %(()CRHH%
 %
! (3'J*!"(
 (
 (
$ +6*M-!"+
 +
 +
' '2&I)!"'
 '
 '
###r    c                 .    t          j        dd          S )NTzTime Series)is_ng_componenttab_name)r   FrontendMetadatarl   s    r   frontend_metadatazMetricsPlugin.frontend_metadata  s!    + =
 
 
 	
r    c                 ,    | j         | j        | j        dS )N)z/tagsz/timeSeriesz
/imageData)_serve_tags_serve_time_series_serve_image_datars   s    r   get_plugin_appszMetricsPlugin.get_plugin_apps  s#    %20
 
 	
r    c                 H    t           j        t          j        t          j        fS N)rc   rd   re   rf   rs   s    r   data_plugin_nameszMetricsPlugin.data_plugin_names&  s    '*&
 	
r    c                     dS )NFr5   rs   s    r   	is_activezMetricsPlugin.is_active-  s    ur    c                     t          j        |j                  }t          j        |j                  }|                     ||          }t          j        ||d          S )N)
experimentapplication/json)r   rm   environexperiment_id
_tags_implr   Respond)rl   requestctxr   rH   s        r   rv   zMetricsPlugin._serve_tags0  sQ    !'/22 .w??

;; %1CDDDr    Nc                 T   | j                             ||t          j                  }|                     |t          j        | j                  }| j                             ||t          j                  }|i }|                     |t          j        | j	                  }| j         
                    ||t          j                  }|i }|                     |t          j        | j                  }i }t          |          |d<   t          |          |d<   t          |          |d<   |S )a  Returns tag metadata for a given experiment's logged metrics.

        Args:
            ctx: A `tensorboard.context.RequestContext` value.
            experiment: optional string ID of the request's experiment.

        Returns:
            A nested dict 'd' with keys in ("scalars", "histograms", "images")
                and values being the return type of _format_*mapping.
        )r   plugin_nameNrZ   r[   r\   )r`   list_scalarsrc   rd   _filter_by_versionparse_plugin_metadatari   list_tensorsre   rj   list_blob_sequencesrf   rk   r=   rT   )rl   r   r   scalar_mappinghistogram_mappingimage_mappingr1   s          r   r   zMetricsPlugin._tags_impl7  sR    ,99$'3 : 
 

 001(
 
 !/<<$*6 = 
 

 $ " 334+
 
 +??$&2 @ 
 

  M//0'
 
 1.AAy45FGG|0??xr    c                     d |D             }|                                 D ]W\  }}|                                 D ]=\  }} ||j                  }	|                    |	j        ||          s2|||         |<   >X|S )z@Filter `DataProvider.list_*` output by summary metadata version.c                     i | ]}|i S r5   r5   )r6   r   s     r   r7   z4MetricsPlugin._filter_by_version.<locals>.<dictcomp>o  s    ---c#r---r    )r   plugin_contentokversion)
rl   r   parse_metadataversion_checkerr1   r   r   r   r   mds
             r   r   z MetricsPlugin._filter_by_versionm  s    --W---%,]]__ 	- 	-!S.$2$8$8$:$: - - i#^I$<==&))"*c3?? #,sC  	-
 r    c                    t          j        |j                  }t          j        |j                  }|j        dk    r|j                            d          }n|j                            d          }|st          j	        d          	 t          j        |          }n"# t          $ r t          j	        d          w xY w|                     |||          }t          j        ||d          S )NPOSTrequestszMissing 'requests' fieldz"Unable to parse 'requests' as JSONr   )r   rm   r   r   methodformrb   argsr   InvalidArgumentErrorjsonloads
ValueError_time_series_implr   r   )rl   r   r   r   series_requests_stringseries_requestsresponses          r   rw   z MetricsPlugin._serve_time_seriesx  s    !'/22 .w??
>V##%,\%5%5j%A%A""%,\%5%5j%A%A"% 	J-.HIII	"j)?@@OO 	 	 	-4  	
 ))#z?KK (4FGGGs   
B B>c                 ,      fd|D             }|S )a~  Constructs a list of responses from a list of series requests.

        Args:
            ctx: A `tensorboard.context.RequestContext` value.
            experiment: string ID of the request's experiment.
            series_requests: a list of `TimeSeriesRequest` dicts (see http_api.md).

        Returns:
            A list of `TimeSeriesResponse` dicts (see http_api.md).
        c                 >    g | ]}                     |          S r5   )_get_time_series)r6   r   r   r   rl   s     r   
<listcomp>z3MetricsPlugin._time_series_impl.<locals>.<listcomp>  s;     
 
 
 !!#z7;;
 
 
r    r5   )rl   r   r   r   	responsess   ```  r   r   zMetricsPlugin._time_series_impl  s?    
 
 
 
 
 
*
 
 
	 r    c                     |                     d          }|                     d          }|                     d          }|                     d          }||d}t          |t                    r||d<   t          |t                    r||d<   |S )Nr   r   pluginrG   )r   r   )rb   
isinstancestrint)rl   series_requestr   r   r   rG   r   s          r   _create_base_responsez#MetricsPlugin._create_base_response  s      ''  ''##H--##H--$S11c3 	"!HUOfc"" 	(!'HXr    c                    |                     d          }|                     d          }|                     d          }|                     d          }t          |t                    sdS |t          j        k    r"|t
          j        k    r|t          j        k    rdS |t          v rt          |t                    sdS |t          v rt          |t                    sdS d S )	Nr   r   r   rG   zMissing tagzInvalid pluginzMissing runzMissing sample)
rb   r   r   rc   rd   re   rf   _SINGLE_RUN_PLUGINS_SAMPLED_PLUGINSr   )rl   r   r   r   r   rG   s         r   _get_invalid_request_errorz(MetricsPlugin._get_invalid_request_error  s      ''##H--  ''##H--#s## 	! = o111,888.444##(((C1E1E( =%%%j.E.E%##tr    c                 "   |                     d          }|                     d          }|                     d          }|                     d          }|                     |          }|                     |          }	|	r|	|d<   |S |r|gnd}
d}|t          j        k    r|                     ||||
          }|t          j        k    r|                     ||||
          }|t          j        k    r| 	                    |||||
          }||d<   |S )aY  Returns time series data for a given tag, plugin.

        Args:
            ctx: A `tensorboard.context.RequestContext` value.
            experiment: string ID of the request's experiment.
            series_request: a `TimeSeriesRequest` (see http_api.md).

        Returns:
            A `TimeSeriesResponse` dict (see http_api.md).
        r   r   r   rG   errorNrunToSeries)
rb   r   r   rc   rd   _get_run_to_scalar_seriesre   _get_run_to_histogram_seriesrf   _get_run_to_image_series)rl   r   r   r   r   r   r   rG   r   request_errorr#   run_to_seriess               r   r   zMetricsPlugin._get_time_series  s>      ''  ''##H--##H----n==77GG 	 -HWO%uu_000 ::Zd M '333 ==Zd M ^/// 99Zfd M #0r    c           
         | j                             ||t          j        | j        d         t          j        ||g                    }i }|                                D ]!\  }}||vr
d ||         D             }	|	||<   "|S )a  Builds a run-to-scalar-series dict for client consumption.

        Args:
            ctx: A `tensorboard.context.RequestContext` value.
            experiment: a string experiment id.
            tag: string of the requested tag.
            runs: optional list of run names as strings.

        Returns:
            A map from string run names to `ScalarStepDatum` (see http_api.md).
        rZ   r#   tagsr   r   
downsamplerun_tag_filterc                 8    g | ]}|j         |j        |j        d S ))rA   r@   value)rD   r@   r   )r6   rJ   s     r   r   z;MetricsPlugin._get_run_to_scalar_series.<locals>.<listcomp>  s@        	 !&!J"[   r    )r`   read_scalarsrc   rd   rg   r   RunTagFilterr   
rl   r   r   r   r#   r   r   
result_runtag_datarC   s
             r   r   z'MetricsPlugin._get_run_to_scalar_series  s     %22$'30;#0d#GGG 3 
 
 &-mmoo 	/ 	/"Z(""  &c]  F )/M*%%r    c                 P    |j                                         }d |D             }|S )zFormats a histogram datum's bins for client consumption.

        Args:
            datum: a DataProvider's TensorDatum.

        Returns:
            A list of `HistogramBin`s (see http_api.md).
        c                 >    g | ]}|d          |d         |d         dS )r   r"   r?   )minmaxcountr5   )r6   xs     r   r   z>MetricsPlugin._format_histogram_datum_bins.<locals>.<listcomp>  s.    NNNa!QqTAaD99NNNr    )numpytolist)rl   rJ   
numpy_listbinss       r   _format_histogram_datum_binsz*MetricsPlugin._format_histogram_datum_bins  s/     [''))
NN:NNNr    c           
           j                             ||t          j         j        d         t          j        ||g                    }i }|                                D ]#\  }}||vr
 fd||         D             }	|	||<   $|S )a  Builds a run-to-histogram-series dict for client consumption.

        Args:
            ctx: A `tensorboard.context.RequestContext` value.
            experiment: a string experiment id.
            tag: string of the requested tag.
            runs: optional list of run names as strings.

        Returns:
            A map from string run names to `HistogramStepDatum` (see http_api.md).
        r[   r   r   c                 V    g | ]%}|j         |j                            |          d &S ))rA   r@   r   )rD   r@   r   )r6   rJ   rl   s     r   r   z>MetricsPlugin._get_run_to_histogram_series.<locals>.<listcomp>4  sM        	 !&!J ==eDD   r    )r`   read_tensorsre   rd   rg   r   r   r   r   s
   `         r   r   z*MetricsPlugin._get_run_to_histogram_series  s     %22$*60>#0d#GGG 3 
 
 &-mmoo 	/ 	/"Z(""    &c]  F )/M*%%r    c           
         | j                             ||t          j        | j        d         t          j        ||g                    }i }|                                D ])\  }}	||	vr
|	|         }
t          |
|          }|r|||<   *|S )a  Builds a run-to-image-series dict for client consumption.

        Args:
            ctx: A `tensorboard.context.RequestContext` value.
            experiment: a string experiment id.
            tag: string of the requested tag.
            sample: zero-indexed integer for the requested sample.
            runs: optional list of run names as strings.

        Returns:
            A `RunToSeries` dict (see http_api.md).
        r\   )r   r   )	r`   read_blob_sequencesrf   rd   rg   r   r   r   rK   )rl   r   r   r   rG   r#   r   r   r   r   blob_sequence_datum_listseriess               r   r   z&MetricsPlugin._get_run_to_image_series@  s     %99$&20:#0SEBBB : 
 
 &-mmoo 	3 	3"Z(""'/}$6(& F  3,2j)r    c                     t          j        |j                  }|j        d         }|st	          j        d          |                     ||          \  }}t          j        |||          S )zServes an individual image.rB   zMissing 'imageId' field)	r   rm   r   r   r   r   _image_data_implr   r   )rl   r   r   rE   datacontent_types         r   rx   zMetricsPlugin._serve_image_datab  sl     !'/22<	* 	I-.GHHH#44S(CC| $===r    c                     | j                             ||          }t          j        d|          }t                              |t                    }||fS )ao  Gets the image data for a blob key.

        Args:
            ctx: A `tensorboard.context.RequestContext` value.
            blob_key: a string identifier for a DataProvider blob.

        Returns:
            A tuple containing:
              data: a raw bytestring of the requested image's contents.
              content_type: a string HTTP content type.
        )rE   N)r`   	read_blobimghdrwhat_IMGHDR_TO_MIMETYPErb   _DEFAULT_IMAGE_MIMETYPE)rl   r   rE   r   
image_typer   s         r   r   zMetricsPlugin._image_data_implm  sX     ",,S8,DD[t,,
*../
 
 l##r    r{   )__name__
__module____qualname____doc__r	   rd   r   rn   rt   ry   r|   r~   r   Requestapplicationrv   r   r   rw   r   r   r   r   r   r   r   r   rx   r   r5   r    r   rV   rV      s       ))&K
 
 
B
 
 


 
 

 
 
   !E E "!E4 4 4 4l	 	 	 !H H "!H&  "    0' ' 'R" " "H  " " "H     D !> > "!>$ $ $ $ $r    rV   )'r   r   r   r   werkzeugr   tensorboardr   r   tensorboard.backendr   tensorboard.datar   tensorboard.pluginsr   tensorboard.plugins.histogramr	   re   tensorboard.plugins.imagerf   tensorboard.plugins.metricstensorboard.plugins.scalarrc   r   r   	frozensetrd   r   r   r   r.   r2   r9   r=   rK   rQ   rT   TBPluginrV   r5   r    r   <module>r      s   & %                   # # # # # # ) ) ) ) ) ) % % % % % % + + + + + + H H H H H H @ @ @ @ @ @ 0 0 0 0 0 0 B B B B B B    5 i#^%?@   9n89:: 4 4 445 5 54  B: : :  $  @$ $ $4  "J$ J$ J$ J$ J$K( J$ J$ J$ J$ J$r    