U
    d                     @   s  d dl Z d dl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  m  mZ z,d dlmZmZ d dlmZ d dlmZ W nb ek
r   d dlmZmZ d dlmZ zd dlmZ W n  ek
r   d dlmZ Y nX Y nX G d	d
 d
eZdZdZ dd Z!dd Z"dd Z#dd Z$e % dd Z&dd Z'dd Z(e&)de j*de j+ddddd e j*d!e j+dd"d#d$d% Z,e&)d&e j*d'e j+ddd(d)d*e j*d!e j+dd+d,d*d-d. Z-e.d/kre&  dS )0    N)
caffe2_pb2)core)SummaryHistogramProto)Event)EventFileWriter)
FileWriter)SummaryWriterc                   @   s   e Zd ZdZdZdS )ConfigiX  g?N)__name__
__module____qualname__HEIGHTASPECT_RATIO r   r   J/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/contrib/tensorboard/tensorboard.pyr
      s   r
   a  
<script>
  function load() {{
    document.getElementById("{id}").pbtxt = {data};
  }}
</script>
<link rel="import"
  href="https://tensorboard.appspot.com/tf-graph-basic.build.html"
  onload=load()
>
<div style="height:{height}px">
  <tf-graph-basic id="{id}"></tf-graph-basic>
</div>
zf
<iframe
  seamless
  style="width:{width}px;height:{height}px;border:0"
  srcdoc="{code}">
</iframe>
c                 C   sn   dd l }tjtt| dttj  tj	d}t
j|ddtj	tj tj	d d}|j|j| d S )Nr   graph)dataidheight"z&quot;   )codewidthr   )ZIPython.displayCODE_TEMPLATEformatreprstrnprandomZrandr
   r   IFRAME_TEMPLATEreplacer   ZdisplayZHTML)	graph_defZIPythonr   iframer   r   r   _show_graph<   s    


