pyglove 0.4.5.dev202411020808__tar.gz → 0.4.5.dev202411040809__tar.gz

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 (198) hide show
  1. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/PKG-INFO +1 -1
  2. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/typing/value_specs.py +36 -18
  3. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/typing/value_specs_test.py +15 -2
  4. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove.egg-info/PKG-INFO +1 -1
  5. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/LICENSE +0 -0
  6. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/README.md +0 -0
  7. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/__init__.py +0 -0
  8. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/__init__.py +0 -0
  9. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/detouring/__init__.py +0 -0
  10. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/detouring/class_detour.py +0 -0
  11. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/detouring/class_detour_test.py +0 -0
  12. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/geno/__init__.py +0 -0
  13. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/geno/base.py +0 -0
  14. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/geno/base_test.py +0 -0
  15. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/geno/categorical.py +0 -0
  16. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/geno/categorical_test.py +0 -0
  17. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/geno/custom.py +0 -0
  18. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/geno/custom_test.py +0 -0
  19. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/geno/deduping.py +0 -0
  20. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/geno/deduping_test.py +0 -0
  21. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/geno/dna_generator.py +0 -0
  22. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/geno/dna_generator_test.py +0 -0
  23. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/geno/numerical.py +0 -0
  24. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/geno/numerical_test.py +0 -0
  25. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/geno/random.py +0 -0
  26. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/geno/random_test.py +0 -0
  27. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/geno/space.py +0 -0
  28. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/geno/space_test.py +0 -0
  29. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/geno/sweeping.py +0 -0
  30. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/geno/sweeping_test.py +0 -0
  31. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/hyper/__init__.py +0 -0
  32. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/hyper/base.py +0 -0
  33. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/hyper/categorical.py +0 -0
  34. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/hyper/categorical_test.py +0 -0
  35. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/hyper/custom.py +0 -0
  36. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/hyper/custom_test.py +0 -0
  37. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/hyper/derived.py +0 -0
  38. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/hyper/derived_test.py +0 -0
  39. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/hyper/dynamic_evaluation.py +0 -0
  40. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/hyper/dynamic_evaluation_test.py +0 -0
  41. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/hyper/evolvable.py +0 -0
  42. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/hyper/evolvable_test.py +0 -0
  43. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/hyper/iter.py +0 -0
  44. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/hyper/iter_test.py +0 -0
  45. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/hyper/numerical.py +0 -0
  46. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/hyper/numerical_test.py +0 -0
  47. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/hyper/object_template.py +0 -0
  48. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/hyper/object_template_test.py +0 -0
  49. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/io/__init__.py +0 -0
  50. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/io/file_system.py +0 -0
  51. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/io/file_system_test.py +0 -0
  52. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/io/sequence.py +0 -0
  53. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/io/sequence_test.py +0 -0
  54. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/logging.py +0 -0
  55. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/logging_test.py +0 -0
  56. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/object_utils/__init__.py +0 -0
  57. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/object_utils/codegen.py +0 -0
  58. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/object_utils/codegen_test.py +0 -0
  59. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/object_utils/common_traits.py +0 -0
  60. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/object_utils/common_traits_test.py +0 -0
  61. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/object_utils/docstr_utils.py +0 -0
  62. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/object_utils/docstr_utils_test.py +0 -0
  63. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/object_utils/error_utils.py +0 -0
  64. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/object_utils/error_utils_test.py +0 -0
  65. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/object_utils/formatting.py +0 -0
  66. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/object_utils/formatting_test.py +0 -0
  67. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/object_utils/hierarchical.py +0 -0
  68. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/object_utils/hierarchical_test.py +0 -0
  69. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/object_utils/json_conversion.py +0 -0
  70. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/object_utils/json_conversion_test.py +0 -0
  71. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/object_utils/missing.py +0 -0
  72. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/object_utils/missing_test.py +0 -0
  73. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/object_utils/thread_local.py +0 -0
  74. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/object_utils/thread_local_test.py +0 -0
  75. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/object_utils/timing.py +0 -0
  76. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/object_utils/timing_test.py +0 -0
  77. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/object_utils/value_location.py +0 -0
  78. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/object_utils/value_location_test.py +0 -0
  79. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/patching/__init__.py +0 -0
  80. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/patching/object_factory.py +0 -0
  81. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/patching/object_factory_test.py +0 -0
  82. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/patching/pattern_based.py +0 -0
  83. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/patching/pattern_based_test.py +0 -0
  84. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/patching/rule_based.py +0 -0
  85. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/patching/rule_based_test.py +0 -0
  86. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/__init__.py +0 -0
  87. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/base.py +0 -0
  88. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/base_test.py +0 -0
  89. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/boilerplate.py +0 -0
  90. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/boilerplate_test.py +0 -0
  91. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/class_wrapper.py +0 -0
  92. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/class_wrapper_test.py +0 -0
  93. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/compounding.py +0 -0
  94. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/compounding_test.py +0 -0
  95. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/dict.py +0 -0
  96. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/dict_test.py +0 -0
  97. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/diff.py +0 -0
  98. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/diff_test.py +0 -0
  99. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/flags.py +0 -0
  100. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/flags_test.py +0 -0
  101. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/functor.py +0 -0
  102. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/functor_test.py +0 -0
  103. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/inferred.py +0 -0
  104. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/inferred_test.py +0 -0
  105. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/list.py +0 -0
  106. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/list_test.py +0 -0
  107. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/object.py +0 -0
  108. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/object_test.py +0 -0
  109. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/origin.py +0 -0
  110. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/origin_test.py +0 -0
  111. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/pure_symbolic.py +0 -0
  112. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/ref.py +0 -0
  113. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/ref_test.py +0 -0
  114. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/symbolize.py +0 -0
  115. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/symbolic/symbolize_test.py +0 -0
  116. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/tuning/__init__.py +0 -0
  117. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/tuning/backend.py +0 -0
  118. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/tuning/backend_test.py +0 -0
  119. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/tuning/early_stopping.py +0 -0
  120. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/tuning/local_backend.py +0 -0
  121. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/tuning/protocols.py +0 -0
  122. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/tuning/protocols_test.py +0 -0
  123. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/tuning/sample.py +0 -0
  124. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/tuning/sample_test.py +0 -0
  125. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/typing/__init__.py +0 -0
  126. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/typing/annotated.py +0 -0
  127. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/typing/annotated_test.py +0 -0
  128. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/typing/annotation_conversion.py +0 -0
  129. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/typing/annotation_conversion_test.py +0 -0
  130. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/typing/callable_ext.py +0 -0
  131. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/typing/callable_ext_test.py +0 -0
  132. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/typing/callable_signature.py +0 -0
  133. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/typing/callable_signature_test.py +0 -0
  134. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/typing/class_schema.py +0 -0
  135. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/typing/class_schema_test.py +0 -0
  136. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/typing/custom_typing.py +0 -0
  137. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/typing/inspect.py +0 -0
  138. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/typing/inspect_test.py +0 -0
  139. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/typing/key_specs.py +0 -0
  140. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/typing/key_specs_test.py +0 -0
  141. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/typing/pytype_support.py +0 -0
  142. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/typing/type_conversion.py +0 -0
  143. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/typing/type_conversion_test.py +0 -0
  144. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/typing/typed_missing.py +0 -0
  145. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/typing/typed_missing_test.py +0 -0
  146. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/views/__init__.py +0 -0
  147. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/views/base.py +0 -0
  148. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/views/base_test.py +0 -0
  149. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/views/html/__init__.py +0 -0
  150. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/views/html/base.py +0 -0
  151. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/views/html/base_test.py +0 -0
  152. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/views/html/tree_view.py +0 -0
  153. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/core/views/html/tree_view_test.py +0 -0
  154. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/__init__.py +0 -0
  155. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/early_stopping/__init__.py +0 -0
  156. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/early_stopping/base.py +0 -0
  157. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/early_stopping/base_test.py +0 -0
  158. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/early_stopping/step_wise.py +0 -0
  159. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/early_stopping/step_wise_test.py +0 -0
  160. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/evolution/__init__.py +0 -0
  161. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/evolution/base.py +0 -0
  162. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/evolution/base_test.py +0 -0
  163. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/evolution/hill_climb.py +0 -0
  164. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/evolution/hill_climb_test.py +0 -0
  165. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/evolution/mutators.py +0 -0
  166. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/evolution/mutators_test.py +0 -0
  167. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/evolution/neat.py +0 -0
  168. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/evolution/neat_test.py +0 -0
  169. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/evolution/nsga2.py +0 -0
  170. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/evolution/nsga2_test.py +0 -0
  171. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/evolution/recombinators.py +0 -0
  172. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/evolution/recombinators_test.py +0 -0
  173. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/evolution/regularized_evolution.py +0 -0
  174. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/evolution/regularized_evolution_test.py +0 -0
  175. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/evolution/selectors.py +0 -0
  176. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/evolution/selectors_test.py +0 -0
  177. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/evolution/where.py +0 -0
  178. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/evolution/where_test.py +0 -0
  179. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/mutfun/__init__.py +0 -0
  180. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/mutfun/base.py +0 -0
  181. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/mutfun/base_test.py +0 -0
  182. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/mutfun/basic_ops.py +0 -0
  183. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/mutfun/basic_ops_test.py +0 -0
  184. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/scalars/__init__.py +0 -0
  185. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/scalars/base.py +0 -0
  186. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/scalars/base_test.py +0 -0
  187. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/scalars/maths.py +0 -0
  188. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/scalars/maths_test.py +0 -0
  189. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/scalars/randoms.py +0 -0
  190. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/scalars/randoms_test.py +0 -0
  191. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/scalars/step_wise.py +0 -0
  192. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove/ext/scalars/step_wise_test.py +0 -0
  193. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove.egg-info/SOURCES.txt +0 -0
  194. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove.egg-info/dependency_links.txt +0 -0
  195. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove.egg-info/requires.txt +0 -0
  196. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/pyglove.egg-info/top_level.txt +0 -0
  197. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/setup.cfg +0 -0
  198. {pyglove-0.4.5.dev202411020808 → pyglove-0.4.5.dev202411040809}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyglove
3
- Version: 0.4.5.dev202411020808
3
+ Version: 0.4.5.dev202411040809
4
4
  Summary: PyGlove: A library for manipulating Python objects.
5
5
  Home-page: https://github.com/google/pyglove
6
6
  Author: PyGlove Authors
@@ -2612,35 +2612,53 @@ class Union(Generic, ValueSpecBase):
2612
2612
  ],
2613
2613
  root_path: object_utils.KeyPath) -> typing.Any:
2614
2614
  """Union specific apply."""
2615
+ # Match strong-typed candidates first.
2616
+ if not self.type_resolved:
2617
+ return value
2618
+
2615
2619
  for c in self._candidates:
2616
- if (c.type_resolved
2617
- and (c.value_type is None or isinstance(value, c.value_type))):
2620
+ if c.value_type is not None and isinstance(value, c.value_type):
2618
2621
  return c.apply(
2619
2622
  value,
2620
2623
  allow_partial=allow_partial,
2621
2624
  child_transform=child_transform,
2622
- root_path=root_path)
2625
+ root_path=root_path
2626
+ )
2627
+
2628
+ def _try_candidate(c, value) -> typing.Tuple[typing.Any, bool]:
2629
+ try:
2630
+ return c.apply(
2631
+ value, allow_partial=allow_partial,
2632
+ child_transform=child_transform, root_path=root_path
2633
+ ), True
2634
+ except TypeError:
2635
+ return value, False
2636
+
2637
+ # Match non-strong-typed candidates (e.g. Callable).
2638
+ for c in self._candidates:
2639
+ if c.value_type is None:
2640
+ value, success = _try_candidate(c, value)
2641
+ if success:
2642
+ return value
2623
2643
 
