pyglove 0.5.0.dev202510200810__py3-none-any.whl → 0.5.0.dev202512280810__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.

Potentially problematic release.


This version of pyglove might be problematic. Click here for more details.

Files changed (34) hide show
  1. pyglove/core/geno/base.py +7 -3
  2. pyglove/core/io/file_system.py +452 -2
  3. pyglove/core/io/file_system_test.py +442 -0
  4. pyglove/core/symbolic/__init__.py +7 -0
  5. pyglove/core/symbolic/base.py +89 -35
  6. pyglove/core/symbolic/base_test.py +3 -3
  7. pyglove/core/symbolic/dict.py +31 -12
  8. pyglove/core/symbolic/dict_test.py +49 -0
  9. pyglove/core/symbolic/list.py +17 -3
  10. pyglove/core/symbolic/list_test.py +24 -2
  11. pyglove/core/symbolic/object.py +3 -1
  12. pyglove/core/symbolic/object_test.py +13 -10
  13. pyglove/core/symbolic/ref.py +19 -7
  14. pyglove/core/symbolic/ref_test.py +94 -7
  15. pyglove/core/symbolic/unknown_symbols.py +147 -0
  16. pyglove/core/symbolic/unknown_symbols_test.py +100 -0
  17. pyglove/core/typing/annotation_conversion.py +8 -1
  18. pyglove/core/typing/annotation_conversion_test.py +14 -19
  19. pyglove/core/typing/class_schema.py +4 -1
  20. pyglove/core/typing/type_conversion.py +17 -3
  21. pyglove/core/typing/type_conversion_test.py +7 -2
  22. pyglove/core/typing/value_specs.py +5 -1
  23. pyglove/core/typing/value_specs_test.py +5 -0
  24. pyglove/core/utils/__init__.py +1 -0
  25. pyglove/core/utils/json_conversion.py +360 -63
  26. pyglove/core/utils/json_conversion_test.py +146 -13
  27. pyglove/core/views/html/controls/tab.py +33 -0
  28. pyglove/core/views/html/controls/tab_test.py +37 -0
  29. pyglove/ext/evolution/base_test.py +1 -1
  30. {pyglove-0.5.0.dev202510200810.dist-info → pyglove-0.5.0.dev202512280810.dist-info}/METADATA +8 -1
  31. {pyglove-0.5.0.dev202510200810.dist-info → pyglove-0.5.0.dev202512280810.dist-info}/RECORD +34 -32
  32. {pyglove-0.5.0.dev202510200810.dist-info → pyglove-0.5.0.dev202512280810.dist-info}/WHEEL +0 -0
  33. {pyglove-0.5.0.dev202510200810.dist-info → pyglove-0.5.0.dev202512280810.dist-info}/licenses/LICENSE +0 -0
  34. {pyglove-0.5.0.dev202510200810.dist-info → pyglove-0.5.0.dev202512280810.dist-info}/top_level.txt +0 -0
@@ -14,6 +14,7 @@
14
14
  import abc
15
15
  import typing
16
16
  import unittest
17
+ from pyglove.core.symbolic import unknown_symbols
17
18
  from pyglove.core.typing import inspect as pg_inspect
18
19
  from pyglove.core.utils import json_conversion
19
20
 
@@ -156,7 +157,7 @@ class JSONConvertibleTest(unittest.TestCase):
156
157
  def __init__(self, x=None):
157
158
  self.x = x
158
159
 
159
- def to_json(self):
160
+ def to_json(self, **kwargs):
160
161
  return T.to_json_dict(dict(x=(self.x, None)), exclude_default=True)
161
162
 
162
163
  def __eq__(self, other):
@@ -202,7 +203,7 @@ class JSONConvertibleTest(unittest.TestCase):
202
203
  def __init__(self, x=None):
203
204
  self.x = x
204
205
 
205
- def to_json(self):
206
+ def to_json(self, **kwargs):
206
207
  return self.to_json_dict(
207
208
  dict(x=(self.x, None)), exclude_default=True
208
209
  )
@@ -215,7 +216,6 @@ class JSONConvertibleTest(unittest.TestCase):
215
216
 
216
217
  def test_json_conversion_with_auto_import(self):
217
218
  json_dict = json_conversion.to_json(self.CustomJsonConvertible(1))
218
-
219
219
  with self.assertRaisesRegex(
220
220
  TypeError, 'Type name .* is not registered'):
221
221
  json_conversion.from_json(json_dict, auto_import=False)
@@ -272,7 +272,8 @@ class JSONConvertibleTest(unittest.TestCase):
272
272
  self.assert_conversion_is(typing.List[typing.List[int]])
273
273
  self.assert_conversion_is(typing.Annotated[int, 'abc'])
274
274
  self.assert_conversion_is(typing.Dict[str, typing.Any])
275
- self.assert_conversion_is(typing.Union[int, str])
275
+ # From Python 3.14, union no longer preserves `is` identity.
276
+ self.assert_conversion_equal(typing.Union[int, str])
276
277
  self.assert_conversion_is(typing.Sequence[int])
277
278
  self.assert_conversion_is(typing.Set[int])
278
279
  self.assert_conversion_is(typing.FrozenSet[int])
@@ -308,6 +309,19 @@ class JSONConvertibleTest(unittest.TestCase):
308
309
  self.assertEqual(baz1(1), 2)
309
310
  self.assertEqual(baz1(1, 2), 3)
310
311
 
