mtlearn 1.2.0__tar.gz → 1.2.1__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 (481) hide show
  1. {mtlearn-1.2.0 → mtlearn-1.2.1}/PKG-INFO +1 -1
  2. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/source/concepts/attributes.md +5 -17
  3. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/source/guides/custom-attributes-filter-specs.md +2 -1
  4. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/bindings/morphology/AttributeBinding.hpp +111 -20
  5. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/bindings/morphology/BindingSupport.hpp +4 -4
  6. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/include/mtlearn/morphology.hpp +6 -4
  7. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/_version.py +3 -3
  8. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/normalization/stats_serializer.py +9 -4
  9. mtlearn-1.2.1/mtlearn/tests/python/cfp_reference_names.py +12 -0
  10. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_cfp_cache_baseline.py +3 -1
  11. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_cfp_disk_cache.py +3 -1
  12. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_cfp_preparation.py +3 -1
  13. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_cfp_prepared_runtime.py +3 -1
  14. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_morphology_api.py +1 -1
  15. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_morphology_attribute_groups.py +1 -1
  16. mtlearn-1.2.1/mtlearn/tests/python/test_morphology_bounding_box_width.py +64 -0
  17. mtlearn-1.2.1/mtlearn/tests/python/test_morphology_gray_level.py +69 -0
  18. {mtlearn-1.2.0 → mtlearn-1.2.1}/.github/workflows/ci.yml +0 -0
  19. {mtlearn-1.2.0 → mtlearn-1.2.1}/.github/workflows/docs.yml +0 -0
  20. {mtlearn-1.2.0 → mtlearn-1.2.1}/.github/workflows/notebooks.yml +0 -0
  21. {mtlearn-1.2.0 → mtlearn-1.2.1}/.github/workflows/package.yml +0 -0
  22. {mtlearn-1.2.0 → mtlearn-1.2.1}/.github/workflows/release.yml +0 -0
  23. {mtlearn-1.2.0 → mtlearn-1.2.1}/CMakeLists.txt +0 -0
  24. {mtlearn-1.2.0 → mtlearn-1.2.1}/LICENSE +0 -0
  25. {mtlearn-1.2.0 → mtlearn-1.2.1}/Pipfile +0 -0
  26. {mtlearn-1.2.0 → mtlearn-1.2.1}/README.md +0 -0
  27. {mtlearn-1.2.0 → mtlearn-1.2.1}/cmake/mtlearnConfig.cmake.in +0 -0
  28. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/assets/cfp-class-architecture.svg +0 -0
  29. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/cfp-architecture.md +0 -0
  30. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/cfp-loss-design.md +0 -0
  31. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/cfp-regularization-design.md +0 -0
  32. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/cfp-score-constraint-design.md +0 -0
  33. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/cfp-scoring-design.md +0 -0
  34. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/development.md +0 -0
  35. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/installation.md +0 -0
  36. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/source/_static/.gitkeep +0 -0
  37. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/source/_templates/.gitkeep +0 -0
  38. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/source/api/python/cfp_preparation.rst +0 -0
  39. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/source/api/python/data.rst +0 -0
  40. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/source/api/python/datasets.rst +0 -0
  41. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/source/api/python/index.rst +0 -0
  42. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/source/api/python/layers.rst +0 -0
  43. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/source/api/python/morphology.rst +0 -0
  44. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/source/api/python/native.rst +0 -0
  45. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/source/concepts/morphology.md +0 -0
  46. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/source/conf.py +0 -0
  47. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/source/guides/getting-started.md +0 -0
  48. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/source/guides/index.md +0 -0
  49. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/source/guides/morphology.md +0 -0
  50. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/source/guides/pytorch-integration.md +0 -0
  51. {mtlearn-1.2.0 → mtlearn-1.2.1}/docs/source/index.md +0 -0
  52. {mtlearn-1.2.0 → mtlearn-1.2.1}/environment.yml +0 -0
  53. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/.clang-format +0 -0
  54. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/.editorconfig +0 -0
  55. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/.gitattributes +0 -0
  56. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/CMakeLists.txt +0 -0
  57. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/LICENSE +0 -0
  58. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/README.md +0 -0
  59. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/CMakeLists.txt +0 -0
  60. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/README.md +0 -0
  61. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/adjacency_iteration_benchmark.cpp +0 -0
  62. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/analyze_scientific_experiment.py +0 -0
  63. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/analyze_tree_construction_comparison.py +0 -0
  64. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/api/ApiBenchmark.hpp +0 -0
  65. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/api/AttributeScenarios.cpp +0 -0
  66. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/api/CasfScenarios.cpp +0 -0
  67. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/api/ConstructionScenarios.cpp +0 -0
  68. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/api/EditingScenarios.cpp +0 -0
  69. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/api/FilterScenarios.cpp +0 -0
  70. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/api/InteroperabilityScenarios.cpp +0 -0
  71. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/api/PipelineScenarios.cpp +0 -0
  72. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/api/WorkloadManifest.cpp +0 -0
  73. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/api/api_benchmark.cpp +0 -0
  74. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/build_tree_construction_report.py +0 -0
  75. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/compare_validation_modes.py +0 -0
  76. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/distance_transform_sensitivity.py +0 -0
  77. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/distance_transform_timing.py +0 -0
  78. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/min_max_residual_tree_benchmark.cpp +0 -0
  79. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/python_api_benchmark.py +0 -0
  80. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/scientific_pipeline_benchmark.cpp +0 -0
  81. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/sibgrapi2026/analyze_results.py +0 -0
  82. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/sibgrapi2026/bitquad_benchmark.cpp +0 -0
  83. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/sibgrapi2026/bitquad_exactness_validation.cpp +0 -0
  84. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/correctness.csv +0 -0
  85. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/dataset-manifest.csv +0 -0
  86. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/experiment.json +0 -0
  87. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/raw-1080p.csv +0 -0
  88. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/raw-480p.csv +0 -0
  89. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/raw-720p.csv +0 -0
  90. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/run-1080p.log +0 -0
  91. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/run-480p.log +0 -0
  92. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/run-720p.log +0 -0
  93. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/speedups.csv +0 -0
  94. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/summary.csv +0 -0
  95. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/table.tex +0 -0
  96. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/sibgrapi2026/run_experiment.py +0 -0
  97. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/summarize_scientific_campaign.py +0 -0
  98. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/support/ScientificBenchmark.hpp +0 -0
  99. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/support/stb_image_read.cpp +0 -0
  100. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/tree_construction_comparison_benchmark.cpp +0 -0
  101. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/tree_validation_benchmark.cpp +0 -0
  102. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/validation-sensitive.md +0 -0
  103. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/validation_sensitive_algorithms_benchmark.cpp +0 -0
  104. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/workloads/distance-transform-contract.ini +0 -0
  105. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/benchmarks/workloads/scientific-api.ini +0 -0
  106. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/cmake/mmcfiltersConfig.cmake.in +0 -0
  107. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/cmake/mmcfiltersPublicHeaders.cmake +0 -0
  108. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/CMakeLists.txt +0 -0
  109. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/AttributeComputation.hpp +0 -0
  110. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/AttributeNames.hpp +0 -0
  111. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/AttributeRegistry.hpp +0 -0
  112. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/AttributeResultTypes.hpp +0 -0
  113. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/AttributeTypes.hpp +0 -0
  114. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/Attributes.hpp +0 -0
  115. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/AreaComputer.hpp +0 -0
  116. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/AttributeComputerDomain.hpp +0 -0
  117. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/AttributeComputerFamily.hpp +0 -0
  118. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/AttributeComputerRegistry.hpp +0 -0
  119. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/BitquadAttributeComputer.hpp +0 -0
  120. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/BoundingBoxComputer.hpp +0 -0
  121. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/ContourSideAttributeComputer.hpp +0 -0
  122. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/FilledShapeAttributeComputer.hpp +0 -0
  123. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/GrayLevelStatsComputer.hpp +0 -0
  124. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/MaxDistComputer.hpp +0 -0
  125. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/MaxDistExactComputer.hpp +0 -0
  126. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/MomentBasedAttributeComputer.hpp +0 -0
  127. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/TreeTopologyComputer.hpp +0 -0
  128. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/VolumeComputer.hpp +0 -0
  129. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/detail/BitquadAttributeData.hpp +0 -0
  130. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/detail/BitquadAttributeProjection.hpp +0 -0
  131. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/detail/BitquadConnectivityPolicy.hpp +0 -0
  132. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/detail/BitquadFiniteWindowComputation.hpp +0 -0
  133. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/detail/ContourSideAttributeData.hpp +0 -0
  134. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/detail/ContourSideAttributeMaterialization.hpp +0 -0
  135. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/detail/ContourSideFiniteWindowComputation.hpp +0 -0
  136. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform/DistanceFieldHistogram.hpp +0 -0
  137. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform/DistanceFieldMoments.hpp +0 -0
  138. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform/DistanceWeightedSpatialMoments.hpp +0 -0
  139. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform/ExactSquaredEuclideanDistanceTransform2D.hpp +0 -0
  140. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform/MorphologicalTreeDistanceTransform.hpp +0 -0
  141. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform/NodeContourSchedule.hpp +0 -0
  142. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform/NodeDistanceFieldProvider.hpp +0 -0
  143. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform/NodeSupportBoxIndex.hpp +0 -0
  144. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform_approx/AdaptiveSquaredEuclideanDIFT2D.hpp +0 -0
  145. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform_approx/DynamicDistanceFieldMoments2D.hpp +0 -0
  146. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform_approx/DynamicDistanceFieldStatistics2D.hpp +0 -0
  147. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform_approx/MorphologicalTreeApproximateDistanceTransform.hpp +0 -0
  148. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform_approx/MorphologicalTreePropagationEdgeIndex.hpp +0 -0
  149. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform_approx/MorphologicalTreeTopologicalLevelIndex.hpp +0 -0
  150. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform_approx/SquaredDistanceBucketQueue.hpp +0 -0
  151. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/detail/AttributeCapabilityValidation.hpp +0 -0
  152. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/detail/AttributeDependencyCache.hpp +0 -0
  153. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/detail/AttributeFamilyScheduler.hpp +0 -0
  154. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/detail/AttributeKernelSupport.hpp +0 -0
  155. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/detail/AttributeNumericPolicy.hpp +0 -0
  156. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/detail/AttributePipeline.hpp +0 -0
  157. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/detail/AttributeProjection.hpp +0 -0
  158. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/detail/AttributeRequestUtils.hpp +0 -0
  159. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/detail/NodeAttributeSampleMaterialization.hpp +0 -0
  160. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/attributes/detail/TopologyAttributeBackend.hpp +0 -0
  161. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/contours/ContourComputation.hpp +0 -0
  162. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/contours/ContourTrace.hpp +0 -0
  163. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/contours/ContourTraceComputation.hpp +0 -0
  164. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/contours/detail/ContourBoundaryTracer.hpp +0 -0
  165. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/contours/detail/ContourEdgeDeltaStore.hpp +0 -0
  166. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/contours/detail/ContourLifetimeIndex.hpp +0 -0
  167. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/contours/detail/ContourTraceTraversal.hpp +0 -0
  168. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/contours/detail/ContourTraversal.hpp +0 -0
  169. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/contours/detail/NodeSupportIndex.hpp +0 -0
  170. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/dataStructure/FastQueue.hpp +0 -0
  171. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/dataStructure/FastStack.hpp +0 -0
  172. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/filters/AttributeFilters.hpp +0 -0
  173. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/filters/AttributeReconstructionFilters.hpp +0 -0
  174. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/filters/DepthStableRegionComputer.hpp +0 -0
  175. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/filters/ExtinctionValues.hpp +0 -0
  176. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/filters/MSERComputer.hpp +0 -0
  177. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/filters/NodeDecisionMasks.hpp +0 -0
  178. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/filters/NodePreservationStability.hpp +0 -0
  179. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/filters/UltimateAttributeOpening.hpp +0 -0
  180. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/filters/detail/VariationMeasure.hpp +0 -0
  181. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/filters/detail/ViterbiDecision.hpp +0 -0
  182. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/localAttributes/ConnectedSubsetTreeLocalizer.hpp +0 -0
  183. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/localAttributes/FiniteWindowLocalAttributeComputer.hpp +0 -0
  184. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/localAttributes/FiniteWindowLocalEventCompiler.hpp +0 -0
  185. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/localAttributes/LocalEventModel.hpp +0 -0
  186. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/MorphologicalTree.hpp +0 -0
  187. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/MorphologicalTreeFactory.hpp +0 -0
  188. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/MorphologicalTreeSemantics.hpp +0 -0
  189. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/NativeHierarchy.hpp +0 -0
  190. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/ProperPartDomain.hpp +0 -0
  191. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/TreeAltitudeAlgorithms.hpp +0 -0
  192. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/TreeEditor.hpp +0 -0
  193. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/TreeOfShapesProducer.hpp +0 -0
  194. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/ValuedMorphologicalTree.hpp +0 -0
  195. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/ValuedMorphologicalTreeView.hpp +0 -0
  196. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/adjust/CasfComponentTrees.hpp +0 -0
  197. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/adjust/DualMinMaxTreeIncrementalFilter.hpp +0 -0
  198. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/adjust/DualMinMaxTreeIncrementalFilterLeaf.hpp +0 -0
  199. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/adjust/DynamicTreeAttributeComputer.hpp +0 -0
  200. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/detail/CommittedTreeAccess.hpp +0 -0
  201. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/detail/ComponentTreeProducerDetail.hpp +0 -0
  202. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/detail/ComponentTreeUnionFind.hpp +0 -0
  203. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/detail/HierarchyCapabilityValidation.hpp +0 -0
  204. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/detail/HigraExportLayoutDetail.hpp +0 -0
  205. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/detail/HigraHierarchyAdapterDetail.hpp +0 -0
  206. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/detail/HigraImportLayoutDetail.hpp +0 -0
  207. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/detail/MorphologicalTreeConstructionContextQueries.hpp +0 -0
  208. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/detail/MorphologicalTreeConstructionTag.hpp +0 -0
  209. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/detail/NativeHierarchyValidationDetail.hpp +0 -0
  210. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/detail/TreeAttributeSamplingNeighborhood.hpp +0 -0
  211. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/detail/TreeStabilityNeighborhood.hpp +0 -0
  212. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/detail/TreeTraversalDetail.hpp +0 -0
  213. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/saliency/HierarchicalWatershedSaliency.hpp +0 -0
  214. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/saliency/HierarchySaliencyMap.hpp +0 -0
  215. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/saliency/HierarchySaliencyMapProjection.hpp +0 -0
  216. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/saliency/HierarchySaliencyMapValidation.hpp +0 -0
  217. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/saliency/ShapeSpaceSaliency.hpp +0 -0
  218. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/sdrt/ResidualEvolution.hpp +0 -0
  219. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/sdrt/ResidualTreeBuildStatistics.hpp +0 -0
  220. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/sdrt/ResidualTreePolicies.hpp +0 -0
  221. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/sdrt/SaturatedResidualTreeBuilder.hpp +0 -0
  222. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/sdrt/UnrestrictedResidualTreeBuilder.hpp +0 -0
  223. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/sdrt/detail/FlatZonePartition.hpp +0 -0
  224. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/sdrt/detail/ResidualTreeCandidateAgenda.hpp +0 -0
  225. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/sdrt/detail/ResidualTreeCandidateContext.hpp +0 -0
  226. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/sdrt/detail/ResidualTreeCandidatePreparation.hpp +0 -0
  227. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/sdrt/detail/ResidualTreeCandidateTypes.hpp +0 -0
  228. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/sdrt/detail/ResidualTreeEventAssembler.hpp +0 -0
  229. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/sdrt/detail/ResidualTreeMaterialization.hpp +0 -0
  230. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/sdrt/detail/ResidualTreeRegionTypes.hpp +0 -0
  231. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/sdrt/detail/SaturatedDynamicLca.hpp +0 -0
  232. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/sdrt/detail/SaturatedResidualEligibility.hpp +0 -0
  233. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/trees/sdrt/detail/SynchronizedResidualTreeEvolution.hpp +0 -0
  234. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/utils/Altitude.hpp +0 -0
  235. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/utils/Assert.hpp +0 -0
  236. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/utils/CommittedGridAccess.hpp +0 -0
  237. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/utils/CommittedImageAccess.hpp +0 -0
  238. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/utils/Common.hpp +0 -0
  239. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/utils/Contract.hpp +0 -0
  240. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/utils/GenerationStampSet.hpp +0 -0
  241. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/utils/Image.hpp +0 -0
  242. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/mmcfilters/utils/RegularGridAdjacency2D.hpp +0 -0
  243. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/pybinds/AdjustBindings.cpp +0 -0
  244. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/pybinds/AttributeBindings.cpp +0 -0
  245. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/pybinds/AttributeComputationBindings.hpp +0 -0
  246. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/pybinds/AttributeFiltersPybind.hpp +0 -0
  247. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/pybinds/AttributeReconstructionFiltersPybind.hpp +0 -0
  248. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/pybinds/ContourBindings.cpp +0 -0
  249. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/pybinds/ContourTraceBindings.cpp +0 -0
  250. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/pybinds/DepthStableRegionComputerPybind.hpp +0 -0
  251. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/pybinds/ExtinctionValuesPybind.hpp +0 -0
  252. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/pybinds/FilterBindings.cpp +0 -0
  253. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/pybinds/ModuleBindings.hpp +0 -0
  254. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/pybinds/PybindConversions.hpp +0 -0
  255. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/pybinds/PythonValuedMorphologicalTree.hpp +0 -0
  256. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/pybinds/TreeBindings.cpp +0 -0
  257. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/pybinds/UltimateAttributeOpeningPybind.hpp +0 -0
  258. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/pybinds/UtilityBindings.cpp +0 -0
  259. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/scripts/execute_notebooks.py +0 -0
  260. {mtlearn-1.2.0 → mtlearn-1.2.1}/external/mmcfilters/scripts/validate_notebooks.py +0 -0
  261. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/bindings/CMakeLists.txt +0 -0
  262. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/bindings/MtlearnModule.cpp +0 -0
  263. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/bindings/cfp/TreeTensorsBinding.hpp +0 -0
  264. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/bindings/cfp/TreeTraversalBinding.hpp +0 -0
  265. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/bindings/morphology/AttributeFiltersBinding.hpp +0 -0
  266. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/bindings/morphology/WeightedTreeBinding.hpp +0 -0
  267. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/include/mtlearn/detail/morphology_backend.hpp +0 -0
  268. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/__init__.py +0 -0
  269. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/_backends/__init__.py +0 -0
  270. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/_backends/_mtlearn.py +0 -0
  271. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/_datasets/__init__.py +0 -0
  272. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/_datasets/_explicit_pairs.py +0 -0
  273. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/_datasets/_generated_target.py +0 -0
  274. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/_datasets/_image_ops.py +0 -0
  275. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/_datasets/_paired_image.py +0 -0
  276. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/_datasets/_split.py +0 -0
  277. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/_native.py +0 -0
  278. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/data.py +0 -0
  279. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/datasets.py +0 -0
  280. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/__init__.py +0 -0
  281. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/_helpers.py +0 -0
  282. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/__init__.py +0 -0
  283. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/component_registries.py +0 -0
  284. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/connected_filter_preprocessing_layer.py +0 -0
  285. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/constraints/__init__.py +0 -0
  286. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/constraints/base.py +0 -0
  287. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/constraints/preserve_root.py +0 -0
  288. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/normalization/__init__.py +0 -0
  289. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/normalization/attribute_normalizer.py +0 -0
  290. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/normalization/attribute_statistics.py +0 -0
  291. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/normalization/statistics_snapshot.py +0 -0
  292. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/preparation/__init__.py +0 -0
  293. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/preparation/_calibration_measurement.py +0 -0
  294. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/preparation/_disk_preparation.py +0 -0
  295. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/preparation/_identity.py +0 -0
  296. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/preparation/_loader_memory.py +0 -0
  297. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/preparation/_parallel_preparation.py +0 -0
  298. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/preparation/_persistent_preparation.py +0 -0
  299. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/preparation/_preparation_progress.py +0 -0
  300. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/preparation/_prepared_reader.py +0 -0
  301. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/preparation/_process_reader.py +0 -0
  302. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/preparation/_read_diagnostics.py +0 -0
  303. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/preparation/_reader_process.py +0 -0
  304. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/preparation/_shared_batch.py +0 -0
  305. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/preparation/_statistics_fitter.py +0 -0
  306. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/preparation/_threaded_reader.py +0 -0
  307. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/preparation/calibration.py +0 -0
  308. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/preparation/cfp_preprocessor.py +0 -0
  309. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/preparation/dataset_cache.py +0 -0
  310. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/preparation/dataset_diagnostics.py +0 -0
  311. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/preparation/dataset_source.py +0 -0
  312. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/preparation/preparation_result.py +0 -0
  313. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/preparation/prepared_batch.py +0 -0
  314. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/preparation/prepared_dataloader.py +0 -0
  315. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/preparation/prepared_dataset.py +0 -0
  316. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/preparation/prepared_morphology.py +0 -0
  317. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/regularization/__init__.py +0 -0
  318. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/regularization/_tree_info.py +0 -0
  319. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/regularization/attribute_order_score_monotonicity.py +0 -0
  320. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/regularization/base.py +0 -0
  321. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/regularization/edge_score_monotonicity.py +0 -0
  322. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/regularization/path_score_monotonicity.py +0 -0
  323. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/runtime/__init__.py +0 -0
  324. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/runtime/_prepared_lifetime.py +0 -0
  325. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/runtime/batch_input.py +0 -0
  326. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/runtime/cache_input_contract.py +0 -0
  327. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/runtime/cached_dataloader_builder.py +0 -0
  328. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/runtime/context.py +0 -0
  329. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/runtime/forward_executor.py +0 -0
  330. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/runtime/implicit_jacobian_function.py +0 -0
  331. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/runtime/training_sample_inspector.py +0 -0
  332. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/runtime/tree_payload_cache.py +0 -0
  333. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/runtime/tree_payload_provider.py +0 -0
  334. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/runtime/tree_reconstructor.py +0 -0
  335. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/scoring/__init__.py +0 -0
  336. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/scoring/_layer_owned_linear_parameter_initializer.py +0 -0
  337. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/scoring/base.py +0 -0
  338. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/scoring/linear_sigmoid.py +0 -0
  339. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/scoring/mlp.py +0 -0
  340. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/serialization/__init__.py +0 -0
  341. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/serialization/config_deserializer.py +0 -0
  342. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/serialization/config_serializer.py +0 -0
  343. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/serialization/persistent_state_manager.py +0 -0
  344. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/specs/__init__.py +0 -0
  345. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/specs/feature_spec.py +0 -0
  346. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/specs/filter_spec.py +0 -0
  347. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/specs/filter_spec_normalizer.py +0 -0
  348. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/specs/normalized_filter_spec.py +0 -0
  349. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/specs/spec_registry.py +0 -0
  350. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/specs/tree_spec.py +0 -0
  351. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/storage/__init__.py +0 -0
  352. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/storage/_disk_format.py +0 -0
  353. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/storage/_manifest.py +0 -0
  354. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/storage/_manifest_inspection.py +0 -0
  355. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/storage/_read_validation.py +0 -0
  356. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/storage/_storages.py +0 -0
  357. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/storage/_writer_lock.py +0 -0
  358. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/storage/disk_store.py +0 -0
  359. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/storage/memory_store.py +0 -0
  360. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/cfp/storage/null_store.py +0 -0
  361. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/layers/checkpoint.py +0 -0
  362. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/python/mtlearn/morphology.py +0 -0
  363. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/src/CMakeLists.txt +0 -0
  364. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/src/mtlearn/cfp/tree_tensors.hpp +0 -0
  365. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/src/mtlearn/cfp/tree_traversal.hpp +0 -0
  366. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/src/mtlearn/morphology.cpp +0 -0
  367. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/CMakeLists.txt +0 -0
  368. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/cmake/installed_consumer_test.cmake +0 -0
  369. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/cpp/public_morphology.cpp +0 -0
  370. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/cpp/test_interpreter.cpp +0 -0
  371. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/_paired_dataset_reference.py +0 -0
  372. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/README.md +0 -0
  373. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/baseline.pt +0 -0
  374. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/manifest.json +0 -0
  375. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_linear_dataset_clipped_zscore01.pt +0 -0
  376. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_linear_dataset_clipped_zscore01.stats.pt +0 -0
  377. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_linear_dataset_minmax01.pt +0 -0
  378. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_linear_dataset_minmax01.stats.pt +0 -0
  379. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_linear_dataset_zscore.pt +0 -0
  380. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_linear_dataset_zscore.stats.pt +0 -0
  381. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_linear_none.pt +0 -0
  382. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_linear_none.stats.pt +0 -0
  383. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_mlp_dataset_clipped_zscore01.pt +0 -0
  384. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_mlp_dataset_clipped_zscore01.stats.pt +0 -0
  385. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_mlp_dataset_minmax01.pt +0 -0
  386. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_mlp_dataset_minmax01.stats.pt +0 -0
  387. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_mlp_dataset_zscore.pt +0 -0
  388. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_mlp_dataset_zscore.stats.pt +0 -0
  389. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_mlp_none.pt +0 -0
  390. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_mlp_none.stats.pt +0 -0
  391. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/min-tree_linear_dataset_clipped_zscore01.pt +0 -0
  392. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/min-tree_linear_dataset_clipped_zscore01.stats.pt +0 -0
  393. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/min-tree_mlp_dataset_clipped_zscore01.pt +0 -0
  394. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/min-tree_mlp_dataset_clipped_zscore01.stats.pt +0 -0
  395. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/tree-of-shapes_linear_dataset_clipped_zscore01.pt +0 -0
  396. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/tree-of-shapes_linear_dataset_clipped_zscore01.stats.pt +0 -0
  397. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/tree-of-shapes_mlp_dataset_clipped_zscore01.pt +0 -0
  398. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0/tree-of-shapes_mlp_dataset_clipped_zscore01.stats.pt +0 -0
  399. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/baseline.pt +0 -0
  400. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/manifest.json +0 -0
  401. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_linear_dataset_clipped_zscore01.pt +0 -0
  402. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_linear_dataset_clipped_zscore01.stats.pt +0 -0
  403. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_linear_dataset_minmax01.pt +0 -0
  404. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_linear_dataset_minmax01.stats.pt +0 -0
  405. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_linear_dataset_zscore.pt +0 -0
  406. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_linear_dataset_zscore.stats.pt +0 -0
  407. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_linear_none.pt +0 -0
  408. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_linear_none.stats.pt +0 -0
  409. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_mlp_dataset_clipped_zscore01.pt +0 -0
  410. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_mlp_dataset_clipped_zscore01.stats.pt +0 -0
  411. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_mlp_dataset_minmax01.pt +0 -0
  412. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_mlp_dataset_minmax01.stats.pt +0 -0
  413. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_mlp_dataset_zscore.pt +0 -0
  414. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_mlp_dataset_zscore.stats.pt +0 -0
  415. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_mlp_none.pt +0 -0
  416. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/max-tree_mlp_none.stats.pt +0 -0
  417. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/min-tree_linear_dataset_clipped_zscore01.pt +0 -0
  418. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/min-tree_linear_dataset_clipped_zscore01.stats.pt +0 -0
  419. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/min-tree_mlp_dataset_clipped_zscore01.pt +0 -0
  420. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/min-tree_mlp_dataset_clipped_zscore01.stats.pt +0 -0
  421. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/tree-of-shapes_linear_dataset_clipped_zscore01.pt +0 -0
  422. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/tree-of-shapes_linear_dataset_clipped_zscore01.stats.pt +0 -0
  423. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/tree-of-shapes_mlp_dataset_clipped_zscore01.pt +0 -0
  424. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/tree-of-shapes_mlp_dataset_clipped_zscore01.stats.pt +0 -0
  425. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p1/statistics.json +0 -0
  426. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_cache_p5/notebook_before_p5.json +0 -0
  427. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/legacy_linear_sigmoid_max-tree.pt +0 -0
  428. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/legacy_linear_sigmoid_min-tree.pt +0 -0
  429. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/legacy_linear_sigmoid_tree-of-shapes.pt +0 -0
  430. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/legacy_mlp_max-tree.pt +0 -0
  431. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/legacy_mlp_min-tree.pt +0 -0
  432. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/legacy_mlp_tree-of-shapes.pt +0 -0
  433. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/manifest.json +0 -0
  434. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/memory_linear_sigmoid_max-tree.pt +0 -0
  435. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/memory_linear_sigmoid_min-tree.pt +0 -0
  436. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/memory_linear_sigmoid_tree-of-shapes.pt +0 -0
  437. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/memory_mlp_max-tree.pt +0 -0
  438. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/memory_mlp_min-tree.pt +0 -0
  439. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/memory_mlp_tree-of-shapes.pt +0 -0
  440. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_bindings.py +0 -0
  441. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_cfp_cache.py +0 -0
  442. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_cfp_cache_calibration.py +0 -0
  443. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_cfp_checkpoint_independence.py +0 -0
  444. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_cfp_components.py +0 -0
  445. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_cfp_dataset_cache.py +0 -0
  446. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_cfp_dataset_diagnostics.py +0 -0
  447. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_cfp_dataset_source.py +0 -0
  448. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_cfp_deterministic.py +0 -0
  449. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_cfp_disk_cache_e0.py +0 -0
  450. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_cfp_disk_cache_validation.py +0 -0
  451. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_cfp_disk_preparation_flow.py +0 -0
  452. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_cfp_jacobian_intervals.py +0 -0
  453. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_cfp_mps_reconstruction.py +0 -0
  454. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_cfp_notebook_cache_budget.py +0 -0
  455. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_cfp_notebook_streaming.py +0 -0
  456. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_cfp_parallel_preparation.py +0 -0
  457. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_cfp_prepared_dataloader.py +0 -0
  458. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_cfp_process_dataloader.py +0 -0
  459. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_cfp_uint32_pixel_map.py +0 -0
  460. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_cfp_validation.py +0 -0
  461. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_data.py +0 -0
  462. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_gradchecks.py +0 -0
  463. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_paired_dataset_characterization.py +0 -0
  464. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_reusable_paired_dataset.py +0 -0
  465. {mtlearn-1.2.0 → mtlearn-1.2.1}/mtlearn/tests/python/test_version.py +0 -0
  466. {mtlearn-1.2.0 → mtlearn-1.2.1}/pyproject.toml +0 -0
  467. {mtlearn-1.2.0 → mtlearn-1.2.1}/requirements.txt +0 -0
  468. {mtlearn-1.2.0 → mtlearn-1.2.1}/scripts/benchmarks/cfp_cache_p0.py +0 -0
  469. {mtlearn-1.2.0 → mtlearn-1.2.1}/scripts/benchmarks/cfp_cache_p1.py +0 -0
  470. {mtlearn-1.2.0 → mtlearn-1.2.1}/scripts/benchmarks/cfp_cache_p2.py +0 -0
  471. {mtlearn-1.2.0 → mtlearn-1.2.1}/scripts/benchmarks/cfp_cache_p3.py +0 -0
  472. {mtlearn-1.2.0 → mtlearn-1.2.1}/scripts/benchmarks/cfp_cache_p4.py +0 -0
  473. {mtlearn-1.2.0 → mtlearn-1.2.1}/scripts/benchmarks/cfp_cache_p5.py +0 -0
  474. {mtlearn-1.2.0 → mtlearn-1.2.1}/scripts/benchmarks/cfp_cache_p6.py +0 -0
  475. {mtlearn-1.2.0 → mtlearn-1.2.1}/scripts/benchmarks/cfp_cache_p6_finalize.py +0 -0
  476. {mtlearn-1.2.0 → mtlearn-1.2.1}/scripts/benchmarks/cfp_jacobian_intervals.py +0 -0
  477. {mtlearn-1.2.0 → mtlearn-1.2.1}/scripts/download_data.py +0 -0
  478. {mtlearn-1.2.0 → mtlearn-1.2.1}/scripts/install_release_dependencies.py +0 -0
  479. {mtlearn-1.2.0 → mtlearn-1.2.1}/scripts/resolve_package_version.py +0 -0
  480. {mtlearn-1.2.0 → mtlearn-1.2.1}/scripts/smoke_test_release.py +0 -0
  481. {mtlearn-1.2.0 → mtlearn-1.2.1}/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.1
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.1'
22
+ __version_tuple__ = version_tuple = (1, 2, 1)
23
23
 
