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