a
    du                     @   s  d dl Z d dlZd dlZd dlm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mZ g dZeeZdd Z dDddZ!dEddZ"dFddZ#dd Z$dGddZ%dHdd Z&dId"d#Z'dJd%d&Z(dKd'd(Z)dLd)d*Z*dMd,d-Z+d.d/ Z,dNd1d2Z-d3d4 Z.d5d6 Z/dOd8d9Z0dPd:d;Z1dQd<d=Z2d>d? Z3d@dA Z4dRdBdCZ5dS )S    N)Optional)
struct_pb2)HistogramProto)Summary)SummaryMetadata)TensorProto)TensorShapeProto)
layout_pb2)PrCurvePluginData)TextPluginData   )make_np)_prepare_videoconvert_to_HWC)hparamsscalarhistogram_raw	histogrammake_histogramimageimage_boxes
draw_boxes
make_imagevideo
make_videoaudiocustom_scalarstextpr_curve_rawpr_curvecompute_curvemeshc                 C   s,   t | tjs|  n| }|jtjkr(dS dS )Nr      )
isinstancenpZndarraynumpydtypeuint8)tensorZ	converted r)   h/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/torch/utils/tensorboard/summary.py_calc_scale_factor   s    r+   black   c	                 C   s   ddl m}	m}
 |
 }|	| }||||f\}}}}|j||f||f||f||f||fg||d |r|}||\}}td| }|j	||| d|  f|| |fg|d |j
|| || | f|||d | S )Nr   )	ImageDraw	ImageFont)widthfillg?r-   )r1   )r1   font)PILr.   r/   Zload_defaultZDrawlinegetsizer$   ceilZ	rectangler   )r   ZxminZyminZxmaxZymaxdisplay_strcolorZ
color_textZ	thicknessr.   r/   r2   ZdrawleftrighttopZbottomZtext_bottom
text_widthZtext_heightmarginr)   r)   r*   _draw_single_box!   s4    
 
r>   c                    s~  ddl }ddlm}m}m mm}m} ddlm	}m
}	m}
m}m} ddlm}m}m} ttsttd tdt|tstd td|pi }t|tstd| D ]B\}vst|trtfd	d
|D stdqg }| } D ]\}|du r qt|ttfr||j _|v rbtj dd | D d}nd}|!||"d|d qt|t#r||j _$|v rtj dd | D d}nd}|!||"d|d qt|t%rD||j _&|v r"tj dd | D d}nd}|!||"d|d qt||j'rt(|d }||j _|!||"dd qt)dq|||	d}t*t*j+||, dd}t-t-j"||dgd} fdd|. D }|||d}|||	d}t*t*j+||, dd}t-t-j"|
|dgd}||"dd }|||	d!}t*t*j+||, dd}t-t-j"||dgd}|||fS )"a2  Outputs three `Summary` protocol buffers needed by hparams plugin.
    `Experiment` keeps the metadata of an experiment, such as the name of the
      hyperparameters and the name of the metrics.
    `SessionStartInfo` keeps key-value pairs of the hyperparameters
    `SessionEndInfo` describes status of the experiment e.g. STATUS_SUCCESS

    Args:
      hparam_dict: A dictionary that contains names of the hyperparameters
        and their values.
      metric_dict: A dictionary that contains names of the metrics
        and their values.
      hparam_domain_discrete: (Optional[Dict[str, List[Any]]]) A dictionary that
        contains names of the hyperparameters and all discrete values they can hold

    Returns:
      The `Summary` protobufs for Experiment, SessionStartInfo and
        SessionEndInfo
    r   N)