24
- __commit_id__ = commit_id = 'g1ddf531d3'
24
+ __commit_id__ = commit_id = 'g1d6f21bf0'
@@ -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
@@ -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):
@@ -11,6 +11,8 @@ import weakref
11
11
  import numpy as np
12
12
  import pytest
13
13
  import torch
14
+
15
+ from cfp_reference_names import canonical_reference_names
14
16
  from torch.utils.data import DataLoader, Subset, TensorDataset
15
17
 
16
18
  import mtlearn
@@ -32,7 +34,7 @@ QUOTA = 32 * 1024**2
32
34
 
33
35
  @pytest.fixture(scope="module")
34
36
  def baseline():
35
- return torch.load(FIXTURES / "baseline.pt", map_location="cpu", weights_only=True)
37
+ return canonical_reference_names(torch.load(FIXTURES / "baseline.pt", map_location="cpu", weights_only=True))
36
38
 
37
39
 
38
40
  def model(*, mode="dataset_clipped_zscore01", scoring="linear_sigmoid", attrs=(AREA, HEIGHT), dtype=np.float32):
@@ -7,6 +7,8 @@ import weakref
7
7
 
8
8
  import pytest
9
9
  import torch
10
+
11
+ from cfp_reference_names import canonical_reference_names
10
12
  from torch.utils.data import DataLoader, TensorDataset