2624
2644
  # NOTE(daiyip): This code is to support consider A as B scenario when there
2625
2645
  # is a converter from A to B (converter may return value that is not B). A
2626
2646
  # use case is that tf.Variable is not a tf.Tensor, but value spec of
2627
2647
  # tf.Tensor should be able to accept tf.Variable.
2628
- matched_candidate = None
2629
2648
  for c in self._candidates:
2630
- if c.type_resolved and type_conversion.get_converter(
2631
- type(value), c.value_type) is not None:
2632
- matched_candidate = c
2633
- break
2634
-
2635
- if self.type_resolved:
2636
- # `_apply` is entered only when there is a type match or conversion path.
2637
- assert matched_candidate is not None
2638
- return matched_candidate.apply(
2639
- value, allow_partial, child_transform, root_path)
2640
-
2641
- # Return value directly if the forward declaration of the current union
2642
- # is unsolved.
2643
- return value
2649
+ if c.value_type is None:
2650
+ continue
2651
+ converter = type_conversion.get_converter(type(value), c.value_type)
2652
+ if converter is not None:
2653
+ return c.apply(
2654
+ converter(value),
2655
+ allow_partial=allow_partial,
2656
+ child_transform=child_transform,
2657
+ root_path=root_path
2658
+ )
2659
+ raise TypeError(
2660
+ f'{value!r} does not match any candidate of {self!r}.'
2661
+ )
2644
2662
 
