pyglove 0.4.5.dev202410301815__tar.gz → 0.4.5.dev202410310809__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.dev202410301815 → pyglove-0.4.5.dev202410310809}/PKG-INFO +1 -1
  2. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/io/file_system.py +4 -4
  3. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/io/sequence.py +8 -10
  4. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/io/sequence_test.py +2 -15
  5. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/object_utils/error_utils.py +6 -6
  6. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/object_utils/error_utils_test.py +4 -4
  7. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/object_utils/timing.py +23 -12
  8. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/object_utils/timing_test.py +8 -4
  9. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove.egg-info/PKG-INFO +1 -1
  10. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/LICENSE +0 -0
  11. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/README.md +0 -0
  12. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/__init__.py +0 -0
  13. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/__init__.py +0 -0
  14. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/detouring/__init__.py +0 -0
  15. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/detouring/class_detour.py +0 -0
  16. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/detouring/class_detour_test.py +0 -0
  17. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/geno/__init__.py +0 -0
  18. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/geno/base.py +0 -0
  19. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/geno/base_test.py +0 -0
  20. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/geno/categorical.py +0 -0
  21. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/geno/categorical_test.py +0 -0
  22. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/geno/custom.py +0 -0
  23. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/geno/custom_test.py +0 -0
  24. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/geno/deduping.py +0 -0
  25. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/geno/deduping_test.py +0 -0
  26. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/geno/dna_generator.py +0 -0
  27. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/geno/dna_generator_test.py +0 -0
  28. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/geno/numerical.py +0 -0
  29. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/geno/numerical_test.py +0 -0
  30. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/geno/random.py +0 -0
  31. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/geno/random_test.py +0 -0
  32. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/geno/space.py +0 -0
  33. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/geno/space_test.py +0 -0
  34. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/geno/sweeping.py +0 -0
  35. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/geno/sweeping_test.py +0 -0
  36. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/hyper/__init__.py +0 -0
  37. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/hyper/base.py +0 -0
  38. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/hyper/categorical.py +0 -0
  39. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/hyper/categorical_test.py +0 -0
  40. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/hyper/custom.py +0 -0
  41. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/hyper/custom_test.py +0 -0
  42. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/hyper/derived.py +0 -0
  43. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/hyper/derived_test.py +0 -0
  44. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/hyper/dynamic_evaluation.py +0 -0
  45. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/hyper/dynamic_evaluation_test.py +0 -0
  46. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/hyper/evolvable.py +0 -0
  47. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/hyper/evolvable_test.py +0 -0
  48. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/hyper/iter.py +0 -0
  49. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/hyper/iter_test.py +0 -0
  50. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/hyper/numerical.py +0 -0
  51. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/hyper/numerical_test.py +0 -0
  52. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/hyper/object_template.py +0 -0
  53. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/hyper/object_template_test.py +0 -0
  54. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/io/__init__.py +0 -0
  55. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/io/file_system_test.py +0 -0
  56. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/logging.py +0 -0
  57. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/logging_test.py +0 -0
  58. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/object_utils/__init__.py +0 -0
  59. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/object_utils/codegen.py +0 -0
  60. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/object_utils/codegen_test.py +0 -0
  61. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/object_utils/common_traits.py +0 -0
  62. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/object_utils/common_traits_test.py +0 -0
  63. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/object_utils/docstr_utils.py +0 -0
  64. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/object_utils/docstr_utils_test.py +0 -0
  65. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/object_utils/formatting.py +0 -0
  66. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/object_utils/formatting_test.py +0 -0
  67. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/object_utils/hierarchical.py +0 -0
  68. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/object_utils/hierarchical_test.py +0 -0
  69. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/object_utils/json_conversion.py +0 -0
  70. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/object_utils/json_conversion_test.py +0 -0
  71. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/object_utils/missing.py +0 -0
  72. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/object_utils/missing_test.py +0 -0
  73. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/object_utils/thread_local.py +0 -0
  74. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/object_utils/thread_local_test.py +0 -0
  75. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/object_utils/value_location.py +0 -0
  76. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/object_utils/value_location_test.py +0 -0
  77. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/patching/__init__.py +0 -0
  78. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/patching/object_factory.py +0 -0
  79. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/patching/object_factory_test.py +0 -0
  80. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/patching/pattern_based.py +0 -0
  81. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/patching/pattern_based_test.py +0 -0
  82. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/patching/rule_based.py +0 -0
  83. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/patching/rule_based_test.py +0 -0
  84. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/__init__.py +0 -0
  85. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/base.py +0 -0
  86. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/base_test.py +0 -0
  87. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/boilerplate.py +0 -0
  88. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/boilerplate_test.py +0 -0
  89. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/class_wrapper.py +0 -0
  90. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/class_wrapper_test.py +0 -0
  91. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/compounding.py +0 -0
  92. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/compounding_test.py +0 -0
  93. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/dict.py +0 -0
  94. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/dict_test.py +0 -0
  95. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/diff.py +0 -0
  96. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/diff_test.py +0 -0
  97. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/flags.py +0 -0
  98. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/flags_test.py +0 -0
  99. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/functor.py +0 -0
  100. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/functor_test.py +0 -0
  101. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/inferred.py +0 -0
  102. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/inferred_test.py +0 -0
  103. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/list.py +0 -0
  104. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/list_test.py +0 -0
  105. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/object.py +0 -0
  106. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/object_test.py +0 -0
  107. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/origin.py +0 -0
  108. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/origin_test.py +0 -0
  109. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/pure_symbolic.py +0 -0
  110. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/ref.py +0 -0
  111. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/ref_test.py +0 -0
  112. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/symbolize.py +0 -0
  113. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/symbolic/symbolize_test.py +0 -0
  114. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/tuning/__init__.py +0 -0
  115. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/tuning/backend.py +0 -0
  116. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/tuning/backend_test.py +0 -0
  117. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/tuning/early_stopping.py +0 -0
  118. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/tuning/local_backend.py +0 -0
  119. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/tuning/protocols.py +0 -0
  120. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/tuning/protocols_test.py +0 -0
  121. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/tuning/sample.py +0 -0
  122. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/tuning/sample_test.py +0 -0
  123. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/typing/__init__.py +0 -0
  124. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/typing/annotated.py +0 -0
  125. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/typing/annotated_test.py +0 -0
  126. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/typing/annotation_conversion.py +0 -0
  127. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/typing/annotation_conversion_test.py +0 -0
  128. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/typing/callable_ext.py +0 -0
  129. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/typing/callable_ext_test.py +0 -0
  130. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/typing/callable_signature.py +0 -0
  131. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/typing/callable_signature_test.py +0 -0
  132. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/typing/class_schema.py +0 -0
  133. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/typing/class_schema_test.py +0 -0
  134. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/typing/custom_typing.py +0 -0
  135. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/typing/inspect.py +0 -0
  136. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/typing/inspect_test.py +0 -0
  137. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/typing/key_specs.py +0 -0
  138. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/typing/key_specs_test.py +0 -0
  139. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/typing/pytype_support.py +0 -0
  140. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/typing/type_conversion.py +0 -0
  141. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/typing/type_conversion_test.py +0 -0
  142. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/typing/typed_missing.py +0 -0
  143. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/typing/typed_missing_test.py +0 -0
  144. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/typing/value_specs.py +0 -0
  145. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/typing/value_specs_test.py +0 -0
  146. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/views/__init__.py +0 -0
  147. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/views/base.py +0 -0
  148. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/views/base_test.py +0 -0
  149. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/views/html/__init__.py +0 -0
  150. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/views/html/base.py +0 -0
  151. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/views/html/base_test.py +0 -0
  152. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/views/html/tree_view.py +0 -0
  153. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/core/views/html/tree_view_test.py +0 -0
  154. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/__init__.py +0 -0
  155. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/early_stopping/__init__.py +0 -0
  156. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/early_stopping/base.py +0 -0
  157. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/early_stopping/base_test.py +0 -0
  158. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/early_stopping/step_wise.py +0 -0
  159. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/early_stopping/step_wise_test.py +0 -0
  160. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/evolution/__init__.py +0 -0
  161. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/evolution/base.py +0 -0
  162. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/evolution/base_test.py +0 -0
  163. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/evolution/hill_climb.py +0 -0
  164. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/evolution/hill_climb_test.py +0 -0
  165. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/evolution/mutators.py +0 -0
  166. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/evolution/mutators_test.py +0 -0
  167. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/evolution/neat.py +0 -0
  168. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/evolution/neat_test.py +0 -0
  169. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/evolution/nsga2.py +0 -0
  170. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/evolution/nsga2_test.py +0 -0
  171. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/evolution/recombinators.py +0 -0
  172. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/evolution/recombinators_test.py +0 -0
  173. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/evolution/regularized_evolution.py +0 -0
  174. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/evolution/regularized_evolution_test.py +0 -0
  175. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/evolution/selectors.py +0 -0
  176. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/evolution/selectors_test.py +0 -0
  177. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/evolution/where.py +0 -0
  178. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/evolution/where_test.py +0 -0
  179. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/mutfun/__init__.py +0 -0
  180. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/mutfun/base.py +0 -0
  181. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/mutfun/base_test.py +0 -0
  182. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/mutfun/basic_ops.py +0 -0
  183. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/mutfun/basic_ops_test.py +0 -0
  184. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/scalars/__init__.py +0 -0
  185. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/scalars/base.py +0 -0
  186. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/scalars/base_test.py +0 -0
  187. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/scalars/maths.py +0 -0
  188. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/scalars/maths_test.py +0 -0
  189. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/scalars/randoms.py +0 -0
  190. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/scalars/randoms_test.py +0 -0
  191. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/scalars/step_wise.py +0 -0
  192. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove/ext/scalars/step_wise_test.py +0 -0
  193. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove.egg-info/SOURCES.txt +0 -0
  194. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove.egg-info/dependency_links.txt +0 -0
  195. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove.egg-info/requires.txt +0 -0
  196. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/pyglove.egg-info/top_level.txt +0 -0
  197. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/setup.cfg +0 -0
  198. {pyglove-0.4.5.dev202410301815 → pyglove-0.4.5.dev202410310809}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyglove
3
- Version: 0.4.5.dev202410301815
3
+ Version: 0.4.5.dev202410310809
4
4
  Summary: PyGlove: A library for manipulating Python objects.
5
5
  Home-page: https://github.com/google/pyglove
6
6
  Author: PyGlove Authors
@@ -116,7 +116,7 @@ class FileSystem(metaclass=abc.ABCMeta):
116
116
  """Removes a directory chain based on a path."""
117
117
 
118
118
 
119
- def _resolve_path(path: Union[str, os.PathLike[str]]) -> str:
119
+ def resolve_path(path: Union[str, os.PathLike[str]]) -> str:
120
120
  if isinstance(path, str):
121
121
  return path
122
122
  elif hasattr(path, '__fspath__'):
@@ -243,7 +243,7 @@ class MemoryFileSystem(FileSystem):
243
243
  self._prefix = prefix
244
244
 
245
245
  def _internal_path(self, path: Union[str, os.PathLike[str]]) -> str:
246
- return '/' + _resolve_path(path).lstrip(self._prefix)
246
+ return '/' + resolve_path(path).lstrip(self._prefix)
247
247
 
248
248
  def _locate(self, path: Union[str, os.PathLike[str]]) -> Any:
249
249
  current = self._root
@@ -287,7 +287,7 @@ class MemoryFileSystem(FileSystem):
287
287
  def _parent_and_name(
288
288
  self, path: Union[str, os.PathLike[str]]
289
289
  ) -> tuple[dict[str, Any], str]:
