mtlearn 1.2.0__tar.gz → 1.2.2__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 (482) hide show
  1. {mtlearn-1.2.0 → mtlearn-1.2.2}/PKG-INFO +1 -1
  2. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/concepts/attributes.md +5 -17
  3. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/guides/custom-attributes-filter-specs.md +2 -1
  4. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/bindings/morphology/AttributeBinding.hpp +111 -20
  5. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/bindings/morphology/BindingSupport.hpp +4 -4
  6. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/include/mtlearn/morphology.hpp +6 -4
  7. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/_version.py +3 -3
  8. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/normalization/stats_serializer.py +9 -4
  9. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_disk_preparation.py +4 -2
  10. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_identity.py +20 -12
  11. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_persistent_preparation.py +9 -3
  12. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/storage/_manifest.py +5 -2
  13. mtlearn-1.2.2/mtlearn/tests/python/cfp_reference_names.py +12 -0
  14. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_cache_baseline.py +3 -1
  15. mtlearn-1.2.2/mtlearn/tests/python/test_cfp_cache_compatibility.py +101 -0
  16. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_disk_cache.py +3 -1
  17. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_preparation.py +3 -1
  18. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_prepared_runtime.py +3 -1
  19. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_morphology_api.py +1 -1
  20. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_morphology_attribute_groups.py +1 -1
  21. mtlearn-1.2.2/mtlearn/tests/python/test_morphology_bounding_box_width.py +64 -0
  22. mtlearn-1.2.2/mtlearn/tests/python/test_morphology_gray_level.py +69 -0
  23. {mtlearn-1.2.0 → mtlearn-1.2.2}/.github/workflows/ci.yml +0 -0
  24. {mtlearn-1.2.0 → mtlearn-1.2.2}/.github/workflows/docs.yml +0 -0
  25. {mtlearn-1.2.0 → mtlearn-1.2.2}/.github/workflows/notebooks.yml +0 -0
  26. {mtlearn-1.2.0 → mtlearn-1.2.2}/.github/workflows/package.yml +0 -0
  27. {mtlearn-1.2.0 → mtlearn-1.2.2}/.github/workflows/release.yml +0 -0
  28. {mtlearn-1.2.0 → mtlearn-1.2.2}/CMakeLists.txt +0 -0
  29. {mtlearn-1.2.0 → mtlearn-1.2.2}/LICENSE +0 -0
  30. {mtlearn-1.2.0 → mtlearn-1.2.2}/Pipfile +0 -0
  31. {mtlearn-1.2.0 → mtlearn-1.2.2}/README.md +0 -0
  32. {mtlearn-1.2.0 → mtlearn-1.2.2}/cmake/mtlearnConfig.cmake.in +0 -0
  33. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/assets/cfp-class-architecture.svg +0 -0
  34. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/cfp-architecture.md +0 -0
  35. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/cfp-loss-design.md +0 -0
  36. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/cfp-regularization-design.md +0 -0
  37. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/cfp-score-constraint-design.md +0 -0
  38. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/cfp-scoring-design.md +0 -0
  39. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/development.md +0 -0
  40. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/installation.md +0 -0
  41. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/_static/.gitkeep +0 -0
  42. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/_templates/.gitkeep +0 -0
  43. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/api/python/cfp_preparation.rst +0 -0
  44. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/api/python/data.rst +0 -0
  45. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/api/python/datasets.rst +0 -0
  46. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/api/python/index.rst +0 -0
  47. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/api/python/layers.rst +0 -0
  48. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/api/python/morphology.rst +0 -0
  49. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/api/python/native.rst +0 -0
  50. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/concepts/morphology.md +0 -0
  51. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/conf.py +0 -0
  52. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/guides/getting-started.md +0 -0
  53. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/guides/index.md +0 -0
  54. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/guides/morphology.md +0 -0
  55. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/guides/pytorch-integration.md +0 -0
  56. {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/index.md +0 -0
  57. {mtlearn-1.2.0 → mtlearn-1.2.2}/environment.yml +0 -0
  58. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/.clang-format +0 -0
  59. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/.editorconfig +0 -0
  60. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/.gitattributes +0 -0
  61. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/CMakeLists.txt +0 -0
  62. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/LICENSE +0 -0
  63. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/README.md +0 -0
  64. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/CMakeLists.txt +0 -0
  65. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/README.md +0 -0
  66. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/adjacency_iteration_benchmark.cpp +0 -0
  67. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/analyze_scientific_experiment.py +0 -0
  68. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/analyze_tree_construction_comparison.py +0 -0
  69. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/api/ApiBenchmark.hpp +0 -0
  70. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/api/AttributeScenarios.cpp +0 -0
  71. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/api/CasfScenarios.cpp +0 -0
  72. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/api/ConstructionScenarios.cpp +0 -0
  73. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/api/EditingScenarios.cpp +0 -0
  74. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/api/FilterScenarios.cpp +0 -0
  75. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/api/InteroperabilityScenarios.cpp +0 -0
  76. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/api/PipelineScenarios.cpp +0 -0
  77. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/api/WorkloadManifest.cpp +0 -0
  78. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/api/api_benchmark.cpp +0 -0
  79. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/build_tree_construction_report.py +0 -0
  80. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/compare_validation_modes.py +0 -0
  81. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/distance_transform_sensitivity.py +0 -0
  82. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/distance_transform_timing.py +0 -0
  83. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/min_max_residual_tree_benchmark.cpp +0 -0
  84. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/python_api_benchmark.py +0 -0
  85. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/scientific_pipeline_benchmark.cpp +0 -0
  86. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/analyze_results.py +0 -0
  87. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/bitquad_benchmark.cpp +0 -0
  88. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/bitquad_exactness_validation.cpp +0 -0
  89. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/correctness.csv +0 -0
  90. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/dataset-manifest.csv +0 -0
  91. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/experiment.json +0 -0
  92. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/raw-1080p.csv +0 -0
  93. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/raw-480p.csv +0 -0
  94. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/raw-720p.csv +0 -0
  95. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/run-1080p.log +0 -0
  96. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/run-480p.log +0 -0
  97. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/run-720p.log +0 -0
  98. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/speedups.csv +0 -0
  99. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/summary.csv +0 -0
  100. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/table.tex +0 -0
  101. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/run_experiment.py +0 -0
  102. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/summarize_scientific_campaign.py +0 -0
  103. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/support/ScientificBenchmark.hpp +0 -0
  104. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/support/stb_image_read.cpp +0 -0
  105. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/tree_construction_comparison_benchmark.cpp +0 -0
  106. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/tree_validation_benchmark.cpp +0 -0
  107. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/validation-sensitive.md +0 -0
  108. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/validation_sensitive_algorithms_benchmark.cpp +0 -0
  109. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/workloads/distance-transform-contract.ini +0 -0
  110. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/workloads/scientific-api.ini +0 -0
  111. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/cmake/mmcfiltersConfig.cmake.in +0 -0
  112. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/cmake/mmcfiltersPublicHeaders.cmake +0 -0
  113. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/CMakeLists.txt +0 -0
  114. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/AttributeComputation.hpp +0 -0
  115. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/AttributeNames.hpp +0 -0
  116. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/AttributeRegistry.hpp +0 -0
  117. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/AttributeResultTypes.hpp +0 -0
  118. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/AttributeTypes.hpp +0 -0
  119. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/Attributes.hpp +0 -0
  120. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/AreaComputer.hpp +0 -0
  121. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/AttributeComputerDomain.hpp +0 -0
  122. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/AttributeComputerFamily.hpp +0 -0
  123. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/AttributeComputerRegistry.hpp +0 -0
  124. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/BitquadAttributeComputer.hpp +0 -0
  125. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/BoundingBoxComputer.hpp +0 -0
  126. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/ContourSideAttributeComputer.hpp +0 -0
  127. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/FilledShapeAttributeComputer.hpp +0 -0
  128. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/GrayLevelStatsComputer.hpp +0 -0
  129. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/MaxDistComputer.hpp +0 -0
  130. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/MaxDistExactComputer.hpp +0 -0
  131. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/MomentBasedAttributeComputer.hpp +0 -0
  132. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/TreeTopologyComputer.hpp +0 -0
  133. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/VolumeComputer.hpp +0 -0
  134. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/BitquadAttributeData.hpp +0 -0
  135. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/BitquadAttributeProjection.hpp +0 -0
  136. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/BitquadConnectivityPolicy.hpp +0 -0
  137. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/BitquadFiniteWindowComputation.hpp +0 -0
  138. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/ContourSideAttributeData.hpp +0 -0
  139. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/ContourSideAttributeMaterialization.hpp +0 -0
  140. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/ContourSideFiniteWindowComputation.hpp +0 -0
  141. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform/DistanceFieldHistogram.hpp +0 -0
  142. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform/DistanceFieldMoments.hpp +0 -0
  143. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform/DistanceWeightedSpatialMoments.hpp +0 -0
  144. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform/ExactSquaredEuclideanDistanceTransform2D.hpp +0 -0
  145. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform/MorphologicalTreeDistanceTransform.hpp +0 -0
  146. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform/NodeContourSchedule.hpp +0 -0
  147. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform/NodeDistanceFieldProvider.hpp +0 -0
  148. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform/NodeSupportBoxIndex.hpp +0 -0
  149. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform_approx/AdaptiveSquaredEuclideanDIFT2D.hpp +0 -0
  150. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform_approx/DynamicDistanceFieldMoments2D.hpp +0 -0
  151. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform_approx/DynamicDistanceFieldStatistics2D.hpp +0 -0
  152. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform_approx/MorphologicalTreeApproximateDistanceTransform.hpp +0 -0
  153. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform_approx/MorphologicalTreePropagationEdgeIndex.hpp +0 -0
  154. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform_approx/MorphologicalTreeTopologicalLevelIndex.hpp +0 -0
  155. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform_approx/SquaredDistanceBucketQueue.hpp +0 -0
  156. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/detail/AttributeCapabilityValidation.hpp +0 -0
  157. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/detail/AttributeDependencyCache.hpp +0 -0
  158. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/detail/AttributeFamilyScheduler.hpp +0 -0
  159. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/detail/AttributeKernelSupport.hpp +0 -0
  160. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/detail/AttributeNumericPolicy.hpp +0 -0
  161. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/detail/AttributePipeline.hpp +0 -0
  162. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/detail/AttributeProjection.hpp +0 -0
  163. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/detail/AttributeRequestUtils.hpp +0 -0
  164. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/detail/NodeAttributeSampleMaterialization.hpp +0 -0
  165. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/detail/TopologyAttributeBackend.hpp +0 -0
  166. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/contours/ContourComputation.hpp +0 -0
  167. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/contours/ContourTrace.hpp +0 -0
  168. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/contours/ContourTraceComputation.hpp +0 -0
  169. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/contours/detail/ContourBoundaryTracer.hpp +0 -0
  170. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/contours/detail/ContourEdgeDeltaStore.hpp +0 -0
  171. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/contours/detail/ContourLifetimeIndex.hpp +0 -0
  172. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/contours/detail/ContourTraceTraversal.hpp +0 -0
  173. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/contours/detail/ContourTraversal.hpp +0 -0
  174. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/contours/detail/NodeSupportIndex.hpp +0 -0
  175. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/dataStructure/FastQueue.hpp +0 -0
  176. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/dataStructure/FastStack.hpp +0 -0
  177. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/filters/AttributeFilters.hpp +0 -0
  178. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/filters/AttributeReconstructionFilters.hpp +0 -0
  179. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/filters/DepthStableRegionComputer.hpp +0 -0
  180. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/filters/ExtinctionValues.hpp +0 -0
  181. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/filters/MSERComputer.hpp +0 -0
  182. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/filters/NodeDecisionMasks.hpp +0 -0
  183. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/filters/NodePreservationStability.hpp +0 -0
  184. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/filters/UltimateAttributeOpening.hpp +0 -0
  185. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/filters/detail/VariationMeasure.hpp +0 -0
  186. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/filters/detail/ViterbiDecision.hpp +0 -0
  187. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/localAttributes/ConnectedSubsetTreeLocalizer.hpp +0 -0
  188. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/localAttributes/FiniteWindowLocalAttributeComputer.hpp +0 -0
  189. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/localAttributes/FiniteWindowLocalEventCompiler.hpp +0 -0
  190. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/localAttributes/LocalEventModel.hpp +0 -0
  191. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/MorphologicalTree.hpp +0 -0
  192. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/MorphologicalTreeFactory.hpp +0 -0
  193. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/MorphologicalTreeSemantics.hpp +0 -0
  194. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/NativeHierarchy.hpp +0 -0
  195. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/ProperPartDomain.hpp +0 -0
  196. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/TreeAltitudeAlgorithms.hpp +0 -0
  197. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/TreeEditor.hpp +0 -0
  198. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/TreeOfShapesProducer.hpp +0 -0
  199. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/ValuedMorphologicalTree.hpp +0 -0
  200. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/ValuedMorphologicalTreeView.hpp +0 -0
  201. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/adjust/CasfComponentTrees.hpp +0 -0
  202. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/adjust/DualMinMaxTreeIncrementalFilter.hpp +0 -0
  203. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/adjust/DualMinMaxTreeIncrementalFilterLeaf.hpp +0 -0
  204. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/adjust/DynamicTreeAttributeComputer.hpp +0 -0
  205. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/CommittedTreeAccess.hpp +0 -0
  206. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/ComponentTreeProducerDetail.hpp +0 -0
  207. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/ComponentTreeUnionFind.hpp +0 -0
  208. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/HierarchyCapabilityValidation.hpp +0 -0
  209. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/HigraExportLayoutDetail.hpp +0 -0
  210. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/HigraHierarchyAdapterDetail.hpp +0 -0
  211. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/HigraImportLayoutDetail.hpp +0 -0
  212. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/MorphologicalTreeConstructionContextQueries.hpp +0 -0
  213. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/MorphologicalTreeConstructionTag.hpp +0 -0
  214. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/NativeHierarchyValidationDetail.hpp +0 -0
  215. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/TreeAttributeSamplingNeighborhood.hpp +0 -0
  216. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/TreeStabilityNeighborhood.hpp +0 -0
  217. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/TreeTraversalDetail.hpp +0 -0
  218. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/saliency/HierarchicalWatershedSaliency.hpp +0 -0
  219. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/saliency/HierarchySaliencyMap.hpp +0 -0
  220. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/saliency/HierarchySaliencyMapProjection.hpp +0 -0
  221. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/saliency/HierarchySaliencyMapValidation.hpp +0 -0
  222. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/saliency/ShapeSpaceSaliency.hpp +0 -0
  223. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/ResidualEvolution.hpp +0 -0
  224. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/ResidualTreeBuildStatistics.hpp +0 -0
  225. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/ResidualTreePolicies.hpp +0 -0
  226. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/SaturatedResidualTreeBuilder.hpp +0 -0
  227. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/UnrestrictedResidualTreeBuilder.hpp +0 -0
  228. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/detail/FlatZonePartition.hpp +0 -0
  229. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/detail/ResidualTreeCandidateAgenda.hpp +0 -0
  230. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/detail/ResidualTreeCandidateContext.hpp +0 -0
  231. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/detail/ResidualTreeCandidatePreparation.hpp +0 -0
  232. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/detail/ResidualTreeCandidateTypes.hpp +0 -0
  233. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/detail/ResidualTreeEventAssembler.hpp +0 -0
  234. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/detail/ResidualTreeMaterialization.hpp +0 -0
  235. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/detail/ResidualTreeRegionTypes.hpp +0 -0
  236. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/detail/SaturatedDynamicLca.hpp +0 -0
  237. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/detail/SaturatedResidualEligibility.hpp +0 -0
  238. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/detail/SynchronizedResidualTreeEvolution.hpp +0 -0
  239. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/utils/Altitude.hpp +0 -0
  240. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/utils/Assert.hpp +0 -0
  241. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/utils/CommittedGridAccess.hpp +0 -0
  242. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/utils/CommittedImageAccess.hpp +0 -0
  243. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/utils/Common.hpp +0 -0
  244. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/utils/Contract.hpp +0 -0
  245. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/utils/GenerationStampSet.hpp +0 -0
  246. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/utils/Image.hpp +0 -0
  247. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/utils/RegularGridAdjacency2D.hpp +0 -0
  248. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/AdjustBindings.cpp +0 -0
  249. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/AttributeBindings.cpp +0 -0
  250. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/AttributeComputationBindings.hpp +0 -0
  251. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/AttributeFiltersPybind.hpp +0 -0
  252. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/AttributeReconstructionFiltersPybind.hpp +0 -0
  253. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/ContourBindings.cpp +0 -0
  254. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/ContourTraceBindings.cpp +0 -0
  255. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/DepthStableRegionComputerPybind.hpp +0 -0
  256. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/ExtinctionValuesPybind.hpp +0 -0
  257. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/FilterBindings.cpp +0 -0
  258. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/ModuleBindings.hpp +0 -0
  259. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/PybindConversions.hpp +0 -0
  260. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/PythonValuedMorphologicalTree.hpp +0 -0
  261. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/TreeBindings.cpp +0 -0
  262. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/UltimateAttributeOpeningPybind.hpp +0 -0
  263. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/UtilityBindings.cpp +0 -0
  264. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/scripts/execute_notebooks.py +0 -0
  265. {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/scripts/validate_notebooks.py +0 -0
  266. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/bindings/CMakeLists.txt +0 -0
  267. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/bindings/MtlearnModule.cpp +0 -0
  268. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/bindings/cfp/TreeTensorsBinding.hpp +0 -0
  269. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/bindings/cfp/TreeTraversalBinding.hpp +0 -0
  270. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/bindings/morphology/AttributeFiltersBinding.hpp +0 -0
  271. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/bindings/morphology/WeightedTreeBinding.hpp +0 -0
  272. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/include/mtlearn/detail/morphology_backend.hpp +0 -0
  273. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/__init__.py +0 -0
  274. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/_backends/__init__.py +0 -0
  275. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/_backends/_mtlearn.py +0 -0
  276. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/_datasets/__init__.py +0 -0
  277. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/_datasets/_explicit_pairs.py +0 -0
  278. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/_datasets/_generated_target.py +0 -0
  279. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/_datasets/_image_ops.py +0 -0
  280. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/_datasets/_paired_image.py +0 -0
  281. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/_datasets/_split.py +0 -0
  282. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/_native.py +0 -0
  283. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/data.py +0 -0
  284. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/datasets.py +0 -0
  285. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/__init__.py +0 -0
  286. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/_helpers.py +0 -0
  287. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/__init__.py +0 -0
  288. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/component_registries.py +0 -0
  289. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/connected_filter_preprocessing_layer.py +0 -0
  290. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/constraints/__init__.py +0 -0
  291. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/constraints/base.py +0 -0
  292. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/constraints/preserve_root.py +0 -0
  293. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/normalization/__init__.py +0 -0
  294. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/normalization/attribute_normalizer.py +0 -0
  295. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/normalization/attribute_statistics.py +0 -0
  296. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/normalization/statistics_snapshot.py +0 -0
  297. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/__init__.py +0 -0
  298. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_calibration_measurement.py +0 -0
  299. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_loader_memory.py +0 -0
  300. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_parallel_preparation.py +0 -0
  301. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_preparation_progress.py +0 -0
  302. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_prepared_reader.py +0 -0
  303. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_process_reader.py +0 -0
  304. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_read_diagnostics.py +0 -0
  305. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_reader_process.py +0 -0
  306. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_shared_batch.py +0 -0
  307. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_statistics_fitter.py +0 -0
  308. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_threaded_reader.py +0 -0
  309. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/calibration.py +0 -0
  310. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/cfp_preprocessor.py +0 -0
  311. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/dataset_cache.py +0 -0
  312. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/dataset_diagnostics.py +0 -0
  313. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/dataset_source.py +0 -0
  314. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/preparation_result.py +0 -0
  315. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/prepared_batch.py +0 -0
  316. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/prepared_dataloader.py +0 -0
  317. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/prepared_dataset.py +0 -0
  318. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/prepared_morphology.py +0 -0
  319. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/regularization/__init__.py +0 -0
  320. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/regularization/_tree_info.py +0 -0
  321. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/regularization/attribute_order_score_monotonicity.py +0 -0
  322. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/regularization/base.py +0 -0
  323. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/regularization/edge_score_monotonicity.py +0 -0
  324. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/regularization/path_score_monotonicity.py +0 -0
  325. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/runtime/__init__.py +0 -0
  326. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/runtime/_prepared_lifetime.py +0 -0
  327. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/runtime/batch_input.py +0 -0
  328. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/runtime/cache_input_contract.py +0 -0
  329. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/runtime/cached_dataloader_builder.py +0 -0
  330. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/runtime/context.py +0 -0
  331. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/runtime/forward_executor.py +0 -0
  332. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/runtime/implicit_jacobian_function.py +0 -0
  333. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/runtime/training_sample_inspector.py +0 -0
  334. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/runtime/tree_payload_cache.py +0 -0
  335. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/runtime/tree_payload_provider.py +0 -0
  336. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/runtime/tree_reconstructor.py +0 -0
  337. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/scoring/__init__.py +0 -0
  338. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/scoring/_layer_owned_linear_parameter_initializer.py +0 -0
  339. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/scoring/base.py +0 -0
  340. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/scoring/linear_sigmoid.py +0 -0
  341. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/scoring/mlp.py +0 -0
  342. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/serialization/__init__.py +0 -0
  343. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/serialization/config_deserializer.py +0 -0
  344. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/serialization/config_serializer.py +0 -0
  345. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/serialization/persistent_state_manager.py +0 -0
  346. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/specs/__init__.py +0 -0
  347. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/specs/feature_spec.py +0 -0
  348. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/specs/filter_spec.py +0 -0
  349. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/specs/filter_spec_normalizer.py +0 -0
  350. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/specs/normalized_filter_spec.py +0 -0
  351. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/specs/spec_registry.py +0 -0
  352. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/specs/tree_spec.py +0 -0
  353. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/storage/__init__.py +0 -0
  354. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/storage/_disk_format.py +0 -0
  355. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/storage/_manifest_inspection.py +0 -0
  356. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/storage/_read_validation.py +0 -0
  357. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/storage/_storages.py +0 -0
  358. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/storage/_writer_lock.py +0 -0
  359. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/storage/disk_store.py +0 -0
  360. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/storage/memory_store.py +0 -0
  361. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/storage/null_store.py +0 -0
  362. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/checkpoint.py +0 -0
  363. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/morphology.py +0 -0
  364. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/src/CMakeLists.txt +0 -0
  365. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/src/mtlearn/cfp/tree_tensors.hpp +0 -0
  366. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/src/mtlearn/cfp/tree_traversal.hpp +0 -0
  367. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/src/mtlearn/morphology.cpp +0 -0
  368. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/CMakeLists.txt +0 -0
  369. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/cmake/installed_consumer_test.cmake +0 -0
  370. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/cpp/public_morphology.cpp +0 -0
  371. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/cpp/test_interpreter.cpp +0 -0
  372. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/_paired_dataset_reference.py +0 -0
  373. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/README.md +0 -0
  374. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/baseline.pt +0 -0
  375. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/manifest.json +0 -0
  376. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_linear_dataset_clipped_zscore01.pt +0 -0
  377. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_linear_dataset_clipped_zscore01.stats.pt +0 -0
  378. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_linear_dataset_minmax01.pt +0 -0
  379. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_linear_dataset_minmax01.stats.pt +0 -0
  380. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_linear_dataset_zscore.pt +0 -0
  381. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_linear_dataset_zscore.stats.pt +0 -0
  382. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_linear_none.pt +0 -0
  383. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_linear_none.stats.pt +0 -0
  384. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_mlp_dataset_clipped_zscore01.pt +0 -0
  385. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_mlp_dataset_clipped_zscore01.stats.pt +0 -0
  386. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_mlp_dataset_minmax01.pt +0 -0
  387. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_mlp_dataset_minmax01.stats.pt +0 -0
  388. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_mlp_dataset_zscore.pt +0 -0
  389. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_mlp_dataset_zscore.stats.pt +0 -0
  390. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_mlp_none.pt +0 -0
  391. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_mlp_none.stats.pt +0 -0
  392. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/min-tree_linear_dataset_clipped_zscore01.pt +0 -0
  393. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/min-tree_linear_dataset_clipped_zscore01.stats.pt +0 -0
  394. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/min-tree_mlp_dataset_clipped_zscore01.pt +0 -0
  395. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/min-tree_mlp_dataset_clipped_zscore01.stats.pt +0 -0
  396. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/tree-of-shapes_linear_dataset_clipped_zscore01.pt +0 -0
  397. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/tree-of-shapes_linear_dataset_clipped_zscore01.stats.pt +0 -0
  398. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/tree-of-shapes_mlp_dataset_clipped_zscore01.pt +0 -0
  399. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/tree-of-shapes_mlp_dataset_clipped_zscore01.stats.pt +0 -0
  400. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/baseline.pt +0 -0
  401. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/manifest.json +0 -0
  402. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_linear_dataset_clipped_zscore01.pt +0 -0
  403. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_linear_dataset_clipped_zscore01.stats.pt +0 -0
  404. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_linear_dataset_minmax01.pt +0 -0
  405. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_linear_dataset_minmax01.stats.pt +0 -0
  406. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_linear_dataset_zscore.pt +0 -0
  407. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_linear_dataset_zscore.stats.pt +0 -0
  408. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_linear_none.pt +0 -0
  409. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_linear_none.stats.pt +0 -0
  410. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_mlp_dataset_clipped_zscore01.pt +0 -0
  411. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_mlp_dataset_clipped_zscore01.stats.pt +0 -0
  412. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_mlp_dataset_minmax01.pt +0 -0
  413. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_mlp_dataset_minmax01.stats.pt +0 -0
  414. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_mlp_dataset_zscore.pt +0 -0
  415. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_mlp_dataset_zscore.stats.pt +0 -0
  416. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_mlp_none.pt +0 -0
  417. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_mlp_none.stats.pt +0 -0
  418. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/min-tree_linear_dataset_clipped_zscore01.pt +0 -0
  419. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/min-tree_linear_dataset_clipped_zscore01.stats.pt +0 -0
  420. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/min-tree_mlp_dataset_clipped_zscore01.pt +0 -0
  421. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/min-tree_mlp_dataset_clipped_zscore01.stats.pt +0 -0
  422. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/tree-of-shapes_linear_dataset_clipped_zscore01.pt +0 -0
  423. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/tree-of-shapes_linear_dataset_clipped_zscore01.stats.pt +0 -0
  424. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/tree-of-shapes_mlp_dataset_clipped_zscore01.pt +0 -0
  425. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/tree-of-shapes_mlp_dataset_clipped_zscore01.stats.pt +0 -0
  426. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p1/statistics.json +0 -0
  427. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p5/notebook_before_p5.json +0 -0
  428. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/legacy_linear_sigmoid_max-tree.pt +0 -0
  429. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/legacy_linear_sigmoid_min-tree.pt +0 -0
  430. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/legacy_linear_sigmoid_tree-of-shapes.pt +0 -0
  431. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/legacy_mlp_max-tree.pt +0 -0
  432. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/legacy_mlp_min-tree.pt +0 -0
  433. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/legacy_mlp_tree-of-shapes.pt +0 -0
  434. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/manifest.json +0 -0
  435. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/memory_linear_sigmoid_max-tree.pt +0 -0
  436. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/memory_linear_sigmoid_min-tree.pt +0 -0
  437. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/memory_linear_sigmoid_tree-of-shapes.pt +0 -0
  438. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/memory_mlp_max-tree.pt +0 -0
  439. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/memory_mlp_min-tree.pt +0 -0
  440. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/memory_mlp_tree-of-shapes.pt +0 -0
  441. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_bindings.py +0 -0
  442. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_cache.py +0 -0
  443. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_cache_calibration.py +0 -0
  444. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_checkpoint_independence.py +0 -0
  445. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_components.py +0 -0
  446. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_dataset_cache.py +0 -0
  447. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_dataset_diagnostics.py +0 -0
  448. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_dataset_source.py +0 -0
  449. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_deterministic.py +0 -0
  450. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_disk_cache_e0.py +0 -0
  451. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_disk_cache_validation.py +0 -0
  452. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_disk_preparation_flow.py +0 -0
  453. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_jacobian_intervals.py +0 -0
  454. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_mps_reconstruction.py +0 -0
  455. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_notebook_cache_budget.py +0 -0
  456. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_notebook_streaming.py +0 -0
  457. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_parallel_preparation.py +0 -0
  458. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_prepared_dataloader.py +0 -0
  459. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_process_dataloader.py +0 -0
  460. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_uint32_pixel_map.py +0 -0
  461. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_validation.py +0 -0
  462. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_data.py +0 -0
  463. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_gradchecks.py +0 -0
  464. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_paired_dataset_characterization.py +0 -0
  465. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_reusable_paired_dataset.py +0 -0
  466. {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_version.py +0 -0
  467. {mtlearn-1.2.0 → mtlearn-1.2.2}/pyproject.toml +0 -0
  468. {mtlearn-1.2.0 → mtlearn-1.2.2}/requirements.txt +0 -0
  469. {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/benchmarks/cfp_cache_p0.py +0 -0
  470. {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/benchmarks/cfp_cache_p1.py +0 -0
  471. {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/benchmarks/cfp_cache_p2.py +0 -0
  472. {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/benchmarks/cfp_cache_p3.py +0 -0
  473. {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/benchmarks/cfp_cache_p4.py +0 -0
  474. {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/benchmarks/cfp_cache_p5.py +0 -0
  475. {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/benchmarks/cfp_cache_p6.py +0 -0
  476. {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/benchmarks/cfp_cache_p6_finalize.py +0 -0
  477. {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/benchmarks/cfp_jacobian_intervals.py +0 -0
  478. {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/download_data.py +0 -0
  479. {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/install_release_dependencies.py +0 -0
  480. {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/resolve_package_version.py +0 -0
  481. {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/smoke_test_release.py +0 -0
  482. {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/validate_notebooks.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mtlearn
3
- Version: 1.2.0
3
+ Version: 1.2.2
4
4
  Summary: Morphological tree learning utilities with a stable morphology facade
5
5
  Author-Email: Wonder Alexandre Luz Alves <worderalexandre@gmail.com>
6
6
  License-Expression: GPL-3.0-only
@@ -2,7 +2,7 @@
2
2
 
3
3
  This catalog lists the scalar attributes exposed through
4
4
  `mtlearn.morphology.AttributeType` and the groups exposed through
5
- `mtlearn.morphology.AttributeGroup`: 132 scalar attributes and nine groups.
5
+ `mtlearn.morphology.AttributeGroup`: 133 scalar attributes and nine groups.
6
6
  Names, groups, and definitions follow the
7
7
  [mmcfilters v5.2.0 attribute catalog](https://github.com/wonderalexandre/mmcfilters/blob/v5.2.0/docs/attribute-catalog.md).
8
8
 
@@ -49,7 +49,7 @@ below, with its group memberships. `ALL` includes every listed scalar.
49
49
 
50
50
  | Group | Meaning |
51
51
  | --- | --- |
52
- | `GRAY_LEVEL` | Gray-level mass, contrast, height, mean, and variance. |
52
+ | `GRAY_LEVEL` | Node valuation, gray-level mass, contrast, height, mean, and variance. |
53
53
  | `SHAPE` | Size, bounding box, moment, bitquad, contour, and selected shape descriptors. |
54
54
  | `MOMENTS` | Central moments, Hu invariants, and moment-derived descriptors. |
55
55
  | `BOUNDARY` | Bitquad and contour descriptors. |
@@ -75,16 +75,11 @@ The catalog uses three contracts:
75
75
  | Topology/support | Uses node support, pixel coordinates, contours, or adjacency information. |
76
76
  | Tree topology | Reads only parent/child relations in the hierarchy. |
77
77
 
78
- Distance-transform attributes require a regular 2D image domain. They support
79
- max-trees, min-trees, and trees of shapes without requiring node altitudes or
80
- construction-adjacency metadata. Bitquad and filled-shape attributes require
81
- canonical 4- or 8-connectivity; trees of shapes also use node altitudes to
82
- select the applicable directional connectivity.
83
-
84
78
  ## Gray-Level Attributes
85
79
 
86
80
  | Attribute | Groups | Contract | Use |
87
81
  | --- | --- | --- | --- |
82
+ | `GRAY_LEVEL` | `GRAY_LEVEL` | Altitude-aware | Node valuation: the gray level associated with the node. |
88
83
  | `VOLUME` | `GRAY_LEVEL` | Altitude-aware | Sum of altitude-weighted support contributions over the node subtree. |
89
84
  | `RELATIVE_VOLUME` | `GRAY_LEVEL` | Altitude-aware | Recursive contrast volume `R(n) = area(n) + sum_c [R(c) + area(c) * abs(altitude(c) - altitude(n))]` over the direct children `c`. |
90
85
  | `GRAY_LEVEL_HEIGHT` | `GRAY_LEVEL` | Altitude-aware | Maximum absolute altitude difference between the node and any node in its subtree. |
@@ -99,23 +94,16 @@ contrast, intensity, or altitude differences rather than pure geometry.
99
94
  | Attribute | Groups | Contract | Use |
100
95
  | --- | --- | --- | --- |
101
96
  | `AREA` | `SHAPE` | Topology/support | Number of pixels in the full node support. |
102
- | `BOX_WIDTH` | `SHAPE` | Topology/support | Width, in columns, of the smallest axis-aligned bounding box enclosing the node support. |
97
+ | `BOUNDING_BOX_WIDTH` | `SHAPE` | Topology/support | Width, in columns, of the smallest axis-aligned bounding box enclosing the node support. |
103
98
  | `BOUNDING_BOX_HEIGHT` | `SHAPE` | Topology/support | Height, in rows, of the smallest axis-aligned bounding box enclosing the node support. |
104
99
  | `DIAGONAL_LENGTH` | `SHAPE` | Topology/support | Euclidean diagonal length of the bounding box, `sqrt(width^2 + height^2)`. |
105
- | `RECTANGULARITY` | `SHAPE` | Topology/support | Ratio `AREA / (BOX_WIDTH * BOUNDING_BOX_HEIGHT)`. |
100
+ | `RECTANGULARITY` | `SHAPE` | Topology/support | Ratio `AREA / (BOUNDING_BOX_WIDTH * BOUNDING_BOX_HEIGHT)`. |
106
101
  | `RATIO_WH` | `SHAPE` | Topology/support | Bounding-box aspect ratio, `max(width, height) / min(width, height)` for non-degenerate boxes. |
107
102
  | `BOX_COLUMN_MIN` | `SHAPE` | Topology/support | Minimum image column index covered by the node support. |
108
103
  | `BOX_COLUMN_MAX` | `SHAPE` | Topology/support | Maximum image column index covered by the node support. |
109
104
  | `BOX_ROW_MIN` | `SHAPE` | Topology/support | Minimum image row index covered by the node support. |
110
105
  | `BOX_ROW_MAX` | `SHAPE` | Topology/support | Maximum image row index covered by the node support. |
111
106
 
112
- `AREA` is the usual attribute for size filtering. A high `AREA` value means
113
- that the component represented by the node covers many pixels in the original
114
- image domain; it is not the number of children in the tree.
115
-
116
- These attributes are the most direct tools for area openings, size priors, and
117
- filters that should keep or remove elongated connected components.
118
-
119
107
  ## Distance-Transform Attributes
120
108
 
121
109
  These attributes describe distances from support pixels to the foreground
@@ -10,10 +10,11 @@ For the full attribute list, see {doc}`../concepts/attributes`.
10
10
 
11
11
  | Intent | Candidate attributes |
12
12
  | --- | --- |
13
+ | Use the gray level associated with each node | `GRAY_LEVEL` |
13
14
  | Remove small components | `AREA`, `VOLUME` |
14
15
  | Prefer contrast in the tree | `GRAY_LEVEL_HEIGHT`, `RELATIVE_VOLUME` |
15
16
  | Prefer elongated or compact shapes | `COMPACTNESS`, `ECCENTRICITY`, `RATIO_WH` |
16
- | Use bounding-box geometry | `BOX_WIDTH`, `BOUNDING_BOX_HEIGHT`, `RECTANGULARITY` |
17
+ | Use bounding-box geometry | `BOUNDING_BOX_WIDTH`, `BOUNDING_BOX_HEIGHT`, `RECTANGULARITY` |
17
18
  | Use tree position | `DEPTH_NODE`, `SUBTREE_HEIGHT`, `NUM_CHILDREN_NODE` |
18
19
  | Use contours | `CONTOUR_PERIMETER`, `CONTOUR_PIXELS` |
19
20
 
@@ -38,7 +38,7 @@ inline const std::vector<morphology::Attribute>& allAttributes()
38
38
  morphology::Attribute::GrayLevelHeight,
39
39
  morphology::Attribute::MeanGrayLevel,
40
40
  morphology::Attribute::GrayLevelVariance,
41
- morphology::Attribute::BoxWidth,
41
+ morphology::Attribute::BoundingBoxWidth,
42
42
  morphology::Attribute::BoundingBoxHeight,
43
43
  morphology::Attribute::DiagonalLength,
44
44
  morphology::Attribute::Rectangularity,
@@ -164,6 +164,7 @@ inline const std::vector<morphology::Attribute>& allAttributes()
164
164
  morphology::Attribute::FilledCentroidDisplacementNormalized,
165
165
  morphology::Attribute::FilledCompactness,
166
166
  morphology::Attribute::FilledCircularity,
167
+ morphology::Attribute::GrayLevel,
167
168
  };
168
169
  return attributes;
169
170
  }
@@ -173,18 +174,29 @@ inline const std::vector<morphology::Attribute>& allAttributes()
173
174
  // facade is introduced.
174
175
  inline std::string describeAttribute(morphology::Attribute attribute)
175
176
  {
177
+ if (attribute == morphology::Attribute::GrayLevel) {
178
+ return "Gray level: Node valuation (the gray level associated with the node).";
179
+ }
176
180
  return mmcfilters::AttributeNames::describe(toBackend(attribute));
177
181
  }
178
182
 
183
+ inline std::string attributeName(mmcfilters::Attribute attribute)
184
+ {
185
+ if (fromBackend(attribute) == morphology::Attribute::BoundingBoxWidth) {
186
+ return "BOUNDING_BOX_WIDTH";
187
+ }
188
+ return mmcfilters::AttributeNames::toString(attribute);
189
+ }
190
+
179
191
  // Return all descriptions keyed by backend/public attribute name. Keeping the
180
192
  // names aligned with enum values makes the Python API easy to inspect.
181
193
  inline py::dict describeAllAttributes()
182
194
  {
183
195
  py::dict descriptions;
184
196
  for (const auto attribute : allAttributes()) {
185
- const auto backendAttribute = toBackend(attribute);
186
- descriptions[py::str(mmcfilters::AttributeNames::toString(backendAttribute))] =
187
- py::str(mmcfilters::AttributeNames::describe(backendAttribute));
197
+ const auto name = attribute == morphology::Attribute::GrayLevel
198
+ ? std::string("GRAY_LEVEL") : attributeName(toBackend(attribute));
199
+ descriptions[py::str(name)] = py::str(describeAttribute(attribute));
188
200
  }
189
201
  return descriptions;
190
202
  }
@@ -203,6 +215,9 @@ inline std::vector<morphology::Attribute> expandAttributeGroup(morphology::Attri
203
215
  for (const auto attribute : it->second) {
204
216
  attributes.push_back(fromBackend(attribute));
205
217
  }
218
+ if (group == morphology::AttributeGroup::All || group == morphology::AttributeGroup::GrayLevel) {
219
+ attributes.push_back(morphology::Attribute::GrayLevel);
220
+ }
206
221
  return attributes;
207
222
  }
208
223
 
@@ -211,7 +226,11 @@ inline std::vector<morphology::Attribute> expandAttributeGroup(morphology::Attri
211
226
  // row count for the selected node-id space.
212
227
  inline int outputSize(const morphology::WeightedTree& tree, morphology::NodeIdSpace outputSpace)
213
228
  {
214
- return morphology::detail::topology(tree).getNodeIdSpaceSize(toBackend(outputSpace));
229
+ const auto& topology = morphology::detail::topology(tree);
230
+ if (outputSpace == morphology::NodeIdSpace::Higra) {
231
+ return topology.numPixels() + topology.numNodes();
232
+ }
233
+ return topology.getNodeIdSpaceSize(toBackend(outputSpace));
215
234
  }
216
235
 
217
236
  // mmcfilters returns an attribute-name map that is not guaranteed to iterate in
@@ -225,7 +244,7 @@ inline py::dict sortedAttributeIndex(const mmcfilters::AttributeNames& attribute
225
244
  values.reserve(attributeNames.indexMap.size());
226
245
 
227
246
  for (const auto& item : attributeNames.indexMap) {
228
- keys.push_back(attributeNames.toString(item.first));
247
+ keys.push_back(attributeName(item.first));
229
248
  values.push_back(item.second);
230
249
  }
231
250
 
@@ -242,6 +261,25 @@ inline py::dict sortedAttributeIndex(const mmcfilters::AttributeNames& attribute
242
261
  return result;
243
262
  }
244
263
 
264
+ template <std::floating_point Real>
265
+ std::vector<Real> computeGrayLevel(const morphology::WeightedTree& tree, morphology::NodeIdSpace outputSpace)
266
+ {
267
+ const auto& valuedTree = morphology::detail::backend(tree);
268
+ if (outputSpace == morphology::NodeIdSpace::Higra) {
269
+ const auto [parents, altitudes] = valuedTree.exportHigraHierarchy();
270
+ return std::vector<Real>(altitudes.begin(), altitudes.end());
271
+ }
272
+ if (outputSpace != morphology::NodeIdSpace::MorphologicalTree) {
273
+ throw std::invalid_argument("unknown NodeIdSpace");
274
+ }
275
+ const auto& topology = morphology::detail::topology(tree);
276
+ std::vector<Real> values(topology.numInternalNodeSlots(), Real{0});
277
+ for (const auto node : topology.aliveNodeIds()) {
278
+ values[node] = static_cast<Real>(valuedTree.nodeAltitude(node));
279
+ }
280
+ return values;
281
+ }
282
+
245
283
  template <std::floating_point Real>
246
284
  std::pair<py::dict, py::array> computeAttributesTyped(
247
285
  morphology::WeightedTreePtr tree,
@@ -252,16 +290,57 @@ std::pair<py::dict, py::array> computeAttributesTyped(
252
290
  throw py::value_error("invalid ValuedMorphologicalTree");
253
291
  }
254
292
 
255
- const auto backendAttributes = toBackend(attributes);
256
- auto [attributeNames, buffer] =
257
- mmcfilters::AttributeComputation::computeAttributes<Real>(
258
- morphology::detail::backend(*tree),
259
- backendAttributes,
260
- toBackend(outputSpace));
293
+ bool includeGrayLevel = false;
294
+ std::vector<mmcfilters::AttributeOrGroup> backendAttributes;
295
+ backendAttributes.reserve(attributes.size());
296
+ for (const auto& request : attributes) {
297
+ if (const auto* scalar = std::get_if<morphology::Attribute>(&request)) {
298
+ if (*scalar == morphology::Attribute::GrayLevel) {
299
+ includeGrayLevel = true;
300
+ continue;
301
+ }
302
+ } else {
303
+ const auto group = std::get<morphology::AttributeGroup>(request);
304
+ includeGrayLevel = includeGrayLevel || group == morphology::AttributeGroup::All
305
+ || group == morphology::AttributeGroup::GrayLevel;
306
+ }
307
+ backendAttributes.push_back(toBackend(request));
308
+ }
261
309
 
262
- return {
263
- sortedAttributeIndex(attributeNames),
264
- vectorToNumpyOwned(std::move(buffer), outputSize(*tree, outputSpace), attributeNames.NUM_ATTRIBUTES)};
310
+ const int rows = outputSize(*tree, outputSpace);
311
+ py::dict layout;
312
+ std::vector<Real> buffer;
313
+ int columns = 0;
314
+ if (!backendAttributes.empty() || !includeGrayLevel) {
315
+ auto [attributeNames, values] =
316
+ mmcfilters::AttributeComputation::computeAttributes<Real>(
317
+ morphology::detail::backend(*tree), backendAttributes);
318
+ if (outputSpace == morphology::NodeIdSpace::Higra) {
319
+ values = mmcfilters::AttributeComputation::projectNodeValuesToExportedHigra<Real>(
320
+ morphology::detail::backend(*tree), attributeNames, values);
321
+ }
322
+ layout = sortedAttributeIndex(attributeNames);
323
+ columns = attributeNames.NUM_ATTRIBUTES;
324
+ buffer = std::move(values);
325
+ }
326
+ if (includeGrayLevel) {
327
+ auto grayLevel = computeGrayLevel<Real>(*tree, outputSpace);
328
+ layout["GRAY_LEVEL"] = columns;
329
+ if (columns == 0) {
330
+ buffer = std::move(grayLevel);
331
+ } else {
332
+ std::vector<Real> values(static_cast<std::size_t>(rows) * (columns + 1));
333
+ for (int row = 0; row < rows; ++row) {
334
+ const auto source = static_cast<std::size_t>(row) * columns;
335
+ const auto destination = static_cast<std::size_t>(row) * (columns + 1);
336
+ std::copy_n(buffer.begin() + source, columns, values.begin() + destination);
337
+ values[destination + columns] = grayLevel[row];
338
+ }
339
+ buffer = std::move(values);
340
+ }
341
+ ++columns;
342
+ }
343
+ return {std::move(layout), vectorToNumpyOwned(std::move(buffer), rows, columns)};
265
344
  }
266
345
 
267
346
  // Compute several attributes or attribute groups and return the pair used by
@@ -289,12 +368,18 @@ py::array computeSingleAttributeTyped(
289
368
  throw py::value_error("invalid ValuedMorphologicalTree");
290
369
  }
291
370
 
371
+ if (attribute == morphology::Attribute::GrayLevel) {
372
+ return vectorToNumpyOwned(computeGrayLevel<Real>(*tree, outputSpace), outputSize(*tree, outputSpace));
373
+ }
374
+
292
375
  auto [attributeNames, buffer] =
293
376
  mmcfilters::AttributeComputation::computeSingleAttribute<Real>(
294
377
  morphology::detail::backend(*tree),
295
- toBackend(attribute),
296
- toBackend(outputSpace));
297
- (void)attributeNames;
378
+ toBackend(attribute));
379
+ if (outputSpace == morphology::NodeIdSpace::Higra) {
380
+ buffer = mmcfilters::AttributeComputation::projectNodeValuesToExportedHigra<Real>(
381
+ morphology::detail::backend(*tree), attributeNames, buffer);
382
+ }
298
383
 
299
384
  return vectorToNumpyOwned(std::move(buffer), outputSize(*tree, outputSpace));
300
385
  }
@@ -385,14 +470,14 @@ Returns:
385
470
  attribute,
386
471
  "Type",
387
472
  py::module_local(),
388
- "Scalar morphology attributes supported by the current backend.")
473
+ "Scalar morphology attributes supported by mtlearn.")
389
474
  .value("AREA", morphology::Attribute::Area)
390
475
  .value("VOLUME", morphology::Attribute::Volume)
391
476
  .value("RELATIVE_VOLUME", morphology::Attribute::RelativeVolume)
392
477
  .value("GRAY_LEVEL_HEIGHT", morphology::Attribute::GrayLevelHeight)
393
478
  .value("MEAN_GRAY_LEVEL", morphology::Attribute::MeanGrayLevel)
394
479
  .value("GRAY_LEVEL_VARIANCE", morphology::Attribute::GrayLevelVariance)
395
- .value("BOX_WIDTH", morphology::Attribute::BoxWidth)
480
+ .value("BOUNDING_BOX_WIDTH", morphology::Attribute::BoundingBoxWidth)
396
481
  .value("BOUNDING_BOX_HEIGHT", morphology::Attribute::BoundingBoxHeight)
397
482
  .value("RECTANGULARITY", morphology::Attribute::Rectangularity)
398
483
  .value("DIAGONAL_LENGTH", morphology::Attribute::DiagonalLength)
@@ -518,7 +603,13 @@ Returns:
518
603
  .value("FILLED_CENTROID_DISPLACEMENT_NORMALIZED", morphology::Attribute::FilledCentroidDisplacementNormalized)
519
604
  .value("FILLED_COMPACTNESS", morphology::Attribute::FilledCompactness)
520
605
  .value("FILLED_CIRCULARITY", morphology::Attribute::FilledCircularity)
606
+ .value("GRAY_LEVEL", morphology::Attribute::GrayLevel)
521
607
  .export_values();
608
+
609
+ attribute.attr("GRAY_LEVEL") = attribute.attr("Group").attr("GRAY_LEVEL");
610
+
611
+ attribute.attr("Type").attr("BOX_WIDTH") = attribute.attr("Type").attr("BOUNDING_BOX_WIDTH");
612
+ attribute.attr("BOX_WIDTH") = attribute.attr("BOUNDING_BOX_WIDTH");
522
613
  }
523
614
 
524
615
  } // namespace morphology_pybind
@@ -266,21 +266,21 @@ inline mmcfilters::AttributeGroup toBackend(morphology::AttributeGroup group)
266
266
  inline mmcfilters::Attribute toBackend(morphology::Attribute attribute)
267
267
  {
268
268
  switch (attribute) {
269
+ case morphology::Attribute::GrayLevel:
270
+ throw std::invalid_argument("GRAY_LEVEL is computed from the node valuation by mtlearn");
269
271
  case morphology::Attribute::Area:
270
272
  return mmcfilters::Attribute::Area;
271
273
  case morphology::Attribute::Volume:
272
274
  return mmcfilters::Attribute::Volume;
273
275
  case morphology::Attribute::RelativeVolume:
274
276
  return mmcfilters::Attribute::RelativeVolume;
275
- // The backend dropped the plain node-altitude attribute, so the facade no
276
- // longer publishes LEVEL/ALTITUDE either.
277
277
  case morphology::Attribute::GrayLevelHeight:
278
278
  return mmcfilters::Attribute::GrayLevelHeight;
279
279
  case morphology::Attribute::MeanGrayLevel:
280
280
  return mmcfilters::Attribute::MeanGrayLevel;
281
281
  case morphology::Attribute::GrayLevelVariance:
282
282
  return mmcfilters::Attribute::GrayLevelVariance;
283
- case morphology::Attribute::BoxWidth:
283
+ case morphology::Attribute::BoundingBoxWidth:
284
284
  return mmcfilters::Attribute::BoxWidth;
285
285
  case morphology::Attribute::BoundingBoxHeight:
286
286
  return mmcfilters::Attribute::BoundingBoxHeight;
@@ -551,7 +551,7 @@ inline morphology::Attribute fromBackend(mmcfilters::Attribute attribute)
551
551
  MTLEARN_FROM_BACKEND_ATTRIBUTE(GrayLevelHeight, GrayLevelHeight);
552
552
  MTLEARN_FROM_BACKEND_ATTRIBUTE(MeanGrayLevel, MeanGrayLevel);
553
553
  MTLEARN_FROM_BACKEND_ATTRIBUTE(GrayLevelVariance, GrayLevelVariance);
554
- MTLEARN_FROM_BACKEND_ATTRIBUTE(BoxWidth, BoxWidth);
554
+ MTLEARN_FROM_BACKEND_ATTRIBUTE(BoxWidth, BoundingBoxWidth);
555
555
  MTLEARN_FROM_BACKEND_ATTRIBUTE(BoundingBoxHeight, BoundingBoxHeight);
556
556
  MTLEARN_FROM_BACKEND_ATTRIBUTE(DiagonalLength, DiagonalLength);
557
557
  MTLEARN_FROM_BACKEND_ATTRIBUTE(Rectangularity, Rectangularity);
@@ -61,7 +61,7 @@ enum class NodeIdSpace {
61
61
  Higra, ///< Rows are indexed by exported Higra hierarchy ids.
62
62
  };
63
63
 
64
- /// Public attribute identifiers supported by the current morphology backend.
64
+ /// Public attribute identifiers supported by the morphology facade.
65
65
  ///
66
66
  /// Keep this enum synchronized with the conversion table in
67
67
  /// `bindings/morphology/BindingSupport.hpp` and the Python exposure in
@@ -73,7 +73,8 @@ enum class Attribute {
73
73
  GrayLevelHeight, ///< Gray-level height.
74
74
  MeanGrayLevel, ///< Mean gray-level value.
75
75
  GrayLevelVariance, ///< Gray-level variance.
76
- BoxWidth, ///< Bounding-box width.
76
+ BoundingBoxWidth, ///< Bounding-box width.
77
+ BoxWidth = BoundingBoxWidth,
77
78
  BoundingBoxHeight, ///< Bounding-box height.
78
79
  DiagonalLength, ///< Bounding-box diagonal length.
79
80
  Rectangularity, ///< Component rectangularity.
@@ -199,14 +200,15 @@ enum class Attribute {
199
200
  FilledCentroidDisplacementNormalized,
200
201
  FilledCompactness,
201
202
  FilledCircularity,
203
+ GrayLevel, ///< Node valuation (gray level).
202
204
  };
203
205
 
204
- /// Attribute groups expanded by the backend attribute computer.
206
+ /// Attribute groups expanded by the morphology facade.
205
207
  ///
206
208
  /// Groups are part of the facade because Python notebooks and future C++
207
209
  /// consumers should not depend on backend attribute-group types directly.
208
210
  enum class AttributeGroup {
209
- All, ///< All public scalar attributes supported by the backend.
211
+ All, ///< All public scalar attributes supported by the facade.
210
212
  GrayLevel, ///< Gray-level attributes.
211
213
  Shape, ///< Shape attributes.
212
214
  Moments, ///< Moment-based attributes.
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.2.0'
22
- __version_tuple__ = version_tuple = (1, 2, 0)
21
+ __version__ = version = '1.2.2'
22
+ __version_tuple__ = version_tuple = (1, 2, 2)
23
23
 
24
- __commit_id__ = commit_id = 'g1ddf531d3'
24
+ __commit_id__ = commit_id = 'g218d9dab2'
@@ -30,10 +30,15 @@ class StatsSerializer:
30
30
  ) -> dict[str, dict[str, Any]]:
31
31
  """Move serialized statistics to ``device`` for a CFP layer."""
32
32
  device = torch.device(device)
33
- return {
34
- str(key): {
33
+ result = {}
34
+ for key, stats in serialized.items():
35
+ key = str(key)
36
+ if key.endswith("::BOX_WIDTH"):
37
+ key = key.removesuffix("::BOX_WIDTH") + "::BOUNDING_BOX_WIDTH"
38
+ if key in result:
39
+ raise ValueError(f"duplicate dataset statistics for {key}")
40
+ result[key] = {
35
41
  name: value.to(device) if torch.is_tensor(value) else value
36
42
  for name, value in stats.items()
37
43
  }
38
- for key, stats in serialized.items()
39
- }
44
+ return result
@@ -4,7 +4,7 @@ from pathlib import Path
4
4
  import shutil
5
5
 
6
6
  from ..storage import DiskStore
7
- from ._identity import canonical_json, preprocessor_config, validate_identity, tree_config
7
+ from ._identity import canonical_json, compatibility_config, preprocessor_config, validate_identity, tree_config
8
8
  from ._persistent_preparation import statistics_contract, statistics_identity
9
9
  from .preparation_result import DiskPreparationResult
10
10
 
@@ -78,7 +78,9 @@ def _header(store, preprocessor, manifest, source_version, preprocessing_version
78
78
  "preprocessing_version": preprocessing_version, "split": split}
79
79
  if count is not None:
80
80
  expected["sample_count"] = count
81
- differences = [name for name, value in expected.items() if row[name] != value]
81
+ differences = [name for name, value in expected.items()
82
+ if (compatibility_config(json.loads(row[name])) != compatibility_config(json.loads(value))
83
+ if name == "config" else row[name] != value)]
82
84
  if differences:
83
85
  raise ValueError(f"Manifest {manifest!r} is incompatible: {', '.join(differences)} changed. "
84
86
  "Use the matching contract or a new manifest name; cache metadata must not be rewritten.")
@@ -1,11 +1,8 @@
1
1
  """Versioned, primitive-only identities for local persistent preparation."""
2
- from functools import lru_cache
3
2
  import hashlib
4
3
  import json
5
- from pathlib import Path
6
4
 
7
5
  from .... import morphology
8
- from ...._native import load_bindings
9
6
  from ..specs import FeatureSpec, TreeSpec
10
7
 
11
8
  FORMAT_VERSION = 4
@@ -24,12 +21,20 @@ def digest_file(path):
24
21
  return digest.hexdigest()
25
22
 
26
23
 
27
- @lru_cache(maxsize=1)
28
24
  def implementation_identity():
29
- # Binary identity is deliberately conservative across backend builds. The
30
- # semantic version must change when Python preparation/quantization changes.
31
- return {"semantics": PREPARATION_SEMANTICS,
32
- "native_sha256": digest_file(Path(load_bindings().__file__))}
25
+ return {"semantics": PREPARATION_SEMANTICS}
26
+
27
+
28
+ def compatible_implementation(implementation):
29
+ return (isinstance(implementation, dict)
30
+ and set(implementation) in ({"semantics"}, {"semantics", "native_sha256"})
31
+ and implementation["semantics"] == PREPARATION_SEMANTICS)
32
+
33
+
34
+ def compatibility_config(config):
35
+ if not isinstance(config, dict) or not compatible_implementation(config.get("implementation")):
36
+ raise ValueError("Incompatible persistent preparation implementation or format.")
37
+ return dict(config, implementation=implementation_identity())
33
38
 
34
39
 
35
40
  def tree_config(spec):
@@ -55,7 +60,8 @@ def preprocessor_config(preprocessor):
55
60
  from .cfp_preprocessor import CFPPreprocessor
56
61
  if type(preprocessor) is not CFPPreprocessor or preprocessor.morphology is not morphology:
57
62
  raise ValueError("Persistent preparation currently requires the standard CFPPreprocessor implementation.")
58
- return {"format_version": FORMAT_VERSION, "implementation": dict(implementation_identity()),
63
+ implementation = getattr(preprocessor, "_implementation", implementation_identity())
64
+ return {"format_version": FORMAT_VERSION, "implementation": dict(implementation),
59
65
  "attribute_dtype": preprocessor.attribute_dtype.name,
60
66
  "trees": [{"tree": tree_config(spec),
61
67
  "attributes": [a.name for a in preprocessor.features[key].attributes]}
@@ -64,14 +70,16 @@ def preprocessor_config(preprocessor):
64
70
 
65
71
  def preprocessor_from_config(config):
66
72
  from .cfp_preprocessor import CFPPreprocessor
67
- if config["format_version"] != FORMAT_VERSION or config["implementation"] != implementation_identity():
73
+ if config["format_version"] != FORMAT_VERSION or not compatible_implementation(config["implementation"]):
68
74
  raise ValueError("Incompatible persistent preparation implementation or format.")
69
75
  trees, features = {}, {}
70
76
  for entry in config["trees"]:
71
77
  tree = tree_from_config(entry["tree"])
72
78
  trees[tree.cache_key()] = tree
73
79
  features[tree.cache_key()] = FeatureSpec(tuple(getattr(morphology.AttributeType, a) for a in entry["attributes"]))
74
- return CFPPreprocessor(tree_specs=trees, features=features, attribute_dtype=config["attribute_dtype"])
80
+ preprocessor = CFPPreprocessor(tree_specs=trees, features=features, attribute_dtype=config["attribute_dtype"])
81
+ preprocessor._implementation = dict(config["implementation"])
82
+ return preprocessor
75
83
 
76
84
 
77
85
  def image_identity(preprocessor, image, tree_key, *, pixel_digest=None):
@@ -91,7 +99,7 @@ def validate_identity(identity):
91
99
  expected = {"format_version", "implementation", "pixels_sha256", "shape", "tree", "attributes", "attribute_dtype"}
92
100
  if set(identity) != expected or identity["format_version"] != FORMAT_VERSION:
93
101
  raise ValueError("Unsupported preparation identity format.")
94
- if identity["implementation"] != implementation_identity():
102
+ if not compatible_implementation(identity["implementation"]):
95
103
  raise ValueError("Preparation backend/semantics do not match this runtime.")
96
104
  digest = identity["pixels_sha256"]
97
105
  if not isinstance(digest, str) or len(digest) != 64 or any(c not in "0123456789abcdef" for c in digest):
@@ -10,7 +10,7 @@ from ..._helpers import to_numpy_u8
10
10
  from ..normalization import AttributeNormalizer
11
11
  from ..normalization.statistics_snapshot import StatisticsSnapshot
12
12
  from ..runtime.cache_input_contract import validate_cfp_cache_batch_x
13
- from ._identity import canonical_json, image_identity, identity_key, preprocessor_config, preprocessor_from_config
13
+ from ._identity import canonical_json, compatibility_config, image_identity, identity_key, preprocessor_config, preprocessor_from_config
14
14
  from .preparation_result import PreparationResult
15
15
  from ._preparation_progress import emit
16
16
 
@@ -63,13 +63,19 @@ def _begin_manifest(store, name, preprocessor, count, source_version, preprocess
63
63
  if any(not isinstance(v, str) or not v for v in (name, source_version, preprocessing_version)):
64
64
  raise ValueError("Persistent preparation requires manifest, source_version and preprocessing_version strings.")
65
65
  config = canonical_json(preprocessor_config(preprocessor))
66
- values = (config, source_version, preprocessing_version, split, count)
67
66
  row = store._db.execute("SELECT * FROM manifests WHERE name=?", (name,)).fetchone()
67
+ if row is not None:
68
+ previous = json.loads(row["config"])
69
+ if compatibility_config(previous) == compatibility_config(json.loads(config)):
70
+ preprocessor = preprocessor_from_config(previous)
71
+ config = row["config"]
72
+ values = (config, source_version, preprocessing_version, split, count)
68
73
  if row is not None and tuple(row[k] for k in ("config", "source_version", "preprocessing_version", "split", "sample_count")) != values:
69
74
  raise ValueError("Manifest contract/source version changed; use a new manifest name to reuse compatible content safely.")
70
75
  with store._db:
71
76
  store._db.execute("""INSERT INTO manifests VALUES (?,?,?,?,?,?,'preparing',NULL)
72
77
  ON CONFLICT(name) DO UPDATE SET state='preparing',error=NULL""", (name, *values))
78
+ return preprocessor
73
79
 
74
80
 
75
81
  def _bind_sample(store, name, position, sample_id, bindings, shape):
@@ -146,7 +152,7 @@ def prepare_source(preprocessor, source, *, store=None, manifest=None, source_ve
146
152
  persistent = getattr(store, "persistent", False)
147
153
  if persistent:
148
154
  store._check(write=True)
149
- _begin_manifest(store, manifest, preprocessor, count, source_version, preprocessing_version, split)
155
+ preprocessor = _begin_manifest(store, manifest, preprocessor, count, source_version, preprocessing_version, split)
150
156
  # A resumed pass must revalidate durable files, even if this process has
151
157
  # already borrowed valid CPU buffers from a now damaged/missing file.
152
158
  store.clear()
@@ -2,7 +2,7 @@
2
2
  import json
3
3
  import sqlite3
4
4
 
5
- from ..preparation._identity import FORMAT_VERSION, canonical_json, implementation_identity
5
+ from ..preparation._identity import FORMAT_VERSION, canonical_json, implementation_identity, compatible_implementation
6
6
 
7
7
  SCHEMA = """
8
8
  CREATE TABLE metadata (key TEXT PRIMARY KEY, value TEXT NOT NULL);
@@ -55,7 +55,10 @@ def connect(path, *, readonly):
55
55
  db.rollback()
56
56
  raise
57
57
  row = db.execute("SELECT value FROM metadata WHERE key='contract'").fetchone()
58
- if row is None or json.loads(row[0]) != expected:
58
+ contract = json.loads(row[0]) if row is not None else None
59
+ if (not isinstance(contract, dict) or set(contract) != set(expected)
60
+ or contract["format_version"] != FORMAT_VERSION
61
+ or not compatible_implementation(contract["implementation"])):
59
62
  raise ValueError("DiskStore format/backend is incompatible; use a separate store directory.")
60
63
  except BaseException:
61
64
  db.close()
@@ -0,0 +1,12 @@
1
+ import re
2
+
3
+
4
+ def canonical_reference_names(value):
5
+ if isinstance(value, str):
6
+ return re.sub(r"(?<![A-Z0-9_])BOX_WIDTH(?![A-Z0-9_])", "BOUNDING_BOX_WIDTH", value)
7
+ if isinstance(value, dict):
8
+ return {canonical_reference_names(key): canonical_reference_names(item)
9
+ for key, item in value.items()}
10
+ if isinstance(value, (tuple, list)):
11
+ return type(value)(canonical_reference_names(item) for item in value)
12
+ return value
@@ -11,6 +11,8 @@ from pathlib import Path
11
11
  import pytest
12
12
  import torch
13
13
 
14
+ from cfp_reference_names import canonical_reference_names
15
+
14
16
  import mtlearn
15
17
  from mtlearn.layers import ConnectedFilterPreprocessingLayer, load_checkpoint
16
18
 
@@ -25,7 +27,7 @@ CASE_NAMES = MANIFEST['cases']
25
27
 
26
28
  @pytest.fixture(scope='module')
27
29
  def reference():
28
- return torch.load(FIXTURES / 'baseline.pt', map_location='cpu', weights_only=True)
30
+ return canonical_reference_names(torch.load(FIXTURES / 'baseline.pt', map_location='cpu', weights_only=True))
29
31
 
30
32
 
31
33
  def assert_nested_close(actual, expected):