r$   c                 K   s   t j| f|}t| d S N)tb_exporterZcnn_to_graph_defr$   )Zcnnkwargsgr   r   r   visualize_cnnL   s    r)   c                 K   s   t j| f|}t| d S r%   )r&   nets_to_graph_defr$   )netsr'   r(   r   r   r   visualize_netQ   s    r,   c                 K   s   t j| f|}t| d S r%   )r&   Zops_to_graph_defr$   )opsr'   r(   r   r   r   visualize_opsV   s    r.   c                   C   s   d S r%   r   r   r   r   r   cli[   s    r/   c                 C   s6   t | t|}|D ]}|| q|  |  d S r%   )r   lenZ	add_eventflushclose)tf_direventswritereventr   r   r   write_events`   s
    r7   c                 C   s   t | | | dS )N)	wall_timestepr"   )r   ZSerializeToString)r9   r"   r   r   r   graph_def_to_eventh   s
      r:   ztensorboard-graphsz--c2-netdefTF)existsZdir_okay)typemultiplez--tf-dir)r;   )r<   c                    sf   t t}|t j dd   fdd| D }dd t|ddD }t|| |dt|| d S )	Nc              	   S   sB   dd l }t }t| }|jj| | W 5 Q R X t	|S )Nr   )
Zgoogle.protobuf.text_formatr   ZNetDefopenZprotobufZtext_formatZMergereadr   ZNet)pathZgoogleZnet_deffr   r   r   parse_net_defu   s
    
z)tensorboard_graphs.<locals>.parse_net_defc                    s   g | ]}t  |gqS r   )r&   r*   ).0r@   rB   r   r   
<listcomp>|   s   z&tensorboard_graphs.<locals>.<listcomp>c                 S   s   g | ]\}}t ||qS r   )r:   )rC   ir"   r   r   r   rE   ~   s      startzWrote %s graphs to logdir %s)	logging	getLoggerr   setLevelINFO	enumerater7   infor0   )Z	c2_netdefr3   logZ
graph_defsr4   r   rD   r   tensorboard_graphsm   s    



rQ   ztensorboard-eventsz--c2-dir)r;   Z	file_okayz Root directory of the Caffe2 run)r<   help)writablez-Output path to the logdir used by TensorBoardc                    s   t jd tttj t	dddddg  fddfd	d
}dddfdd}|| }||}t
|| dt|| d S )Ni  Sminmaxmeanstdc              
      sz   zBt | 0}dd |D } fdd|D W  5 Q R  W S Q R X W n2 tk
rt } z| W Y d S d }~X Y nX d S )Nc                 S   s   g | ]}d d |  D qS )c                 s   s   | ]}t |V  qd S r%   )float)rC   elr   r   r   	<genexpr>   s     zGtensorboard_events.<locals>.parse_summary.<locals>.<listcomp>.<genexpr>)split)rC   liner   r   r   rE      s     z=tensorboard_events.<locals>.parse_summary.<locals>.<listcomp>c                    s   g | ]} | qS r   r   )rC   r)rT   r   r   rE      s     )r>   	Exception	exception)filenamerA   Zrowse)rT   rP   r   r   parse_summary   s    
*
z)tensorboard_events.<locals>.parse_summaryc                    s&    fddt | D }dd |D S )Nc              	      s2   g | ]*\}}}|D ]}| t j||fqqS r   )osr@   join)rC   dirname_fnamesfnamerc   r   r   rE      s    zCtensorboard_events.<locals>.get_named_summaries.<locals>.<listcomp>c                 S   s   g | ]\}}|r||fqS r   r   )rC   nsr   r   r   rE      s      )rd   walk)root	summariesrj   r   r   get_named_summaries   s    
z/tensorboard_events.<locals>.get_named_summaries  c                 S   s   t jt| j| j | j | j t t j	j  t j
|| j | j }t j|| j| jd}t |\}}|dd  }t| j| jt|| ||  d}|j| |j| |S )N)Za_minZa_maxrG   )rU   rV   numsumZsum_squares)r   r   seedhashrX   rW   rU   rV   ZiinfoZint32ZrandnZclipZ	histogramr   r0   rs   Zbucket_limitextendZbucket)summaryZsampleshistedgesZupper_edgesr^   r   r   r   inferred_histo   s*    
z*tensorboard_events.<locals>.inferred_histoc                    sP   dd | D dd | D }t t| }fdd  fddt|ddD S )	Nc                 S   s   g | ]\}}|qS r   r   )rC   rk   rg   r   r   r   rE      s     zItensorboard_events.<locals>.named_summaries_to_events.<locals>.<listcomp>c                 S   s   g | ]\}}|qS r   r   )rC   rg   rl   r   r   r   rE      s     c                    sT   t  }dd t|D } fddt|D }|j||  tt| | |dS )Nc                 S   s<   g | ]4\}}|   D ]\}}tjd |||dqqS )z{}/{})tagZsimple_value)_asdictitemsr   Valuer   )rC   namevaluefieldvr   r   r   rE      s    
zXtensorboard_events.<locals>.named_summaries_to_events.<locals>.event.<locals>.<listcomp>c                    s(   g | ] \}}t jd | |dqS )z{}/inferred_normal_hist)r{   Zhisto)r   r~   r   )rC   r   r   rz   r   r   rE      s
   )r8   r9   rw   )r   zipr   rv   r   int)r9   valuesrl   Zscalarrx   )rz   namesr   r   r6      s    
zDtensorboard_events.<locals>.named_summaries_to_events.<locals>.eventc                    s   g | ]\}} ||qS r   r   )rC   r9   r   )r6   r   r   rE      s   rG   rH   )listr   rN   )named_summariesro   r   )r6   r   r   named_summaries_to_events   s    

z5tensorboard_events.<locals>.named_summaries_to_eventszWrote %s events to logdir %s)rq   )r   r   rt   rJ   rK   r   rL   rM   collections
namedtupler7   rO   r0   )Zc2_dirr3   rp   r   r   r4   r   )rT   rz   rP   rc   r   tensorboard_events   s    
	

r   __main__)/Zclickr   rJ   Znumpyr   rd   Zcaffe2.protor   Zcaffe2.pythonr   Z/caffe2.contrib.tensorboard.tensorboard_exportercontribZtensorboardZtensorboard_exporterr&   Z$tensorboard.compat.proto.summary_pb2r   r   Z"tensorboard.compat.proto.event_pb2r   Z,tensorboard.summary.writer.event_file_writerr   r   ImportErrorZ%tensorflow.core.framework.summary_pb2Ztensorflow.core.util.event_pb2Ztensorflow.summaryZtensorflow.trainr	   objectr
   r   r    r$   r)   r,   r.   groupr/   r7   r:   commandoptionPathrQ   r   r   r   r   r   r   <module>   sZ   	
J
