tensorbored 2.21.0rc1769983804__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. tensorbored/__init__.py +112 -0
  2. tensorbored/_vendor/__init__.py +0 -0
  3. tensorbored/_vendor/bleach/__init__.py +125 -0
  4. tensorbored/_vendor/bleach/_vendor/__init__.py +0 -0
  5. tensorbored/_vendor/bleach/_vendor/html5lib/__init__.py +35 -0
  6. tensorbored/_vendor/bleach/_vendor/html5lib/_ihatexml.py +289 -0
  7. tensorbored/_vendor/bleach/_vendor/html5lib/_inputstream.py +918 -0
  8. tensorbored/_vendor/bleach/_vendor/html5lib/_tokenizer.py +1735 -0
  9. tensorbored/_vendor/bleach/_vendor/html5lib/_trie/__init__.py +5 -0
  10. tensorbored/_vendor/bleach/_vendor/html5lib/_trie/_base.py +40 -0
  11. tensorbored/_vendor/bleach/_vendor/html5lib/_trie/py.py +67 -0
  12. tensorbored/_vendor/bleach/_vendor/html5lib/_utils.py +159 -0
  13. tensorbored/_vendor/bleach/_vendor/html5lib/constants.py +2946 -0
  14. tensorbored/_vendor/bleach/_vendor/html5lib/filters/__init__.py +0 -0
  15. tensorbored/_vendor/bleach/_vendor/html5lib/filters/alphabeticalattributes.py +29 -0
  16. tensorbored/_vendor/bleach/_vendor/html5lib/filters/base.py +12 -0
  17. tensorbored/_vendor/bleach/_vendor/html5lib/filters/inject_meta_charset.py +73 -0
  18. tensorbored/_vendor/bleach/_vendor/html5lib/filters/lint.py +93 -0
  19. tensorbored/_vendor/bleach/_vendor/html5lib/filters/optionaltags.py +207 -0
  20. tensorbored/_vendor/bleach/_vendor/html5lib/filters/sanitizer.py +916 -0
  21. tensorbored/_vendor/bleach/_vendor/html5lib/filters/whitespace.py +38 -0
  22. tensorbored/_vendor/bleach/_vendor/html5lib/html5parser.py +2795 -0
  23. tensorbored/_vendor/bleach/_vendor/html5lib/serializer.py +409 -0
  24. tensorbored/_vendor/bleach/_vendor/html5lib/treeadapters/__init__.py +30 -0
  25. tensorbored/_vendor/bleach/_vendor/html5lib/treeadapters/genshi.py +54 -0
  26. tensorbored/_vendor/bleach/_vendor/html5lib/treeadapters/sax.py +50 -0
  27. tensorbored/_vendor/bleach/_vendor/html5lib/treebuilders/__init__.py +88 -0
  28. tensorbored/_vendor/bleach/_vendor/html5lib/treebuilders/base.py +417 -0
  29. tensorbored/_vendor/bleach/_vendor/html5lib/treebuilders/dom.py +239 -0
  30. tensorbored/_vendor/bleach/_vendor/html5lib/treebuilders/etree.py +343 -0
  31. tensorbored/_vendor/bleach/_vendor/html5lib/treebuilders/etree_lxml.py +392 -0
  32. tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/__init__.py +154 -0
  33. tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/base.py +252 -0
  34. tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/dom.py +43 -0
  35. tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/etree.py +131 -0
  36. tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/etree_lxml.py +215 -0
  37. tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/genshi.py +69 -0
  38. tensorbored/_vendor/bleach/_vendor/parse.py +1078 -0
  39. tensorbored/_vendor/bleach/callbacks.py +32 -0
  40. tensorbored/_vendor/bleach/html5lib_shim.py +757 -0
  41. tensorbored/_vendor/bleach/linkifier.py +633 -0
  42. tensorbored/_vendor/bleach/parse_shim.py +1 -0
  43. tensorbored/_vendor/bleach/sanitizer.py +638 -0
  44. tensorbored/_vendor/bleach/six_shim.py +19 -0
  45. tensorbored/_vendor/webencodings/__init__.py +342 -0
  46. tensorbored/_vendor/webencodings/labels.py +231 -0
  47. tensorbored/_vendor/webencodings/mklabels.py +59 -0
  48. tensorbored/_vendor/webencodings/x_user_defined.py +325 -0
  49. tensorbored/assets.py +36 -0
  50. tensorbored/auth.py +102 -0
  51. tensorbored/backend/__init__.py +0 -0
  52. tensorbored/backend/application.py +604 -0
  53. tensorbored/backend/auth_context_middleware.py +38 -0
  54. tensorbored/backend/client_feature_flags.py +113 -0
  55. tensorbored/backend/empty_path_redirect.py +46 -0
  56. tensorbored/backend/event_processing/__init__.py +0 -0
  57. tensorbored/backend/event_processing/data_ingester.py +276 -0
  58. tensorbored/backend/event_processing/data_provider.py +535 -0
  59. tensorbored/backend/event_processing/directory_loader.py +142 -0
  60. tensorbored/backend/event_processing/directory_watcher.py +272 -0
  61. tensorbored/backend/event_processing/event_accumulator.py +950 -0
  62. tensorbored/backend/event_processing/event_file_inspector.py +463 -0
  63. tensorbored/backend/event_processing/event_file_loader.py +292 -0
  64. tensorbored/backend/event_processing/event_multiplexer.py +521 -0
  65. tensorbored/backend/event_processing/event_util.py +68 -0
  66. tensorbored/backend/event_processing/io_wrapper.py +223 -0
  67. tensorbored/backend/event_processing/plugin_asset_util.py +104 -0
  68. tensorbored/backend/event_processing/plugin_event_accumulator.py +721 -0
  69. tensorbored/backend/event_processing/plugin_event_multiplexer.py +522 -0
  70. tensorbored/backend/event_processing/reservoir.py +266 -0
  71. tensorbored/backend/event_processing/tag_types.py +29 -0
  72. tensorbored/backend/experiment_id.py +71 -0
  73. tensorbored/backend/experimental_plugin.py +51 -0
  74. tensorbored/backend/http_util.py +263 -0
  75. tensorbored/backend/json_util.py +70 -0
  76. tensorbored/backend/path_prefix.py +67 -0
  77. tensorbored/backend/process_graph.py +74 -0
  78. tensorbored/backend/security_validator.py +202 -0
  79. tensorbored/compat/__init__.py +69 -0
  80. tensorbored/compat/proto/__init__.py +0 -0
  81. tensorbored/compat/proto/allocation_description_pb2.py +35 -0
  82. tensorbored/compat/proto/api_def_pb2.py +82 -0
  83. tensorbored/compat/proto/attr_value_pb2.py +80 -0
  84. tensorbored/compat/proto/cluster_pb2.py +58 -0
  85. tensorbored/compat/proto/config_pb2.py +271 -0
  86. tensorbored/compat/proto/coordination_config_pb2.py +45 -0
  87. tensorbored/compat/proto/cost_graph_pb2.py +87 -0
  88. tensorbored/compat/proto/cpp_shape_inference_pb2.py +70 -0
  89. tensorbored/compat/proto/debug_pb2.py +65 -0
  90. tensorbored/compat/proto/event_pb2.py +149 -0
  91. tensorbored/compat/proto/full_type_pb2.py +74 -0
  92. tensorbored/compat/proto/function_pb2.py +157 -0
  93. tensorbored/compat/proto/graph_debug_info_pb2.py +111 -0
  94. tensorbored/compat/proto/graph_pb2.py +41 -0
  95. tensorbored/compat/proto/histogram_pb2.py +39 -0
  96. tensorbored/compat/proto/meta_graph_pb2.py +254 -0
  97. tensorbored/compat/proto/node_def_pb2.py +61 -0
  98. tensorbored/compat/proto/op_def_pb2.py +81 -0
  99. tensorbored/compat/proto/resource_handle_pb2.py +48 -0
  100. tensorbored/compat/proto/rewriter_config_pb2.py +93 -0
  101. tensorbored/compat/proto/rpc_options_pb2.py +35 -0
  102. tensorbored/compat/proto/saved_object_graph_pb2.py +193 -0
  103. tensorbored/compat/proto/saver_pb2.py +38 -0
  104. tensorbored/compat/proto/step_stats_pb2.py +116 -0
  105. tensorbored/compat/proto/struct_pb2.py +144 -0
  106. tensorbored/compat/proto/summary_pb2.py +111 -0
  107. tensorbored/compat/proto/tensor_description_pb2.py +38 -0
  108. tensorbored/compat/proto/tensor_pb2.py +68 -0
  109. tensorbored/compat/proto/tensor_shape_pb2.py +46 -0
  110. tensorbored/compat/proto/tfprof_log_pb2.py +307 -0
  111. tensorbored/compat/proto/trackable_object_graph_pb2.py +90 -0
  112. tensorbored/compat/proto/types_pb2.py +105 -0
  113. tensorbored/compat/proto/variable_pb2.py +62 -0
  114. tensorbored/compat/proto/verifier_config_pb2.py +38 -0
  115. tensorbored/compat/proto/versions_pb2.py +35 -0
  116. tensorbored/compat/tensorflow_stub/__init__.py +38 -0
  117. tensorbored/compat/tensorflow_stub/app.py +124 -0
  118. tensorbored/compat/tensorflow_stub/compat/__init__.py +131 -0
  119. tensorbored/compat/tensorflow_stub/compat/v1/__init__.py +20 -0
  120. tensorbored/compat/tensorflow_stub/dtypes.py +692 -0
  121. tensorbored/compat/tensorflow_stub/error_codes.py +169 -0
  122. tensorbored/compat/tensorflow_stub/errors.py +507 -0
  123. tensorbored/compat/tensorflow_stub/flags.py +124 -0
  124. tensorbored/compat/tensorflow_stub/io/__init__.py +17 -0
  125. tensorbored/compat/tensorflow_stub/io/gfile.py +1011 -0
  126. tensorbored/compat/tensorflow_stub/pywrap_tensorflow.py +285 -0
  127. tensorbored/compat/tensorflow_stub/tensor_shape.py +1035 -0
  128. tensorbored/context.py +129 -0
  129. tensorbored/data/__init__.py +0 -0
  130. tensorbored/data/grpc_provider.py +365 -0
  131. tensorbored/data/ingester.py +46 -0
  132. tensorbored/data/proto/__init__.py +0 -0
  133. tensorbored/data/proto/data_provider_pb2.py +517 -0
  134. tensorbored/data/proto/data_provider_pb2_grpc.py +374 -0
  135. tensorbored/data/provider.py +1365 -0
  136. tensorbored/data/server_ingester.py +301 -0
  137. tensorbored/data_compat.py +159 -0
  138. tensorbored/dataclass_compat.py +224 -0
  139. tensorbored/default.py +124 -0
  140. tensorbored/errors.py +130 -0
  141. tensorbored/lazy.py +99 -0
  142. tensorbored/main.py +48 -0
  143. tensorbored/main_lib.py +62 -0
  144. tensorbored/manager.py +487 -0
  145. tensorbored/notebook.py +441 -0
  146. tensorbored/plugin_util.py +266 -0
  147. tensorbored/plugins/__init__.py +0 -0
  148. tensorbored/plugins/audio/__init__.py +0 -0
  149. tensorbored/plugins/audio/audio_plugin.py +229 -0
  150. tensorbored/plugins/audio/metadata.py +69 -0
  151. tensorbored/plugins/audio/plugin_data_pb2.py +37 -0
  152. tensorbored/plugins/audio/summary.py +230 -0
  153. tensorbored/plugins/audio/summary_v2.py +124 -0
  154. tensorbored/plugins/base_plugin.py +367 -0
  155. tensorbored/plugins/core/__init__.py +0 -0
  156. tensorbored/plugins/core/core_plugin.py +981 -0
  157. tensorbored/plugins/custom_scalar/__init__.py +0 -0
  158. tensorbored/plugins/custom_scalar/custom_scalars_plugin.py +320 -0
  159. tensorbored/plugins/custom_scalar/layout_pb2.py +85 -0
  160. tensorbored/plugins/custom_scalar/metadata.py +35 -0
  161. tensorbored/plugins/custom_scalar/summary.py +79 -0
  162. tensorbored/plugins/debugger_v2/__init__.py +0 -0
  163. tensorbored/plugins/debugger_v2/debug_data_multiplexer.py +631 -0
  164. tensorbored/plugins/debugger_v2/debug_data_provider.py +634 -0
  165. tensorbored/plugins/debugger_v2/debugger_v2_plugin.py +504 -0
  166. tensorbored/plugins/distribution/__init__.py +0 -0
  167. tensorbored/plugins/distribution/compressor.py +158 -0
  168. tensorbored/plugins/distribution/distributions_plugin.py +116 -0
  169. tensorbored/plugins/distribution/metadata.py +19 -0
  170. tensorbored/plugins/graph/__init__.py +0 -0
  171. tensorbored/plugins/graph/graph_util.py +129 -0
  172. tensorbored/plugins/graph/graphs_plugin.py +336 -0
  173. tensorbored/plugins/graph/keras_util.py +328 -0
  174. tensorbored/plugins/graph/metadata.py +42 -0
  175. tensorbored/plugins/histogram/__init__.py +0 -0
  176. tensorbored/plugins/histogram/histograms_plugin.py +144 -0
  177. tensorbored/plugins/histogram/metadata.py +63 -0
  178. tensorbored/plugins/histogram/plugin_data_pb2.py +34 -0
  179. tensorbored/plugins/histogram/summary.py +234 -0
  180. tensorbored/plugins/histogram/summary_v2.py +292 -0
  181. tensorbored/plugins/hparams/__init__.py +14 -0
  182. tensorbored/plugins/hparams/_keras.py +93 -0
  183. tensorbored/plugins/hparams/api.py +130 -0
  184. tensorbored/plugins/hparams/api_pb2.py +208 -0
  185. tensorbored/plugins/hparams/backend_context.py +606 -0
  186. tensorbored/plugins/hparams/download_data.py +158 -0
  187. tensorbored/plugins/hparams/error.py +26 -0
  188. tensorbored/plugins/hparams/get_experiment.py +71 -0
  189. tensorbored/plugins/hparams/hparams_plugin.py +206 -0
  190. tensorbored/plugins/hparams/hparams_util_pb2.py +69 -0
  191. tensorbored/plugins/hparams/json_format_compat.py +38 -0
  192. tensorbored/plugins/hparams/list_metric_evals.py +57 -0
  193. tensorbored/plugins/hparams/list_session_groups.py +1040 -0
  194. tensorbored/plugins/hparams/metadata.py +125 -0
  195. tensorbored/plugins/hparams/metrics.py +41 -0
  196. tensorbored/plugins/hparams/plugin_data_pb2.py +69 -0
  197. tensorbored/plugins/hparams/summary.py +205 -0
  198. tensorbored/plugins/hparams/summary_v2.py +597 -0
  199. tensorbored/plugins/image/__init__.py +0 -0
  200. tensorbored/plugins/image/images_plugin.py +232 -0
  201. tensorbored/plugins/image/metadata.py +65 -0
  202. tensorbored/plugins/image/plugin_data_pb2.py +34 -0
  203. tensorbored/plugins/image/summary.py +159 -0
  204. tensorbored/plugins/image/summary_v2.py +130 -0
  205. tensorbored/plugins/mesh/__init__.py +14 -0
  206. tensorbored/plugins/mesh/mesh_plugin.py +292 -0
  207. tensorbored/plugins/mesh/metadata.py +152 -0
  208. tensorbored/plugins/mesh/plugin_data_pb2.py +37 -0
  209. tensorbored/plugins/mesh/summary.py +251 -0
  210. tensorbored/plugins/mesh/summary_v2.py +214 -0
  211. tensorbored/plugins/metrics/__init__.py +0 -0
  212. tensorbored/plugins/metrics/metadata.py +17 -0
  213. tensorbored/plugins/metrics/metrics_plugin.py +623 -0
  214. tensorbored/plugins/pr_curve/__init__.py +0 -0
  215. tensorbored/plugins/pr_curve/metadata.py +75 -0
  216. tensorbored/plugins/pr_curve/plugin_data_pb2.py +34 -0
  217. tensorbored/plugins/pr_curve/pr_curves_plugin.py +241 -0
  218. tensorbored/plugins/pr_curve/summary.py +574 -0
  219. tensorbored/plugins/profile_redirect/__init__.py +0 -0
  220. tensorbored/plugins/profile_redirect/profile_redirect_plugin.py +49 -0
  221. tensorbored/plugins/projector/__init__.py +67 -0
  222. tensorbored/plugins/projector/metadata.py +26 -0
  223. tensorbored/plugins/projector/projector_config_pb2.py +54 -0
  224. tensorbored/plugins/projector/projector_plugin.py +795 -0
  225. tensorbored/plugins/projector/tf_projector_plugin/index.js +32 -0
  226. tensorbored/plugins/projector/tf_projector_plugin/projector_binary.html +524 -0
  227. tensorbored/plugins/projector/tf_projector_plugin/projector_binary.js +15536 -0
  228. tensorbored/plugins/scalar/__init__.py +0 -0
  229. tensorbored/plugins/scalar/metadata.py +60 -0
  230. tensorbored/plugins/scalar/plugin_data_pb2.py +34 -0
  231. tensorbored/plugins/scalar/scalars_plugin.py +181 -0
  232. tensorbored/plugins/scalar/summary.py +109 -0
  233. tensorbored/plugins/scalar/summary_v2.py +124 -0
  234. tensorbored/plugins/text/__init__.py +0 -0
  235. tensorbored/plugins/text/metadata.py +62 -0
  236. tensorbored/plugins/text/plugin_data_pb2.py +34 -0
  237. tensorbored/plugins/text/summary.py +114 -0
  238. tensorbored/plugins/text/summary_v2.py +124 -0
  239. tensorbored/plugins/text/text_plugin.py +288 -0
  240. tensorbored/plugins/wit_redirect/__init__.py +0 -0
  241. tensorbored/plugins/wit_redirect/wit_redirect_plugin.py +49 -0
  242. tensorbored/program.py +910 -0
  243. tensorbored/summary/__init__.py +35 -0
  244. tensorbored/summary/_output.py +124 -0
  245. tensorbored/summary/_tf/__init__.py +14 -0
  246. tensorbored/summary/_tf/summary/__init__.py +178 -0
  247. tensorbored/summary/_writer.py +105 -0
  248. tensorbored/summary/v1.py +51 -0
  249. tensorbored/summary/v2.py +25 -0
  250. tensorbored/summary/writer/__init__.py +13 -0
  251. tensorbored/summary/writer/event_file_writer.py +291 -0
  252. tensorbored/summary/writer/record_writer.py +50 -0
  253. tensorbored/util/__init__.py +0 -0
  254. tensorbored/util/encoder.py +116 -0
  255. tensorbored/util/grpc_util.py +311 -0
  256. tensorbored/util/img_mime_type_detector.py +40 -0
  257. tensorbored/util/io_util.py +20 -0
  258. tensorbored/util/lazy_tensor_creator.py +110 -0
  259. tensorbored/util/op_evaluator.py +104 -0
  260. tensorbored/util/platform_util.py +20 -0
  261. tensorbored/util/tb_logging.py +24 -0
  262. tensorbored/util/tensor_util.py +617 -0
  263. tensorbored/util/timing.py +122 -0
  264. tensorbored/version.py +21 -0
  265. tensorbored/webfiles.zip +0 -0
  266. tensorbored-2.21.0rc1769983804.dist-info/METADATA +49 -0
  267. tensorbored-2.21.0rc1769983804.dist-info/RECORD +271 -0
  268. tensorbored-2.21.0rc1769983804.dist-info/WHEEL +5 -0
  269. tensorbored-2.21.0rc1769983804.dist-info/entry_points.txt +6 -0
  270. tensorbored-2.21.0rc1769983804.dist-info/licenses/LICENSE +739 -0
  271. tensorbored-2.21.0rc1769983804.dist-info/top_level.txt +1 -0