312
+ with self.assertRaisesRegex(
313
+ TypeError, 'Cannot load function .*'):
314
+ json_conversion.from_json(
315
+ {'_type': 'function', 'name': 'non_existent_function'}
316
+ )
317
+ self.assertEqual(
318
+ json_conversion.from_json(
319
+ {'_type': 'function', 'name': 'non_existent_function'},
320
+ convert_unknown=True
321
+ ),
322
+ unknown_symbols.UnknownFunction('non_existent_function')
323
+ )
324
+
311
325
  def test_json_conversion_for_methods(self):
312
326
  # Test class-level method.
313
327
  f = json_conversion.from_json(json_conversion.to_json(X.Y.Z.class_method))
@@ -320,6 +334,19 @@ class JSONConvertibleTest(unittest.TestCase):
320
334
  ValueError, 'Cannot convert instance method .* to JSON.'):
321
335
  json_conversion.to_json(X.Y.Z().instance_method)
322
336
 
337
+ with self.assertRaisesRegex(
338
+ TypeError, 'Cannot load method .*'):
339
+ json_conversion.from_json(
340
+ {'_type': 'method', 'name': 'non_existent_method'}
341
+ )
342
+ self.assertEqual(
343
+ json_conversion.from_json(
344
+ {'_type': 'method', 'name': 'non_existent_method'},
345
+ convert_unknown=True
346
+ ),
347
+ unknown_symbols.UnknownMethod('non_existent_method')
348
+ )
349
+
323
350
  def test_json_conversion_for_opaque_objects(self):
324
351
  self.assert_conversion_equal(X(1))
325
352
 
@@ -336,12 +363,15 @@ class JSONConvertibleTest(unittest.TestCase):
336
363
  ValueError, 'Cannot decode opaque object with pickle.'):
337
364
  json_conversion.from_json(json_dict)
338
365
 
339
- def test_json_conversion_auto_dict(self):
340
- # Does not exist.
366
+ def test_json_conversion_convert_unknown(self):
341
367
  self.assertEqual(
342
368
  json_conversion.from_json([
343
369
  '__tuple__',
344
370
  1,
371
+ {
372
+ '_type': 'type',
373
+ 'name': 'Unknown type',
374
+ },
345
375
  {
346
376
  '_type': 'Unknown type',
347
377
  'x': [{
@@ -351,13 +381,18 @@ class JSONConvertibleTest(unittest.TestCase):
351
381
  'name': 'builtins.print'
352
382
  }]
353
383
  }
354
- ], auto_dict=True),
355
- (1, {
356
- 'type_name': 'Unknown type',
357
- 'x': [{
358
- 'type_name': 'Unknown type',
359
- }, print]
360
- })
384
+ ], convert_unknown=True),
385
+ (
386
+ 1,
387
+ unknown_symbols.UnknownType('Unknown type'),
388
+ unknown_symbols.UnknownTypedObject(
389
+ type_name='Unknown type',
390
+ x=[
391
+ unknown_symbols.UnknownTypedObject('Unknown type'),
392
+ print
393
+ ]
394
+ )
395
+ )
361
396
  )
362
397
 
363
398
  def test_json_conversion_with_bad_types(self):
@@ -384,6 +419,10 @@ class JSONConvertibleTest(unittest.TestCase):
384
419
  TypeError, 'Cannot load class .*'):
385
420
  json_conversion.from_json({'_type': '__main__.ABC'})
386
421
 
422
+ with self.assertRaisesRegex(
423
+ TypeError, 'Cannot load type .*'):
424
+ json_conversion.from_json({'_type': 'type', 'name': '__main__.ABC'})
425
+
387
426
  # Type exist but not a JSONConvertible subclass.
388
427
  class A:
389
428
  pass
@@ -393,6 +432,100 @@ class JSONConvertibleTest(unittest.TestCase):
393
432
  TypeError, '.* is not a `pg.JSONConvertible` subclass'):
394
433
  json_conversion.from_json({'_type': '__main__.A'})
395
434
 
435
+ def test_json_conversion_with_sharing(self):
436
+
437
+ class T(json_conversion.JSONConvertible):
438
+
439
+ def __init__(self, x=None):
440
+ self.x = x
441
+
442
+ def to_json(self, **kwargs):
443
+ return T.to_json_dict(dict(x=(self.x, None)), exclude_default=True)
444
+
445
+ t = T(1)
446
+ x = X(1)
447
+ u = {'x': x}
448
+ v = [u, t]
449
+ y = dict(t=t, x=x, u=u, v=v)
450
+ y_json = json_conversion.to_json(y)
451
+ x_serialized = json_conversion._OpaqueObject(x).to_json()
452
+ self.assertEqual(
453
+ y_json,
454
+ {
455
+ '__context__': {
456
+ 'shared_objects': [
457
+ {
458
+ '_type': json_conversion._type_name(T),
459
+ 'x': 1
460
+ },
461
+ x_serialized,
462
+ {
463
+ 'x': {
464
+ '__ref__': 1
465
+ }
466
+ }
467
+ ]
468
+ },
469
+ '__root__': {
470
+ 't': {
471
+ '__ref__': 0
472
+ },
473
+ 'x': {
474
+ '__ref__': 1
475
+ },
476
+ 'u': {
477
+ '__ref__': 2
478
+ },
479
+ 'v': [
480
+ {
481
+ '__ref__': 2
482
+ },
483
+ {
484
+ '__ref__': 0
485
+ }
486
+ ]
487
+ }
488
+ }
489
+ )
490
+ y_prime = json_conversion.from_json(y_json)
491
+ self.assertIs(y_prime['t'], y_prime['v'][1])
492
+ self.assertIs(y_prime['u'], y_prime['v'][0])
493
+
494
+ def test_json_conversion_with_sharing_convert_unknown(self):
495
+ self.assertEqual(
496
+ json_conversion.from_json(
497
+ {
498
+ '__context__': {
499
+ 'shared_objects': [
500
+ {
501
+ '_type': 'type',
502
+ 'name': '__main__.ABC',
503
+ },
504
+ {
505
+ '_type': '__main__.ABC',
506
+ 'x': 1
507
+ }
508
+ ]
509
+ },
510
+ '__root__': [
511
+ {
512
+ '__ref__': 0
513
+ },
514
+ {
515
+ '__ref__': 1
516
+ },
517
+ ]
518
+ },
519
+ convert_unknown=True
520
+ ),
521
+ [
522
+ unknown_symbols.UnknownType('__main__.ABC'),
523
+ unknown_symbols.UnknownTypedObject(
524
+ type_name='__main__.ABC',
525
+ x=1
526
+ )
527
+ ]
528
+ )
396
529
 
