U
    Vc1                     @   s   d 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lmZ ddlmZ ddlmZ e ZG dd dejZdS )zThe TensorBoard Graphs plugin.    N)wrappers)errors)plugin_util)	http_util)process_graph)
config_pb2)	graph_pb2)provider)base_plugin)
graph_util)
keras_util)metadata)
tb_loggingc                   @   s   e Zd ZdZejZdd Zdd Zdd Z	dd	 Z
d
d ZdddZdd Zd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 )GraphsPluginzGraphs Plugin for TensorBoard.c                 C   s   |j | _dS )z|Instantiates GraphsPlugin via TensorBoard core.

        Args:
          context: A base_plugin.TBContext instance.
        N)Zdata_provider_data_provider)selfcontext r   K/tmp/pip-unpacked-wheel-g8kmtpbc/tensorboard/plugins/graph/graphs_plugin.py__init__*   s    zGraphsPlugin.__init__c                 C   s   | j | j| jdS )N)z/graphz/infoz/run_metadata)graph_route
info_routerun_metadata_router   r   r   r   get_plugin_apps2   s    zGraphsPlugin.get_plugin_appsc                 C   s   dS )z@The graphs plugin is active iff any run has a graph or metadata.Fr   r   r   r   r   	is_active9   s    zGraphsPlugin.is_activec                 C   s   t jt jt jt jt jfS )N)r   PLUGIN_NAMEPLUGIN_NAME_RUN_METADATA#PLUGIN_NAME_RUN_METADATA_WITH_GRAPHPLUGIN_NAME_KERAS_MODELPLUGIN_NAME_TAGGED_RUN_METADATAr   r   r   r   data_plugin_names=   s    zGraphsPlugin.data_plugin_namesc                 C   s   t jdddS )Nztf-graph-dashboardT)Zelement_nameZdisable_reload)r
   ZFrontendMetadatar   r   r   r   frontend_metadataF   s    zGraphsPlugin.frontend_metadataNc                    s  i  d fdd	}| j j||tjd}| D ]F\}}| D ]4\}}|jdkr\td q>|||\}	}
d|
d< q>q.| j j||tjd}| D ]N\}}| D ]<\}}|jdkrtd q|||\}	}
d|
d	< d|
d< qq| j j||tj	d}| D ]N\}}| D ]:\}}|jdkr0td q|||\}	}
d|
d
< q q| j j||tj
d}| D ],\}}tj|krj||d\}}	d|d< qj| j j||tjd}| D ],\}}|D ]}|||\}	}
d|
d	< qq S )z9Returns a dict of all runs and their data availabilities.Nc                    s@     | | i dd}d }|r8|d ||dddd}||fS )NF)runtags	run_graphr$   )tagconceptual_graphop_graphprofile)
setdefaultget)r#   r&   run_itemtag_itemresultr   r   add_row_itemQ   s$    


z,GraphsPlugin.info_impl.<locals>.add_row_item)experiment_idplugin_name   1z/Ignoring unrecognizable version of RunMetadata.Tr(   r)   r'   r%   )N)r   Zlist_blob_sequencesr   r   itemsZplugin_contentloggerwarningr   r   r   RUN_GRAPH_NAMEr    )r   ctx
experimentr0   mappingZrun_namer$   r&   Ztag_data_r-   r,   r   r.   r   	info_implM   s    

zGraphsPlugin.info_implc           
   	   C   s   |D ]|}| j j|||tj|g|gddd}||i |d}z|d jd }	W n tk
rj   Y qY nX | j j||	jd  S t	
 d S )N)runsr$      )r1   r2   Zrun_tag_filterZ
downsampler   r   )blob_key)r   Zread_blob_sequencesr	   ZRunTagFilterr+   values
IndexErrorZ	read_blobr?   r   ZNotFoundError)
r   r8   r9   Zplugin_namesr#   r&   r2   Zblob_sequencesZblob_sequence_dataZblob_refr   r   r   
_read_blob   s$    
 
zGraphsPlugin._read_blobc              	   C   s   |r,t | ||tjg||}t|}	nn|dkrZ| ||tjg|tj}
t	j
|
}	n@tjtjg}| |||||}tj|}tdd |jD }	t|	|| t|	dfS )=Result of the form `(body, mime_type)`; may raise `NotFound`.Nc                 S   s   g | ]
}|j qS r   )Zpre_optimization_graph).0Z
func_graphr   r   r   
<listcomp>   s   z+GraphsPlugin.graph_impl.<locals>.<listcomp>text/x-protobuf)jsonloadsrB   r   r   r   Zkeras_model_to_graph_defr   r7   r   ZGraphDef
FromStringr   r   r   RunMetadatar   Zmerge_graph_defsZfunction_graphsr   Zprepare_graph_for_uistr)r   r8   r#   r&   is_conceptualr9   limit_attr_sizelarge_attrs_keyZkeras_model_configgraphZ	graph_rawpluginsraw_run_metadatarun_metadatar   r   r   
graph_impl   sT    	    	  zGraphsPlugin.graph_implc                 C   s6   t jt jg}| |||||}tj|}t|dfS )rC   rF   )r   r    r   rB   r   rJ   rI   rK   )r   r8   r9   r#   r&   rP   rQ   rR   r   r   r   run_metadata_impl  s    zGraphsPlugin.run_metadata_implc                 C   s2   t |j}t |j}| ||}t||dS )Nzapplication/json)r   r   environr1   r<   r   Respond)r   requestr8   r9   infor   r   r   r     s    zGraphsPlugin.info_routec              
   C   s*  t |j}t |j}|jd}|jd}|jdd}|dkrJdnd}|dkrft|dd	d
S |jdd}|dk	rzt|}W n$ t	k
r   t|dd	d
 Y S X |jdd}	z| 
|||||||	}
W n< t	k
r } ztj||jd	d
d W Y S d}~X Y nX |
\}}t|||S )zKGiven a single run, return the graph definition in protobuf
        format.r#   r&   Z
conceptualFtrueTN!query parameter "run" is required
text/plain  rM   z4query parameter `limit_attr_size` must be an integerrN   )code)r   r   rU   r1   argsr+   r   rV   int
ValueErrorrS   message)r   rW   r8   r9   r#   r&   Zconceptual_argrL   rM   rN   r/   ebody	mime_typer   r   r   r     sN       
	*zGraphsPlugin.graph_routec                 C   s   t |j}t |j}|jd}|jd}|dkrHt|dddS |dkr`t|dddS | ||||\}}t|||S )z9Given a tag and a run, return the session.run() metadata.r&   r#   Nz!query parameter "tag" is requiredr[   r\   rZ   )	r   r   rU   r1   r^   r+   r   rV   rT   )r   rW   r8   r9   r&   r#   rc   rd   r   r   r   r   A  s(          zGraphsPlugin.run_metadata_route)N)NNN)__name__
__module____qualname____doc__r   r   r2   r   r   r   r!   r"   r<   rB   rS   rT   r   RequestZapplicationr   r   r   r   r   r   r   r   %   s(   	
i   
9

,r   )rh   rG   Zwerkzeugr   Ztensorboardr   r   Ztensorboard.backendr   r   Ztensorboard.compat.protor   r   Ztensorboard.datar	   Ztensorboard.pluginsr
   Ztensorboard.plugins.graphr   r   r   Ztensorboard.utilr   Z
get_loggerr5   ZTBPluginr   r   r   r   r   <module>   s    