pyglove 0.4.5.dev202412100720__py3-none-any.whl → 0.4.5.dev202501250807__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 (118) hide show
  1. pyglove/core/__init__.py +40 -21
  2. pyglove/core/coding/__init__.py +42 -0
  3. pyglove/core/coding/errors.py +111 -0
  4. pyglove/core/coding/errors_test.py +98 -0
  5. pyglove/core/coding/execution.py +312 -0
  6. pyglove/core/coding/execution_test.py +333 -0
  7. pyglove/core/{object_utils/codegen.py → coding/function_generation.py} +10 -4
  8. pyglove/core/{object_utils/codegen_test.py → coding/function_generation_test.py} +5 -7
  9. pyglove/core/coding/parsing.py +153 -0
  10. pyglove/core/coding/parsing_test.py +150 -0
  11. pyglove/core/coding/permissions.py +100 -0
  12. pyglove/core/coding/permissions_test.py +93 -0
  13. pyglove/core/geno/base.py +53 -38
  14. pyglove/core/geno/base_test.py +2 -4
  15. pyglove/core/geno/categorical.py +36 -27
  16. pyglove/core/geno/custom.py +18 -15
  17. pyglove/core/geno/numerical.py +19 -16
  18. pyglove/core/geno/space.py +3 -4
  19. pyglove/core/hyper/base.py +6 -6
  20. pyglove/core/hyper/categorical.py +91 -52
  21. pyglove/core/hyper/custom.py +7 -7
  22. pyglove/core/hyper/custom_test.py +9 -10
  23. pyglove/core/hyper/derived.py +30 -22
  24. pyglove/core/hyper/derived_test.py +3 -5
  25. pyglove/core/hyper/dynamic_evaluation.py +3 -4
  26. pyglove/core/hyper/evolvable.py +57 -46
  27. pyglove/core/hyper/numerical.py +48 -24
  28. pyglove/core/hyper/numerical_test.py +9 -9
  29. pyglove/core/hyper/object_template.py +58 -46
  30. pyglove/core/logging_test.py +0 -2
  31. pyglove/core/patching/object_factory.py +4 -4
  32. pyglove/core/patching/pattern_based.py +4 -4
  33. pyglove/core/patching/rule_based.py +4 -3
  34. pyglove/core/symbolic/__init__.py +4 -0
  35. pyglove/core/symbolic/base.py +200 -136
  36. pyglove/core/symbolic/base_test.py +17 -19
  37. pyglove/core/symbolic/boilerplate.py +4 -5
  38. pyglove/core/symbolic/class_wrapper.py +10 -14
  39. pyglove/core/symbolic/class_wrapper_test.py +2 -2
  40. pyglove/core/symbolic/compounding.py +2 -2
  41. pyglove/core/symbolic/compounding_test.py +2 -4
  42. pyglove/core/symbolic/contextual_object.py +288 -0
  43. pyglove/core/symbolic/contextual_object_test.py +327 -0
  44. pyglove/core/symbolic/dict.py +115 -87
  45. pyglove/core/symbolic/dict_test.py +188 -131
  46. pyglove/core/symbolic/diff.py +12 -12
  47. pyglove/core/symbolic/flags.py +1 -1
  48. pyglove/core/symbolic/functor.py +16 -15
  49. pyglove/core/symbolic/functor_test.py +2 -4
  50. pyglove/core/symbolic/inferred.py +2 -2
  51. pyglove/core/symbolic/list.py +70 -47
  52. pyglove/core/symbolic/list_test.py +117 -98
  53. pyglove/core/symbolic/object.py +59 -58
  54. pyglove/core/symbolic/object_test.py +143 -90
  55. pyglove/core/symbolic/origin.py +5 -7
  56. pyglove/core/symbolic/pure_symbolic.py +4 -3
  57. pyglove/core/symbolic/ref.py +33 -16
  58. pyglove/core/symbolic/ref_test.py +17 -0
  59. pyglove/core/tuning/local_backend.py +2 -2
  60. pyglove/core/tuning/protocols.py +3 -3
  61. pyglove/core/typing/annotation_conversion.py +8 -3
  62. pyglove/core/typing/annotation_conversion_test.py +8 -0
  63. pyglove/core/typing/callable_ext.py +11 -13
  64. pyglove/core/typing/callable_signature.py +22 -19
  65. pyglove/core/typing/callable_signature_test.py +3 -5
  66. pyglove/core/typing/class_schema.py +93 -54
  67. pyglove/core/typing/class_schema_test.py +4 -5
  68. pyglove/core/typing/custom_typing.py +5 -4
  69. pyglove/core/typing/key_specs.py +5 -7
  70. pyglove/core/typing/key_specs_test.py +4 -4
  71. pyglove/core/typing/type_conversion.py +4 -5
  72. pyglove/core/typing/type_conversion_test.py +12 -12
  73. pyglove/core/typing/typed_missing.py +6 -7
  74. pyglove/core/typing/typed_missing_test.py +7 -8
  75. pyglove/core/typing/value_specs.py +287 -144
  76. pyglove/core/typing/value_specs_test.py +148 -25
  77. pyglove/core/utils/__init__.py +172 -0
  78. pyglove/core/{object_utils → utils}/common_traits.py +2 -2
  79. pyglove/core/{object_utils → utils}/common_traits_test.py +1 -3
  80. pyglove/core/utils/contextual.py +147 -0
  81. pyglove/core/utils/contextual_test.py +88 -0
  82. pyglove/core/{object_utils → utils}/docstr_utils_test.py +1 -3
  83. pyglove/core/{object_utils → utils}/error_utils.py +3 -3
  84. pyglove/core/{object_utils → utils}/error_utils_test.py +1 -1
  85. pyglove/core/{object_utils → utils}/formatting.py +1 -1
  86. pyglove/core/{object_utils → utils}/formatting_test.py +1 -2
  87. pyglove/core/{object_utils → utils}/hierarchical.py +23 -25
  88. pyglove/core/{object_utils → utils}/hierarchical_test.py +3 -5
  89. pyglove/core/{object_utils → utils}/json_conversion.py +1 -1
  90. pyglove/core/{object_utils → utils}/json_conversion_test.py +1 -3
  91. pyglove/core/{object_utils → utils}/missing.py +2 -2
  92. pyglove/core/{object_utils → utils}/missing_test.py +2 -4
  93. pyglove/core/utils/text_color.py +128 -0
  94. pyglove/core/utils/text_color_test.py +94 -0
  95. pyglove/core/{object_utils → utils}/thread_local_test.py +1 -3
  96. pyglove/core/{object_utils → utils}/timing.py +21 -10
  97. pyglove/core/{object_utils → utils}/timing_test.py +14 -12
  98. pyglove/core/{object_utils → utils}/value_location.py +2 -2
  99. pyglove/core/{object_utils → utils}/value_location_test.py +2 -4
  100. pyglove/core/views/base.py +25 -29
  101. pyglove/core/views/html/base.py +14 -15
  102. pyglove/core/views/html/controls/base.py +5 -5
  103. pyglove/core/views/html/controls/label.py +1 -1
  104. pyglove/core/views/html/controls/label_test.py +6 -6
  105. pyglove/core/views/html/controls/progress_bar.py +3 -5
  106. pyglove/core/views/html/controls/progress_bar_test.py +2 -2
  107. pyglove/core/views/html/controls/tab.py +80 -2
  108. pyglove/core/views/html/controls/tab_test.py +34 -1
  109. pyglove/core/views/html/tree_view.py +39 -37
  110. {pyglove-0.4.5.dev202412100720.dist-info → pyglove-0.4.5.dev202501250807.dist-info}/METADATA +17 -3
  111. pyglove-0.4.5.dev202501250807.dist-info/RECORD +218 -0
  112. {pyglove-0.4.5.dev202412100720.dist-info → pyglove-0.4.5.dev202501250807.dist-info}/WHEEL +1 -1
  113. pyglove/core/object_utils/__init__.py +0 -164
  114. pyglove-0.4.5.dev202412100720.dist-info/RECORD +0 -203
  115. /pyglove/core/{object_utils → utils}/docstr_utils.py +0 -0
  116. /pyglove/core/{object_utils → utils}/thread_local.py +0 -0
  117. {pyglove-0.4.5.dev202412100720.dist-info → pyglove-0.4.5.dev202501250807.dist-info}/LICENSE +0 -0
  118. {pyglove-0.4.5.dev202412100720.dist-info → pyglove-0.4.5.dev202501250807.dist-info}/top_level.txt +0 -0