397
530
  if __name__ == '__main__':
398
531
  unittest.main()
@@ -158,6 +158,39 @@ class TabControl(HtmlControl):
158
158
  position='beforebegin',
159
159
  )
160
160
 
161
+ def remove(self, index_or_name: Union[int, str]) -> Tab:
162
+ """Removes a tab identified by index or name."""
163
+ index = self.indexof(index_or_name)
164
+ if index == -1:
165
+ raise ValueError(f'Tab not found: {index_or_name!r}')
166
+
167
+ with pg_flags.notify_on_change(False):
168
+ tab = self.tabs.pop(index)
169
+
170
+ self._run_javascript(
171
+ f"""
172
+ const button = document.querySelectorAll('#{self.element_id()}-button-group > .tab-button')[{index}];
173
+ if (button) {{
174
+ button.remove();
175
+ }}
176
+ const content = document.querySelectorAll('#{self.element_id()}-content-group > .tab-content')[{index}];
177
+ if (content) {{
178
+ content.remove();
179
+ }}
180
+ """
181
+ )
182
+
183
+ if not self.tabs:
184
+ self._sync_members(selected=0)
185
+ return tab
186
+
187
+ if self.selected == index:
188
+ new_selected = index - 1 if index == len(self.tabs) else index
189
+ self.select(max(0, new_selected))
190
+ elif self.selected > index:
191
+ self._sync_members(selected=self.selected - 1)
192
+ return tab
193
+
161
194
  def indexof(self, index_or_name: Union[int, str]) -> int:
162
195
  if isinstance(index_or_name, int):
163
196
  index = index_or_name
@@ -154,6 +154,43 @@ class TabControlTest(unittest.TestCase):
154
154
  self.assertEqual(len(scripts), 1)
155
155
  self.assertEqual(tab.selected, 1)
156
156
 
157
+ def test_remove(self):
158
+ tabs = [tab_lib.Tab(l, l, name=l) for l in ['a', 'b', 'c', 'd']]
159
+ tc = tab_lib.TabControl(tabs, selected='c')
160
+ self.assertEqual([t.name for t in tc.tabs], ['a', 'b', 'c', 'd'])
161
+ self.assertEqual(tc.selected, 2)
162
+
163
+ # Trigger rendering so scripts are tracked.
164
+ _ = tc.to_html()
165
+ with tc.track_scripts() as scripts:
166
+ tc.remove('b')
167
+ self.assertEqual(len(scripts), 1)
168
+ self.assertEqual([t.name for t in tc.tabs], ['a', 'c', 'd'])
169
+ self.assertEqual(tc.selected, 1)
170
+
171
+ with tc.track_scripts() as scripts:
172
+ # Remove currently selected tab 'c'
173
+ tc.remove('c')
174
+ # 1 script for remove, 1 for select.
175
+ self.assertEqual(len(scripts), 2)
176
+ self.assertEqual([t.name for t in tc.tabs], ['a', 'd'])
177
+ self.assertEqual(tc.selected, 1)
178
+
179
+ with tc.track_scripts() as scripts:
180
+ tc.remove(1)
181
+ self.assertEqual(len(scripts), 2)
182
+ self.assertEqual([t.name for t in tc.tabs], ['a'])
183
+ self.assertEqual(tc.selected, 0)
184
+
185
+ with tc.track_scripts() as scripts:
186
+ tc.remove('a')
187
+ self.assertEqual(len(scripts), 1)
188
+ self.assertEqual(tc.tabs, [])
189
+ self.assertEqual(tc.selected, 0)
190
+
191
+ with self.assertRaisesRegex(ValueError, 'Tab not found'):
192
+ tc.remove('x')
193
+
157
194
 
158
195
  if __name__ == '__main__':
159
196
  unittest.main()
@@ -57,7 +57,7 @@ class NextValue(base.Mutator):
57
57
  """A mutator to increase current DNA by 1."""
58
58
 
59
59
  def mutate(self, dna, step):
60
- return dna.next_dna()
60
+ return dna.next_dna() or dna
61
61
 
62
62
 
63
63
  def search_space():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyglove
3
- Version: 0.5.0.dev202510200810
3
+ Version: 0.5.0.dev202512280810
4
4
  Summary: PyGlove: A library for manipulating Python objects.
5
5
  Home-page: https://github.com/google/pyglove
6
6
  Author: PyGlove Authors
@@ -23,6 +23,12 @@ Description-Content-Type: text/markdown
23
23
  License-File: LICENSE
24
24
  Requires-Dist: docstring-parser>=0.12
