pyglove 0.5.0.dev202508250811__py3-none-any.whl → 0.5.0.dev202511300809__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 (44) hide show
  1. pyglove/core/__init__.py +8 -1
  2. pyglove/core/geno/base.py +7 -3
  3. pyglove/core/io/file_system.py +295 -2
  4. pyglove/core/io/file_system_test.py +291 -0
  5. pyglove/core/logging.py +45 -1
  6. pyglove/core/logging_test.py +12 -21
  7. pyglove/core/monitoring.py +657 -0
  8. pyglove/core/monitoring_test.py +289 -0
  9. pyglove/core/symbolic/__init__.py +7 -0
  10. pyglove/core/symbolic/base.py +89 -35
  11. pyglove/core/symbolic/base_test.py +3 -3
  12. pyglove/core/symbolic/dict.py +31 -12
  13. pyglove/core/symbolic/dict_test.py +49 -0
  14. pyglove/core/symbolic/list.py +17 -3
  15. pyglove/core/symbolic/list_test.py +24 -2
  16. pyglove/core/symbolic/object.py +3 -1
  17. pyglove/core/symbolic/object_test.py +13 -10
  18. pyglove/core/symbolic/ref.py +19 -7
  19. pyglove/core/symbolic/ref_test.py +94 -7
  20. pyglove/core/symbolic/unknown_symbols.py +147 -0
  21. pyglove/core/symbolic/unknown_symbols_test.py +100 -0
  22. pyglove/core/typing/annotation_conversion.py +8 -1
  23. pyglove/core/typing/annotation_conversion_test.py +14 -19
  24. pyglove/core/typing/class_schema.py +24 -1
  25. pyglove/core/typing/json_schema.py +221 -8
  26. pyglove/core/typing/json_schema_test.py +508 -12
  27. pyglove/core/typing/type_conversion.py +17 -3
  28. pyglove/core/typing/type_conversion_test.py +7 -2
  29. pyglove/core/typing/value_specs.py +5 -1
  30. pyglove/core/typing/value_specs_test.py +5 -0
  31. pyglove/core/utils/__init__.py +2 -0
  32. pyglove/core/utils/contextual.py +9 -4
  33. pyglove/core/utils/contextual_test.py +10 -0
  34. pyglove/core/utils/error_utils.py +59 -25
  35. pyglove/core/utils/json_conversion.py +360 -63
  36. pyglove/core/utils/json_conversion_test.py +146 -13
  37. pyglove/core/views/html/controls/tab.py +33 -0
  38. pyglove/core/views/html/controls/tab_test.py +37 -0
  39. pyglove/ext/evolution/base_test.py +1 -1
  40. {pyglove-0.5.0.dev202508250811.dist-info → pyglove-0.5.0.dev202511300809.dist-info}/METADATA +8 -1
  41. {pyglove-0.5.0.dev202508250811.dist-info → pyglove-0.5.0.dev202511300809.dist-info}/RECORD +44 -40
  42. {pyglove-0.5.0.dev202508250811.dist-info → pyglove-0.5.0.dev202511300809.dist-info}/WHEEL +0 -0
  43. {pyglove-0.5.0.dev202508250811.dist-info → pyglove-0.5.0.dev202511300809.dist-info}/licenses/LICENSE +0 -0
  44. {pyglove-0.5.0.dev202508250811.dist-info → pyglove-0.5.0.dev202511300809.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.dev202508250811
3
+ Version: 0.5.0.dev202511300809
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
 
@@ -1,7 +1,9 @@
1
1
  pyglove/__init__.py,sha256=LP1HNk_VVWMHaakX3HZ0NeZ2c4lq2uJaRbalvT8haOg,1352
2
- pyglove/core/__init__.py,sha256=23XwyBxalafAnDAsJSSxTz56AtjBjq_d5SPCKCNdCoM,9668
3
- pyglove/core/logging.py,sha256=pD5A6K8TOWoQdYZ1IgGHHd_vIcqtcWQ51Eep5Hswfwc,3305
4
- pyglove/core/logging_test.py,sha256=3z_c6wnxbqDbwUmSOAZzeDPXvzoweYL5QHUQVMJ5Xgo,1917
2
+ pyglove/core/__init__.py,sha256=WPTvhQXv63f4-AkYH__RwVKQyr8vHr5e3tGqT2OxRGM,9774
3
+ pyglove/core/logging.py,sha256=zTNLGnWrl6kkjjEjTphQMeNf9FfqFtl1G9VCh2LhnHg,4614
4
+ pyglove/core/logging_test.py,sha256=ioDbmf4S6xQXeyGWihvk6292wfYdldBw_TK1WXvIq5k,1648
5
+ pyglove/core/monitoring.py,sha256=ZHH6JFq6-FAUNXZn_fJzcpi8MNj8cQYb5wHDsXFm3K8,19595
6
+ pyglove/core/monitoring_test.py,sha256=yeEtscOVsySb6mYRuGvL1Ct1C5lppOLtCGL8LuWWrBY,10896
5
7
  pyglove/core/coding/__init__.py,sha256=tuHIg19ZchtkOQbdFVTVLkUpBa5f1eo66XtnKw3lcIU,1645
6
8
  pyglove/core/coding/errors.py,sha256=aP3Y4amBzOKdlb5JnESJ3kdoijQXbiBiPDMeA88LNrk,3310
7
9
  pyglove/core/coding/errors_test.py,sha256=fwOR8vLiRvLadubsccyE19hLHj-kThlCQt88qmUYk9M,2311
@@ -17,7 +19,7 @@ pyglove/core/detouring/__init__.py,sha256=ck_n2VSuU31HNVYQkbG4Zvnx90mNYtSVc2StN3
17
19
  pyglove/core/detouring/class_detour.py,sha256=ejuUr7UfRU3l9PrDxD0dpKmt2iqdDU6liHdebA1jEfQ,13312
18
20
  pyglove/core/detouring/class_detour_test.py,sha256=9aAK6qPiT0_HJe5oUpqMVTpoHv0wr_h6c4gWYKMTJoM,5507
19
21
  pyglove/core/geno/__init__.py,sha256=cWA583n7JpsGUkGtoTlMMX83tNS7geRBKFsoPEvFZ4A,4767
20
- pyglove/core/geno/base.py,sha256=4CjZ1j-LGd6q2qootGcLMVuX8nTDxH0LvA1KVSI9qbE,64498
22
+ pyglove/core/geno/base.py,sha256=fZaTmmCJaiIm2ACU8EgEUHQLr9iF0f6yBNdYWIwYKWg,64639
21
23
  pyglove/core/geno/base_test.py,sha256=f0pMpfXsjAqFOBtlOxof3jRX0jLvXpzowk9szcr6bgY,38512
22
24
  pyglove/core/geno/categorical.py,sha256=t1bS129D5iF4CZ0yVHaFDXy2T6ujv5F5HHDc_0X36z8,28015
23
25
  pyglove/core/geno/categorical_test.py,sha256=23UkOPhDSvonxxM_1YoBYp723Xim-BmBzywl612CRyg,18444
@@ -54,8 +56,8 @@ pyglove/core/hyper/numerical_test.py,sha256=UWdH55Bok7bghYDLJOGsgOwV_2LNkhj1AmFw
54
56
  pyglove/core/hyper/object_template.py,sha256=YPALTV0mMULa7iuqnryTpA2wMsdyFZ_6g-R525asAr8,22222
55
57
  pyglove/core/hyper/object_template_test.py,sha256=TEFX7LIqUvdCdJILnK_gP5xIgNJKzRnioUF0CGVBzcY,9105
56
58
  pyglove/core/io/__init__.py,sha256=4ZT1a595DqQuLTNYc2JP_eCp_KesXvHmKRkr777bzpg,785
57
- pyglove/core/io/file_system.py,sha256=E_kSi1Lqo31al4GJYywCzJT97X3ByW8Te4xVfAM93D4,13990
58
- pyglove/core/io/file_system_test.py,sha256=mQdg4p8_D66sxRp_Hu2ILPvJa6PcR_y8q3NB0UCYjW8,8719
59
+ pyglove/core/io/file_system.py,sha256=r7x_kDWDynKbAcO8tEkkRHShOPiYXyB9wmCXv2c-Oes,23149
60
+ pyglove/core/io/file_system_test.py,sha256=QvcPEQj3hAk7xc8VkFda1ZzgsV0etBimc1V9CJXr_Rk,19145
59
61
  pyglove/core/io/sequence.py,sha256=XdVpPBuvhUnrTIWMUrak_qdcNdUJBpjgH5c1b5I3E2A,8873
60
62
  pyglove/core/io/sequence_test.py,sha256=mnONyNG1M1sCae2tyI-tF8qns96htfZPKycthETPthU,4062
61
63
  pyglove/core/patching/__init__.py,sha256=C1Q1cWPV74YL3eXbzGvc-8aPw1DR8EK6lRhQYDCwHek,2059
@@ -65,9 +67,9 @@ pyglove/core/patching/pattern_based.py,sha256=UtSNB-ARNqVjXwZovjVi84QEoXUGLLBTgL
65
67
  pyglove/core/patching/pattern_based_test.py,sha256=PW1EcVfsFPB6wtgwg3s4dzvigWn3b5S8eMNGo0SJiZ0,2771
66
68
  pyglove/core/patching/rule_based.py,sha256=JAQp8mWeIOxwIdqusA3GmXia-fxQhQsxbUTmE329wF8,17038
67
69
  pyglove/core/patching/rule_based_test.py,sha256=qfy0ILmczV_LMHWEnwo2y079OrJsGYO0nKxSZdmIUcI,18782
68
- pyglove/core/symbolic/__init__.py,sha256=VMQj8oW2hGaJwqgchBJbu5qXoJKaNizxv__vsYL4b7U,6057
69
- pyglove/core/symbolic/base.py,sha256=3vOHKtanrksBv5B_0HAq2R_CnE355aPx1B9lyJNb5us,77683
70
- 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
71
73
  pyglove/core/symbolic/boilerplate.py,sha256=sQ3G25r5bo_UmIdjreL4jkAuQCXIHVlvUfGjjkNod6Y,5955
72
74
  pyglove/core/symbolic/boilerplate_test.py,sha256=1CZ1W6kq3l-3tpaknhGFa04V18bO7vPzis5qzWnxHEs,5252
73
75
  pyglove/core/symbolic/class_wrapper.py,sha256=xQiMh5vFlOQ76tbqsF5UWEghvU4d9UmvbNqIyBccNHg,22869
@@ -76,8 +78,8 @@ pyglove/core/symbolic/compounding.py,sha256=gvOodZ2gWHA0jNdwt8yvnRsPkHQDXDb5s88U
76
78
  pyglove/core/symbolic/compounding_test.py,sha256=hOzrIROvajUTtPm0SUbEsEV4C1bXanhAoHinHrjZoXw,8320
77
79
  pyglove/core/symbolic/contextual_object.py,sha256=ar9Q_0P0HHbDf8kLHpS8GFZEMCRuCCB6DP18iGItiiw,9146
78
80
  pyglove/core/symbolic/contextual_object_test.py,sha256=wA5xfIhEHOC9qE3bbiA59CAPxWs9AVPaNiKEoprkWpQ,10209
79
- pyglove/core/symbolic/dict.py,sha256=ARBQr-uPUmryN9tBf5xi6fxGk9F6abKfihmPZU11y44,36931
80
- 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
81
83
  pyglove/core/symbolic/diff.py,sha256=zHfED0Bbq8G_HWNPj3vrOCWzt_062rFhx3BMlpCb9oo,16282
82
84
  pyglove/core/symbolic/diff_test.py,sha256=EDiGHqqKhi-NeMxr-bgjBEqlquee_4l_0IM6hgAb9Mg,29400
83
85
  pyglove/core/symbolic/error_info.py,sha256=rqRwfmnEibMixaS2G-P0VhKjkZl79qjO6EUItnATHlQ,3675
@@ -88,17 +90,19 @@ pyglove/core/symbolic/functor.py,sha256=AwE9GX2cO3QNihac1_ZN0sdG-TrWAJ5lXO2ZQ5Gs
88
90
  pyglove/core/symbolic/functor_test.py,sha256=9c5_7OBKNVNbYC7IaVQB6c5ks2v00qQ36oivyWiBbKA,31798
89
91
  pyglove/core/symbolic/inferred.py,sha256=E4zgphg6NNZad9Fl3jdHQOMZeqEp9XHq5OUYqXEmwZQ,3178
90
92
  pyglove/core/symbolic/inferred_test.py,sha256=G6uPykONcChvs6vZujXHSWaYfjewLTVBscMqzzKNty0,1270
91
- pyglove/core/symbolic/list.py,sha256=z8goU0ntd-Q5ADaCGiKsJwPhdRdQb0Kd_p-ZekXaLy4,30303
92
- pyglove/core/symbolic/list_test.py,sha256=IAyFQ48nyczKUcPNZFKHBkX5oh7Xuxbnv3rRkONhbHw,61146
93
- pyglove/core/symbolic/object.py,sha256=OZ6eK8qyaLsUKxFiV2GWL5Ol6FDzMrrkpWSRKRwIKAA,42726
94
- 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
95
97
  pyglove/core/symbolic/origin.py,sha256=OSWMKjvPcISOXrzuX3lCQC8m_qaGl-9INsIB81erUnU,6124
96
98
  pyglove/core/symbolic/origin_test.py,sha256=dU_ZGrGDetM_lYVMn3wQO0d367_t_t8eESe3NrKPBNE,3159
97
99
  pyglove/core/symbolic/pure_symbolic.py,sha256=pvo15gn35_KLiGW_XrTjlx5ddmHbwpLr93VgbQ59uQ8,3231
98
- pyglove/core/symbolic/ref.py,sha256=qRN-0xm9pWlszel5qE-HAhQCkgB0umi_pDlzDhBWPUA,8513
99
- 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
100
102
  pyglove/core/symbolic/symbolize.py,sha256=ohID9-V8QiFe7OMpPlRomiqUnKBVMpypd8ZuMuHaa4s,6582
101
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
102
106
  pyglove/core/tuning/__init__.py,sha256=JtXpjsBto01fLf55hZ1dSx-CEZUyVQeyRP9AMH_hw8c,2229
103
107
  pyglove/core/tuning/backend.py,sha256=GwbBI9nHYYe5h6iDuhqRtD-Msjmmc7wFtagxW0rTypU,5597
104
108
  pyglove/core/tuning/backend_test.py,sha256=vyfUi509-hbF5uYk-I0FsoniPFBXmobQVl-4d0YPIWY,1999
@@ -111,44 +115,44 @@ pyglove/core/tuning/sample_test.py,sha256=JqwDPy3EPC_VjU9dipk90jj1kovZB3Zb9hAjAl
111
115
  pyglove/core/typing/__init__.py,sha256=u2YSrSi8diTkQn8_1J2hEpk5o7zDhx2tU_oRuS-k1XU,14580
112
116
  pyglove/core/typing/annotated.py,sha256=llaajIDj9GK-4kUGJoO4JsHU6ESPOra2SZ-jG6xmsOQ,3203
113
117
  pyglove/core/typing/annotated_test.py,sha256=p1qid3R-jeiOTTxOVq6hXW8XFvn-h1cUzJWISPst2l8,2484
114
- pyglove/core/typing/annotation_conversion.py,sha256=txUrChAhMNeaukV-PSQEA9BCjtonUQDWFHxnpTE0_K8,15582
115
- 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
116
120
  pyglove/core/typing/annotation_future_test.py,sha256=tAVuzWNfW8R4e4l7fx88Q4nJDM2LPUogNKNAIIPAEWQ,3959
117
121
  pyglove/core/typing/callable_ext.py,sha256=PiBQWPeUAH7Lgmf2xKCZqgK7N0OSrTdbnEkV8Ph31OA,9127
118
122
  pyglove/core/typing/callable_ext_test.py,sha256=TnWKU4_ZjvpbHZFtFHgFvCMDiCos8VmLlODcM_7Xg8M,10156
119
123
  pyglove/core/typing/callable_signature.py,sha256=DRpt7aShfkn8pb3SCiZzS_27eHbkQ_d2UB8BUhJjs0Q,27176
120
124
  pyglove/core/typing/callable_signature_test.py,sha256=iQmHsKPhJPQlMikDhEyxKyq7yWyXI9juKCLYgKhrH3U,25145
121
- pyglove/core/typing/class_schema.py,sha256=3U92-Suwdxlc8mXjK6Tqa9iiqogtRuv1YZwVYpmkMTc,55288
125
+ pyglove/core/typing/class_schema.py,sha256=lbY5yAC8p5rBuvJ8qMBwqbJmqTlC5bunN4yU4T9rhMg,56037
122
126
  pyglove/core/typing/class_schema_test.py,sha256=sJkE7ndDSIKb0EUcjZiVFOeJYDI7Hdu2GdPJCMgZxrI,29556
123
127
  pyglove/core/typing/custom_typing.py,sha256=qdnIKHWNt5kZAAFdpQXra8bBu6RljMbbJ_YDG2mhAUA,2205
124
128
  pyglove/core/typing/inspect.py,sha256=VLSz1KAunNm2hx0eEMjiwxKLl9FHlKr9nHelLT25iEA,7726
125
129
  pyglove/core/typing/inspect_test.py,sha256=xclevobF0X8c_B5b1q1dkBJZN1TsVA1RUhk5l25DUCM,10248
126
- pyglove/core/typing/json_schema.py,sha256=shHElSIpw6AZ5L1iKrKzX3yZXgGKYFJOvMC-syEf-i8,10453
127
- pyglove/core/typing/json_schema_test.py,sha256=DhtyoWLoYzCS-DU67QuwaZKZ-9WgK_ZFVsiFp94Ltx8,13011
130
+ pyglove/core/typing/json_schema.py,sha256=F7uWXN8Tk4cAydh8FE9jncaP_n7KEvgprvNHeagTvqE,17871
131
+ pyglove/core/typing/json_schema_test.py,sha256=ZxMO2xgKiELNDzoQ84cmXsyCtFA0Ltn1I4gZjF-3efY,26482
128
132
  pyglove/core/typing/key_specs.py,sha256=-7xjCuUGoQgD0sMafsRFNlw3S4f1r-7t5OO4ev5bbeI,9225
129
133
  pyglove/core/typing/key_specs_test.py,sha256=5zornpyHMAYoRaG8KDXHiQ3obu9UfRp3399lBeUNTPk,6499
130
134
  pyglove/core/typing/pytype_support.py,sha256=lyX11WVbCwoOi5tTQ90pEOS-yvo_6iEi7Lxbp-nXu2A,2069
131
- pyglove/core/typing/type_conversion.py,sha256=0L4Cbsw_QiM-gpsn-4y-XLEIvwiUB16Clj9gCtoC_Xc,5224
132
- 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
133
137
  pyglove/core/typing/typed_missing.py,sha256=-l1omAu0jBZv5BnsFYXBqfvQwVBnmPh_X1wcIKD9bOk,2734
134
138
  pyglove/core/typing/typed_missing_test.py,sha256=TCNsb1SRpFaVdxYn2mB_yaLuja8w5Qn5NP7uGiZVBWs,2301
135
- pyglove/core/typing/value_specs.py,sha256=8E83QDZMb3lMXhgzfVNt9u6Bg3NPkvpjLXetjkps8UU,103263
136
- pyglove/core/typing/value_specs_test.py,sha256=eGXVxdduIM-oEaapJS9Kh7WSQHRUFegLIJ1GEzQkKHA,131017
137
- pyglove/core/utils/__init__.py,sha256=I2bRTzigU7qJVEATGlLUFkYzkiCBBCCEwrQyhsrRNmI,8602
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
138
142
  pyglove/core/utils/common_traits.py,sha256=PWxOgPhG5H60ZwfO8xNAEGRjFUqqDZQBWQYomOfvdy8,3640
139
143
  pyglove/core/utils/common_traits_test.py,sha256=DIuZB_1xfmeTVfWnGOguDQcDAM_iGgBOe8C-5CsIqBc,1122
140
- pyglove/core/utils/contextual.py,sha256=RxBQkDM2gB6QwZj_2oMels6oh-zQPGJJlinZbbqHuYQ,5148
141
- pyglove/core/utils/contextual_test.py,sha256=OOcthquVyAekTqt1RyYcEMHaockMIokpbv4pSf13Nzs,3252
144
+ pyglove/core/utils/contextual.py,sha256=_EO_ubCcmI81QyYyyucm3QcH1asQWSeXvT2Xa4KONs8,5355
145
+ pyglove/core/utils/contextual_test.py,sha256=g5P6IBf6XgQTUW83QTDC1K5JQJ9bxP6ULiAj2ko4mMo,3552
142
146
  pyglove/core/utils/docstr_utils.py,sha256=5BY40kXozPKVGOB0eN8jy1P5_GHIzqFJ9FXAu_kzxaw,5119
143
147
  pyglove/core/utils/docstr_utils_test.py,sha256=TBHNwvhGyyoEs7dNOv5bW7h3B_y2smDyoAR9uPDiidI,4179
144
- pyglove/core/utils/error_utils.py,sha256=U9Ms3G1a_WUXaFgWccyPL7yOIf4k8Wi0nyXJ3yIaIfY,5264
148
+ pyglove/core/utils/error_utils.py,sha256=5if1LlouHMx9EkZt-rhlkDU53Qc-hmXgjhJHhhI125s,6392
145
149
  pyglove/core/utils/error_utils_test.py,sha256=gnsEwFmgDNNVNvuQyhSWai8GDfLoCuX_DMqYow9Q2l4,2547
146
150
  pyglove/core/utils/formatting.py,sha256=Wn4d933LQLhuMIfjdRJgpxOThCxBxQrkRBa6Z1-hL_I,15591
147
151
  pyglove/core/utils/formatting_test.py,sha256=hhg-nL6DyE5A2QA92ALHK5QtfAYKfPpTbBARF-IT1j0,14241
148
152
  pyglove/core/utils/hierarchical.py,sha256=jwB-0FhqOspAymAkvJphRhPTQEsoShmKupCZpU3Vip4,19690
149
153
  pyglove/core/utils/hierarchical_test.py,sha256=f382DMJPa_bavJGGQDjuw-hWcafUg5bkQCPX-nbzeiI,21077
150
- pyglove/core/utils/json_conversion.py,sha256=26Wt7VDU4df6fT_Joly-UzU87abkAQNL8gYDIh36fQ8,26785
151
- 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
152
156
  pyglove/core/utils/missing.py,sha256=9gslt1lXd1qSEIuAFxUWu30oD-YdYcnm13eau1S9uqY,1445
153
157
  pyglove/core/utils/missing_test.py,sha256=D6-FuVEwCyJemUiPLcwLmwyptqI5Bx0Pfipc2juhKSE,1335
154
158
  pyglove/core/utils/text_color.py,sha256=xcCTCxY2qFNZs_jismMGus8scEXKBpYGAhpAgnz-MHk,4112
@@ -173,8 +177,8 @@ pyglove/core/views/html/controls/label.py,sha256=2u7z_6o-ANf6EbxufFl_fZ1VFSUrjNw
173
177
  pyglove/core/views/html/controls/label_test.py,sha256=_Fi6vMITup8iFYTiU_1w7FZCXaYp1eMmVBxub8JMYbs,5170
174
178
  pyglove/core/views/html/controls/progress_bar.py,sha256=0an0eCbPCDjwrR58C16NwLZ-cf3Oy0wQerLsiNgGHmk,5235
175
179
  pyglove/core/views/html/controls/progress_bar_test.py,sha256=kKOJDZQtBPkmNcgIBrRQkNNzcTm51ojuFBTRUEDSsp0,3506
176
- pyglove/core/views/html/controls/tab.py,sha256=dn2rs6IBqvjtKvk0BC8ypVYqjjHsqJvP_Bh9y94QjMc,10818
177
- 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
178
182
  pyglove/core/views/html/controls/tooltip.py,sha256=01BbpuM1twf3FYMUT09_Ck5JSSONe8QE9RmyA9nhCnU,3092
179
183
  pyglove/core/views/html/controls/tooltip_test.py,sha256=17BY-WmZKpz9tCbySPcwG6KJyfeE_MeMyKxtfxorBQ0,3194
180
184
  pyglove/ext/__init__.py,sha256=3jp8cJvKW6PENOZlmVAbT0w-GBRn_kjhc0wDX3XjpOE,755
@@ -185,7 +189,7 @@ pyglove/ext/early_stopping/step_wise.py,sha256=P99Z2hODmCNBnR3iVOOj2NCCwveSH6h5V
185
189
  pyglove/ext/early_stopping/step_wise_test.py,sha256=I9DDMrCpDwIWC6mV9w2pDypnrwYnWjg6QXTFNT13cts,9032
186
190
  pyglove/ext/evolution/__init__.py,sha256=lAf4NyxUZRt39kMFFoW_i8-ExigJXakG1-sUREW7jkQ,3214
187
191
  pyglove/ext/evolution/base.py,sha256=I27qJja6MErMs3SyrlBYvmDQ4eTq9dY9RVpscKlwReQ,50090
188
- pyglove/ext/evolution/base_test.py,sha256=yIw4YS60c_MvDj71QkoxX5Y2NLZgGc_KzT_NuHMCXMk,29936
192
+ pyglove/ext/evolution/base_test.py,sha256=HgWSGGHh7nd03IFLln3dKV4TsI1kK4idJd4azAGaxHw,29943
189
193
  pyglove/ext/evolution/hill_climb.py,sha256=Bysi2u4KEM7d9CIPcnvKKgEQHttkaKFkI8xlrNOkBB8,1688
190
194
  pyglove/ext/evolution/hill_climb_test.py,sha256=7snzopGFRgkryNXiDVcHMhtVz6LXLZCOH_tz_t15b4I,3110
191
195
  pyglove/ext/evolution/mutators.py,sha256=ZkNmIf9B2KRP3H7UfML7nkjUYPPgOkm5Fe1kaJQ8W5I,10062
@@ -216,8 +220,8 @@ pyglove/ext/scalars/randoms.py,sha256=LkMIIx7lOq_lvJvVS3BrgWGuWl7Pi91-lA-O8x_gZs
216
220
  pyglove/ext/scalars/randoms_test.py,sha256=nEhiqarg8l_5EOucp59CYrpO2uKxS1pe0hmBdZUzRNM,2000
217
221
  pyglove/ext/scalars/step_wise.py,sha256=IDw3tuTpv0KVh7AN44W43zqm1-E0HWPUlytWOQC9w3Y,3789
218
222
  pyglove/ext/scalars/step_wise_test.py,sha256=TL1vJ19xVx2t5HKuyIzGoogF7N3Rm8YhLE6JF7i0iy8,2540
219
- pyglove-0.5.0.dev202508250811.dist-info/licenses/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
220
- pyglove-0.5.0.dev202508250811.dist-info/METADATA,sha256=wsHCsF6fbaycZeiCNEH02HaUj3CnGq_T6XmHYh-p82s,7089
221
- pyglove-0.5.0.dev202508250811.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
222
- pyglove-0.5.0.dev202508250811.dist-info/top_level.txt,sha256=wITzJSKcj8GZUkbq-MvUQnFadkiuAv_qv5qQMw0fIow,8
223
- pyglove-0.5.0.dev202508250811.dist-info/RECORD,,
223
+ pyglove-0.5.0.dev202511300809.dist-info/licenses/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
224
+ pyglove-0.5.0.dev202511300809.dist-info/METADATA,sha256=UenEruuR6yfx1_hUKjd-L5lbN15GMZnpOhKYeA7hwPc,7349
225
+ pyglove-0.5.0.dev202511300809.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
226
+ pyglove-0.5.0.dev202511300809.dist-info/top_level.txt,sha256=wITzJSKcj8GZUkbq-MvUQnFadkiuAv_qv5qQMw0fIow,8
227
+ pyglove-0.5.0.dev202511300809.dist-info/RECORD,,