11
13
 
12
14
  import mtlearn
@@ -27,7 +29,7 @@ MANIFEST = json.loads((FIXTURES / "manifest.json").read_text())
27
29
 
28
30
  @pytest.fixture(scope="module")
29
31
  def baseline():
30
- return torch.load(FIXTURES / "baseline.pt", weights_only=True, map_location="cpu")
32
+ return canonical_reference_names(torch.load(FIXTURES / "baseline.pt", weights_only=True, map_location="cpu"))
31
33
 
32
34
 
33
35
  def loader(images, *, batch_size=2, **kwargs):
@@ -10,6 +10,8 @@ import numpy as np
10
10
  import pytest
11
11
  import torch
12
12
 
13
+ from cfp_reference_names import canonical_reference_names
14
+
13
15
  import mtlearn
14
16
  from mtlearn import morphology
15
17
  from mtlearn.layers import ConnectedFilterPreprocessingLayer as Layer, load_checkpoint
@@ -27,7 +29,7 @@ AREA, HEIGHT = morphology.AttributeType.AREA, morphology.AttributeType.GRAY_LEVE
27
29
 
28
30
  @pytest.fixture(scope="module")
29
31
  def baseline():
30
- return torch.load(FIXTURES / "baseline.pt", weights_only=True, map_location="cpu")
32
+ return canonical_reference_names(torch.load(FIXTURES / "baseline.pt", weights_only=True, map_location="cpu"))
31
33
 