25
25
  Requires-Dist: termcolor>=1.1.0
26
+ Provides-Extra: all
27
+ Requires-Dist: docstring-parser>=0.12; extra == "all"
28
+ Requires-Dist: termcolor>=1.1.0; extra == "all"
29
+ Requires-Dist: fsspec>=2023.3.0; extra == "all"
30
+ Provides-Extra: io
31
+ Requires-Dist: fsspec>=2023.3.0; extra == "io"
26
32
  Dynamic: author
27
33
  Dynamic: author-email
28
34
  Dynamic: classifier
@@ -32,6 +38,7 @@ Dynamic: home-page
32
38
  Dynamic: keywords
33
39
  Dynamic: license
34
40
  Dynamic: license-file
41
+ Dynamic: provides-extra
35
42
  Dynamic: requires-dist
36
43
  Dynamic: summary
37
44
 
@@ -19,7 +19,7 @@ pyglove/core/detouring/__init__.py,sha256=ck_n2VSuU31HNVYQkbG4Zvnx90mNYtSVc2StN3
19
19
  pyglove/core/detouring/class_detour.py,sha256=ejuUr7UfRU3l9PrDxD0dpKmt2iqdDU6liHdebA1jEfQ,13312
20
20
  pyglove/core/detouring/class_detour_test.py,sha256=9aAK6qPiT0_HJe5oUpqMVTpoHv0wr_h6c4gWYKMTJoM,5507
21
21
  pyglove/core/geno/__init__.py,sha256=cWA583n7JpsGUkGtoTlMMX83tNS7geRBKFsoPEvFZ4A,4767
22
- pyglove/core/geno/base.py,sha256=4CjZ1j-LGd6q2qootGcLMVuX8nTDxH0LvA1KVSI9qbE,64498
22
+ pyglove/core/geno/base.py,sha256=fZaTmmCJaiIm2ACU8EgEUHQLr9iF0f6yBNdYWIwYKWg,64639
23
23
  pyglove/core/geno/base_test.py,sha256=f0pMpfXsjAqFOBtlOxof3jRX0jLvXpzowk9szcr6bgY,38512
24
24
  pyglove/core/geno/categorical.py,sha256=t1bS129D5iF4CZ0yVHaFDXy2T6ujv5F5HHDc_0X36z8,28015
25
25
  pyglove/core/geno/categorical_test.py,sha256=23UkOPhDSvonxxM_1YoBYp723Xim-BmBzywl612CRyg,18444
@@ -56,8 +56,8 @@ pyglove/core/hyper/numerical_test.py,sha256=UWdH55Bok7bghYDLJOGsgOwV_2LNkhj1AmFw
56
56
  pyglove/core/hyper/object_template.py,sha256=YPALTV0mMULa7iuqnryTpA2wMsdyFZ_6g-R525asAr8,22222
57
57
  pyglove/core/hyper/object_template_test.py,sha256=TEFX7LIqUvdCdJILnK_gP5xIgNJKzRnioUF0CGVBzcY,9105
58
58
  pyglove/core/io/__init__.py,sha256=4ZT1a595DqQuLTNYc2JP_eCp_KesXvHmKRkr777bzpg,785
59
- pyglove/core/io/file_system.py,sha256=E_kSi1Lqo31al4GJYywCzJT97X3ByW8Te4xVfAM93D4,13990
60
- pyglove/core/io/file_system_test.py,sha256=mQdg4p8_D66sxRp_Hu2ILPvJa6PcR_y8q3NB0UCYjW8,8719
59
+ pyglove/core/io/file_system.py,sha256=cggBMIzQxQpTjPsYQPQj8IsO-UpunsEGxaclYQcUHjw,28093
60
+ pyglove/core/io/file_system_test.py,sha256=2c2l3HCNS8Q4mv8k1dqopnGpeVLiWSzmc8eDIx4b5oo,24561
61
61
  pyglove/core/io/sequence.py,sha256=XdVpPBuvhUnrTIWMUrak_qdcNdUJBpjgH5c1b5I3E2A,8873
62
62
  pyglove/core/io/sequence_test.py,sha256=mnONyNG1M1sCae2tyI-tF8qns96htfZPKycthETPthU,4062
63
63
  pyglove/core/patching/__init__.py,sha256=C1Q1cWPV74YL3eXbzGvc-8aPw1DR8EK6lRhQYDCwHek,2059
@@ -67,9 +67,9 @@ pyglove/core/patching/pattern_based.py,sha256=UtSNB-ARNqVjXwZovjVi84QEoXUGLLBTgL
67
67
  pyglove/core/patching/pattern_based_test.py,sha256=PW1EcVfsFPB6wtgwg3s4dzvigWn3b5S8eMNGo0SJiZ0,2771
68
68
  pyglove/core/patching/rule_based.py,sha256=JAQp8mWeIOxwIdqusA3GmXia-fxQhQsxbUTmE329wF8,17038
69
69
  pyglove/core/patching/rule_based_test.py,sha256=qfy0ILmczV_LMHWEnwo2y079OrJsGYO0nKxSZdmIUcI,18782