@@ -13,7 +13,7 @@
13
13
  # limitations under the License.
14
14
  """Tab control."""
15
15
 
16
- from typing import Annotated, List, Literal, Union
16
+ from typing import Annotated, List, Literal, Optional, Union
17
17
 
18
18
  from pyglove.core.symbolic import flags as pg_flags
19
19
  from pyglove.core.symbolic import object as pg_object
@@ -44,6 +44,11 @@ class Tab(pg_object.Object):
44
44
  'The CSS classes of the tab.'
45
45
  ] = []
46
46
 
47
+ name: Annotated[
48
+ Optional[str],
49
+ 'An optional name that can be used to identify a tab under a tab control'
50
+ ] = None
51
+
47
52
 
48
53
  @pg_object.use_init_args(
49
54
  ['tabs', 'selected', 'tab_position', 'id', 'css_classes', 'styles']
@@ -87,10 +92,84 @@ class TabControl(HtmlControl):
87
92
  position='beforeend',
88
93
  )
89
94
 
95
+ def insert(self, index_or_name: Union[int, str], tab: Tab) -> None:
96
+ """Inserts a tab before a tab identified by index or name."""
97
+ index = self.indexof(index_or_name)
98
+ if index == -1:
99
+ raise ValueError(f'Tab not found: {index_or_name!r}')
100
+ with pg_flags.notify_on_change(False):
101
+ self.tabs.insert(index, tab)
102
+
103
+ self._insert_adjacent_html(
104
+ f"""
105
+ const elem = document.querySelectorAll('#{self.element_id()}-button-group > .tab-button')[{index}];
106
+ """,
107
+ self._tab_button(tab, len(self.tabs) - 1),
108
+ position='beforebegin',
109
+ )
110
+ self._insert_adjacent_html(
111
+ f"""
112
+ const elem = document.querySelectorAll('#{self.element_id()}-content-group > .tab-content')[{index}];
113
+ """,
114
+ self._tab_content(tab, len(self.tabs) - 1),
115
+ position='beforebegin',
116
+ )
117
+
118
+ def indexof(self, index_or_name: Union[int, str]) -> int:
119
+ if isinstance(index_or_name, int):
120
+ index = index_or_name
121
+ if index >= len(self.tabs):
122
+ return len(self.tabs) - 1
123
+ elif index < -len(self.tabs):
124
+ return -1
125
+ elif index < 0:
126
+ index = index + len(self.tabs)
127
+ return index
128
+ else:
129
+ name = index_or_name
130
+ assert isinstance(name, str), name
131
+ for i, tab in enumerate(self.tabs):
132
+ if tab.name == name:
133
+ return i
134
+ return -1
135
+
90
136
  def extend(self, tabs: List[Tab]) -> None:
91
137
  for tab in tabs:
92
138
  self.append(tab)
93
139
 
140
+ def select(
141
+ self,
142
+ index_or_name: Union[int, str, List[str]]) -> Union[int, str]:
143
+ """Selects a tab identified by an index or name.
144
+
145
+ Args:
146
+ index_or_name: The index or name of the tab to select. If a list of names
147
+ is provided, the first name in the list that is found will be selected.
148
+
149
+ Returns:
150
+ The index (if the index was provided) or name of the selected tab.
151
+ """
152
+ selected_name = index_or_name if isinstance(index_or_name, str) else None
153
+ index = -1
154
+ if isinstance(index_or_name, list):
155
+ for name in index_or_name:
156
+ index = self.indexof(name)
157
+ if index != -1:
158
+ selected_name = name
159
+ break
160
+ else:
161
+ index = self.indexof(index_or_name)
162
+ if index == -1:
163
+ raise ValueError(f'Tab not found: {index_or_name!r}')
164
+ self._sync_members(selected=index)
165
+ self._run_javascript(
166
+ f"""
167
+ const tabButtons = document.querySelectorAll('#{self.element_id()}-button-group > .tab-button');
168
+ tabButtons[{index}].click();
169
+ """
170
+ )
171
+ return selected_name or index
172
+
94
173
  def _to_html(self, **kwargs):
95
174
  return Html.element(
96
175
  'table',
@@ -141,7 +220,6 @@ class TabControl(HtmlControl):
141
220
  .tab-control {
142
221
  border-spacing: 0px;
143
222
  border-collapse: collapse;
144
- height: 100%;
145
223
  margin-top: 10px;
146
224
  }
147
225
  .tab-control td {
@@ -36,7 +36,7 @@ class TabControlTest(unittest.TestCase):
36
36
  elem_id = tab.element_id()
37
37
  self.assert_html_content(
38
38
  tab,
39
- f"""<table class="tab-control"><tr><td><div class="tab-button-group top" id="{elem_id}-button-group"><button class="tab-button selected foo" onclick="openTab(event, '{elem_id}', '{elem_id}-0')"><a class="label">foo</a></button><button class="tab-button" onclick="openTab(event, '{elem_id}', '{elem_id}-1')"><a class="label">bar</a></button></div></td></tr><tr><td><div class="tab-content-group top" id="{elem_id}-content-group"><div class="tab-content selected foo" id="{elem_id}-0"><h1>foo</h1></div><div class="tab-content" id="{elem_id}-1"><h1>bar</h1></div></div></td></tr></table>"""
39
+ f"""<table class="tab-control"><tr><td><div class="tab-button-group top" id="{elem_id}-button-group"><button class="tab-button selected foo" onclick="openTab(event, '{elem_id}', '{elem_id}-0')"><span class="label">foo</span></button><button class="tab-button" onclick="openTab(event, '{elem_id}', '{elem_id}-1')"><span class="label">bar</span></button></div></td></tr><tr><td><div class="tab-content-group top" id="{elem_id}-content-group"><div class="tab-content selected foo" id="{elem_id}-0"><h1>foo</h1></div><div class="tab-content" id="{elem_id}-1"><h1>bar</h1></div></div></td></tr></table>"""
40
40
  )
41
41
  with tab.track_scripts() as scripts:
42
42
  tab.extend([
@@ -48,6 +48,39 @@ class TabControlTest(unittest.TestCase):
48
48
  tab_lib.Tab('qux', base.Html('<h1>qux</h1>')),
49
49
  ])
50
50
  self.assertEqual(len(scripts), 6)
51
+ with tab.track_scripts() as scripts:
52
+ tab.insert(0, tab_lib.Tab('x', 'foo', name='x'))
53
+ self.assertEqual(len(scripts), 2)
54
+ self.assertEqual(len(tab.tabs), 5)
55
+ self.assertEqual(tab.indexof(-1), 4)
56
+ self.assertEqual(tab.indexof(3), 3)
57
+ self.assertEqual(tab.indexof(10), 4)
58
+ self.assertEqual(tab.indexof(-10), -1)
59
+ self.assertEqual(tab.indexof('x'), 0)
60
+ self.assertEqual(tab.indexof('y'), -1)
61
+ self.assertEqual(tab.select(0), 0)
62
+ self.assertEqual(tab.select('x'), 'x')
63
+ self.assertEqual(tab.select(['y', 'x']), 'x')
64
+
65
+ with self.assertRaisesRegex(ValueError, 'Tab not found'):
66
+ tab.select('y')
67
+ with self.assertRaisesRegex(ValueError, 'Tab not found'):
68
+ tab.insert('y', tab_lib.Tab('z', 'bar'))
69
+
70
+ with tab.track_scripts() as scripts:
71
+ tab.insert('x', tab_lib.Tab('y', 'bar'))
72
+ self.assertEqual(len(scripts), 2)
73
+ self.assertEqual(len(tab.tabs), 6)
74
+
75
+ with tab.track_scripts() as scripts:
76
+ tab.select(3)
77
+ self.assertEqual(len(scripts), 1)
78
+ self.assertEqual(tab.selected, 3)
79
+
80
+ with tab.track_scripts() as scripts:
81
+ tab.select('x')
82
+ self.assertEqual(len(scripts), 1)
83
+ self.assertEqual(tab.selected, 1)
51
84
 
52
85
 
53
86
  if __name__ == '__main__':
@@ -16,13 +16,13 @@
16
16
  import inspect
17
17
  from typing import Any, Callable, Dict, Iterable, Literal, Optional, Sequence, Tuple, Union
18
18
 
19
- from pyglove.core import object_utils
19
+ from pyglove.core import utils
20
20
  from pyglove.core.symbolic import base as pg_symbolic
21
21
  from pyglove.core.views.html import base
22
22
 
23
23
 
24
- KeyPath = object_utils.KeyPath
25
- KeyPathSet = object_utils.KeyPathSet
24
+ KeyPath = utils.KeyPath
25
+ KeyPathSet = utils.KeyPathSet
26
26
  Html = base.Html
27
27
  HtmlView = base.HtmlView
28
28
 
@@ -305,7 +305,7 @@ class HtmlTreeView(HtmlView):
305
305
 
306
306
  summary = self.summary(
307
307
  value,
308
- name=name,
308
+ name=f'[{name}]' if isinstance(name, int) else name,
309
309
  parent=parent,
310
310
  root_path=root_path,
311
311
  css_classes=css_classes,
@@ -622,7 +622,7 @@ class HtmlTreeView(HtmlView):
622
622
  color=summary_color[0],
623
623
  background_color=summary_color[1],
624
624
  ),
625
- ) if name else None,
625
+ ) if name is not None else None,
626
626
 
