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.
- pyglove/core/__init__.py +40 -21
- pyglove/core/coding/__init__.py +42 -0
- pyglove/core/coding/errors.py +111 -0
- pyglove/core/coding/errors_test.py +98 -0
- pyglove/core/coding/execution.py +312 -0
- pyglove/core/coding/execution_test.py +333 -0
- pyglove/core/{object_utils/codegen.py → coding/function_generation.py} +10 -4
- pyglove/core/{object_utils/codegen_test.py → coding/function_generation_test.py} +5 -7
- pyglove/core/coding/parsing.py +153 -0
- pyglove/core/coding/parsing_test.py +150 -0
- pyglove/core/coding/permissions.py +100 -0
- pyglove/core/coding/permissions_test.py +93 -0
- pyglove/core/geno/base.py +53 -38
- pyglove/core/geno/base_test.py +2 -4
- pyglove/core/geno/categorical.py +36 -27
- pyglove/core/geno/custom.py +18 -15
- pyglove/core/geno/numerical.py +19 -16
- pyglove/core/geno/space.py +3 -4
- pyglove/core/hyper/base.py +6 -6
- pyglove/core/hyper/categorical.py +91 -52
- pyglove/core/hyper/custom.py +7 -7
- pyglove/core/hyper/custom_test.py +9 -10
- pyglove/core/hyper/derived.py +30 -22
- pyglove/core/hyper/derived_test.py +3 -5
- pyglove/core/hyper/dynamic_evaluation.py +3 -4
- pyglove/core/hyper/evolvable.py +57 -46
- pyglove/core/hyper/numerical.py +48 -24
- pyglove/core/hyper/numerical_test.py +9 -9
- pyglove/core/hyper/object_template.py +58 -46
- pyglove/core/logging_test.py +0 -2
- pyglove/core/patching/object_factory.py +4 -4
- pyglove/core/patching/pattern_based.py +4 -4
- pyglove/core/patching/rule_based.py +4 -3
- pyglove/core/symbolic/__init__.py +4 -0
- pyglove/core/symbolic/base.py +200 -136
- pyglove/core/symbolic/base_test.py +17 -19
- pyglove/core/symbolic/boilerplate.py +4 -5
- pyglove/core/symbolic/class_wrapper.py +10 -14
- pyglove/core/symbolic/class_wrapper_test.py +2 -2
- pyglove/core/symbolic/compounding.py +2 -2
- pyglove/core/symbolic/compounding_test.py +2 -4
- pyglove/core/symbolic/contextual_object.py +288 -0
- pyglove/core/symbolic/contextual_object_test.py +327 -0
- pyglove/core/symbolic/dict.py +115 -87
- pyglove/core/symbolic/dict_test.py +188 -131
- pyglove/core/symbolic/diff.py +12 -12
- pyglove/core/symbolic/flags.py +1 -1
- pyglove/core/symbolic/functor.py +16 -15
- pyglove/core/symbolic/functor_test.py +2 -4
- pyglove/core/symbolic/inferred.py +2 -2
- pyglove/core/symbolic/list.py +70 -47
- pyglove/core/symbolic/list_test.py +117 -98
- pyglove/core/symbolic/object.py +59 -58
- pyglove/core/symbolic/object_test.py +143 -90
- pyglove/core/symbolic/origin.py +5 -7
- pyglove/core/symbolic/pure_symbolic.py +4 -3
- pyglove/core/symbolic/ref.py +33 -16
- pyglove/core/symbolic/ref_test.py +17 -0
- pyglove/core/tuning/local_backend.py +2 -2
- pyglove/core/tuning/protocols.py +3 -3
- pyglove/core/typing/annotation_conversion.py +8 -3
- pyglove/core/typing/annotation_conversion_test.py +8 -0
- pyglove/core/typing/callable_ext.py +11 -13
- pyglove/core/typing/callable_signature.py +22 -19
- pyglove/core/typing/callable_signature_test.py +3 -5
- pyglove/core/typing/class_schema.py +93 -54
- pyglove/core/typing/class_schema_test.py +4 -5
- pyglove/core/typing/custom_typing.py +5 -4
- pyglove/core/typing/key_specs.py +5 -7
- pyglove/core/typing/key_specs_test.py +4 -4
- pyglove/core/typing/type_conversion.py +4 -5
- pyglove/core/typing/type_conversion_test.py +12 -12
- pyglove/core/typing/typed_missing.py +6 -7
- pyglove/core/typing/typed_missing_test.py +7 -8
- pyglove/core/typing/value_specs.py +287 -144
- pyglove/core/typing/value_specs_test.py +148 -25
- pyglove/core/utils/__init__.py +172 -0
- pyglove/core/{object_utils → utils}/common_traits.py +2 -2
- pyglove/core/{object_utils → utils}/common_traits_test.py +1 -3
- pyglove/core/utils/contextual.py +147 -0
- pyglove/core/utils/contextual_test.py +88 -0
- pyglove/core/{object_utils → utils}/docstr_utils_test.py +1 -3
- pyglove/core/{object_utils → utils}/error_utils.py +3 -3
- pyglove/core/{object_utils → utils}/error_utils_test.py +1 -1
- pyglove/core/{object_utils → utils}/formatting.py +1 -1
- pyglove/core/{object_utils → utils}/formatting_test.py +1 -2
- pyglove/core/{object_utils → utils}/hierarchical.py +23 -25
- pyglove/core/{object_utils → utils}/hierarchical_test.py +3 -5
- pyglove/core/{object_utils → utils}/json_conversion.py +1 -1
- pyglove/core/{object_utils → utils}/json_conversion_test.py +1 -3
- pyglove/core/{object_utils → utils}/missing.py +2 -2
- pyglove/core/{object_utils → utils}/missing_test.py +2 -4
- pyglove/core/utils/text_color.py +128 -0
- pyglove/core/utils/text_color_test.py +94 -0
- pyglove/core/{object_utils → utils}/thread_local_test.py +1 -3
- pyglove/core/{object_utils → utils}/timing.py +21 -10
- pyglove/core/{object_utils → utils}/timing_test.py +14 -12
- pyglove/core/{object_utils → utils}/value_location.py +2 -2
- pyglove/core/{object_utils → utils}/value_location_test.py +2 -4
- pyglove/core/views/base.py +25 -29
- pyglove/core/views/html/base.py +14 -15
- pyglove/core/views/html/controls/base.py +5 -5
- pyglove/core/views/html/controls/label.py +1 -1
- pyglove/core/views/html/controls/label_test.py +6 -6
- pyglove/core/views/html/controls/progress_bar.py +3 -5
- pyglove/core/views/html/controls/progress_bar_test.py +2 -2
- pyglove/core/views/html/controls/tab.py +80 -2
- pyglove/core/views/html/controls/tab_test.py +34 -1
- pyglove/core/views/html/tree_view.py +39 -37
- {pyglove-0.4.5.dev202412100720.dist-info → pyglove-0.4.5.dev202501250807.dist-info}/METADATA +17 -3
- pyglove-0.4.5.dev202501250807.dist-info/RECORD +218 -0
- {pyglove-0.4.5.dev202412100720.dist-info → pyglove-0.4.5.dev202501250807.dist-info}/WHEEL +1 -1
- pyglove/core/object_utils/__init__.py +0 -164
- pyglove-0.4.5.dev202412100720.dist-info/RECORD +0 -203
- /pyglove/core/{object_utils → utils}/docstr_utils.py +0 -0
- /pyglove/core/{object_utils → utils}/thread_local.py +0 -0
- {pyglove-0.4.5.dev202412100720.dist-info → pyglove-0.4.5.dev202501250807.dist-info}/LICENSE +0 -0
- {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')"><
|
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
|
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 =
|
25
|
-
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
|
943
|
+
return utils.format(
|
944
944
|
value,
|
945
|
-
compact=False,
|
946
|
-
|
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
|
-
|
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
|
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] =
|
1345
|
-
enable_summary_for_str: bool =
|
1346
|
-
max_summary_len_for_str: int =
|
1347
|
-
enable_summary_tooltip: bool =
|
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
|
-
] =
|
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
|
-
] =
|
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
|
-
] =
|
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
|
-
] =
|
1366
|
-
enable_key_tooltip: bool =
|
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
|
-
] =
|
1370
|
-
extra_flags: Optional[Dict[str, Any]] =
|
1371
|
-
highlight: Optional[base.NodeFilter] =
|
1372
|
-
lowlight: Optional[base.NodeFilter] =
|
1373
|
-
debug: bool =
|
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
|
-
|
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
|
1405
|
-
|
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
|
1472
|
+
return utils.merge_tree(call_kwargs, overriden_kwargs)
|
1471
1473
|
|
1472
1474
|
@staticmethod
|
1473
1475
|
def merge_uncollapse(
|
{pyglove-0.4.5.dev202412100720.dist-info → pyglove-0.4.5.dev202501250807.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.2
|
2
2
|
Name: pyglove
|
3
|
-
Version: 0.4.5.
|
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
|
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,,
|