70
- pyglove/core/symbolic/__init__.py,sha256=VMQj8oW2hGaJwqgchBJbu5qXoJKaNizxv__vsYL4b7U,6057
71
- pyglove/core/symbolic/base.py,sha256=3vOHKtanrksBv5B_0HAq2R_CnE355aPx1B9lyJNb5us,77683
72
- pyglove/core/symbolic/base_test.py,sha256=yASIHIuWiUB1jf4nN-Y4XOjyvr8eQfRpr7s_1LZsu78,7188
70
+ pyglove/core/symbolic/__init__.py,sha256=ifUnJyF_hNFyrNAqlN7ClKWUvZouIA38GrYctnMc-F4,6402
71
+ pyglove/core/symbolic/base.py,sha256=QMAMFuqH_FjwJUSlUZKTBnxDpiVkM9Z8j611u6FWAcg,79816
72
+ pyglove/core/symbolic/base_test.py,sha256=OHEexXI7uE2bixT-trfR3j-dfiAJsbY7pFyAA6XEPqA,7338
73
73
  pyglove/core/symbolic/boilerplate.py,sha256=sQ3G25r5bo_UmIdjreL4jkAuQCXIHVlvUfGjjkNod6Y,5955
74
74
  pyglove/core/symbolic/boilerplate_test.py,sha256=1CZ1W6kq3l-3tpaknhGFa04V18bO7vPzis5qzWnxHEs,5252
75
75
  pyglove/core/symbolic/class_wrapper.py,sha256=xQiMh5vFlOQ76tbqsF5UWEghvU4d9UmvbNqIyBccNHg,22869
@@ -78,8 +78,8 @@ pyglove/core/symbolic/compounding.py,sha256=gvOodZ2gWHA0jNdwt8yvnRsPkHQDXDb5s88U
78
78
  pyglove/core/symbolic/compounding_test.py,sha256=hOzrIROvajUTtPm0SUbEsEV4C1bXanhAoHinHrjZoXw,8320
79
79
  pyglove/core/symbolic/contextual_object.py,sha256=ar9Q_0P0HHbDf8kLHpS8GFZEMCRuCCB6DP18iGItiiw,9146
80
80
  pyglove/core/symbolic/contextual_object_test.py,sha256=wA5xfIhEHOC9qE3bbiA59CAPxWs9AVPaNiKEoprkWpQ,10209
81
- pyglove/core/symbolic/dict.py,sha256=ARBQr-uPUmryN9tBf5xi6fxGk9F6abKfihmPZU11y44,36931
82
- pyglove/core/symbolic/dict_test.py,sha256=3MATsFw9Ci0jVPbAT2ivKVZ3PCnBBBvbkMWKgpgl-Fk,72915
81
+ pyglove/core/symbolic/dict.py,sha256=ELM-5XSxChNZNTaDxRDm_rCpMkuJ2nBASMOMxVjB07g,37657
82
+ pyglove/core/symbolic/dict_test.py,sha256=XPOe5DV_opYMkzSJZEl7rTvBBN-H9NvKe8zC7tQf7EE,74429
83
83
  pyglove/core/symbolic/diff.py,sha256=zHfED0Bbq8G_HWNPj3vrOCWzt_062rFhx3BMlpCb9oo,16282
84
84
  pyglove/core/symbolic/diff_test.py,sha256=EDiGHqqKhi-NeMxr-bgjBEqlquee_4l_0IM6hgAb9Mg,29400
85
85
  pyglove/core/symbolic/error_info.py,sha256=rqRwfmnEibMixaS2G-P0VhKjkZl79qjO6EUItnATHlQ,3675
@@ -90,17 +90,19 @@ pyglove/core/symbolic/functor.py,sha256=AwE9GX2cO3QNihac1_ZN0sdG-TrWAJ5lXO2ZQ5Gs
90
90
  pyglove/core/symbolic/functor_test.py,sha256=9c5_7OBKNVNbYC7IaVQB6c5ks2v00qQ36oivyWiBbKA,31798
91
91
  pyglove/core/symbolic/inferred.py,sha256=E4zgphg6NNZad9Fl3jdHQOMZeqEp9XHq5OUYqXEmwZQ,3178
92
92
  pyglove/core/symbolic/inferred_test.py,sha256=G6uPykONcChvs6vZujXHSWaYfjewLTVBscMqzzKNty0,1270
93
- pyglove/core/symbolic/list.py,sha256=z8goU0ntd-Q5ADaCGiKsJwPhdRdQb0Kd_p-ZekXaLy4,30303
94
- pyglove/core/symbolic/list_test.py,sha256=IAyFQ48nyczKUcPNZFKHBkX5oh7Xuxbnv3rRkONhbHw,61146
95
- pyglove/core/symbolic/object.py,sha256=OZ6eK8qyaLsUKxFiV2GWL5Ol6FDzMrrkpWSRKRwIKAA,42726
96
- pyglove/core/symbolic/object_test.py,sha256=rDP7lcQZTFdQCqeaNYs7ZfwvGanzHz7CHM33NCmRIFk,94391
93
+ pyglove/core/symbolic/list.py,sha256=CRDoBxYJsmNly1MxhY5vO0wp6EUTnxze6-2O9vXHna4,30717
94
+ pyglove/core/symbolic/list_test.py,sha256=sH3wuJB6SqXVefJEPmzGVfoXc-ZiJ1ZTV4-O88LFuaM,61943
95
+ pyglove/core/symbolic/object.py,sha256=g6omG6r6B5TQaHSgoOWCEL_2OY_DcutxOTe1R1M1uFo,42822
96
+ pyglove/core/symbolic/object_test.py,sha256=mB8Aw1foE3XWdRX1LVn9C9U5XJeR7iqZYHrv4y94STE,94514
97
97
  pyglove/core/symbolic/origin.py,sha256=OSWMKjvPcISOXrzuX3lCQC8m_qaGl-9INsIB81erUnU,6124