@@ -0,0 +1,34 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: tensorbored/plugins/pr_curve/plugin_data.proto
4
+ """Generated protocol buffer code."""
5
+ from google.protobuf import descriptor as _descriptor
6
+ from google.protobuf import descriptor_pool as _descriptor_pool
7
+ from google.protobuf import message as _message
8
+ from google.protobuf import reflection as _reflection
9
+ from google.protobuf import symbol_database as _symbol_database
10
+ # @@protoc_insertion_point(imports)
11
+
12
+ _sym_db = _symbol_database.Default()
13
+
14
+
15
+
16
+
17
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n.tensorbored/plugins/pr_curve/plugin_data.proto\x12\x0btensorbored\"<\n\x11PrCurvePluginData\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12\x16\n\x0enum_thresholds\x18\x02 \x01(\rb\x06proto3')
18
+
19
+
20
+
21
+ _PRCURVEPLUGINDATA = DESCRIPTOR.message_types_by_name['PrCurvePluginData']
22
+ PrCurvePluginData = _reflection.GeneratedProtocolMessageType('PrCurvePluginData', (_message.Message,), {
23
+ 'DESCRIPTOR' : _PRCURVEPLUGINDATA,
24
+ '__module__' : 'tensorbored.plugins.pr_curve.plugin_data_pb2'
25
+ # @@protoc_insertion_point(class_scope:tensorbored.PrCurvePluginData)
26
+ })
27
+ _sym_db.RegisterMessage(PrCurvePluginData)
28
+
29
+ if _descriptor._USE_C_DESCRIPTORS == False:
30
+
31
+ DESCRIPTOR._options = None
32
+ _PRCURVEPLUGINDATA._serialized_start=63
33
+ _PRCURVEPLUGINDATA._serialized_end=123
34
+ # @@protoc_insertion_point(module_scope)
@@ -0,0 +1,241 @@
1
+ # Copyright 2017 The TensorFlow Authors. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+
16
+ import numpy as np
17
+ from werkzeug import wrappers
18
+
19
+ from tensorbored import plugin_util
20
+ from tensorbored.data import provider
21
+ from tensorbored.backend import http_util
22
+ from tensorbored.plugins import base_plugin
23
+ from tensorbored.plugins.pr_curve import metadata
24
+
25
+ _DEFAULT_DOWNSAMPLING = 100 # PR curves per time series
26
+
27
+
28
+ class PrCurvesPlugin(base_plugin.TBPlugin):
29
+ """A plugin that serves PR curves for individual classes."""
30
+
31
+ plugin_name = metadata.PLUGIN_NAME
32
+
33
+ def __init__(self, context):
34
+ """Instantiates a PrCurvesPlugin.
35
+
36
+ Args:
37
+ context: A base_plugin.TBContext instance. A magic container that
38
+ TensorBoard uses to make objects available to the plugin.
39
+ """
40
+ self._data_provider = context.data_provider
41
+ self._downsample_to = (context.sampling_hints or {}).get(
42
+ metadata.PLUGIN_NAME, _DEFAULT_DOWNSAMPLING
43
+ )
44
+ self._version_checker = plugin_util._MetadataVersionChecker(
45
+ data_kind="PR curve",
46
+ latest_known_version=0,
47
+ )
48
+
49
+ @wrappers.Request.application
50
+ def pr_curves_route(self, request):
51
+ """A route that returns a JSON mapping between runs and PR curve data.
52
+
53
+ Returns:
54
+ Given a tag and a comma-separated list of runs (both stored within GET
55
+ parameters), fetches a JSON object that maps between run name and objects
56
+ containing data required for PR curves for that run. Runs that either
57
+ cannot be found or that lack tags will be excluded from the response.
58
+ """
59
+ ctx = plugin_util.context(request.environ)
60
+ experiment = plugin_util.experiment_id(request.environ)
61
+
62
+ runs = request.args.getlist("run")
63
+ if not runs:
64
+ return http_util.Respond(
65
+ request, "No runs provided when fetching PR curve data", 400
66
+ )
67
+
68
+ tag = request.args.get("tag")
69
+ if not tag:
70
+ return http_util.Respond(
71
+ request, "No tag provided when fetching PR curve data", 400
72
+ )
73
+
74
+ try:
75
+ response = http_util.Respond(
76
+ request,
77
+ self.pr_curves_impl(ctx, experiment, runs, tag),
78
+ "application/json",
79
+ )
80
+ except ValueError as e:
81
+ return http_util.Respond(request, str(e), "text/plain", 400)
82
+
83
+ return response
84
+
85
+ def pr_curves_impl(self, ctx, experiment, runs, tag):
86
+ """Creates the JSON object for the PR curves response for a run-tag
87
+ combo.
88
+
89
+ Arguments:
90
+ runs: A list of runs to fetch the curves for.
91
+ tag: The tag to fetch the curves for.
92
+
93
+ Raises:
94
+ ValueError: If no PR curves could be fetched for a run and tag.
95
+
96
+ Returns:
97
+ The JSON object for the PR curves route response.
98
+ """
99
+ response_mapping = {}
100
+ rtf = provider.RunTagFilter(runs, [tag])
101
+ read_result = self._data_provider.read_tensors(
102
+ ctx,
103
+ experiment_id=experiment,
104
+ plugin_name=metadata.PLUGIN_NAME,
105
+ run_tag_filter=rtf,
106
+ downsample=self._downsample_to,
107
+ )
108
+ for run in runs:
109
+ data = read_result.get(run, {}).get(tag)
110
+ if data is None:
111
+ raise ValueError(
112
+ "No PR curves could be found for run %r and tag %r"
113
+ % (run, tag)
114
+ )
115
+ response_mapping[run] = [self._process_datum(d) for d in data]
116
+ return response_mapping
117
+
118
+ @wrappers.Request.application
119
+ def tags_route(self, request):
120
+ """A route (HTTP handler) that returns a response with tags.
121
+
122
+ Returns:
123
+ A response that contains a JSON object. The keys of the object
124
+ are all the runs. Each run is mapped to a (potentially empty) dictionary
125
+ whose keys are tags associated with run and whose values are metadata
126
+ (dictionaries).
127
+
128
+ The metadata dictionaries contain 2 keys:
129
+ - displayName: For the display name used atop visualizations in
130
+ TensorBoard.
131
+ - description: The description that appears near visualizations upon the
132
+ user hovering over a certain icon.
133
+ """
134
+ ctx = plugin_util.context(request.environ)
135
+ experiment = plugin_util.experiment_id(request.environ)
136
+ return http_util.Respond(
137
+ request, self.tags_impl(ctx, experiment), "application/json"
138
+ )
139
+
140
+ def tags_impl(self, ctx, experiment):
141
+ """Creates the JSON object for the tags route response.
142
+
143
+ Returns:
144
+ The JSON object for the tags route response.
145
+ """
146
+ mapping = self._data_provider.list_tensors(
147
+ ctx, experiment_id=experiment, plugin_name=metadata.PLUGIN_NAME
148
+ )
149
+ result = {run: {} for run in mapping}
150
+ for run, tag_to_time_series in mapping.items():
151
+ for tag, time_series in tag_to_time_series.items():
152
+ md = metadata.parse_plugin_metadata(time_series.plugin_content)
153
+ if not self._version_checker.ok(md.version, run, tag):
154
+ continue
155
+ result[run][tag] = {
156
+ "displayName": time_series.display_name,
157
+ "description": plugin_util.markdown_to_safe_html(
158
+ time_series.description
159
+ ),
160
+ }
161
+ return result
162
+
163
+ def get_plugin_apps(self):
164
+ """Gets all routes offered by the plugin.
165
+
166
+ Returns:
167
+ A dictionary mapping URL path to route that handles it.
168
+ """
169
+ return {
170
+ "/tags": self.tags_route,
171
+ "/pr_curves": self.pr_curves_route,
172
+ }
173
+
174
+ def is_active(self):
175
+ return False # `list_plugins` as called by TB core suffices
176
+
177
+ def frontend_metadata(self):
178
+ return base_plugin.FrontendMetadata(
179
+ element_name="tf-pr-curve-dashboard",
180
+ tab_name="PR Curves",
181
+ )
182
+
183
+ def _process_datum(self, datum):
184
+ """Converts a TensorDatum into a dict that encapsulates information on
185
+ it.
186
+
187
+ Args:
188
+ datum: The TensorDatum to convert.
189
+
190
+ Returns:
191
+ A JSON-able dictionary of PR curve data for 1 step.
192
+ """
193
+ return self._make_pr_entry(datum.step, datum.wall_time, datum.numpy)
194
+
195
+ def _make_pr_entry(self, step, wall_time, data_array):
196
+ """Creates an entry for PR curve data. Each entry corresponds to 1
197
+ step.
198
+
199
+ Args:
200
+ step: The step.
201
+ wall_time: The wall time.
202
+ data_array: A numpy array of PR curve data stored in the summary format.
203
+
204
+ Returns:
205
+ A PR curve entry.
206
+ """
207
+ tp_index = metadata.TRUE_POSITIVES_INDEX
208
+ fp_index = metadata.FALSE_POSITIVES_INDEX
209
+ tn_index = metadata.TRUE_NEGATIVES_INDEX
210
+ fn_index = metadata.FALSE_NEGATIVES_INDEX
211
+
212
+ # Trim entries for which TP + FP = 0 (precision is undefined) at the tail of
213
+ # the data.
214
+ positives = data_array[[tp_index, fp_index], :].astype(int).sum(axis=0)
215
+ # Searching from the end, find the farthest index where TP + FP = 0.
216
+ end_index_inclusive = len(positives) - 1
217
+ while end_index_inclusive > 0 and positives[end_index_inclusive] == 0:
218
+ end_index_inclusive -= 1
219
+ end_index = end_index_inclusive + 1
220
+ # Generate thresholds in [0, 1].
221
+ num_thresholds = data_array.shape[1]
222
+ thresholds = np.linspace(0.0, 1.0, num_thresholds)
223
+
224
+ true_positives = [int(v) for v in data_array[tp_index]]
225
+ false_positives = [int(v) for v in data_array[fp_index]]
226
+ true_negatives = [int(v) for v in data_array[tn_index]]
227
+ false_negatives = [int(v) for v in data_array[fn_index]]
228
+
229
+ return {
230
+ "wall_time": wall_time,
231
+ "step": step,
232
+ "precision": data_array[
233
+ metadata.PRECISION_INDEX, :end_index
234
+ ].tolist(),
235
+ "recall": data_array[metadata.RECALL_INDEX, :end_index].tolist(),
236
+ "true_positives": true_positives[:end_index],
237
+ "false_positives": false_positives[:end_index],
238
+ "true_negatives": true_negatives[:end_index],
239
+ "false_negatives": false_negatives[:end_index],
240
+ "thresholds": thresholds[:end_index].tolist(),
241
+ }