32
34
 
33
35
  def model(*, channels=1, scoring="linear_sigmoid", mode="none", attrs=(AREA, HEIGHT), tree="max-tree", **kwargs):
@@ -468,7 +468,7 @@ def test_attribute_enum_names_match_the_catalog_without_aliases():
468
468
  descriptions = morphology.describe_all_attributes()
469
469
  members = morphology.AttributeType.__members__
470
470
 
471
- assert len(members) == len(descriptions) == 132
471
+ assert len(members) == len(descriptions) == 133
472
472
  assert set(members) == set(descriptions)
473
473
  for name, value in members.items():
474
474
  assert value.name == name
@@ -45,7 +45,7 @@ def test_distance_and_filled_shape_groups_match_scalar_attributes(
45
45
  def test_attribute_catalog_contains_all_distance_and_filled_shape_attributes():
46
46
  descriptions = morphology.describe_all_attributes()
47
47
  attributes = morphology.expand_attribute_group(morphology.AttributeGroup.ALL)
48
- assert len(attributes) == len(set(attributes)) == len(descriptions) == 132
48
+ assert len(attributes) == len(set(attributes)) == len(descriptions) == 133
49
49
  names = set()
50
50
  for group_name, _ in GROUPS:
51
51
  names.update(attribute.name for attribute in morphology.expand_attribute_group(
@@ -0,0 +1,64 @@
1
+ import pickle
2
+ import re
3
+
4
+ import numpy as np
5
+ import pytest
6
+
7
+ from mtlearn import morphology
8
+
9
+
10
+ def test_bounding_box_width_alias_uses_canonical_name():
11
+ attribute = morphology.AttributeType.BOUNDING_BOX_WIDTH
12
+ assert morphology.AttributeType.BOX_WIDTH is attribute
13
+ assert morphology.Attribute.BOX_WIDTH is attribute
14
+ assert attribute.name == "BOUNDING_BOX_WIDTH"
15
+ assert int(attribute) == 6
16
+ assert pickle.loads(pickle.dumps(morphology.AttributeType.BOX_WIDTH)) == attribute
17
+ assert "BOX_WIDTH" not in morphology.AttributeType.__members__
18
+ assert not re.search(r"\bBOX_WIDTH\b", morphology.AttributeType.__doc__)
19
+ descriptions = morphology.describe_all_attributes()
20
+ assert "BOX_WIDTH" not in descriptions
21
+ assert descriptions[attribute.name] == morphology.describe_attribute(attribute)
22
+ attributes = morphology.expand_attribute_group(morphology.AttributeGroup.SHAPE)
23
+ assert attributes.count(attribute) == 1
24
+ assert "BOX_WIDTH" not in {value.name for value in attributes}
25
+
26
+
27
+ @pytest.mark.parametrize("tree_type", ["max-tree", "min-tree"])
28
+ @pytest.mark.parametrize("dtype", [np.float32, np.float64])
29
+ def test_bounding_box_width_alias_computes_canonical_columns(tree_type, dtype):
30
+ image = np.zeros((5, 7), dtype=np.uint8)
31
+ image[1:4, 1:6] = 200
32
+ if tree_type == "min-tree":
33
+ image = 255 - image
34
+ tree = morphology.build_tree(image, tree_type)
35
+ node = tree.smallest_node(2 * 7 + 3)
36
+ attribute = morphology.AttributeType.BOUNDING_BOX_WIDTH
37
+ expected = morphology.compute_single_attribute(tree, attribute, dtype=dtype)
38
+ assert expected[node] == 5
39
+ for requested in [attribute, morphology.AttributeType.BOX_WIDTH]:
40
+ values = morphology.compute_single_attribute(tree, requested, dtype=dtype)
41
+ np.testing.assert_array_equal(values, expected)
42
+ layout, values = morphology.compute_attributes(tree, [requested], dtype=dtype)
43
+ assert layout == {"BOUNDING_BOX_WIDTH": 0}
44
+ np.testing.assert_array_equal(values[:, 0], expected)
45
+ layout, values = morphology.compute_attributes(
46
+ tree, [morphology.AttributeGroup.SHAPE], dtype=dtype
47
+ )
48
+ assert "BOX_WIDTH" not in layout
49
+ np.testing.assert_array_equal(values[:, layout[attribute.name]], expected)
50
+
51
+
52
+ def test_bounding_box_width_legacy_statistics_are_canonicalized():
53
+ import torch
54
+ from mtlearn.layers.cfp.normalization.stats_serializer import StatsSerializer
55
+
56
+ key = "max-tree|None|0|0"
57
+ stats = {"amin": torch.tensor(1.0), "amax": torch.tensor(7.0)}
58
+ restored = StatsSerializer.deserialize({key + "::BOX_WIDTH": stats}, device="cpu")
59
+ assert set(restored) == {key + "::BOUNDING_BOX_WIDTH"}
60
+ for name, value in stats.items():
61
+ torch.testing.assert_close(restored[key + "::BOUNDING_BOX_WIDTH"][name], value)
62
+ with pytest.raises(ValueError, match="duplicate dataset statistics"):
63
+ StatsSerializer.deserialize({key + "::BOX_WIDTH": stats,
64
+ key + "::BOUNDING_BOX_WIDTH": stats}, device="cpu")