98
98
  pyglove/core/symbolic/origin_test.py,sha256=dU_ZGrGDetM_lYVMn3wQO0d367_t_t8eESe3NrKPBNE,3159
99
99
  pyglove/core/symbolic/pure_symbolic.py,sha256=pvo15gn35_KLiGW_XrTjlx5ddmHbwpLr93VgbQ59uQ8,3231
100
- pyglove/core/symbolic/ref.py,sha256=qRN-0xm9pWlszel5qE-HAhQCkgB0umi_pDlzDhBWPUA,8513
101
- pyglove/core/symbolic/ref_test.py,sha256=0687hClfR5G5_VKuRlwjJGVQ2MC74ADFWklDaZ3aEVI,6294
100
+ pyglove/core/symbolic/ref.py,sha256=gIu02b8BfKspH1XejXhEFh_Iil3jvfGHdpaCRq6qor0,8817
101
+ pyglove/core/symbolic/ref_test.py,sha256=-rCA1AaLZnyuKOh0cJzS5UaQ_9Kp4p7xexZ_e3IwpOg,8974
102
102
  pyglove/core/symbolic/symbolize.py,sha256=ohID9-V8QiFe7OMpPlRomiqUnKBVMpypd8ZuMuHaa4s,6582
103
103
  pyglove/core/symbolic/symbolize_test.py,sha256=o7bRfMhGc6uw2FIH8arE99-bPb3i0YixcHYyiP-QqeQ,6487
104
+ pyglove/core/symbolic/unknown_symbols.py,sha256=-BuT1izzGZDjuz_OSPDz9UAd1ialpxK8ceTZtIdni1Y,4323
105
+ pyglove/core/symbolic/unknown_symbols_test.py,sha256=0bjZ4cYjDdTCHwQ5GHe-D7VVDfJez7iG0v6Z0ksEDTU,3069
104
106
  pyglove/core/tuning/__init__.py,sha256=JtXpjsBto01fLf55hZ1dSx-CEZUyVQeyRP9AMH_hw8c,2229
105
107
  pyglove/core/tuning/backend.py,sha256=GwbBI9nHYYe5h6iDuhqRtD-Msjmmc7wFtagxW0rTypU,5597
106
108
  pyglove/core/tuning/backend_test.py,sha256=vyfUi509-hbF5uYk-I0FsoniPFBXmobQVl-4d0YPIWY,1999
@@ -113,14 +115,14 @@ pyglove/core/tuning/sample_test.py,sha256=JqwDPy3EPC_VjU9dipk90jj1kovZB3Zb9hAjAl
113
115
  pyglove/core/typing/__init__.py,sha256=u2YSrSi8diTkQn8_1J2hEpk5o7zDhx2tU_oRuS-k1XU,14580
114
116
  pyglove/core/typing/annotated.py,sha256=llaajIDj9GK-4kUGJoO4JsHU6ESPOra2SZ-jG6xmsOQ,3203
115
117
  pyglove/core/typing/annotated_test.py,sha256=p1qid3R-jeiOTTxOVq6hXW8XFvn-h1cUzJWISPst2l8,2484
116
- pyglove/core/typing/annotation_conversion.py,sha256=txUrChAhMNeaukV-PSQEA9BCjtonUQDWFHxnpTE0_K8,15582
117
- pyglove/core/typing/annotation_conversion_test.py,sha256=GW7e3e00jcYJjJGRvCvMtW4QBHyVwFtZVcETdh1yBS8,17540
118
+ pyglove/core/typing/annotation_conversion.py,sha256=pnm6dZbn_nsTCreyarspkwpsdteMb8uFT2TLtblq_0M,15780
119
+ pyglove/core/typing/annotation_conversion_test.py,sha256=N49ZuzsmaqVi23wszDpfwcJApr2-Pk2E_ELrjssSQb0,17598
118
120
  pyglove/core/typing/annotation_future_test.py,sha256=tAVuzWNfW8R4e4l7fx88Q4nJDM2LPUogNKNAIIPAEWQ,3959
119
121
  pyglove/core/typing/callable_ext.py,sha256=PiBQWPeUAH7Lgmf2xKCZqgK7N0OSrTdbnEkV8Ph31OA,9127
120
122
  pyglove/core/typing/callable_ext_test.py,sha256=TnWKU4_ZjvpbHZFtFHgFvCMDiCos8VmLlODcM_7Xg8M,10156
121
123
  pyglove/core/typing/callable_signature.py,sha256=DRpt7aShfkn8pb3SCiZzS_27eHbkQ_d2UB8BUhJjs0Q,27176
122
124
  pyglove/core/typing/callable_signature_test.py,sha256=iQmHsKPhJPQlMikDhEyxKyq7yWyXI9juKCLYgKhrH3U,25145
123
- pyglove/core/typing/class_schema.py,sha256=jICxKo6Ubu35FJO1ei6iOqHB9I204Wtea5UGng2_hTE,55897
125
+ pyglove/core/typing/class_schema.py,sha256=lbY5yAC8p5rBuvJ8qMBwqbJmqTlC5bunN4yU4T9rhMg,56037
124
126
  pyglove/core/typing/class_schema_test.py,sha256=sJkE7ndDSIKb0EUcjZiVFOeJYDI7Hdu2GdPJCMgZxrI,29556
125
127
  pyglove/core/typing/custom_typing.py,sha256=qdnIKHWNt5kZAAFdpQXra8bBu6RljMbbJ_YDG2mhAUA,2205
126
128
  pyglove/core/typing/inspect.py,sha256=VLSz1KAunNm2hx0eEMjiwxKLl9FHlKr9nHelLT25iEA,7726