Experiment
HParamInfo
MetricInfo
MetricNameStatusDataType)PLUGIN_NAMEPLUGIN_DATA_VERSIONEXPERIMENT_TAGSESSION_START_INFO_TAGSESSION_END_INFO_TAG)HParamsPluginDataSessionEndInfoSessionStartInfoz>parameter: hparam_dict should be a dictionary, nothing logged.z>parameter: metric_dict should be a dictionary, nothing logged.zIparameter: hparam_domain_discrete should be a dictionary, nothing logged.c                 3   s    | ]}t |t  V  qd S )N)r#   type.0d)hparam_dictkr)   r*   	<genexpr>       zhparams.<locals>.<genexpr>zWparameter: hparam_domain_discrete[{}] should be a list of same type as hparam_dict[{}].c                 S   s   g | ]}t j|d qS ))number_valuer   ValuerN   r)   r)   r*   
<listcomp>   s   zhparams.<locals>.<listcomp>)valuesZDATA_TYPE_FLOAT64)namerM   domain_discretec                 S   s   g | ]}t j|d qS ))string_valuerV   rN   r)   r)   r*   rX      s   ZDATA_TYPE_STRINGc                 S   s   g | ]}t j|d qS ))
bool_valuerV   rN   r)   r)   r*   rX      s   ZDATA_TYPE_BOOL)rZ   rM   z=value should be one of int, float, str, bool, or torch.Tensor)Zsession_start_infoversionplugin_namecontentplugin_data)tagmetadatavaluec                    s   g | ]} |d dqS )rd   )rZ   r)   )rO   rR   )rA   rB   r)   r*   rX      rT   )Zhparam_infosZmetric_infos)Z
experimentr^   ZSTATUS_SUCCESS)status)Zsession_end_infor^   )/torchZ#tensorboard.plugins.hparams.api_pb2r?   r@   rA   rB   rC   rD   Z$tensorboard.plugins.hparams.metadatarE   rF   rG   rH   rI   Z+tensorboard.plugins.hparams.plugin_data_pb2rJ   rK   rL   r#   dictloggerwarning	TypeErroritemslistallformatintfloatr   rU   r   Z	ListValueappendrW   strr\   boolr]   ZTensorr   
ValueErrorr   
PluginDataSerializeToStringr   keys)rQ   Zmetric_dictZhparam_domain_discreterj   r?   r@   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   vZhpsZssir[   ra   smdZmtsexpZseir)   )rA   rB   rQ   rR   r*   r   K   s     








r   Fc           	      C   s   t | }|jdks0J d|j d|j dt|}|rt|gdd}|r\t|gdd}tjd	d
}t|d}ttj	| ||dgdS ttj	| |dgdS dS )a  Outputs a `Summary` protocol buffer containing a single scalar value.
    The generated Summary has a Tensor.proto containing the input Tensor.
    Args:
      name: A name for the generated node. Will also serve as the series name in
        TensorBoard.
      tensor: A real numeric Tensor containing a single value.
      collections: Optional list of graph collections keys. The new summary op is
        added to these collections. Defaults to `[GraphKeys.SUMMARIES]`.
      new_style: Whether to use new style (tensor field) or old style (simple_value
        field). New style could lead to faster data loading.
    Returns:
      A scalar `Tensor` of type `string`. Which contains a `Summary` protobuf.
    Raises:
      ValueError: If tensor has the wrong shape or type.
    r   zBTensor should contain one element (0 dimensions). Was given size: z and z dimensions.DT_FLOAT)	float_valr&   Z	DT_DOUBLE)Z