2645
2663
  def _extend(self, base: 'Union') -> None:
2646
2664
  """Union specific extension."""
@@ -11,9 +11,8 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
- """Tests for pyglove.core.typing.value_specs."""
15
-
16
14
  import contextlib
15
+ import datetime
17
16
  import inspect
18
17
  import sys
19
18
  import typing
@@ -3141,6 +3140,15 @@ class UnionTest(ValueSpecTest):
3141
3140
  with self.assertRaisesRegex(TypeError, 'Expect .* but encountered .*'):
3142
3141
  _ = v.apply('foo')
3143
3142
 
3143
+ # Union with strong-type and non-strong-type candidates.
3144
+ self.assertEqual(
3145
+ vs.Union([typing.Callable[[int], int], str]).apply('foo'), 'foo'
3146
+ )
3147
+ # Union with type conversion.
3148
+ self.assertIsInstance(
3149
+ vs.Union([int, str]).apply(datetime.datetime.now()), int
3150
+ )
3151
+
3144
3152
  # Bad cases.
3145
3153
  with self.assertRaisesRegex(ValueError, 'Value cannot be None'):
3146
3154
  vs.Union([vs.Int(), vs.Str()]).apply(None)
@@ -3149,6 +3157,11 @@ class UnionTest(ValueSpecTest):
3149
3157
  TypeError, 'Expect \\(.*\\) but encountered <(type|class) \'list\'>.'):
3150
3158
  vs.Union([vs.Int(), vs.Str()]).apply([])
3151
3159
 
3160
+ with self.assertRaisesRegex(
3161
+ TypeError, '1 does not match any candidate of .*'
3162
+ ):
3163
+ vs.Union([typing.Callable[[int], int], str]).apply(1)
3164
+
3152
3165
  def test_is_compatible(self):
3153
3166
  self.assertTrue(
3154
3167
  vs.Union([vs.Int(), vs.Bool()]).is_compatible(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyglove
3
- Version: 0.4.5.dev202411020808
3
+ Version: 0.4.5.dev202411040809
4
4
  Summary: PyGlove: A library for manipulating Python objects.
5
5
  Home-page: https://github.com/google/pyglove
6
6
  Author: PyGlove Authors