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.
- {mtlearn-1.2.0 → mtlearn-1.2.2}/PKG-INFO +1 -1
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/concepts/attributes.md +5 -17
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/guides/custom-attributes-filter-specs.md +2 -1
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/bindings/morphology/AttributeBinding.hpp +111 -20
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/bindings/morphology/BindingSupport.hpp +4 -4
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/include/mtlearn/morphology.hpp +6 -4
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/_version.py +3 -3
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/normalization/stats_serializer.py +9 -4
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_disk_preparation.py +4 -2
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_identity.py +20 -12
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_persistent_preparation.py +9 -3
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/storage/_manifest.py +5 -2
- mtlearn-1.2.2/mtlearn/tests/python/cfp_reference_names.py +12 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_cache_baseline.py +3 -1
- mtlearn-1.2.2/mtlearn/tests/python/test_cfp_cache_compatibility.py +101 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_disk_cache.py +3 -1
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_preparation.py +3 -1
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_prepared_runtime.py +3 -1
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_morphology_api.py +1 -1
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_morphology_attribute_groups.py +1 -1
- mtlearn-1.2.2/mtlearn/tests/python/test_morphology_bounding_box_width.py +64 -0
- mtlearn-1.2.2/mtlearn/tests/python/test_morphology_gray_level.py +69 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/.github/workflows/ci.yml +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/.github/workflows/docs.yml +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/.github/workflows/notebooks.yml +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/.github/workflows/package.yml +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/.github/workflows/release.yml +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/CMakeLists.txt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/LICENSE +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/Pipfile +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/README.md +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/cmake/mtlearnConfig.cmake.in +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/assets/cfp-class-architecture.svg +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/cfp-architecture.md +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/cfp-loss-design.md +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/cfp-regularization-design.md +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/cfp-score-constraint-design.md +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/cfp-scoring-design.md +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/development.md +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/installation.md +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/_static/.gitkeep +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/_templates/.gitkeep +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/api/python/cfp_preparation.rst +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/api/python/data.rst +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/api/python/datasets.rst +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/api/python/index.rst +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/api/python/layers.rst +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/api/python/morphology.rst +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/api/python/native.rst +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/concepts/morphology.md +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/conf.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/guides/getting-started.md +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/guides/index.md +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/guides/morphology.md +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/guides/pytorch-integration.md +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/docs/source/index.md +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/environment.yml +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/.clang-format +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/.editorconfig +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/.gitattributes +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/CMakeLists.txt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/LICENSE +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/README.md +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/CMakeLists.txt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/README.md +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/adjacency_iteration_benchmark.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/analyze_scientific_experiment.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/analyze_tree_construction_comparison.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/api/ApiBenchmark.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/api/AttributeScenarios.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/api/CasfScenarios.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/api/ConstructionScenarios.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/api/EditingScenarios.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/api/FilterScenarios.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/api/InteroperabilityScenarios.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/api/PipelineScenarios.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/api/WorkloadManifest.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/api/api_benchmark.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/build_tree_construction_report.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/compare_validation_modes.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/distance_transform_sensitivity.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/distance_transform_timing.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/min_max_residual_tree_benchmark.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/python_api_benchmark.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/scientific_pipeline_benchmark.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/analyze_results.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/bitquad_benchmark.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/bitquad_exactness_validation.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/correctness.csv +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/dataset-manifest.csv +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/experiment.json +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/raw-1080p.csv +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/raw-480p.csv +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/raw-720p.csv +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/run-1080p.log +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/run-480p.log +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/run-720p.log +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/speedups.csv +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/summary.csv +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/reference-results/table.tex +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/sibgrapi2026/run_experiment.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/summarize_scientific_campaign.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/support/ScientificBenchmark.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/support/stb_image_read.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/tree_construction_comparison_benchmark.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/tree_validation_benchmark.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/validation-sensitive.md +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/validation_sensitive_algorithms_benchmark.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/workloads/distance-transform-contract.ini +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/benchmarks/workloads/scientific-api.ini +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/cmake/mmcfiltersConfig.cmake.in +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/cmake/mmcfiltersPublicHeaders.cmake +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/CMakeLists.txt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/AttributeComputation.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/AttributeNames.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/AttributeRegistry.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/AttributeResultTypes.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/AttributeTypes.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/Attributes.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/AreaComputer.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/AttributeComputerDomain.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/AttributeComputerFamily.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/AttributeComputerRegistry.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/BitquadAttributeComputer.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/BoundingBoxComputer.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/ContourSideAttributeComputer.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/FilledShapeAttributeComputer.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/GrayLevelStatsComputer.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/MaxDistComputer.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/MaxDistExactComputer.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/MomentBasedAttributeComputer.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/TreeTopologyComputer.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/VolumeComputer.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/BitquadAttributeData.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/BitquadAttributeProjection.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/BitquadConnectivityPolicy.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/BitquadFiniteWindowComputation.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/ContourSideAttributeData.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/ContourSideAttributeMaterialization.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/ContourSideFiniteWindowComputation.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform/DistanceFieldHistogram.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform/DistanceFieldMoments.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform/DistanceWeightedSpatialMoments.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform/ExactSquaredEuclideanDistanceTransform2D.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform/MorphologicalTreeDistanceTransform.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform/NodeContourSchedule.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform/NodeDistanceFieldProvider.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform/NodeSupportBoxIndex.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform_approx/AdaptiveSquaredEuclideanDIFT2D.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform_approx/DynamicDistanceFieldMoments2D.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform_approx/DynamicDistanceFieldStatistics2D.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform_approx/MorphologicalTreeApproximateDistanceTransform.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform_approx/MorphologicalTreePropagationEdgeIndex.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform_approx/MorphologicalTreeTopologicalLevelIndex.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/computers/detail/distance_transform_approx/SquaredDistanceBucketQueue.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/detail/AttributeCapabilityValidation.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/detail/AttributeDependencyCache.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/detail/AttributeFamilyScheduler.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/detail/AttributeKernelSupport.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/detail/AttributeNumericPolicy.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/detail/AttributePipeline.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/detail/AttributeProjection.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/detail/AttributeRequestUtils.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/detail/NodeAttributeSampleMaterialization.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/attributes/detail/TopologyAttributeBackend.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/contours/ContourComputation.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/contours/ContourTrace.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/contours/ContourTraceComputation.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/contours/detail/ContourBoundaryTracer.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/contours/detail/ContourEdgeDeltaStore.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/contours/detail/ContourLifetimeIndex.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/contours/detail/ContourTraceTraversal.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/contours/detail/ContourTraversal.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/contours/detail/NodeSupportIndex.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/dataStructure/FastQueue.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/dataStructure/FastStack.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/filters/AttributeFilters.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/filters/AttributeReconstructionFilters.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/filters/DepthStableRegionComputer.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/filters/ExtinctionValues.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/filters/MSERComputer.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/filters/NodeDecisionMasks.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/filters/NodePreservationStability.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/filters/UltimateAttributeOpening.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/filters/detail/VariationMeasure.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/filters/detail/ViterbiDecision.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/localAttributes/ConnectedSubsetTreeLocalizer.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/localAttributes/FiniteWindowLocalAttributeComputer.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/localAttributes/FiniteWindowLocalEventCompiler.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/localAttributes/LocalEventModel.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/MorphologicalTree.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/MorphologicalTreeFactory.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/MorphologicalTreeSemantics.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/NativeHierarchy.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/ProperPartDomain.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/TreeAltitudeAlgorithms.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/TreeEditor.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/TreeOfShapesProducer.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/ValuedMorphologicalTree.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/ValuedMorphologicalTreeView.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/adjust/CasfComponentTrees.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/adjust/DualMinMaxTreeIncrementalFilter.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/adjust/DualMinMaxTreeIncrementalFilterLeaf.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/adjust/DynamicTreeAttributeComputer.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/CommittedTreeAccess.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/ComponentTreeProducerDetail.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/ComponentTreeUnionFind.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/HierarchyCapabilityValidation.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/HigraExportLayoutDetail.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/HigraHierarchyAdapterDetail.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/HigraImportLayoutDetail.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/MorphologicalTreeConstructionContextQueries.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/MorphologicalTreeConstructionTag.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/NativeHierarchyValidationDetail.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/TreeAttributeSamplingNeighborhood.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/TreeStabilityNeighborhood.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/detail/TreeTraversalDetail.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/saliency/HierarchicalWatershedSaliency.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/saliency/HierarchySaliencyMap.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/saliency/HierarchySaliencyMapProjection.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/saliency/HierarchySaliencyMapValidation.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/saliency/ShapeSpaceSaliency.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/ResidualEvolution.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/ResidualTreeBuildStatistics.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/ResidualTreePolicies.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/SaturatedResidualTreeBuilder.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/UnrestrictedResidualTreeBuilder.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/detail/FlatZonePartition.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/detail/ResidualTreeCandidateAgenda.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/detail/ResidualTreeCandidateContext.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/detail/ResidualTreeCandidatePreparation.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/detail/ResidualTreeCandidateTypes.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/detail/ResidualTreeEventAssembler.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/detail/ResidualTreeMaterialization.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/detail/ResidualTreeRegionTypes.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/detail/SaturatedDynamicLca.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/detail/SaturatedResidualEligibility.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/trees/sdrt/detail/SynchronizedResidualTreeEvolution.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/utils/Altitude.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/utils/Assert.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/utils/CommittedGridAccess.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/utils/CommittedImageAccess.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/utils/Common.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/utils/Contract.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/utils/GenerationStampSet.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/utils/Image.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/mmcfilters/utils/RegularGridAdjacency2D.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/AdjustBindings.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/AttributeBindings.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/AttributeComputationBindings.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/AttributeFiltersPybind.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/AttributeReconstructionFiltersPybind.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/ContourBindings.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/ContourTraceBindings.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/DepthStableRegionComputerPybind.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/ExtinctionValuesPybind.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/FilterBindings.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/ModuleBindings.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/PybindConversions.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/PythonValuedMorphologicalTree.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/TreeBindings.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/UltimateAttributeOpeningPybind.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/pybinds/UtilityBindings.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/scripts/execute_notebooks.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/external/mmcfilters/scripts/validate_notebooks.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/bindings/CMakeLists.txt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/bindings/MtlearnModule.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/bindings/cfp/TreeTensorsBinding.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/bindings/cfp/TreeTraversalBinding.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/bindings/morphology/AttributeFiltersBinding.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/bindings/morphology/WeightedTreeBinding.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/include/mtlearn/detail/morphology_backend.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/__init__.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/_backends/__init__.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/_backends/_mtlearn.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/_datasets/__init__.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/_datasets/_explicit_pairs.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/_datasets/_generated_target.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/_datasets/_image_ops.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/_datasets/_paired_image.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/_datasets/_split.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/_native.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/data.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/datasets.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/__init__.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/_helpers.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/__init__.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/component_registries.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/connected_filter_preprocessing_layer.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/constraints/__init__.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/constraints/base.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/constraints/preserve_root.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/normalization/__init__.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/normalization/attribute_normalizer.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/normalization/attribute_statistics.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/normalization/statistics_snapshot.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/__init__.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_calibration_measurement.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_loader_memory.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_parallel_preparation.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_preparation_progress.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_prepared_reader.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_process_reader.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_read_diagnostics.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_reader_process.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_shared_batch.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_statistics_fitter.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_threaded_reader.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/calibration.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/cfp_preprocessor.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/dataset_cache.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/dataset_diagnostics.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/dataset_source.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/preparation_result.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/prepared_batch.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/prepared_dataloader.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/prepared_dataset.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/prepared_morphology.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/regularization/__init__.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/regularization/_tree_info.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/regularization/attribute_order_score_monotonicity.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/regularization/base.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/regularization/edge_score_monotonicity.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/regularization/path_score_monotonicity.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/runtime/__init__.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/runtime/_prepared_lifetime.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/runtime/batch_input.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/runtime/cache_input_contract.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/runtime/cached_dataloader_builder.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/runtime/context.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/runtime/forward_executor.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/runtime/implicit_jacobian_function.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/runtime/training_sample_inspector.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/runtime/tree_payload_cache.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/runtime/tree_payload_provider.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/runtime/tree_reconstructor.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/scoring/__init__.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/scoring/_layer_owned_linear_parameter_initializer.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/scoring/base.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/scoring/linear_sigmoid.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/scoring/mlp.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/serialization/__init__.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/serialization/config_deserializer.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/serialization/config_serializer.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/serialization/persistent_state_manager.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/specs/__init__.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/specs/feature_spec.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/specs/filter_spec.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/specs/filter_spec_normalizer.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/specs/normalized_filter_spec.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/specs/spec_registry.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/specs/tree_spec.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/storage/__init__.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/storage/_disk_format.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/storage/_manifest_inspection.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/storage/_read_validation.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/storage/_storages.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/storage/_writer_lock.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/storage/disk_store.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/storage/memory_store.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/storage/null_store.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/checkpoint.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/morphology.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/src/CMakeLists.txt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/src/mtlearn/cfp/tree_tensors.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/src/mtlearn/cfp/tree_traversal.hpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/src/mtlearn/morphology.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/CMakeLists.txt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/cmake/installed_consumer_test.cmake +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/cpp/public_morphology.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/cpp/test_interpreter.cpp +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/_paired_dataset_reference.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/README.md +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/baseline.pt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/manifest.json +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_linear_dataset_clipped_zscore01.pt +0 -0
- {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
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_linear_dataset_minmax01.pt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_linear_dataset_minmax01.stats.pt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_linear_dataset_zscore.pt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_linear_dataset_zscore.stats.pt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_linear_none.pt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_linear_none.stats.pt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_mlp_dataset_clipped_zscore01.pt +0 -0
- {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
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_mlp_dataset_minmax01.pt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_mlp_dataset_minmax01.stats.pt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_mlp_dataset_zscore.pt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_mlp_dataset_zscore.stats.pt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_mlp_none.pt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/max-tree_mlp_none.stats.pt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/min-tree_linear_dataset_clipped_zscore01.pt +0 -0
- {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
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0/min-tree_mlp_dataset_clipped_zscore01.pt +0 -0
- {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
- {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
- {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
- {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
- {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
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/baseline.pt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p0_mmcfilters_v5_2_0/manifest.json +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p1/statistics.json +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_cache_p5/notebook_before_p5.json +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/legacy_linear_sigmoid_max-tree.pt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/legacy_linear_sigmoid_min-tree.pt +0 -0
- {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
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/legacy_mlp_max-tree.pt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/legacy_mlp_min-tree.pt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/legacy_mlp_tree-of-shapes.pt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/manifest.json +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/memory_linear_sigmoid_max-tree.pt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/memory_linear_sigmoid_min-tree.pt +0 -0
- {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
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/memory_mlp_max-tree.pt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/memory_mlp_min-tree.pt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/fixtures/cfp_disk_cache_e0/memory_mlp_tree-of-shapes.pt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_bindings.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_cache.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_cache_calibration.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_checkpoint_independence.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_components.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_dataset_cache.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_dataset_diagnostics.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_dataset_source.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_deterministic.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_disk_cache_e0.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_disk_cache_validation.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_disk_preparation_flow.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_jacobian_intervals.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_mps_reconstruction.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_notebook_cache_budget.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_notebook_streaming.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_parallel_preparation.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_prepared_dataloader.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_process_dataloader.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_uint32_pixel_map.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_cfp_validation.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_data.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_gradchecks.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_paired_dataset_characterization.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_reusable_paired_dataset.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/tests/python/test_version.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/pyproject.toml +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/requirements.txt +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/benchmarks/cfp_cache_p0.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/benchmarks/cfp_cache_p1.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/benchmarks/cfp_cache_p2.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/benchmarks/cfp_cache_p3.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/benchmarks/cfp_cache_p4.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/benchmarks/cfp_cache_p5.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/benchmarks/cfp_cache_p6.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/benchmarks/cfp_cache_p6_finalize.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/benchmarks/cfp_jacobian_intervals.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/download_data.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/install_release_dependencies.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/resolve_package_version.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/smoke_test_release.py +0 -0
- {mtlearn-1.2.0 → mtlearn-1.2.2}/scripts/validate_notebooks.py +0 -0
|
@@ -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`:
|
|
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` |
|
|
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
|
-
| `
|
|
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 / (
|
|
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 | `
|
|
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::
|
|
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
|
|
186
|
-
|
|
187
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
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
|
-
|
|
263
|
-
|
|
264
|
-
|
|
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
|
-
|
|
297
|
-
|
|
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
|
|
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("
|
|
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::
|
|
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,
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 2,
|
|
21
|
+
__version__ = version = '1.2.2'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 2)
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'g218d9dab2'
|
{mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/normalization/stats_serializer.py
RENAMED
|
@@ -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
|
-
|
|
34
|
-
|
|
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
|
-
|
|
39
|
-
}
|
|
44
|
+
return result
|
{mtlearn-1.2.0 → mtlearn-1.2.2}/mtlearn/python/mtlearn/layers/cfp/preparation/_disk_preparation.py
RENAMED
|
@@ -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()
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
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"]
|
|
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
|
-
|
|
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"]
|
|
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
|
-
|
|
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):
|