double_valr&   Zscalarsr`   rb   rd   r(   re   rf   )rd   Zsimple_valueN)
r   squeezendimsizert   r   r   ry   r   rW   )	rZ   r(   collectionsZ	new_styleZdouble_precisionr   Ztensor_protorc   r}   r)   r)   r*   r     s*    

r   c           	   	   C   s,   t |||||||d}ttj| |dgdS )a  Outputs a `Summary` protocol buffer with a histogram.
    The generated
    [`Summary`](https://www.tensorflow.org/code/tensorflow/core/framework/summary.proto)
    has one summary value containing a histogram for `values`.
    Args:
      name: A name for the generated node. Will also serve as a series name in
        TensorBoard.
      min: A float or int min value
      max: A float or int max value
      num: Int number of values
      sum: Float or int sum of all values
      sum_squares: Float or int sum of squares for all values
      bucket_limits: A numeric `Tensor` with upper value per bucket
      bucket_counts: A numeric `Tensor` with number of values per bucket
    Returns:
      A scalar `Tensor` of type `string`. The serialized `Summary` protocol
      buffer.
    minmaxnumsumsum_squaresZbucket_limitZbucketrd   Zhistorf   )r   r   rW   )	rZ   r   r   r   r   r   Zbucket_limitsZbucket_countshistr)   r)   r*   r   2  s    	r   c                 C   s0   t |}t|t||}ttj| |dgdS )ad  Outputs a `Summary` protocol buffer with a histogram.
    The generated
    [`Summary`](https://www.tensorflow.org/code/tensorflow/core/framework/summary.proto)
    has one summary value containing a histogram for `values`.
    This op reports an `InvalidArgument` error if any value is not finite.
    Args:
      name: A name for the generated node. Will also serve as a series name in
        TensorBoard.
      values: A real numeric `Tensor`. Any shape. Values to use to
        build the histogram.
    Returns:
      A scalar `Tensor` of type `string`. The serialized `Summary` protocol
      buffer.
    r   rf   )r   r   astypert   r   rW   )rZ   rY   binsmax_binsr   r)   r)   r*   r   R  s    r   c              	   C   s  | j dkrtd| d} tj| |d\}}t|}|dur||kr|| }|| }|dkrztj|d|| ggddd}|d|jdd}t|j d	 f|j	}|dd| |dd< |d |d< |}t
t|d}	tj|	d|	d d	 gd
d\}
}t|
}
t|d	 }~	|
dkr,||
d	 | ntdg|d| g}||
|d	  }|j dksl|j dkrttd| | }t|  |  t| |  || | dS )zDConvert values into a histogram proto using logic from histogram.cc.r   zThe input has no element.)r   NZconstant)Z	pad_widthmodeZconstant_values)Zaxisr   r:   )Zsidez1The histogram is empty, please file a bug report.r   )r   rx   reshaper$   r   lenpadr   emptyr&   cumsumZgreaterZsearchsortedrs   Zconcatenatedotr   r   r   tolist)rY   r   r   countsZlimitsZnum_binsZsubsamplingZsubsampling_remainderZ
new_limits
cum_countsstartendZsum_sqr)   r)   r*   r   g  sP    

 0
r   NCHWc                 C   s`   t |}t||}t|}|tj}|| ddtj}t||d}t	t	j
| |dgdS )aJ  Outputs a `Summary` protocol buffer with images.
    The summary has up to `max_images` summary values containing images. The
    images are built from `tensor` which must be 3-D with shape `[height, width,
    channels]` and where `channels` can be:
    *  1: `tensor` is interpreted as Grayscale.
    *  3: `tensor` is interpreted as RGB.
    *  4: `tensor` is interpreted as RGBA.
    The `name` in the outputted Summary.Value protobufs is generated based on the
    name, with a suffix depending on the max_outputs setting:
    *  If `max_outputs` is 1, the summary value tag is '*name*/image'.
    *  If `max_outputs` is greater than 1, the summary value tags are
       generated sequentially as '*name*/image/0', '*name*/image/1', etc.
    Args:
      tag: A name for the generated node. Will also serve as a series name in
        TensorBoard.
      tensor: A 3-D `uint8` or `float32` `Tensor` of shape `[height, width,
        channels]` where `channels` is 1, 3, or 4.
        'tensor' can either have values in [0, 1] (float32) or [0, 255] (uint8).
        The image() function will scale the image values to [0, 255] by applying
        a scale factor of either 1 (uint8) or 255 (float32). Out-of-range values
        will be clipped.
    Returns:
      A scalar `Tensor` of type `string`. The serialized `Summary` protocol
      buffer.
    r   r"   )rescalerd   r   rf   )r   r   r+   r   r$   float32clipr'   r   r   rW   )rd   r(   r   dataformatsscale_factorr   r)   r)   r*   r     s    
r   CHWc                 C   sd   t |}t||}t |}|tjt| }t|ddtj|||d}t	t	j
| |dgdS )z0Outputs a `Summary` protocol buffer with images.r   r"   )r   roislabelsr   rf   )r   r   r   r$   r   r+   r   r   r'   r   rW   )rd   Ztensor_imageZtensor_boxesr   r   r   r   r)   r)   r*   r     s    
r   c              
   C   sf   |j d }t|}|D ]J}t| ||df ||df ||df ||df |d u rRd n|| dd} q| S )Nr   r   r-      ZRed)r7   r8   )shaperanger>   )Z
disp_imageZboxesr   Z	num_boxesZlist_gtir)   r)   r*   r     s    




	r   c                 C   s   ddl m} | j\}}}t|| }t|| }	|| }
|durPt|
||d}
z|jj}W n tyt   |j	}Y n0 |

|	|f|}
ddl}| }|
j|dd | }|  tj||||dS )z<Convert a numpy representation of an image to Image protobufr   )ImageN)r   ZPNG)rr   heightr0   Z
colorspaceZencoded_image_string)r3   r   r   rs   Z	fromarrayr   Z
ResamplingZLANCZOSAttributeError	ANTIALIASresizeioBytesIOsavegetvaluecloser   )r(   r   r   r   r   r   r0   ZchannelZscaled_heightZscaled_widthr   r   r   outputZimage_stringr)   r)   r*   r     s.    
r      c                 C   s\   t |}t|}t|}|tj}|| ddtj}t||}t	t	j
| |dgdS )Nr   r"   r   rf   )r   r   r+   r   r$   r   r   r'   r   r   rW   )rd   r(   fpsr   r   r)   r)   r*   r     s    
r   c                 C   sd  zdd l }W n ty(   td Y d S 0 zddl m} W n tyX   tdd Y d S 0 dd l}| j\}}}}|jt| |d}	|jddd	j	}
z|	j
|
dd d
 W nH ty   z|	j