@@ -130,13 +132,13 @@ pyglove/core/typing/json_schema_test.py,sha256=ZxMO2xgKiELNDzoQ84cmXsyCtFA0Ltn1I
130
132
  pyglove/core/typing/key_specs.py,sha256=-7xjCuUGoQgD0sMafsRFNlw3S4f1r-7t5OO4ev5bbeI,9225
131
133
  pyglove/core/typing/key_specs_test.py,sha256=5zornpyHMAYoRaG8KDXHiQ3obu9UfRp3399lBeUNTPk,6499
132
134
  pyglove/core/typing/pytype_support.py,sha256=lyX11WVbCwoOi5tTQ90pEOS-yvo_6iEi7Lxbp-nXu2A,2069
133
- pyglove/core/typing/type_conversion.py,sha256=0L4Cbsw_QiM-gpsn-4y-XLEIvwiUB16Clj9gCtoC_Xc,5224
134
- pyglove/core/typing/type_conversion_test.py,sha256=BhASOGvtKXmYLWKCELU1RVB_Nmt1V-saSkGogvsNL7E,5342
135
+ pyglove/core/typing/type_conversion.py,sha256=S_57FU-9DOk-MTE-1Mh31FMshaA3IoKiSDsoKxGxGv4,5432
136
+ pyglove/core/typing/type_conversion_test.py,sha256=rK0lAjLi1azKY4ZltquIsCpKh20EtYSIekArnqI6ThQ,5475
135
137
  pyglove/core/typing/typed_missing.py,sha256=-l1omAu0jBZv5BnsFYXBqfvQwVBnmPh_X1wcIKD9bOk,2734
136
138
  pyglove/core/typing/typed_missing_test.py,sha256=TCNsb1SRpFaVdxYn2mB_yaLuja8w5Qn5NP7uGiZVBWs,2301
137
- pyglove/core/typing/value_specs.py,sha256=8E83QDZMb3lMXhgzfVNt9u6Bg3NPkvpjLXetjkps8UU,103263
138
- pyglove/core/typing/value_specs_test.py,sha256=eGXVxdduIM-oEaapJS9Kh7WSQHRUFegLIJ1GEzQkKHA,131017
139
- pyglove/core/utils/__init__.py,sha256=2aw4n1kYG9xlX2tWI-H5i25cBuK1ME9Lmf-F31VlKEk,8657
139
+ pyglove/core/typing/value_specs.py,sha256=oaLjvJ61Gv7myn93krzG3kfdw0n9va3sxmyDjy0xRFY,103368
140
+ pyglove/core/typing/value_specs_test.py,sha256=Mi0Esw-0E_1JSjoEQcjkefkcaS0-omIBzlWVTRYv1F8,131170
141
+ pyglove/core/utils/__init__.py,sha256=6P2VcGkjDsOFG640Jqu-jd1K3pfAK5NkcK3NBPLI6RY,8726
140
142
  pyglove/core/utils/common_traits.py,sha256=PWxOgPhG5H60ZwfO8xNAEGRjFUqqDZQBWQYomOfvdy8,3640
141
143
  pyglove/core/utils/common_traits_test.py,sha256=DIuZB_1xfmeTVfWnGOguDQcDAM_iGgBOe8C-5CsIqBc,1122
142
144
  pyglove/core/utils/contextual.py,sha256=_EO_ubCcmI81QyYyyucm3QcH1asQWSeXvT2Xa4KONs8,5355
@@ -149,8 +151,8 @@ pyglove/core/utils/formatting.py,sha256=Wn4d933LQLhuMIfjdRJgpxOThCxBxQrkRBa6Z1-h
149
151
  pyglove/core/utils/formatting_test.py,sha256=hhg-nL6DyE5A2QA92ALHK5QtfAYKfPpTbBARF-IT1j0,14241
150
152
  pyglove/core/utils/hierarchical.py,sha256=jwB-0FhqOspAymAkvJphRhPTQEsoShmKupCZpU3Vip4,19690
151
153
  pyglove/core/utils/hierarchical_test.py,sha256=f382DMJPa_bavJGGQDjuw-hWcafUg5bkQCPX-nbzeiI,21077
152
- pyglove/core/utils/json_conversion.py,sha256=26Wt7VDU4df6fT_Joly-UzU87abkAQNL8gYDIh36fQ8,26785
153
- pyglove/core/utils/json_conversion_test.py,sha256=zA_cy7ixVL3sTf6i9BCXMlSH56Aa3JnjHnjyqYJ_9XU,11845
154
+ pyglove/core/utils/json_conversion.py,sha256=PWV51Dm7J-ovakhqXJux_zBAFqvjHKb9RObER8phDvw,37165
155
+ pyglove/core/utils/json_conversion_test.py,sha256=w4k6qgXGEnNXrfryTQppxtF3GJ9rdEHjvjznXSIOMcg,15809
154
156
  pyglove/core/utils/missing.py,sha256=9gslt1lXd1qSEIuAFxUWu30oD-YdYcnm13eau1S9uqY,1445
155
157
  pyglove/core/utils/missing_test.py,sha256=D6-FuVEwCyJemUiPLcwLmwyptqI5Bx0Pfipc2juhKSE,1335
156
158
  pyglove/core/utils/text_color.py,sha256=xcCTCxY2qFNZs_jismMGus8scEXKBpYGAhpAgnz-MHk,4112
