U
    Vc                     @   s   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
ZG dd deZG dd dejZdS )zwThe TensorBoard Scalars plugin.

See `http_api.md` in this directory for specifications of the routes for
this plugin.
    N)wrappers)errors)plugin_util)	http_util)provider)base_plugin)metadatai  c                   @   s   e Zd ZdZdZdZdS )OutputFormatz<An enum used to list the valid output formats for API calls.jsoncsvN)__name__
__module____qualname____doc__ZJSONCSV r   r   M/tmp/pip-unpacked-wheel-g8kmtpbc/tensorboard/plugins/scalar/scalars_plugin.pyr	   &   s   r	   c                   @   s   e Zd ZdZejZdd Zdd Zdd Z	dd	 Z
dddZdd Zdd Zejjdd Zejjdd Zejjdd Zd
S )ScalarsPluginzScalars Plugin for TensorBoard.c                 C   s2   |j pi | jt| _|j| _tjddd| _	dS )z}Instantiates ScalarsPlugin via TensorBoard core.

        Args:
          context: A base_plugin.TBContext instance.
        Zscalarr   )Z	data_kindZlatest_known_versionN)
Zsampling_hintsgetplugin_name_DEFAULT_DOWNSAMPLING_downsample_toZdata_provider_data_providerr   Z_MetadataVersionChecker_version_checker)selfcontextr   r   r   __init__2   s    
 zScalarsPlugin.__init__c                 C   s   | j | j| jdS )N)z/scalarsz/scalars_multirunz/tags)scalars_routescalars_multirun_route
tags_router   r   r   r   get_plugin_appsA   s    zScalarsPlugin.get_plugin_appsc                 C   s   dS )NFr   r    r   r   r   	is_activeH   s    zScalarsPlugin.is_activec                 C   s   t jddS )Nztf-scalar-dashboard)Zelement_name)r   ZFrontendMetadatar    r   r   r   frontend_metadataK   s    zScalarsPlugin.frontend_metadataNc                 C   s   | j j||tjd}dd |D }| D ]Z\}}| D ]H\}}t|j}	| j|	j	||sbq:t
|j}
|j|
d|| |< q:q*|S )zJReturn {runName: {tagName: {displayName: ..., description:
        ...}}}.)experiment_idr   c                 S   s   i | ]
}|i qS r   r   ).0runr   r   r   
<dictcomp>V   s      z,ScalarsPlugin.index_impl.<locals>.<dictcomp>)ZdisplayNamedescription)r   Zlist_scalarsr   PLUGIN_NAMEitemsZparse_plugin_metadataZplugin_contentr   okversionr   Zmarkdown_to_safe_htmlr(   Zdisplay_name)r   ctx
experimentmappingresultr&   Ztag_to_contenttagZ	metadatumZmdr(   r   r   r   
index_implN   s$    zScalarsPlugin.index_implc              	   C   s   | j j||tj| jtj|g|gdd}||i |d}|dkrVt	d||f dd |D }|t
jkrt }	t|	}
|
ddd	g |
| |	 d
fS |dfS dS )'Result of the form `(body, mime_type)`.runstagsr$   r   Z
downsampleZrun_tag_filterNz!No scalar data for run=%r, tag=%rc                 S   s   g | ]}|j |j|jfqS r   Z	wall_timestepvaluer%   xr   r   r   
<listcomp>s   s     z.ScalarsPlugin.scalars_impl.<locals>.<listcomp>z	Wall timeZStepValueztext/csvapplication/json)r   read_scalarsr   r)   r   r   RunTagFilterr   r   ZNotFoundErrorr	   r   ioStringIOr   writerwriterow	writerowsgetvalue)r   r-   r1   r&   r.   output_formatall_scalarsZscalarsvaluesZ	string_iorD   r   r   r   scalars_imple   s(    



zScalarsPlugin.scalars_implc              	      sD   | j j||tj| jtj| gdd} fdd| D }|dfS )r3   r4   r7   c                    s$   i | ]\}}|d d |  D qS )c                 S   s   g | ]}|j |j|jfqS r   r8   r;   r   r   r   r=      s     zBScalarsPlugin.scalars_multirun_impl.<locals>.<dictcomp>.<listcomp>r   )r%   r&   Zrun_datar1   r   r   r'      s    z7ScalarsPlugin.scalars_multirun_impl.<locals>.<dictcomp>r?   )r   r@   r   r)   r   r   rA   r*   )r   r-   r1   r5   r.   rI   bodyr   rL   r   scalars_multirun_impl}   s    
z#ScalarsPlugin.scalars_multirun_implc                 C   s4   t |j}t |j}| j||d}t||dS )N)r.   r?   )r   r   environr$   r2   r   Respond)r   requestr-   r.   indexr   r   r   r      s    zScalarsPlugin.tags_routec           	      C   s   |j d}|j d}|dks(|dkr:td||f t|j}t|j}|j d}| |||||\}}t	
|||S )z9Given a tag and single run, return array of ScalarEvents.r1   r&   Nz2Both run and tag must be specified: tag=%r, run=%rformat)argsr   r   InvalidArgumentErrorr   r   rO   r$   rK   r   rP   )	r   rQ   r1   r&   r-   r.   rH   rM   	mime_typer   r   r   r      s&        zScalarsPlugin.scalars_routec           	      C   s   |j dkrtjdg|jd}|jd}t|dkrFtd|d }t	
|j}t	|j}| ||||\}}t|||S )z@Given a tag and list of runs, return dict of ScalarEvent arrays.POSTr1   r5      z"tag must be specified exactly oncer   )methodwerkzeug
exceptionsZMethodNotAllowedformgetlistlenr   rU   r   r   rO   r$   rN   r   rP   )	r   rQ   r6   r5   r1   r-   r.   rM   rV   r   r   r   r      s$    
   z$ScalarsPlugin.scalars_multirun_route)N)r   r   r   r   r   r)   r   r   r!   r"   r#   r2   rK   rN   r   RequestZapplicationr   r   r   r   r   r   r   r   -   s   


r   )r   r   rB   Zwerkzeug.exceptionsrZ   r   Ztensorboardr   r   Ztensorboard.backendr   Ztensorboard.datar   Ztensorboard.pluginsr   Ztensorboard.plugins.scalarr   r   objectr	   ZTBPluginr   r   r   r   r   <module>   s   