|
ddd W n  ty   |	j
|
dd Y n0 Y n0 t|
d}| }W d    n1 s0    Y  zt|
 W n tyP   td Y n0 tj||||dS )Nr   zadd_video needs package moviepy)editorz6moviepy is installed, but can't import moviepy.editor.z2Some packages could be missing [imageio, requests])r   z.gifF)suffixdelete)verboserl   )r   progress_bar)r   rbz5The temporary file used by moviepy cannot be deleted.r   )moviepyImportErrorprintr   tempfiler   ZImageSequenceCliprp   NamedTemporaryFilerZ   Z	write_gifrn   openreadosremoveOSErrorrl   rm   r   r   )r(   r   r   Zmpyr   thwcr   filenamefZtensor_stringr)   r)   r*   r     sB    (r   D  c           
      C   s  t |}| }t| dkr4td |dd}|jdksFJ d|ttj	j 
d}dd l}dd l}| }||d:}|d |d || ||j W d    n1 s0    Y  | }|  tj|d|jd |d	d
}	ttj| |	dgdS )Nr   z4warning: audio amplitude out of range, auto clipped.r   z%input tensor should be 1 dimensional.z<i2r   wbr-   z	audio/wav)sample_rateZnum_channelsZlength_framesZencoded_audio_stringcontent_type)rd   r   rf   )r   r   absr   r   r   r   r$   Ziinfoint16r   r   waver   r   ZsetnchannelsZsetsampwidthZsetframerateZwriteframesdatar   r   r   ZAudior   rW   )
rd   r(   r   arrayr   r   ZfioZ
wave_writeZaudio_stringr   r)   r)   r*   r   2  s2    


*r   c                 C   s  g }|   D ]\}}g }|  D ]\}}|d }|d dkrt|dksLJ tjtjj|d |d |d dgd}tj||d}	ntj|d	}
tj||
d
}	||	 q |tj||d qtj	|d} t
jdd}t
|d}td|  gt d}ttjd||dgdS )Nr   r   ZMarginr   r-   )rg   lowerupper)Zseries)titler=   rh   )r   	multiline)r   chart)categoryr   r   rb   	DT_STRINGr&   Z
string_valtensor_shapeZcustom_scalars__config__r   rf   )ro   r   r	   ZMarginChartContentZSeriesZChartZMultilineChartContentru   ZCategoryZLayoutr   ry   r   rz   r   r   rW   )Zlayout
categoriesrR   r|   ZchartsZ
chart_nameZchart_meatadatatagsZmgccr   Zmlccrc   r}   r(   r)   r)   r*   r   P  s<    
r   c                 C   sf   t jdtdd d}t |d}td|jddgttjd	d
gdd}ttj	| d ||dgdS )Nr   r   )r^   r_   rb   r   utf_8)encodingr   r   Zdimr   z/text_summaryrd   re   r(   rf   )
r   ry   r   rz   r   encoder   Dimr   rW   )rd   r   rc   r}   r(   r)   r)   r*   r   u  s    
r      c	                 C   s   |dkrd}t ||||||f}	td|d }
tjd|
d}t|d}td|	d t	t	j
|	jd d	t	j
|	jd
 d	gdd}ttj| ||dgdS )Nr   r   r^   num_thresholds	pr_curvesr_   rb   r   r   r   r   r   r&   r   r   r   rf   )r$   stackr
   rz   r   ry   r   r   r   r   r   r   r   rW   )rd   tpfptnfn	precisionrecallr   weightsr   pr_curve_plugin_datarc   r}   r(   r)   r)   r*   r     s(    


r   c           
      C   s   t |d}t||||d}td|d }tjd|d}t|d}td|d	 t	t	j
|jd d
t	j
|jd d
gdd}	ttj| ||	dgdS )Nr   )r   r   r   r   r   r_   rb   r   r   r   r   r   r   r   rf   )r   r    r
   rz   r   ry   r   r   r   r   r   r   r   rW   )
rd   r   predictionsr   r   r   r   rc   r}   r(   r)   r)   r*   r     s*    