@@ -175,8 +177,8 @@ pyglove/core/views/html/controls/label.py,sha256=2u7z_6o-ANf6EbxufFl_fZ1VFSUrjNw
175
177
  pyglove/core/views/html/controls/label_test.py,sha256=_Fi6vMITup8iFYTiU_1w7FZCXaYp1eMmVBxub8JMYbs,5170
176
178
  pyglove/core/views/html/controls/progress_bar.py,sha256=0an0eCbPCDjwrR58C16NwLZ-cf3Oy0wQerLsiNgGHmk,5235
177
179
  pyglove/core/views/html/controls/progress_bar_test.py,sha256=kKOJDZQtBPkmNcgIBrRQkNNzcTm51ojuFBTRUEDSsp0,3506
178
- pyglove/core/views/html/controls/tab.py,sha256=dn2rs6IBqvjtKvk0BC8ypVYqjjHsqJvP_Bh9y94QjMc,10818
179
- pyglove/core/views/html/controls/tab_test.py,sha256=deRXg4LM4dzVgods5HVTXznrOWdddF6wrcl1RuhmRCA,5656
180
+ pyglove/core/views/html/controls/tab.py,sha256=f3ZfYyXfMmERGOXY4a4bxmOhomL3MQONMossaxw8hQw,11851
181
+ pyglove/core/views/html/controls/tab_test.py,sha256=V0HrY0YaGyVlOykMCFg85QSxOq8eBPa3Fqcv2q1c12s,6912
180
182
  pyglove/core/views/html/controls/tooltip.py,sha256=01BbpuM1twf3FYMUT09_Ck5JSSONe8QE9RmyA9nhCnU,3092
181
183
  pyglove/core/views/html/controls/tooltip_test.py,sha256=17BY-WmZKpz9tCbySPcwG6KJyfeE_MeMyKxtfxorBQ0,3194
182
184
  pyglove/ext/__init__.py,sha256=3jp8cJvKW6PENOZlmVAbT0w-GBRn_kjhc0wDX3XjpOE,755
@@ -187,7 +189,7 @@ pyglove/ext/early_stopping/step_wise.py,sha256=P99Z2hODmCNBnR3iVOOj2NCCwveSH6h5V
187
189
  pyglove/ext/early_stopping/step_wise_test.py,sha256=I9DDMrCpDwIWC6mV9w2pDypnrwYnWjg6QXTFNT13cts,9032
188
190
  pyglove/ext/evolution/__init__.py,sha256=lAf4NyxUZRt39kMFFoW_i8-ExigJXakG1-sUREW7jkQ,3214
189
191
  pyglove/ext/evolution/base.py,sha256=I27qJja6MErMs3SyrlBYvmDQ4eTq9dY9RVpscKlwReQ,50090
190
- pyglove/ext/evolution/base_test.py,sha256=yIw4YS60c_MvDj71QkoxX5Y2NLZgGc_KzT_NuHMCXMk,29936
192
+ pyglove/ext/evolution/base_test.py,sha256=HgWSGGHh7nd03IFLln3dKV4TsI1kK4idJd4azAGaxHw,29943
191
193
  pyglove/ext/evolution/hill_climb.py,sha256=Bysi2u4KEM7d9CIPcnvKKgEQHttkaKFkI8xlrNOkBB8,1688
192
194
  pyglove/ext/evolution/hill_climb_test.py,sha256=7snzopGFRgkryNXiDVcHMhtVz6LXLZCOH_tz_t15b4I,3110
193
195
  pyglove/ext/evolution/mutators.py,sha256=ZkNmIf9B2KRP3H7UfML7nkjUYPPgOkm5Fe1kaJQ8W5I,10062
@@ -218,8 +220,8 @@ pyglove/ext/scalars/randoms.py,sha256=LkMIIx7lOq_lvJvVS3BrgWGuWl7Pi91-lA-O8x_gZs
218
220
  pyglove/ext/scalars/randoms_test.py,sha256=nEhiqarg8l_5EOucp59CYrpO2uKxS1pe0hmBdZUzRNM,2000
219
221
  pyglove/ext/scalars/step_wise.py,sha256=IDw3tuTpv0KVh7AN44W43zqm1-E0HWPUlytWOQC9w3Y,3789
220
222
  pyglove/ext/scalars/step_wise_test.py,sha256=TL1vJ19xVx2t5HKuyIzGoogF7N3Rm8YhLE6JF7i0iy8,2540
221
- pyglove-0.5.0.dev202510200810.dist-info/licenses/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
222
- pyglove-0.5.0.dev202510200810.dist-info/METADATA,sha256=7by7F2KCDe4jb1XjA2aB3xdSBwzeRln3quKISH_BvgU,7089
223
- pyglove-0.5.0.dev202510200810.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
224
- pyglove-0.5.0.dev202510200810.dist-info/top_level.txt,sha256=wITzJSKcj8GZUkbq-MvUQnFadkiuAv_qv5qQMw0fIow,8
225
- pyglove-0.5.0.dev202510200810.dist-info/RECORD,,
223
+ pyglove-0.5.0.dev202512280810.dist-info/licenses/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
224
+ pyglove-0.5.0.dev202512280810.dist-info/METADATA,sha256=L6qAEcfvL0IkGLf2tGdBWmx_CJcxduJHGpf_Wjv7g74,7349
225
+ pyglove-0.5.0.dev202512280810.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
226
+ pyglove-0.5.0.dev202512280810.dist-info/top_level.txt,sha256=wITzJSKcj8GZUkbq-MvUQnFadkiuAv_qv5qQMw0fIow,8
227
+ pyglove-0.5.0.dev202512280810.dist-info/RECORD,,