290
- path = _resolve_path(path)
290
+ path = resolve_path(path)
291
291
  rpos = path.rfind('/')
292
292
  assert rpos >= 0, path
293
293
  name = path[rpos + 1:]
@@ -382,7 +382,7 @@ class _FileSystemRegistry:
382
382
 
383
383
  def get(self, path: Union[str, os.PathLike[str]]) -> FileSystem:
384
384
  """Gets the file system for a path."""
385
- path = _resolve_path(path)
385
+ path = resolve_path(path)
386
386
  for prefix, fs in self._filesystems:
387
387
  if path.startswith(prefix):
388
388
  return fs
@@ -107,7 +107,7 @@ class _SequenceIORegistry(object):
107
107
 
108
108
  def get(self, path: Union[str, os.PathLike[str]]) -> SequenceIO:
109
109
  """Gets the record IO system for a path."""
110
- path = _resolve_path(path)
110
+ path = file_system.resolve_path(path)
111
111
  parts = path.split('.')
112
112
  if parts:
113
113
  extension = parts[-1].lower()
@@ -126,15 +126,6 @@ def add_sequence_io(extension: str, sequence_io: SequenceIO) -> None:
126
126
  _registry.add(extension, sequence_io)
127
127
 
128
128
 
129
- def _resolve_path(path: Union[str, os.PathLike[str]]) -> str:
130
- if isinstance(path, str):
131
- return path
132
- elif hasattr(path, '__fspath__'):
133
- return path.__fspath__()
134
- else:
135
- raise ValueError(f'Unsupported path: {path!r}.')
136
-
137
-
138
129
  def open_sequence(
139
130
  path: Union[str, os.PathLike[str]],
140
131
  mode: str = 'r',
@@ -145,6 +136,7 @@ def open_sequence(
145
136
  deserializer: Optional[
146
137
  Callable[[Union[bytes, str]], Any]
147
138
  ] = None,
139
+ make_dirs_if_not_exist: bool = True,
148
140
  ) -> Sequence:
149
141
  """Open sequence for reading or writing.
150
142
 
@@ -155,10 +147,16 @@ def open_sequence(
155
147
  object to a string or bytes.
156
148
  deserializer: (Optional) A deserializer function for converting a string or
157
149
  bytes to a structured object.
150
+ make_dirs_if_not_exist: (Optional) Whether to create the directories
151
+ if they do not exist. Applicable when opening in write or append mode.
158
152
 
159
153
  Returns:
160
154
  A sequence for reading or writing.
161
155
  """
156
+ if 'w' in mode or 'a' in mode:
157
+ parent_dir = os.path.dirname(path)
158
+ if make_dirs_if_not_exist:
159
+ file_system.mkdirs(parent_dir, exist_ok=True)
162
160
  return _registry.get(path).open(
163
161
  path, mode, serializer=serializer, deserializer=deserializer
164
162
  )
@@ -13,7 +13,6 @@
13
13
  # limitations under the License.
14
14
 
15
15
  import os
16
- import pathlib
17
16
  import tempfile
18
17
  import unittest
19
18
  from pyglove.core.io import sequence as sequence_io
@@ -25,7 +24,7 @@ class LineSequenceIOTest(unittest.TestCase):
25
24
 
26
25
  def test_read_write(self):
27
26
  tmp_dir = tempfile.gettempdir()
28
- file1 = os.path.join(tmp_dir, 'file1')
27
+ file1 = os.path.join(tmp_dir, 'abc', 'file1')
29
28
  with pg_symbolic.open_jsonl(file1, 'w') as f:
30
29
  self.assertIsInstance(f, sequence_io.LineSequence)
31
30
  f.add(1)
@@ -73,19 +72,7 @@ class LineSequenceIOTest(unittest.TestCase):
73
72
  self.assertEqual(list(iter(f)), ['foo', 'bar'])
74
73
 
75
74
 
76
- class MemoryRecordIOIOTest(unittest.TestCase):
77
-
78
- def test_resolve_path(self):
79
- self.assertEqual(
80
- sequence_io._resolve_path('/file1.mem@123'),
81
- '/file1.mem@123'
82
- )
83
- self.assertEqual(
84
- sequence_io._resolve_path(pathlib.Path('/file1.mem@123.txt')),
85
- '/file1.mem@123.txt'
86
- )
87
- with self.assertRaisesRegex(ValueError, 'Unsupported path'):
88
- sequence_io._resolve_path(1)
75
+ class MemorySequenceIOTest(unittest.TestCase):
89
76
 
90
77
  def test_read_write(self):
91
78
  with sequence_io.open_sequence('/file1.mem@123', 'w') as f:
@@ -30,19 +30,19 @@ class ErrorInfo(json_conversion.JSONConvertible, formatting.Formattable):
30
30
  """Serializable error information.
31
31
 
32
32
  Attributes:
33
- type: The type path of the error. For example,
33
+ tag: A path of the error types in the exception chain. For example,
34
34
  `ValueError.ZeroDivisionError` means the error is a `ZeroDivisionError`
35
35
  raised at the first place and then reraised as a `ValueError`.
36
36
  description: The description of the error.
37
37
  stacktrace: The stacktrace of the error.
38
38
  """
39
39
 
40
- type: str
40
+ tag: str
41
41
  description: str
42
42
  stacktrace: str
43
43
 
44
44
  @classmethod
45
- def _get_type(cls, error: BaseException):
45
+ def _compute_tag(cls, error: BaseException):
46
46
  error_types = []
47
47
  while error is not None:
48
48
  error_types.append(error.__class__.__name__)
@@ -53,7 +53,7 @@ class ErrorInfo(json_conversion.JSONConvertible, formatting.Formattable):
53
53
  def from_exception(cls, error: BaseException) -> 'ErrorInfo':
54
54
  """Creates an error info from an exception."""
55
55
  return cls(
56
- type=cls._get_type(error),
56
+ tag=cls._compute_tag(error),
57
57
  description=str(error),
58
58
  stacktrace=''.join(
59
59
  traceback.format_exception(*sys.exc_info())
@@ -63,7 +63,7 @@ class ErrorInfo(json_conversion.JSONConvertible, formatting.Formattable):
63
63
  def to_json(self, **kwargs) -> Dict[str, Any]:
64
64
  return self.to_json_dict(
65
65
  fields=dict(
66
- type=(self.type, None),
66
+ tag=(self.tag, None),
67
67
  description=(self.description, None),
68
68
  stacktrace=(self.stacktrace, None),
69
69
  ),
@@ -74,7 +74,7 @@ class ErrorInfo(json_conversion.JSONConvertible, formatting.Formattable):
74
74
  def format(self, *args, **kwargs) -> str:
75
75
  return formatting.kvlist_str(
76
76
  [
77
- ('type', self.type, None),
77
+ ('tag', self.tag, None),
78
78
  ('description', self.description, None),
79
79
  ('stacktrace', self.stacktrace, None),
80
80
  ],
@@ -36,13 +36,13 @@ class ErrorInfoTest(unittest.TestCase):
36
36
  except ValueError as e:
37
37
  error_info = error_utils.ErrorInfo.from_exception(e)
38
38
  self.assertIsNotNone(error_info)
39
- self.assertEqual(error_info.type, 'ValueError.ZeroDivisionError')
39
+ self.assertEqual(error_info.tag, 'ValueError.ZeroDivisionError')
40
40
  self.assertEqual(error_info.description, 'Bad call to `foo`')
41
41
  self.assertIn('Traceback (most recent call last)', error_info.stacktrace)
42
42
 
43
43
  def test_to_json(self):
44
44
  error_info = error_utils.ErrorInfo(
45
- type='ValueError.ZeroDivisionError',
45
+ tag='ValueError.ZeroDivisionError',
46
46
  description='Bad call to `foo`',
47
47
  stacktrace='Traceback (most recent call last)',
48
48
  )
@@ -53,7 +53,7 @@ class ErrorInfoTest(unittest.TestCase):
53
53
 
54
54
  def test_format(self):
55
55
  error_info = error_utils.ErrorInfo(
56
- type='ValueError.ZeroDivisionError',
56
+ tag='ValueError.ZeroDivisionError',
57
57
  description='Bad call to `foo`',
58
58
  stacktrace='Traceback (most recent call last)',
59
59
  )
@@ -62,7 +62,7 @@ class ErrorInfoTest(unittest.TestCase):
62
62
  inspect.cleandoc(
63
63
  """
64
64
  ErrorInfo(
65
- type='ValueError.ZeroDivisionError',
65
+ tag='ValueError.ZeroDivisionError',
66
66
  description='Bad call to `foo`',
67
67
  stacktrace='Traceback (most recent call last)'
68
68
  )
@@ -13,10 +13,12 @@
13
13
  # limitations under the License.
14
14
  """Utilities for timing."""
15
15
 
16
+ import collections
16
17
  import dataclasses
17
18
  import time
18
19
  from typing import Any, Dict, List, Optional
19
20
 
21
+ from pyglove.core.object_utils import error_utils
20
22
  from pyglove.core.object_utils import json_conversion
21
23
  from pyglove.core.object_utils import thread_local
22
24
 
@@ -30,7 +32,7 @@ class TimeIt:
30
32
  name: str
31
33
  elapse: float = 0.0
32
34
  has_ended: bool = True
33
- error: Optional[Exception] = None
35
+ error: Optional[error_utils.ErrorInfo] = None
34
36
 
35
37
  @property
36
38
  def has_started(self) -> bool:
@@ -66,6 +68,9 @@ class TimeIt:
66
68
  num_ended: int = 0
67
69
  num_failed: int = 0
68
70
  avg_duration: float = 0.0
71
+ error_tags: Dict[str, int] = dataclasses.field(
72
+ default_factory=lambda: collections.defaultdict(int)
73
+ )
69
74
 
70
75
  def update(self, status: 'TimeIt.Status'):
71
76
  self.avg_duration = (
@@ -77,6 +82,8 @@ class TimeIt:
77
82
  self.num_ended += 1
78
83
  if status.has_error:
79
84
  self.num_failed += 1
85
+ assert status.error is not None
86
+ self.error_tags[status.error.tag] += 1
80
87
 
81
88
  def to_json(self, **kwargs) -> Dict[str, Any]:
82
89
  return self.to_json_dict(
@@ -85,6 +92,7 @@ class TimeIt:
85
92
  num_ended=(self.num_ended, 0),
86
93
  num_failed=(self.num_failed, 0),
87
94
  avg_duration=(self.avg_duration, 0.0),
95
+ error_tags=(self.error_tags, {}),
88
96
  ),
89
97
  exclude_default=True,
90
98
  **kwargs,
@@ -113,13 +121,13 @@ class TimeIt:
113
121
  **kwargs,
114
122
  )
115
123
 
116
- def __init__(self, name: str):
117
- self._name = name
118
- self._start_time = None
119
- self._end_time = None
120
- self._child_contexts = {}
121
- self._error = None
122
- self._parent = None
124
+ def __init__(self, name: str = ''):
125
+ self._name: str = name
126
+ self._start_time: Optional[float] = None
127
+ self._end_time: Optional[float] = None
128
+ self._child_contexts: Dict[str, TimeIt] = {}
129
+ self._error: Optional[error_utils.ErrorInfo] = None
130
+ self._parent: Optional[TimeIt] = None
123
131
 
124
132
  @property
125
133
  def name(self) -> str:
@@ -145,7 +153,9 @@ class TimeIt:
145
153
  """Ends timing."""
146
154
  if not self.has_ended:
147
155
  self._end_time = time.time()
148
- self._error = error
156
+ self._error = (
157
+ None if error is None else error_utils.ErrorInfo.from_exception(error)
158
+ )
149
159
  return True
150
160
  return False
151
161
 
@@ -170,7 +180,7 @@ class TimeIt:
170
180
  return self._end_time
171
181
 
172
182
  @property
173
- def error(self) -> Optional[BaseException]:
183
+ def error(self) -> Optional[error_utils.ErrorInfo]:
174
184
  """Returns error."""
175
185
  return self._error
176
186
 
@@ -199,7 +209,8 @@ class TimeIt:
199
209
  for child in self._child_contexts.values():
200
210
  child_result = child.status()
201
211
  for k, v in child_result.items():
202
- result[f'{self.name}.{k}'] = v
212
+ key = f'{self.name}.{k}' if self.name else k
213
+ result[key] = v
203
214
  return result
204
215
 
205
216
  def __enter__(self):
@@ -220,6 +231,6 @@ class TimeIt:
220
231
  thread_local.thread_local_set('__timing_context__', self._parent)
221
232
 
222
233
 
223
- def timeit(name: str) -> TimeIt:
234
+ def timeit(name: str = '') -> TimeIt:
224
235
  """Context manager to time a block of code."""
225
236
  return TimeIt(name)
@@ -100,8 +100,8 @@ class TimeItTest(unittest.TestCase):
100
100
  r = t.status()
101
101
  self.assertTrue(r['node'].has_error)
102
102
  self.assertTrue(t.has_error)
103
- self.assertIsInstance(t.error, ValueError)
104
- self.assertIsInstance(r['node'].error, ValueError)
103
+ self.assertTrue(t.error.tag.startswith('ValueError'))
104
+ self.assertTrue(r['node'].error.tag.startswith('ValueError'))
105
105
  self.assertTrue(r['node.child'].has_error)
106
106
  self.assertTrue(t1.has_error)
107
107
  self.assertTrue(r['node.child.grandchild'].has_error)
@@ -111,7 +111,7 @@ class TimeItTest(unittest.TestCase):
111
111
  summary = timing.TimeIt.StatusSummary()
112
112
  self.assertFalse(summary)
113
113
  for i in range(10):
114
- with timing.timeit('node') as t:
114
+ with timing.timeit() as t:
115
115
  time.sleep(0.1)
116
116
  with timing.timeit('child'):
117
117
  time.sleep(0.1)
@@ -126,7 +126,7 @@ class TimeItTest(unittest.TestCase):
126
126
  self.assertTrue(summary)
127
127
  self.assertEqual(
128
128
  list(summary.breakdown.keys()),
129
- ['node', 'node.child', 'node.child.grandchild']
129
+ ['', 'child', 'child.grandchild']
130
130
  )
131
131
  self.assertEqual(
132
132
  [x.num_started for x in summary.breakdown.values()],
@@ -140,6 +140,10 @@ class TimeItTest(unittest.TestCase):
140
140
  [x.num_failed for x in summary.breakdown.values()],
141
141
  [0, 0, 2]
142
142
  )
143
+ self.assertEqual(
144
+ summary.breakdown['child.grandchild'].error_tags,
145
+ {'ValueError': 2},
146
+ )
143
147
  # Test serialization.
144
148
  json_dict = summary.to_json()
145
149
  summary2 = timing.TimeIt.StatusSummary.from_json(json_dict)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyglove
3
- Version: 0.4.5.dev202410301815
3
+ Version: 0.4.5.dev202410310809
4
4
  Summary: PyGlove: A library for manipulating Python objects.
5
5
  Home-page: https://github.com/google/pyglove
6
6
  Author: PyGlove Authors