r   c                 C   s
  d}|d u rd}t t ||d  }| t j}d|d f}t j||||| d\}}	t j|||d| | d\}
}	t |d d d d d d }t |
d d d d d d }|d | }|d | }|t |||  }|t |||  }t ||||||fS )NgHz>g      ?r   r   )r   r   r   r   )	r$   int32floorr   float64r   r   maximumr   )r   r   r   r   Z_MINIMUM_COUNTZbucket_indicesZfloat_labelsZhistogram_rangeZ
tp_buckets_Z
fp_bucketsr   r   r   r   r   r   r)   r)   r*   r      s2    


r    c              	   C   s   ddl }ddlm} ||}|j| ||||j||d}	td|d t	t	j
|jd dt	j
|jd dt	j
|jd	 dgd
d}tj|| |||	d}
|
S )a  Creates a tensor summary with summary metadata.

    Args:
      name: Uniquely identifiable name of the summary op. Could be replaced by
        combination of name and type to make it unique even outside of this
        summary.
      display_name: Will be used as the display name in TensorBoard.
        Defaults to `name`.
      description: A longform readable description of the summary data. Markdown
        is supported.
      tensor: Tensor to display in summary.
      content_type: Type of content inside the Tensor.
      components: Bitmask representing present parts (vertices, colors, etc.) that
        belong to the summary.
      json_config: A string, JSON-serialized dictionary of ThreeJS classes
        configuration.

    Returns:
      Tensor summary with metadata.
    r   Nre   )json_configr   r   r   r   r-   r   r   r   )rj   tensorboard.plugins.meshre   Z	as_tensorZcreate_summary_metadatar   r   r   r   r   r   r   rW   Zget_instance_name)rZ   display_namedescriptionr(   r   
componentsr  rj   re   Ztensor_metadataZtensor_summaryr)   r)   r*   _get_tensor_summary  s8    


r  c                 C   s   d}| durt j| dd}|S )z6Parses and returns JSON string from python dictionary.z{}NT)	sort_keys)jsondumps)config_dictr  r)   r)   r*   _get_json_config  s    r  c                 C   s   ddl m} ddlm} t|}	g }
||jf||jf||jfg}dd |D }|dd |D }|D ]"\}}|
	t
| ||||||	 qft|
dS )a(  Outputs a merged `Summary` protocol buffer with a mesh/point cloud.

    Args:
      tag: A name for this summary operation.
      vertices: Tensor of shape `[dim_1, ..., dim_n, 3]` representing the 3D
        coordinates of vertices.
      faces: Tensor of shape `[dim_1, ..., dim_n, 3]` containing indices of
        vertices within each triangle.
      colors: Tensor of shape `[dim_1, ..., dim_n, 3]` containing colors for each
        vertex.
      display_name: If set, will be used as the display name in TensorBoard.
        Defaults to `name`.
      description: A longform readable description of the summary data. Markdown
        is supported.
      config_dict: Dictionary with ThreeJS classes names and configuration.

    Returns:
      Merged summary for mesh/point cloud representation.
    r   )MeshPluginDatar   c                 S   s   g | ]}|d  dur|qS )r   Nr)   )rO   r(   r)   r)   r*   rX   ?  rT   zmesh.<locals>.<listcomp>c                 S   s   g | ]\}}|qS r)   r)   )rO   r(   r   r)   r)   r*   rX   A  rT   rf   )Z(tensorboard.plugins.mesh.plugin_data_pb2r  r  re   r  ZVERTEXZFACEZCOLORZget_components_bitmaskru   r  r   )rd   ZverticescolorsZfacesr
  r  r  r  re   r  Z	summariesZtensorsr  r(   r   r)   r)   r*   r!     s2    r!   )r,   r,   r-   )NNN)NFF)N)N)r   r   )r   r   N)N)r   NN)r   )r   )r   N)r   N)NN)NN)6r  loggingr   typingr   r%   r$   Zgoogle.protobufr   Z$tensorboard.compat.proto.summary_pb2r   r   r   Z#tensorboard.compat.proto.tensor_pb2r   Z)tensorboard.compat.proto.tensor_shape_pb2r   Z!tensorboard.plugins.custom_scalarr	   Z,tensorboard.plugins.pr_curve.plugin_data_pb2r
   Z(tensorboard.plugins.text.plugin_data_pb2r   Z_convert_npr   _utilsr   r   __all__	getLogger__name__rl   r+   r>   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r  r  r!   r)   r)   r)   r*   <module>   s\   
   
*
 >
* 

6
% 



+
% 


!;
 