627
627
  # Summary title
628
628
  Html.element(
@@ -940,10 +940,13 @@ class HtmlTreeView(HtmlView):
940
940
  return repr(value)
941
941
  else:
942
942
  return value
943
- return object_utils.format(
943
+ return utils.format(
944
944
  value,
945
- compact=False, verbose=False, hide_default_values=True,
946
- python_format=True, use_inferred=True,
945
+ compact=False,
946
+ verbose=False,
947
+ hide_default_values=True,
948
+ python_format=True,
949
+ use_inferred=True,
947
950
  max_bytes_len=64,
948
951
  )
949
952
  return Html.element(
@@ -1257,7 +1260,7 @@ class HtmlTreeView(HtmlView):
1257
1260
  del parent, kwargs
1258
1261
  if content is None:
1259
1262
  content = Html.escape(
1260
- object_utils.format(
1263
+ utils.format(
1261
1264
  value,
1262
1265
  root_path=root_path,
1263
1266
  compact=False,
@@ -1302,7 +1305,7 @@ class HtmlTreeView(HtmlView):
1302
1305
  class_name = f'{value.__name__}-class'
1303
1306
  else:
1304
1307
  class_name = type(value).__name__
1305
- return object_utils.camel_to_snake(class_name, '-')
1308
+ return utils.camel_to_snake(class_name, '-')
1306
1309
 
1307
1310
  @staticmethod
1308
1311
  def init_uncollapse(
@@ -1341,40 +1344,40 @@ class HtmlTreeView(HtmlView):
1341
1344
  @staticmethod
1342
1345
  def get_passthrough_kwargs(
1343
1346
  *,
1344
- enable_summary: Optional[bool] = object_utils.MISSING_VALUE,
1345
- enable_summary_for_str: bool = object_utils.MISSING_VALUE,
1346
- max_summary_len_for_str: int = object_utils.MISSING_VALUE,
1347
- enable_summary_tooltip: bool = object_utils.MISSING_VALUE,
1347
+ enable_summary: Optional[bool] = utils.MISSING_VALUE,
1348
+ enable_summary_for_str: bool = utils.MISSING_VALUE,
1349
+ max_summary_len_for_str: int = utils.MISSING_VALUE,
1350
+ enable_summary_tooltip: bool = utils.MISSING_VALUE,
1348
1351
  key_style: Union[
1349
1352
  Literal['label', 'summary'],
1350
- Callable[[KeyPath, Any, Any], Literal['label', 'summary']]
1351
- ] = object_utils.MISSING_VALUE,
1353
+ Callable[[KeyPath, Any, Any], Literal['label', 'summary']],
1354
+ ] = utils.MISSING_VALUE,
1352
1355
  key_color: Union[
1353
1356
  Tuple[Optional[str], Optional[str]],
1354
- Callable[[KeyPath, Any, Any], Tuple[Optional[str], Optional[str]]]
1355
- ] = object_utils.MISSING_VALUE,
1357
+ Callable[[KeyPath, Any, Any], Tuple[Optional[str], Optional[str]]],
1358
+ ] = utils.MISSING_VALUE,
1356
1359
  include_keys: Union[
1357
1360
  Iterable[Union[int, str]],
1358
1361
  Callable[[KeyPath, Any, Any], Iterable[Union[int, str]]],
1359
- None
1360
- ] = object_utils.MISSING_VALUE,
1362
+ None,
1363
+ ] = utils.MISSING_VALUE,
1361
1364
  exclude_keys: Union[
1362
1365
  Iterable[Union[int, str]],
1363
1366
  Callable[[KeyPath, Any, Any], Iterable[Union[int, str]]],
1364
- None
1365
- ] = object_utils.MISSING_VALUE,
1366
- enable_key_tooltip: bool = object_utils.MISSING_VALUE,
1367
+ None,
1368
+ ] = utils.MISSING_VALUE,
1369
+ enable_key_tooltip: bool = utils.MISSING_VALUE,
1367
1370
  uncollapse: Union[
1368
1371
  KeyPathSet, base.NodeFilter, None
1369
- ] = object_utils.MISSING_VALUE,
1370
- extra_flags: Optional[Dict[str, Any]] = object_utils.MISSING_VALUE,
1371
- highlight: Optional[base.NodeFilter] = object_utils.MISSING_VALUE,
1372
- lowlight: Optional[base.NodeFilter] = object_utils.MISSING_VALUE,
1373
- debug: bool = object_utils.MISSING_VALUE,
1372
+ ] = utils.MISSING_VALUE,
1373
+ extra_flags: Optional[Dict[str, Any]] = utils.MISSING_VALUE,
1374
+ highlight: Optional[base.NodeFilter] = utils.MISSING_VALUE,
1375
+ lowlight: Optional[base.NodeFilter] = utils.MISSING_VALUE,
1376
+ debug: bool = utils.MISSING_VALUE,
1374
1377
  remove: Optional[Iterable[str]] = None,
1375
1378
  **kwargs,
1376
1379
  ):
1377
- # pytype: enable=annotation-type-mismatch
1380
+ # pytype: enable=annotation-type-mismatch
1378
1381
  """Gets the rendering arguments to pass through to the child nodes."""
1379
1382
  del kwargs
1380
1383
  passthrough_kwargs = dict(
@@ -1386,23 +1389,22 @@ class HtmlTreeView(HtmlView):
1386
1389
  key_style=key_style,
1387
1390
  key_color=key_color,
1388
1391
  include_keys=(
1389
- include_keys if callable(include_keys)
1390
- else object_utils.MISSING_VALUE
1392
+ include_keys if callable(include_keys) else utils.MISSING_VALUE
1391
1393
  ),
1392
1394
  exclude_keys=(
1393
- exclude_keys if callable(exclude_keys)
1394
- else object_utils.MISSING_VALUE
1395
+ exclude_keys if callable(exclude_keys) else utils.MISSING_VALUE
1395
1396
  ),
1396
1397
  uncollapse=uncollapse,
1397
1398
  highlight=highlight,
1398
1399
  lowlight=lowlight,
1399
1400
  extra_flags=extra_flags,
1400
- debug=debug
1401
+ debug=debug,
1401
1402
  )
1402
1403
  # Filter out missing values.
1403
1404
  passthrough_kwargs = {
1404
- k: v for k, v in passthrough_kwargs.items()
1405
- if v is not object_utils.MISSING_VALUE
1405
+ k: v
1406
+ for k, v in passthrough_kwargs.items()
1407
+ if v is not utils.MISSING_VALUE
1406
1408
  }
1407
1409
  if remove:
1408
1410
  return {
@@ -1467,7 +1469,7 @@ class HtmlTreeView(HtmlView):
1467
1469
  )
1468
1470
 
1469
1471
  # Deep hierarchy merge.
1470
- return object_utils.merge_tree(call_kwargs, overriden_kwargs)
1472
+ return utils.merge_tree(call_kwargs, overriden_kwargs)
1471
1473
 
1472
1474
  @staticmethod
1473
1475
  def merge_uncollapse(
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: pyglove
3
- Version: 0.4.5.dev202412100720
3
+ Version: 0.4.5.dev202501250807
4
4
  Summary: PyGlove: A library for manipulating Python objects.
5
5
  Home-page: https://github.com/google/pyglove
6
6
  Author: PyGlove Authors
@@ -22,6 +22,17 @@ Classifier: Topic :: Software Development :: Libraries
22
22
  Description-Content-Type: text/markdown
23
23
  License-File: LICENSE
24
24
  Requires-Dist: docstring-parser>=0.12
25
+ Requires-Dist: termcolor>=1.1.0
26
+ Dynamic: author
27
+ Dynamic: author-email
28
+ Dynamic: classifier
29
+ Dynamic: description
30
+ Dynamic: description-content-type
31
+ Dynamic: home-page
32
+ Dynamic: keywords
33
+ Dynamic: license
34
+ Dynamic: requires-dist
35
+ Dynamic: summary
25
36
 
26
37
  <div align="center">
27
38
  <img src="https://raw.githubusercontent.com/google/pyglove/main/docs/_static/logo_light.svg#gh-light-mode-only" width="320px" alt="logo"></img>
@@ -72,7 +83,7 @@ It's commonly used in:
72
83
  PyGlove has been [published](https://proceedings.neurips.cc/paper/2020/file/012a91467f210472fab4e11359bbfef6-Paper.pdf)
73
84
  at NeurIPS 2020. It is widely used within [Alphabet](https://abc.xyz/), including Google Research, Google Cloud, Youtube and Waymo.
74
85
 
75
- PyGlove is developed by Daiyi Peng and colleagues in [Google Brain Team](https://research.google/teams/brain/).
86
+ PyGlove is developed by Daiyi Peng and colleagues at [Google Brain](https://research.google/teams/brain/).
76
87
 
77
88
 
78
89
  ## Hello PyGlove
@@ -145,6 +156,9 @@ pip install pyglove --pre
145
156
  * [Interactive SVG: Components for Direct Manipulation](https://github.com/google/pyglove/blob/main/docs/notebooks/python/interactive_svg.ipynb)
146
157
  * [Where is the Duck: Developing Context-aware Component](https://github.com/google/pyglove/blob/main/docs/notebooks/python/where_is_the_duck.ipynb)
147
158
 
159
+ * Interactive Programming
160
+ * [Viewing PyGlove objects in HTML](https://colab.research.google.com/github/google/pyglove/blob/main/docs/notebooks/gui/html_view.ipynb)
161
+
148
162
  ## Citing PyGlove
149
163
 
150
164
  ```
@@ -0,0 +1,218 @@
1
+ pyglove/__init__.py,sha256=YPUWALRDu4QuI7N3TUmVaVr513hUt0qXrjY582I1q5c,1352
2
+ pyglove/core/__init__.py,sha256=BF-8v1D5lTBAo4vlpDt0qyOG9NQ71oh_UfthBVrPaN4,9614
3
+ pyglove/core/logging.py,sha256=Sr5nLyUQmc4CAEYAq8qbP3ghpjmpz2sOuhq2A0tgQ6I,2456
4
+ pyglove/core/logging_test.py,sha256=3z_c6wnxbqDbwUmSOAZzeDPXvzoweYL5QHUQVMJ5Xgo,1917
5
+ pyglove/core/coding/__init__.py,sha256=tuHIg19ZchtkOQbdFVTVLkUpBa5f1eo66XtnKw3lcIU,1645
6
+ pyglove/core/coding/errors.py,sha256=vstDb52lk5uJef2k_0_1dqvGv8eDYNq37IrqjGJ-cNc,3302
7
+ pyglove/core/coding/errors_test.py,sha256=fwOR8vLiRvLadubsccyE19hLHj-kThlCQt88qmUYk9M,2311
8
+ pyglove/core/coding/execution.py,sha256=Rq-rFPkecd70-wLnK-51L_rK01nd3J5SKfQidg3_qvY,10883
9
+ pyglove/core/coding/execution_test.py,sha256=vTMLOCs7ceVi-XEz7-0CdPeoKqswBUQ26SzTqthcU4c,8397
10
+ pyglove/core/coding/function_generation.py,sha256=2fCqcdcizVYtGYE6QGpw5m1kuH9Fp0OF4BjyJ4en6tw,1636
11
+ pyglove/core/coding/function_generation_test.py,sha256=kbSwmZF8Vog0R0OTSpuzPblEbMLoRJ1TigeIrwDhHS8,2161
12
+ pyglove/core/coding/parsing.py,sha256=JXTdzFS9iB5-JVi9_-rDFORj_EZEtr7In8HBGHp09no,4084
13
+ pyglove/core/coding/parsing_test.py,sha256=XB-bd2Huj36GKmvmFjp3jRwr7NqhRd1Ag-AGNxr_ekk,3575
14
+ pyglove/core/coding/permissions.py,sha256=kd_gO1csXHpySsvazxmKBVe7dfLpX5GquRtu9q4ToRE,2729
15
+ pyglove/core/coding/permissions_test.py,sha256=GTEnCClTZWdFmqHk3U5P8mzOmIINtUeEkeJZApnaWVI,2935
16
+ pyglove/core/detouring/__init__.py,sha256=ck_n2VSuU31HNVYQkbG4Zvnx90mNYtSVc2StN3rXbU8,1891
17
+ pyglove/core/detouring/class_detour.py,sha256=ejuUr7UfRU3l9PrDxD0dpKmt2iqdDU6liHdebA1jEfQ,13312
18
+ pyglove/core/detouring/class_detour_test.py,sha256=9aAK6qPiT0_HJe5oUpqMVTpoHv0wr_h6c4gWYKMTJoM,5507
19
+ pyglove/core/geno/__init__.py,sha256=cWA583n7JpsGUkGtoTlMMX83tNS7geRBKFsoPEvFZ4A,4767
20
+ pyglove/core/geno/base.py,sha256=4CjZ1j-LGd6q2qootGcLMVuX8nTDxH0LvA1KVSI9qbE,64498
21
+ pyglove/core/geno/base_test.py,sha256=f0pMpfXsjAqFOBtlOxof3jRX0jLvXpzowk9szcr6bgY,38512
22
+ pyglove/core/geno/categorical.py,sha256=t1bS129D5iF4CZ0yVHaFDXy2T6ujv5F5HHDc_0X36z8,28015
23
+ pyglove/core/geno/categorical_test.py,sha256=23UkOPhDSvonxxM_1YoBYp723Xim-BmBzywl612CRyg,18444
24
+ pyglove/core/geno/custom.py,sha256=U4_fdTBmHUTZp3uyNI8Kz4kPKj7X0EJ9d55T376p4Vk,7044
25
+ pyglove/core/geno/custom_test.py,sha256=kjHcKRYA-Uaw6AUnOMhVjBs9is37mUS8X3VdZHXxr0k,5938
26
+ pyglove/core/geno/deduping.py,sha256=SmfrY8uz4zUuKInaWSKIB0vm_6CVWgqrfhiwragxM7I,5205
27
+ pyglove/core/geno/deduping_test.py,sha256=zP9XGbfw4tmHgBMv8xP2EMZ2-AJc2UomAP_Ud1aSr-c,4583
28
+ pyglove/core/geno/dna_generator.py,sha256=BwHnjdbVPP_ic04481dhm2pCcFoRmH8PB1o884W8aUs,8959
29
+ pyglove/core/geno/dna_generator_test.py,sha256=vdQ7H8Zg7pvhjJyUbUaK6z8JIB8QeJ5puzo03FN6kwA,4731
30
+ pyglove/core/geno/numerical.py,sha256=AKevY8HALo2Tu4qEjuuRhhv-l1vFS_b4jre2MZQ3odg,8237
31
+ pyglove/core/geno/numerical_test.py,sha256=zkJocfknUZsXL9LwkY4zdVVqO7FbEeCZgohRzlLxET0,5796
32
+ pyglove/core/geno/random.py,sha256=xs03iphDBO9f2FJJkbsRj6piky12g17v-i1drlWODu4,2619
33
+ pyglove/core/geno/random_test.py,sha256=0Ctnm86w3nDcd7QL_XRdqJKrcTl46NpgRQ7TSzPY8ac,4941
34
+ pyglove/core/geno/space.py,sha256=CWhGr-tomZystiLtxCfDbJ9sFrIN6LhkfgdAs1PRHpk,9315
35
+ pyglove/core/geno/space_test.py,sha256=zpCUbe98Qy0rUM1TZIOG6sKQM_2-cglz9UPVIYcPQuk,16554
36
+ pyglove/core/geno/sweeping.py,sha256=VcvEm-IQ5DVUhDUBBXF2w-hcjLc5FJ8_OjItO0TbHuw,1322
37
+ pyglove/core/geno/sweeping_test.py,sha256=Ex3LlH-RyM1aPSbhrtEmkQAScUkL1GWyZGUKxrEAeE8,2709
38
+ pyglove/core/hyper/__init__.py,sha256=igGe4vYAXbdpwjuRCRijfwQBLYLFJk4LPKWlcpg3HhM,5020
39
+ pyglove/core/hyper/base.py,sha256=kYuvUq33CbLMsNVC7uGZ8IHa1h2yYa1KSol9ktisEgg,7029
40
+ pyglove/core/hyper/categorical.py,sha256=6BpObEaaCKrQsvih3CkdN7ZwK0bj1hMUBLnum8r1kAc,23385
41
+ pyglove/core/hyper/categorical_test.py,sha256=Gg41Jubi_1lOhwrXbCiBmXFdYcmZmPpA_X4MqItOOa4,13533
42
+ pyglove/core/hyper/custom.py,sha256=eMWVCq8d0m2tXkwlazGNQ9q_Bi_gbtIotVX4t6Cr_r4,5719
43
+ pyglove/core/hyper/custom_test.py,sha256=4ayyNCiY9T34h_Nfr5ZL6psUtgvuJv9i_ubmkOs796I,3522
44
+ pyglove/core/hyper/derived.py,sha256=IW2QjPR0m0oMb_Ij8lbJ1qLwI2j_wBYKrgQC6TuAEo4,6066
45
+ pyglove/core/hyper/derived_test.py,sha256=H3-lzB_LebKf7oIR_6Jj51APkNkBzcqCz9KbAa-haKM,4221
46
+ pyglove/core/hyper/dynamic_evaluation.py,sha256=ixuqeis6WGL276nWTCZktv7EWHWqzG4H1iy3xtAT6js,22853
47
+ pyglove/core/hyper/dynamic_evaluation_test.py,sha256=87Xc3Ci8mMWFiV4PGG7ZT8B6TqhTJH8tUMTWMYkyKzU,17149
48
+ pyglove/core/hyper/evolvable.py,sha256=AH59oETvS8ox7xmTYOEMiSX-NxbUFrMXUvkx7cdSxCs,10156
49
+ pyglove/core/hyper/evolvable_test.py,sha256=TYDDr69ykdmqzRFo4McxVzwOV_tU4j_WVZu-_6X3M8Q,7914
50
+ pyglove/core/hyper/iter.py,sha256=cCRirBBqw-cYCavLU463hch-anh4aXjqzACZ_9cUw-Y,6921
51
+ pyglove/core/hyper/iter_test.py,sha256=KQ75ZdRDg8LCBHsVzNMPeZ67ArTNqWajUrcQIgolun8,3906
52
+ pyglove/core/hyper/numerical.py,sha256=1zBTEXuLeKfrcZHkRMJpYE6RSBGA6KLQ29tkzUNC05U,8371
53
+ pyglove/core/hyper/numerical_test.py,sha256=UWdH55Bok7bghYDLJOGsgOwV_2LNkhj1AmFwNYeJRY8,4232
54
+ pyglove/core/hyper/object_template.py,sha256=YPALTV0mMULa7iuqnryTpA2wMsdyFZ_6g-R525asAr8,22222
55
+ pyglove/core/hyper/object_template_test.py,sha256=TEFX7LIqUvdCdJILnK_gP5xIgNJKzRnioUF0CGVBzcY,9105
56
+ pyglove/core/io/__init__.py,sha256=4ZT1a595DqQuLTNYc2JP_eCp_KesXvHmKRkr777bzpg,785
57
+ pyglove/core/io/file_system.py,sha256=ps5SVckgFsrZk4xCu37iXkeIrvydLzLs9NsF14VzEcM,13390
58
+ pyglove/core/io/file_system_test.py,sha256=FX0ySuh_Xcg1RO68do7ikD4pvslKUzfSpwZ6P4wIP7c,8691
59
+ pyglove/core/io/sequence.py,sha256=7QWMGXPtJzHyGPgqkT3yJ01FxKJ4mP4lF5HRDiIHNbQ,8165
60
+ pyglove/core/io/sequence_test.py,sha256=6tmnS7frBuDR8ussT5jugeh23TDsPDrDnbfxHh81Gy4,3891
61
+ pyglove/core/patching/__init__.py,sha256=C1Q1cWPV74YL3eXbzGvc-8aPw1DR8EK6lRhQYDCwHek,2059
62
+ pyglove/core/patching/object_factory.py,sha256=fsiqFET9LWQV4xZXJrPFu3j5IRovSi_zrJba7KiYGZ0,3368
63
+ pyglove/core/patching/object_factory_test.py,sha256=UXWVxrlgtsKm9Q-CnzJMcKKeFvFi9qQ1GG4RgWt0S8o,3973
64
+ pyglove/core/patching/pattern_based.py,sha256=UtSNB-ARNqVjXwZovjVi84QEoXUGLLBTgLgjq2rNg3w,7851
65
+ pyglove/core/patching/pattern_based_test.py,sha256=PW1EcVfsFPB6wtgwg3s4dzvigWn3b5S8eMNGo0SJiZ0,2771
66
+ pyglove/core/patching/rule_based.py,sha256=JAQp8mWeIOxwIdqusA3GmXia-fxQhQsxbUTmE329wF8,17038
67
+ pyglove/core/patching/rule_based_test.py,sha256=qfy0ILmczV_LMHWEnwo2y079OrJsGYO0nKxSZdmIUcI,18782
68
+ pyglove/core/symbolic/__init__.py,sha256=JZvyaEcS1QxA8MaAGANBWMmRTQcGk_6F0kjFxjokJqg,6002
69
+ pyglove/core/symbolic/base.py,sha256=aSZPSk7v3Niv6D1HfL_JEEXfI-U1cQnTxJxY9wXem54,77627
70
+ pyglove/core/symbolic/base_test.py,sha256=yASIHIuWiUB1jf4nN-Y4XOjyvr8eQfRpr7s_1LZsu78,7188
71
+ pyglove/core/symbolic/boilerplate.py,sha256=sQ3G25r5bo_UmIdjreL4jkAuQCXIHVlvUfGjjkNod6Y,5955
72
+ pyglove/core/symbolic/boilerplate_test.py,sha256=1CZ1W6kq3l-3tpaknhGFa04V18bO7vPzis5qzWnxHEs,5252
73
+ pyglove/core/symbolic/class_wrapper.py,sha256=xQiMh5vFlOQ76tbqsF5UWEghvU4d9UmvbNqIyBccNHg,22869
74
+ pyglove/core/symbolic/class_wrapper_test.py,sha256=GPgeLefIPj9hiD0ib6z2LyOm6A3O2f4-JHpE7dgfsNM,21644
75
+ pyglove/core/symbolic/compounding.py,sha256=gvOodZ2gWHA0jNdwt8yvnRsPkHQDXDb5s88Uwp6DAqs,11703
76
+ pyglove/core/symbolic/compounding_test.py,sha256=hOzrIROvajUTtPm0SUbEsEV4C1bXanhAoHinHrjZoXw,8320
77
+ pyglove/core/symbolic/contextual_object.py,sha256=ar9Q_0P0HHbDf8kLHpS8GFZEMCRuCCB6DP18iGItiiw,9146
78
+ pyglove/core/symbolic/contextual_object_test.py,sha256=wA5xfIhEHOC9qE3bbiA59CAPxWs9AVPaNiKEoprkWpQ,10209
79
+ pyglove/core/symbolic/dict.py,sha256=7IxKSjUsGulUcNk3xqQnJ2ubGNUbqcc0ZFe8cKiigKA,36931
80
+ pyglove/core/symbolic/dict_test.py,sha256=3MATsFw9Ci0jVPbAT2ivKVZ3PCnBBBvbkMWKgpgl-Fk,72915
81
+ pyglove/core/symbolic/diff.py,sha256=zHfED0Bbq8G_HWNPj3vrOCWzt_062rFhx3BMlpCb9oo,16282
82
+ pyglove/core/symbolic/diff_test.py,sha256=EDiGHqqKhi-NeMxr-bgjBEqlquee_4l_0IM6hgAb9Mg,29400
83
+ pyglove/core/symbolic/flags.py,sha256=a_8VZEhJjkt-zk1v3jCjlfNe7vEG2FqFfAC4l-gKrzg,12090
84
+ pyglove/core/symbolic/flags_test.py,sha256=JDJcm6dYTlnktFsdNFjQszmHXf9bZnhrXMxi_jUiKUA,5483
85
+ pyglove/core/symbolic/functor.py,sha256=6g1eBZSfSB6lp5NSXtAMw--xRhAfkYipSJh2LCVPNTM,26723
86
+ pyglove/core/symbolic/functor_test.py,sha256=9c5_7OBKNVNbYC7IaVQB6c5ks2v00qQ36oivyWiBbKA,31798
87
+ pyglove/core/symbolic/inferred.py,sha256=E4zgphg6NNZad9Fl3jdHQOMZeqEp9XHq5OUYqXEmwZQ,3178
88
+ pyglove/core/symbolic/inferred_test.py,sha256=G6uPykONcChvs6vZujXHSWaYfjewLTVBscMqzzKNty0,1270
89
+ pyglove/core/symbolic/list.py,sha256=z8goU0ntd-Q5ADaCGiKsJwPhdRdQb0Kd_p-ZekXaLy4,30303
90
+ pyglove/core/symbolic/list_test.py,sha256=IAyFQ48nyczKUcPNZFKHBkX5oh7Xuxbnv3rRkONhbHw,61146
91
+ pyglove/core/symbolic/object.py,sha256=T1HtGYNA1qLp0iTZVmgR90nfMLuOQVNopkBPYw_j8B8,42021
92
+ pyglove/core/symbolic/object_test.py,sha256=vIL_ymGpPPXamIljEBdufpw-p82kTeWNy2IbgzGQjig,93811
93
+ pyglove/core/symbolic/origin.py,sha256=OSWMKjvPcISOXrzuX3lCQC8m_qaGl-9INsIB81erUnU,6124
94
+ pyglove/core/symbolic/origin_test.py,sha256=dU_ZGrGDetM_lYVMn3wQO0d367_t_t8eESe3NrKPBNE,3159
95
+ pyglove/core/symbolic/pure_symbolic.py,sha256=pvo15gn35_KLiGW_XrTjlx5ddmHbwpLr93VgbQ59uQ8,3231
96
+ pyglove/core/symbolic/ref.py,sha256=qRN-0xm9pWlszel5qE-HAhQCkgB0umi_pDlzDhBWPUA,8513
97
+ pyglove/core/symbolic/ref_test.py,sha256=0687hClfR5G5_VKuRlwjJGVQ2MC74ADFWklDaZ3aEVI,6294
98
+ pyglove/core/symbolic/symbolize.py,sha256=ohID9-V8QiFe7OMpPlRomiqUnKBVMpypd8ZuMuHaa4s,6582
99
+ pyglove/core/symbolic/symbolize_test.py,sha256=o7bRfMhGc6uw2FIH8arE99-bPb3i0YixcHYyiP-QqeQ,6487
100
+ pyglove/core/tuning/__init__.py,sha256=JtXpjsBto01fLf55hZ1dSx-CEZUyVQeyRP9AMH_hw8c,2229
101
+ pyglove/core/tuning/backend.py,sha256=GwbBI9nHYYe5h6iDuhqRtD-Msjmmc7wFtagxW0rTypU,5597
102
+ pyglove/core/tuning/backend_test.py,sha256=vyfUi509-hbF5uYk-I0FsoniPFBXmobQVl-4d0YPIWY,1999
103
+ pyglove/core/tuning/early_stopping.py,sha256=v7pI2Jv6KfYJoNVmcQsRv3HUbH0b-lrs3wduED8Y7kk,2179
104
+ pyglove/core/tuning/local_backend.py,sha256=1Aflwu4PDpQltAvAoXvAeLYrh3Ormd5yJAk8kkb8uAU,13818
105
+ pyglove/core/tuning/protocols.py,sha256=10Iukt1rqh05caURTZffSsb3CcHo7epBQnNtnyMyziE,16844
106
+ pyglove/core/tuning/protocols_test.py,sha256=Cbzvz3EacaW2sbm1rTSQXEt_VucMoQbeQ6AeN-GV5Vc,1883
107
+ pyglove/core/tuning/sample.py,sha256=UzsCY8kiqnzH_mR94zLXhOloyvvEwfmBWluBjmefUFA,12975
108
+ pyglove/core/tuning/sample_test.py,sha256=JqwDPy3EPC_VjU9dipk90jj1kovZB3Zb9hAjAlZ-U1U,17551
109
+ pyglove/core/typing/__init__.py,sha256=Z_jnwUvDQ3wA16a5TiuWbuof9hW0Xm6YoTNwgG4QGqI,14395
110
+ pyglove/core/typing/annotated.py,sha256=llaajIDj9GK-4kUGJoO4JsHU6ESPOra2SZ-jG6xmsOQ,3203
111
+ pyglove/core/typing/annotated_test.py,sha256=p1qid3R-jeiOTTxOVq6hXW8XFvn-h1cUzJWISPst2l8,2484
112
+ pyglove/core/typing/annotation_conversion.py,sha256=OhBQRCaSh7zJKfb_IQKF7sD32E_YNTekz00qZaSIVnw,9007
113
+ pyglove/core/typing/annotation_conversion_test.py,sha256=tZheqbLWbr76WBIDOplLtY3yznMc4m9u7KCznWEJdEs,11660
114
+ pyglove/core/typing/callable_ext.py,sha256=PiBQWPeUAH7Lgmf2xKCZqgK7N0OSrTdbnEkV8Ph31OA,9127
115
+ pyglove/core/typing/callable_ext_test.py,sha256=TnWKU4_ZjvpbHZFtFHgFvCMDiCos8VmLlODcM_7Xg8M,10156
116
+ pyglove/core/typing/callable_signature.py,sha256=DRpt7aShfkn8pb3SCiZzS_27eHbkQ_d2UB8BUhJjs0Q,27176
117
+ pyglove/core/typing/callable_signature_test.py,sha256=iQmHsKPhJPQlMikDhEyxKyq7yWyXI9juKCLYgKhrH3U,25145
118
+ pyglove/core/typing/class_schema.py,sha256=xfPrLYpqntejMLvSL-7rNiXHTQOgAr2kmxWeR890qLs,53940
119
+ pyglove/core/typing/class_schema_test.py,sha256=UWANPqhu9v_FHNo3cVe05P-bO-HliBmrSBywKrlWep0,29204
120
+ pyglove/core/typing/custom_typing.py,sha256=qdnIKHWNt5kZAAFdpQXra8bBu6RljMbbJ_YDG2mhAUA,2205
121
+ pyglove/core/typing/inspect.py,sha256=Tp2rYqRvMFvL0NzkJo4p04_hQSF__Eip8RduhEaSFfE,7046
122
+ pyglove/core/typing/inspect_test.py,sha256=vJ-MZvSPjzzA7sDY6XIeMeX_aob_6VjGQcIIn_MJl64,8826
123
+ pyglove/core/typing/key_specs.py,sha256=-7xjCuUGoQgD0sMafsRFNlw3S4f1r-7t5OO4ev5bbeI,9225
124
+ pyglove/core/typing/key_specs_test.py,sha256=5zornpyHMAYoRaG8KDXHiQ3obu9UfRp3399lBeUNTPk,6499
125
+ pyglove/core/typing/pytype_support.py,sha256=lyX11WVbCwoOi5tTQ90pEOS-yvo_6iEi7Lxbp-nXu2A,2069
126
+ pyglove/core/typing/type_conversion.py,sha256=6diZrxNsvSyTLLNdoCqcWatWmhh7kZOiKCesyg-nEYQ,5167
127
+ pyglove/core/typing/type_conversion_test.py,sha256=qwNeotCb96vdUELVtA-0Ee19Jm4yOnPZuSIz5nyEbGo,5203
128
+ pyglove/core/typing/typed_missing.py,sha256=-l1omAu0jBZv5BnsFYXBqfvQwVBnmPh_X1wcIKD9bOk,2734
129
+ pyglove/core/typing/typed_missing_test.py,sha256=TCNsb1SRpFaVdxYn2mB_yaLuja8w5Qn5NP7uGiZVBWs,2301
130
+ pyglove/core/typing/value_specs.py,sha256=Yxdrz4aURMBrtqUW4to-2Vptc6Z6oqQrLyMBiAZt2bc,102302
131
+ pyglove/core/typing/value_specs_test.py,sha256=MsScWDRaN_8pfRDO9MCp9HdUHVm_8wHWyKorWVSnhE4,127165
132
+ pyglove/core/utils/__init__.py,sha256=I2bRTzigU7qJVEATGlLUFkYzkiCBBCCEwrQyhsrRNmI,8602
133
+ pyglove/core/utils/common_traits.py,sha256=PWxOgPhG5H60ZwfO8xNAEGRjFUqqDZQBWQYomOfvdy8,3640
134
+ pyglove/core/utils/common_traits_test.py,sha256=DIuZB_1xfmeTVfWnGOguDQcDAM_iGgBOe8C-5CsIqBc,1122
135
+ pyglove/core/utils/contextual.py,sha256=RxBQkDM2gB6QwZj_2oMels6oh-zQPGJJlinZbbqHuYQ,5148
136
+ pyglove/core/utils/contextual_test.py,sha256=OOcthquVyAekTqt1RyYcEMHaockMIokpbv4pSf13Nzs,3252
137
+ pyglove/core/utils/docstr_utils.py,sha256=5BY40kXozPKVGOB0eN8jy1P5_GHIzqFJ9FXAu_kzxaw,5119
138
+ pyglove/core/utils/docstr_utils_test.py,sha256=i33VT6zHXEuIIJ4PPg1bVSfaYSnUsC8yST_NfpT-Uds,4228
139
+ pyglove/core/utils/error_utils.py,sha256=ACIqtq4hsWrV00Gxd1OyeHCI-obGBR6J3H9VI1Y9clM,5780
140
+ pyglove/core/utils/error_utils_test.py,sha256=zwTzmyJupIW8GeF3Z-gnpVNdhdTYwzmO0ClODqbR4bU,4164
141
+ pyglove/core/utils/formatting.py,sha256=qa5XEGRwKEEqEKtyEYZNdsKBxIQFGBTofFW29aQT8hU,14987
142
+ pyglove/core/utils/formatting_test.py,sha256=OQboyCwhgvhw4EcCj1q-O53XG404c0XMK51rCl2_q2M,13533
143
+ pyglove/core/utils/hierarchical.py,sha256=jwB-0FhqOspAymAkvJphRhPTQEsoShmKupCZpU3Vip4,19690
144
+ pyglove/core/utils/hierarchical_test.py,sha256=f382DMJPa_bavJGGQDjuw-hWcafUg5bkQCPX-nbzeiI,21077
145
+ pyglove/core/utils/json_conversion.py,sha256=I0mWn87aAEdaAok9nDvT0ZrmplU40eNmEDUAaNIzZXk,26590
146
+ pyglove/core/utils/json_conversion_test.py,sha256=zA_cy7ixVL3sTf6i9BCXMlSH56Aa3JnjHnjyqYJ_9XU,11845
147
+ pyglove/core/utils/missing.py,sha256=9gslt1lXd1qSEIuAFxUWu30oD-YdYcnm13eau1S9uqY,1445
148
+ pyglove/core/utils/missing_test.py,sha256=D6-FuVEwCyJemUiPLcwLmwyptqI5Bx0Pfipc2juhKSE,1335
149
+ pyglove/core/utils/text_color.py,sha256=xcCTCxY2qFNZs_jismMGus8scEXKBpYGAhpAgnz-MHk,4112
150
+ pyglove/core/utils/text_color_test.py,sha256=3HtZpUB5XPr7A_5Fg4ZSMfNWeDRiQgSzmg9b1tctMI4,2801
151
+ pyglove/core/utils/thread_local.py,sha256=i-CnyY3VREtLfAj4_JndBnsKuQLIgwG29ma8dAyRxbI,4839
152
+ pyglove/core/utils/thread_local_test.py,sha256=AOqsdNsA-cYMvJckqxb25ql3Y5kDW0qLfBW1cl85Bnw,6757
153
+ pyglove/core/utils/timing.py,sha256=gnHCA2IJ9DZ3Y0vb8ItB1Ap8ss8j_zN0OMUAdhoGy2Y,7550
154
+ pyglove/core/utils/timing_test.py,sha256=t_awsYs5SqEO3_2u6HDbVxRcSxSfHsE4zMbFG-1ErZw,5011
155
+ pyglove/core/utils/value_location.py,sha256=wAryIwQeEfrRddyGRk-KbLA7dnNDLhL-dSyFI9wIG5U,26756
156
+ pyglove/core/utils/value_location_test.py,sha256=X6Gih3IoYugziwXWH8VGz5bPeb3Kq0CfZxwbNVIsZJo,21338
157
+ pyglove/core/views/__init__.py,sha256=gll9ZBRYz4p_-LWOdzSR2a6UTWcJ8nR430trrP0yLCU,967
158
+ pyglove/core/views/base.py,sha256=VVWlkyUPvZoNlcwMpuxt-AujGnuIJPS4Ym-jGBX0g9I,26262
159
+ pyglove/core/views/base_test.py,sha256=UKbr_1TANOAnP7V5ICGF0UEkunfSaHiJ4nXZXhA0SaU,16642
160
+ pyglove/core/views/html/__init__.py,sha256=Ff51MK1AKdzLM0kczTqLR3fRlJSJLDaFUdVyCu_7-eY,1085
161
+ pyglove/core/views/html/base.py,sha256=LcRU8Lot_y1RW6fziaCQVVE0gWP0aVzIcO8v71JaX0E,15002
162
+ pyglove/core/views/html/base_test.py,sha256=5RVPNm4YTamTFu6yXA1p2lJg3JHQBKNNBoL977qBZvE,22782
163
+ pyglove/core/views/html/tree_view.py,sha256=MkQXtNKn88j9NXdhluKbIaHswjh1QtQoPv-CUwUfCNk,52062
164
+ pyglove/core/views/html/tree_view_test.py,sha256=whUorrw0eiDaZsEzGB2B3EN3wx0vLFuNEe2RBU03GeU,74707
165
+ pyglove/core/views/html/controls/__init__.py,sha256=61qs5pnJPCTECCGBtkbNfIV3KcCu7cxfVNBEtIg1lMo,1318
166
+ pyglove/core/views/html/controls/base.py,sha256=aSYFEo-I6Yc28TMk1ZFw_Za85xMo8EvgfQLKISsLSe8,7675
167
+ pyglove/core/views/html/controls/label.py,sha256=dXcYId7ASuNqkzKsWMjJ0iQtecoSsUlUgynNNQZOFAM,5681
168
+ pyglove/core/views/html/controls/label_test.py,sha256=uUYqBSZ0XLOuv4qG20gmoZzA3RxYxpfqT63K0azHEfU,5162
169
+ pyglove/core/views/html/controls/progress_bar.py,sha256=0an0eCbPCDjwrR58C16NwLZ-cf3Oy0wQerLsiNgGHmk,5235
170
+ pyglove/core/views/html/controls/progress_bar_test.py,sha256=kKOJDZQtBPkmNcgIBrRQkNNzcTm51ojuFBTRUEDSsp0,3506
171
+ pyglove/core/views/html/controls/tab.py,sha256=ELyroRb3qKQ8ULM_BMq2j-tqV_mnHOvrYv2kbuIe65o,9430
172
+ pyglove/core/views/html/controls/tab_test.py,sha256=wr1msQjZHxp1TFKQ5LxtppY2Dys736JCmmEJ8WBC3Fo,3531
173
+ pyglove/core/views/html/controls/tooltip.py,sha256=01BbpuM1twf3FYMUT09_Ck5JSSONe8QE9RmyA9nhCnU,3092
174
+ pyglove/core/views/html/controls/tooltip_test.py,sha256=17BY-WmZKpz9tCbySPcwG6KJyfeE_MeMyKxtfxorBQ0,3194
175
+ pyglove/ext/__init__.py,sha256=3jp8cJvKW6PENOZlmVAbT0w-GBRn_kjhc0wDX3XjpOE,755
176
+ pyglove/ext/early_stopping/__init__.py,sha256=_xkT3K_MycFuF3k2N74sfr9FPFcXMD3pfv5vuc4Tx5M,1116
177
+ pyglove/ext/early_stopping/base.py,sha256=KolexwKDAXhI9iY7hoaDO1mbc3TA4gDn0UifxURwbk0,2358
178
+ pyglove/ext/early_stopping/base_test.py,sha256=fMCYq5_Ysz1tq5QvNBv0v_cDnDrbNspIP9mdMKf-7jM,2796
179
+ pyglove/ext/early_stopping/step_wise.py,sha256=P99Z2hODmCNBnR3iVOOj2NCCwveSH6h5VnwEv_UABvI,10117
180
+ pyglove/ext/early_stopping/step_wise_test.py,sha256=I9DDMrCpDwIWC6mV9w2pDypnrwYnWjg6QXTFNT13cts,9032
181
+ pyglove/ext/evolution/__init__.py,sha256=lAf4NyxUZRt39kMFFoW_i8-ExigJXakG1-sUREW7jkQ,3214
182
+ pyglove/ext/evolution/base.py,sha256=I27qJja6MErMs3SyrlBYvmDQ4eTq9dY9RVpscKlwReQ,50090
183
+ pyglove/ext/evolution/base_test.py,sha256=yIw4YS60c_MvDj71QkoxX5Y2NLZgGc_KzT_NuHMCXMk,29936
184
+ pyglove/ext/evolution/hill_climb.py,sha256=Bysi2u4KEM7d9CIPcnvKKgEQHttkaKFkI8xlrNOkBB8,1688
185
+ pyglove/ext/evolution/hill_climb_test.py,sha256=7snzopGFRgkryNXiDVcHMhtVz6LXLZCOH_tz_t15b4I,3110
186
+ pyglove/ext/evolution/mutators.py,sha256=ZkNmIf9B2KRP3H7UfML7nkjUYPPgOkm5Fe1kaJQ8W5I,10062
187
+ pyglove/ext/evolution/mutators_test.py,sha256=F7HYeptAsATHbDHG_pEiX-Kz8V3_yGlFLo_DYhXyH-4,17975
188
+ pyglove/ext/evolution/neat.py,sha256=i-O9TEr4a1zfI3IKfDKBmUEYjoj6I_RJcnKdfPR00Qo,8162
189
+ pyglove/ext/evolution/neat_test.py,sha256=qbNCf5dkLOwJtplfRUCVoE-r0OtVM7n_WzzInp54w9c,4474
190
+ pyglove/ext/evolution/nsga2.py,sha256=gmRj84PjjnWbmB4GTVqZidr5nOleAav7Za5OoLKDiDQ,6427
191
+ pyglove/ext/evolution/nsga2_test.py,sha256=YDHZ27jDOoFa-b6He3KUD9OR-0tZ0eh4CQt9_u89ym0,8430
192
+ pyglove/ext/evolution/recombinators.py,sha256=uA9yXp9I3A75rYzzKTIxlh4V4gW_u1fO_uWRMYhsHys,40354
193
+ pyglove/ext/evolution/recombinators_test.py,sha256=xHp9ZMLxot7Mx0tSB3PGle5Y0Bud-4n61A3aQJZY_SM,19290
194
+ pyglove/ext/evolution/regularized_evolution.py,sha256=kSILZHmlThoszJ5Q07ZDm0K9mnE19DAbZ9yn_1ADiDU,1954
195
+ pyglove/ext/evolution/regularized_evolution_test.py,sha256=g1cAoHrx3I-ZTe1wuPdM5f2TMOvOT4jMsoCPyPSWboQ,3472
196
+ pyglove/ext/evolution/selectors.py,sha256=VFgA4p645LE1jXoE-DZx4x9Ka_SrUAhn8AkHsczSl4s,12102
197
+ pyglove/ext/evolution/selectors_test.py,sha256=Cqs4g9UvKRM0sBlpiqcZu7_HXKoPMpTaApfoCodazFo,7714
198
+ pyglove/ext/evolution/where.py,sha256=yfjjEpf9N2PFsLx1WHT-5gpTq53iMgqEcLXjpm7J3Ts,4761
199
+ pyglove/ext/evolution/where_test.py,sha256=nswc__l4r1JFl40xKU0rIt0sH9Iud1Odltj171W6zvw,1931
200
+ pyglove/ext/mutfun/__init__.py,sha256=LaGc13KS90EV5hCK3ChWYvQEvf4yEkdjNeYHXZ0HljA,4959
201
+ pyglove/ext/mutfun/base.py,sha256=tLNJzbHnct1sun9nbfwe8ZeACMZMdOPU1HrMmGvwl1A,16703
202
+ pyglove/ext/mutfun/base_test.py,sha256=Yst9JGydOXl6EpjNJ8UmLXPacin_5863FKgNWacMkv8,21312
203
+ pyglove/ext/mutfun/basic_ops.py,sha256=DfwjLI0rN0g6X8HpkEPNZX5y0d1NPCb6P-FxQzeNUlI,5667
204
+ pyglove/ext/mutfun/basic_ops_test.py,sha256=NcRTUWG6WmL6EljsOk-of7-xHaRGRjAbjW3I6huyd8o,11244
205
+ pyglove/ext/scalars/__init__.py,sha256=6RZ3w8_SgN0pl20JM4M_k93r9vEUNGR9MbmCx5-lBvQ,2749
206
+ pyglove/ext/scalars/base.py,sha256=Q6a93-RsocyXYRKtj4A9PQPnmPujRHy5RcLU5fvIw4U,7102
207
+ pyglove/ext/scalars/base_test.py,sha256=yKTseS5PlTqwzfbkvSGgoQyJbhmpG0hRQFS3io6eoZQ,3095
208
+ pyglove/ext/scalars/maths.py,sha256=pLGWwWc8pLtndSwHGYbwr4XWp2AOs0Cuf63wpifmvDY,3188
209
+ pyglove/ext/scalars/maths_test.py,sha256=v_VKkcReUrSAuWjBCb0O5XHlA9PD5I-MnfFlpHiNCSg,3923
210
+ pyglove/ext/scalars/randoms.py,sha256=LkMIIx7lOq_lvJvVS3BrgWGuWl7Pi91-lA-O8x_gZsg,4198
211
+ pyglove/ext/scalars/randoms_test.py,sha256=nEhiqarg8l_5EOucp59CYrpO2uKxS1pe0hmBdZUzRNM,2000
212
+ pyglove/ext/scalars/step_wise.py,sha256=IDw3tuTpv0KVh7AN44W43zqm1-E0HWPUlytWOQC9w3Y,3789
213
+ pyglove/ext/scalars/step_wise_test.py,sha256=TL1vJ19xVx2t5HKuyIzGoogF7N3Rm8YhLE6JF7i0iy8,2540
214
+ pyglove-0.4.5.dev202501250807.dist-info/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
215
+ pyglove-0.4.5.dev202501250807.dist-info/METADATA,sha256=VApc7ubJdme2te9Hs69f0gj9OPho4m4aCTE2RElX27M,7067
216
+ pyglove-0.4.5.dev202501250807.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
217
+ pyglove-0.4.5.dev202501250807.dist-info/top_level.txt,sha256=wITzJSKcj8GZUkbq-MvUQnFadkiuAv_qv5qQMw0fIow,8
218
+ pyglove-0.4.5.dev202501250807.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.6.0)
2
+ Generator: setuptools (75.8.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5