hypertopos 0.6.2__tar.gz → 0.6.4__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.
- {hypertopos-0.6.2 → hypertopos-0.6.4}/CHANGELOG.md +80 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/LICENSE.md +1 -1
- {hypertopos-0.6.2 → hypertopos-0.6.4}/PKG-INFO +1 -1
- {hypertopos-0.6.2 → hypertopos-0.6.4}/README.md +4 -1
- {hypertopos-0.6.2 → hypertopos-0.6.4}/ROADMAP.md +2 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/SECURITY.md +1 -1
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/api-reference.md +755 -751
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/concepts.md +1 -1
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/configuration.md +1121 -1098
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/data-format.md +4 -2
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/builder/builder.py +5809 -5721
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/builder/mapping.py +490 -427
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/cli/build.py +1020 -1020
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/cli/schema.py +952 -952
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/engine/adjacency.py +4 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/engine/chains.py +109 -19
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/engine/density_gaps.py +4 -0
- hypertopos-0.6.4/hypertopos/engine/edge_features.py +762 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/engine/hop_predicate.py +4 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/engine/structuring.py +4 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/model/sphere.py +27 -6
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/navigation/navigator.py +1039 -108
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/storage/_schemas.py +65 -65
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/storage/calibration_history.py +2 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/storage/reader.py +19 -9
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/storage/writer.py +962 -962
- {hypertopos-0.6.2 → hypertopos-0.6.4}/pyproject.toml +1 -1
- hypertopos-0.6.4/tests/test_anomaly_propagation_in_chain.py +314 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_builder_derived.py +1416 -1416
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_calibration_drift.py +398 -398
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_calibration_history.py +64 -0
- hypertopos-0.6.4/tests/test_chain_coherent_anomaly.py +132 -0
- hypertopos-0.6.4/tests/test_chain_typology_and_extend.py +196 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_chains.py +32 -0
- hypertopos-0.6.4/tests/test_edge_dim_aggregations.py +340 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_edge_dim_aggregations_builder.py +264 -6
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_edge_dim_aggregations_chain.py +4 -4
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_edge_dim_aggregations_engine.py +226 -1
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_find_motif_by_hops.py +111 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_motif.py +2890 -2890
- hypertopos-0.6.2/hypertopos/engine/edge_features.py +0 -345
- hypertopos-0.6.2/tests/test_edge_dim_aggregations.py +0 -173
- {hypertopos-0.6.2 → hypertopos-0.6.4}/.github/workflows/publish-pypi.yml +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/.gitignore +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/README.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/architecture.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/LICENSE +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/README.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/README.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/SUMMARY.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-settings.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-settings.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-settings.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-settings.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-settings.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-settings.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/sphere/prepare_accounts.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/sphere/prepare_cpty_banks.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/sphere/prepare_districts.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/sphere/prepare_loan_accounts.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/sphere/prepare_operations.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/sphere/prepare_orders.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/sphere/prepare_transactions.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/sphere/prepare_tx_types.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/berka/sphere/sphere.yaml +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/ibm-aml/README.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/ibm-aml/_layer2_cross_eval.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/ibm-aml/_layer3_cross_eval.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_accounts.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_currencies.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_payment_formats.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_transactions.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/ibm-aml/hi_small_sphere/sphere.yaml +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/ibm-aml/layer1_passive_scan.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/ibm-aml/layer2_xgboost_sweep.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/ibm-aml/layer3_typology_filter.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/ibm-aml/li_small_sphere/prepare_accounts.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/ibm-aml/li_small_sphere/prepare_currencies.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/ibm-aml/li_small_sphere/prepare_payment_formats.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/ibm-aml/li_small_sphere/prepare_transactions.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/ibm-aml/li_small_sphere/sphere.yaml +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/ibm-aml/passive-scan-calibration.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/nyc-taxi/README.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/nyc-taxi/results/0.1.0/SUMMARY.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-c-report.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-settings.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-c-report.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-settings.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-c-report.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-settings.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/nyc-taxi/sphere/prepare_trips.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmark/nyc-taxi/sphere/sphere.yaml +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/benchmarks.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/images/build-pipeline.svg +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/images/core-objects.svg +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/images/cutting-plane.svg +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/images/directory-layout.svg +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/images/hypertopos-overview.svg +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/images/model-lifecycle.svg +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/images/navigation-primitives.svg +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/images/three-scales.svg +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/introduction.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/docs/quickstart.md +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/__init__.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/builder/__init__.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/builder/_bootstrap.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/builder/_bregman.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/builder/_scatter.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/builder/_stats.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/builder/_writer.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/builder/derived.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/builder/dim_blocks.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/cli/__init__.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/cli/__main__.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/cli/info.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/cli/main.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/cli/sources.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/engine/__init__.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/engine/aggregation.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/engine/calibration.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/engine/composition.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/engine/fdr.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/engine/forecast.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/engine/geometry.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/engine/graph_algorithms.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/engine/heredity.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/engine/invalidation.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/engine/investigation.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/engine/lance_sql_agg.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/engine/selection.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/model/__init__.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/model/manifest.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/model/objects.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/navigation/__init__.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/navigation/scanner.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/sphere.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/storage/__init__.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/storage/cache.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/utils/__init__.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/hypertopos/utils/arrow.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/.gitkeep +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/conftest.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/fixtures/generate_fixtures.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_adjacency.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_adjacency_vectorized.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_aggregation_engine.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_arrow_utils.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_bootstrap.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_bregman.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_builder.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_builder_alias.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_builder_chunking.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_builder_contagion.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_builder_edges.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_builder_rolling_z.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_builder_scatter.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_builder_temporal_perf.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_cache.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_calibration.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_calibration_history_builder.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_calibration_history_reader.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_cli.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_cli_alias.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_cli_sources.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_compaction.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_composition.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_continuous_event_dims.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_data_quality_prop.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_decompose_drift.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_density_gaps_engine.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_detection.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_dim_blocks.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_distinct_neighbor_count.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_edge_dim_aggregations_roundtrip.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_edge_dimensions_builder.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_edge_dimensions_yaml.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_edge_features.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_edge_features_reader.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_edge_potential.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_edge_table.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_engine.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_fdr.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_find_calibration_influencers.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_find_density_gaps.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_find_lead_lag.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_find_lead_lag_significance.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_forecast.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_fts.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_geometric_path.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_geometry_stats.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_gradient_alignment.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_graph_algorithms.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_heredity.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_hop_predicate_engine.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_hybrid_search.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_incremental.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_invalidation.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_investigation.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_kind_detect.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_lance_sql_agg.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_mapping.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_model.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_mvcc_session.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_navigation.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_navigator_alerts.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_navigator_fdr_select.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_neighbors_window.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_observability.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_precision_stack.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_profile_motif_perf_smoke.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_reputation.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_root_cause_trace.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_row_id_cache.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_scanner.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_schema_chain_eda_validation.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_selection.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_sphere.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_sphere_overview_perf.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_stats_guard.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_storage.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_streaming_reads.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_structuring_engine.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_temporal_centroids.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_trajectory_ann.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_witness_cohort.py +0 -0
- {hypertopos-0.6.2 → hypertopos-0.6.4}/tests/test_witness_set.py +0 -0
|
@@ -7,6 +7,86 @@ Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.6.4] — 2026-05-07
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- Parallel chain extraction (`extract_chains` via `ProcessPoolExecutor`) emitted `chain_id`s that collided across workers. Each worker built its chain list locally and used `len(chains)` as the id counter, so the merged output assigned the same `CHAIN-XXXXXX` value to up to N_workers distinct chains. Chains in the points table were then no longer keyed uniquely by `primary_key`. Post-merge dedup now reassigns `chain_id` from the global merged index, restoring uniqueness. **Spheres built before this fix carry colliding chain_ids; rebuild the chain pattern (or the full sphere) to restore unique ids.** A defensive raise in `anomaly_propagation_in_chain` surfaces the ambiguity on legacy spheres so investigations don't silently return the wrong chain's hops. Chain extraction now also asserts post-dedup chain_id uniqueness as a build-time safety net so any future regression in the merge logic fails loudly instead of silently corrupting the chain pattern points table.
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
- `find_motif_by_hops` gains an `anomaly_seed_filter: bool = False` parameter. When `True`, the BFS starting frontier is intersected with the anomaly subset of the resolved anchor companion pattern (entities with `is_anomaly=True`) — replaces the implicit "all keys" frontier when `seed_keys=None`, intersects with the explicit list otherwise. On large populations with a small anomaly fraction, the BFS traversal is collapsed proportionally to the prune ratio, reducing wall-clock for population-sweep motif queries that are bounded on frontier size. Result dict gains `seed_filter_summary` with `requested`, `anomaly`, and `filtered` counts so callers can verify the prune. Raises `GDSNavigationError` when no anchor companion pattern is configured.
|
|
17
|
+
- `classify_chain_typology(chain_id, pattern_id, *, anchor_pattern_id)` — new navigator inspector that wraps `anomaly_propagation_in_chain` and labels the chain along five operational axes: `shape` (monotone-rising / monotone-falling / peak-in-middle / peak-at-start / peak-at-end / flat / single-hop / no-anomalous-run), `peak_position` within the run, `position_in_chain` (leading / transit / terminal / full-chain), `extension_signals` (`forward` / `backward` booleans indicating whether the next-hop or pre-run hop is in an elevated rank band), `pre_run_rank_bucket` and `breakpoint_rank_bucket`, plus the chain-wide `dominant_top_dim`. Returns the chain's longest-run summary alongside the typology block.
|
|
18
|
+
- `extend_chain(chain_id, pattern_id, *, anchor_pattern_id, direction="forward"|"backward", max_results=20)` — new navigator inspector that suggests extension entities at the boundary of a chain's anomalous run. Forward looks at entities that follow the run-end key in OTHER chains in the same chain pattern (via the chain reverse index); backward looks at entities that precede the run-start key. Candidates are returned with `is_anomaly`, `delta_norm`, `delta_rank_pct`, source chain ids, and ranked by `(is_anomaly DESC, delta_norm DESC, n_source_chains DESC)`.
|
|
19
|
+
- `anomaly_propagation_in_chain(chain_id, pattern_id, *, anchor_pattern_id)` — new navigator inspector primitive complementary to `find_chains_with_coherent_anomaly`. Takes a single chain id and returns the chain's hop-by-hop anomaly trace: for each entity in the chain's keys sequence, returns `is_anomaly`, `delta_norm`, the dominant delta dimension (sigma-normalised argmax over `|delta|`) when anomalous, and `delta_rank_pct`. Plus a summary with `n_hops`, `n_anomalous`, `max_run_length_same_top_dim`, and `dominant_top_dim`. Use after a population sweep flags a chain to drill into how the anomaly accumulates and where it breaks. Pure query-side, additive within sphere format 2.4.
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
- `find_motif_by_hops` no longer routes seeded queries (`seed_keys=<list>`) through a scoped per-call edge-table read path. Scoped routing was uniformly slower than the cached global `AdjacencyIndex` + per-call seed filter at every measured seed count from 10 up; the BFS enumerator already filtered the starting frontier by `seed_keys`, so the scoped branch added cost without benefit. After the change all queries — seeded or unseeded — use the cached global adjacency. The cold first call still pays the full O(E) adjacency build; warm calls amortise to BFS-only cost. The internal `_build_scoped_adjacency_for_motif` helper is removed.
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
- `find_chains_with_coherent_anomaly(pattern_id, *, anchor_pattern_id, min_hops=3, max_results=100)` — new navigator primitive that surfaces chains where `>=min_hops` strictly consecutive entity-anchor positions are individually flagged as `is_anomaly=True` AND share the same dominant delta dimension (argmax over sigma-normalised |delta|). Returns ranked runs sorted by `(run_length DESC, max_delta_norm DESC)` with `chain_id`, `run_start_idx`, `run_length`, `top_dim`, `run_keys`, `max_delta_norm` per match plus diagnostics (`n_chains_total`, `n_anomaly_entities`, `elapsed_ms`). Pure query-side, additive within sphere format 2.4. Distinct from `find_anomalies` on a chain pattern, which scores chain-level features (hop count, time span, amount decay); the new primitive scores chain composition — coherent cascades through structurally-similar anomalous entities. Useful when chain shape looks normal but consecutive hops go through entities that all share the same anomaly driver.
|
|
26
|
+
|
|
27
|
+
## [0.6.3] — 2026-05-06
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
- Build-time compute paths for `edge_dim_aggregations:` and the edge feature
|
|
31
|
+
catalog (`compute_pair_edge_count`, `compute_time_since_pair_last_edge`,
|
|
32
|
+
`compute_pair_amount_zscore`, `parse_timestamps_to_epoch`) optimised —
|
|
33
|
+
pure-Python per-row loops replaced with vectorised pyarrow / numpy
|
|
34
|
+
paths. The `_p95` aggregate now returns the exact 95-th percentile
|
|
35
|
+
element (previously a t-digest sketch approximation).
|
|
36
|
+
|
|
37
|
+
### Added
|
|
38
|
+
- `aggregates:` per-source-dim subset selector on `edge_dim_aggregations:`.
|
|
39
|
+
Source dims can now declare which aggregates to emit (`mean` / `max` /
|
|
40
|
+
`std` / `p95` / `count_above_threshold`) instead of always emitting all
|
|
41
|
+
five. The existing `dims: [a, b]` list form continues to expand to all
|
|
42
|
+
five aggregates per dim; the new mapping form
|
|
43
|
+
`dims: {a: [count_above_threshold], b: [mean, max]}` selects subsets.
|
|
44
|
+
Polygon-dim layout follows source-dim insertion order × canonical
|
|
45
|
+
aggregate order, so reordering the user-supplied aggregate list does
|
|
46
|
+
not flip `schema_hash`. Spheres rebuilt with subset selectors carry an
|
|
47
|
+
`aggregates_per_dim` block under each pattern's `edge_dim_aggregations:`
|
|
48
|
+
in `sphere.json`; pre-selector spheres keep emitting the full five-tuple
|
|
49
|
+
on read.
|
|
50
|
+
- Per-source-dim `_count_above_threshold` thresholds are now persisted into
|
|
51
|
+
the calibration epoch JSON under `_gds_meta/calibration_history/<pid>/v={N}.json`
|
|
52
|
+
alongside `mu` / `sigma` / `theta`. Each calibration epoch carries the
|
|
53
|
+
thresholds used during its build, so re-builds are deterministic and
|
|
54
|
+
multi-epoch comparisons see threshold drift. `compare_calibrations`
|
|
55
|
+
output gains a new `edge_dim_threshold_drift` field — a per-source-dim
|
|
56
|
+
`{from, to, delta}` map populated when both compared epochs declared
|
|
57
|
+
`edge_dim_aggregations:`. Legacy epochs (built before this release)
|
|
58
|
+
deserialize with `edge_dim_thresholds=None` and silently omit the
|
|
59
|
+
drift block.
|
|
60
|
+
- `edge_dim_aggregations:` on composite anchors with `len(key_cols) > 2`
|
|
61
|
+
(tripartite and beyond). The previous k=2 (pair) restriction is lifted —
|
|
62
|
+
composite anchors registered via `composite_lines:` with three or more
|
|
63
|
+
key columns now compose with `edge_dim_aggregations:` the same way k=2
|
|
64
|
+
composite anchors did. The anchor primary key is constructed positionally
|
|
65
|
+
from `key_cols` joined by the `composite_lines.<id>.separator`, matching
|
|
66
|
+
the convention used to register the composite line itself. Aggregated
|
|
67
|
+
per-anchor `<source_dim>_mean` / `<source_dim>_max` columns surface in
|
|
68
|
+
every existing anchor-pattern primitive (`find_anomalies`,
|
|
69
|
+
`explain_anomaly`, `find_clusters`, `find_calibration_influencers`,
|
|
70
|
+
`decompose_drift`) via the same `dimension_kinds` source-of-truth as the
|
|
71
|
+
earlier `single` / `pair` / `chain` regimes. No new tools, no MCP API
|
|
72
|
+
change, no sphere format bump.
|
|
73
|
+
- Three new aggregates on `edge_dim_aggregations:` — `_std`
|
|
74
|
+
(per-anchor standard deviation of the source dim across the anchor's
|
|
75
|
+
edges), `_p95` (95th percentile, tail-mass tracker without `_max`'s
|
|
76
|
+
extreme-outlier sensitivity), and `_count_above_threshold` (number
|
|
77
|
+
of edges where the source dim crosses a per-dim threshold). Extend
|
|
78
|
+
the prior `_mean` / `_max` set on every anchor regime (single, pair,
|
|
79
|
+
k>2, chain). Surface automatically alongside `_mean` / `_max` on
|
|
80
|
+
every anchor primitive (`find_anomalies`, `explain_anomaly`,
|
|
81
|
+
`find_clusters`, `find_calibration_influencers`, `decompose_drift`).
|
|
82
|
+
Per-dim threshold for `_count_above_threshold` defaults to the
|
|
83
|
+
population p95 of the source dim; user can override by passing a
|
|
84
|
+
`thresholds` dict keyed by source dim name. `_std` adds variance
|
|
85
|
+
signal that `_mean` / `_max` don't capture; `_p95` separates
|
|
86
|
+
tail-mass from extreme outliers; `_count_above_threshold` flags
|
|
87
|
+
anchors with anomalous concentration of high-value edges. No new
|
|
88
|
+
YAML keywords, no new tools, no sphere format bump.
|
|
89
|
+
|
|
10
90
|
## [0.6.2] — 2026-05-05
|
|
11
91
|
|
|
12
92
|
### Added
|
|
@@ -26,7 +26,7 @@ For purposes of this License:
|
|
|
26
26
|
- **Internal use** within an organization is not a competitive offering. Your
|
|
27
27
|
organization includes entities under common control.
|
|
28
28
|
|
|
29
|
-
**Change Date:** 2029-05-
|
|
29
|
+
**Change Date:** 2029-05-07
|
|
30
30
|
|
|
31
31
|
**Change License:** Apache License, Version 2.0
|
|
32
32
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hypertopos
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.4
|
|
4
4
|
Summary: Understand the structure of your data — without training machine learning models
|
|
5
5
|
Project-URL: Homepage, https://github.com/hypertopos/hypertopos-py
|
|
6
6
|
Project-URL: Documentation, https://github.com/hypertopos/hypertopos-py/tree/main/docs
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
[](https://arrow.apache.org/docs/python/)
|
|
9
9
|
[](https://github.com/lance-format/lance)
|
|
10
10
|
[](https://modelcontextprotocol.io)
|
|
11
|
-
[](pyproject.toml)
|
|
12
12
|
|
|
13
13
|
hypertopos is not a database, and not a machine learning model. It is a layer that turns relational data into a coordinate system where every entity gets a position derived from its relationships and the population around it.
|
|
14
14
|
|
|
@@ -69,6 +69,9 @@ Each capability below emerges from treating entities as points in a shared, popu
|
|
|
69
69
|
| Richer hop predicates | `HopPredicate.amount_ratio_to_prev` (decreasing-chain ratio) and `require_anomalous_entity` (filter chains routing through calibrated-anomalous nodes) extend the declarative motif API | Closed-vocab motif library has fixed amount thresholds and no anomaly-routing filter | `0.6.1` |
|
|
70
70
|
| Event-aware motif scoring | `find_motif_by_hops(score=True)` ranks motifs by the product of event-aware `edge_potential` across edges (uses both the anchor companion's per-entity geometry and the event pattern's per-transaction polygons); distinct transactions between the same accounts produce distinct scores | Pure node-pair scoring collapses ranks when motifs share a node sequence | `0.6.1` |
|
|
71
71
|
| Chain-anchor aggregation | Chain anchor patterns auto-emitted from `chain_lines:` declare `edge_dim_aggregations:` to bake per-event sidecar signals into per-chain `_mean` / `_max` columns; closes the third `anchor_kind` after `single` and `pair` | Per-chain manual aggregation outside the geometry, or no chain-level edge-dim summary at all | `0.6.2` |
|
|
72
|
+
| Expanded `edge_dim_aggregations:` surface | Three additional canonical aggregates per source dim (`_std`, `_p95`, `_count_above_threshold` with population p95 cutoff persisted in calibration epoch JSON); k>2 composite anchor support (tripartite and beyond); per-source-dim subset selector — `dims:` accepts list (sugar = all five aggregates) or mapping `{dim: [agg, …]}` (per-dim subset); cross-epoch `edge_dim_threshold_drift` surface on `compare_calibrations` | Manual rebuild + re-engineering whenever the aggregate vocabulary or the per-anchor breadth changes | `0.6.3` |
|
|
73
|
+
| Chain-coherent investigative loop | Four primitives compose into a complete chain investigation: `find_chains_with_coherent_anomaly` (population sweep — chains where consecutive entity-anchor positions are individually anomalous on the same dominant delta dim), `anomaly_propagation_in_chain` (per-chain hop-by-hop trace), `classify_chain_typology` (five-axis label: shape / peak_position / position_in_chain / extension_signals / dominant_top_dim), `extend_chain` (boundary-extension suggester via the chain reverse index) | Manual SQL over chain pattern + ad-hoc Python scoring + no per-chain typology label | `0.6.4` |
|
|
74
|
+
| Anomaly-anchored seed prune for motifs | `find_motif_by_hops(anomaly_seed_filter=True)` intersects the BFS starting frontier with the anomaly subset of the resolved anchor companion (replaces "all keys" frontier when `seed_keys=None`, intersects with explicit list otherwise); result dict carries `seed_filter_summary` (`{requested, anomaly, filtered}`) | Manual pre-filter on every call, no built-in convergence on anomaly-anchored seeds | `0.6.4` |
|
|
72
75
|
|
|
73
76
|
### What changes in practice
|
|
74
77
|
|
|
@@ -9,6 +9,8 @@ Architecture-emergent analytics, properly enabled — calibration is now version
|
|
|
9
9
|
- **0.6.0** — multi-epoch calibration retention, `compare_calibrations`, intrinsic / extrinsic drift decomposition, hidden-influencer matrix (`find_calibration_influencers`), cross-pattern temporal lead-lag (`find_lead_lag`), edge-derived event-pattern dimensions, joint density gap detection (`find_density_gaps`), declarative motif API (`find_motif_by_hops`, bounded MVP). Sphere format 2.4.
|
|
10
10
|
- **0.6.1** — anchor-pattern aggregation of edge-derived dimensions (`edge_dim_aggregations:`); BFS-by-level enumerator on `find_motif_by_hops` with hop count cap raised 6→8 and global `time_window_hours`; declarative motif API completion via `HopPredicate.amount_ratio_to_prev` and `require_anomalous_entity`; functional anchor-companion + event-aware scoring on `find_motif_by_hops(score=True)`; broadcast-safe `Pattern.dim_labels` on patterns with aggregated edge-dim names. Additive only — no sphere format bump, no new tools.
|
|
11
11
|
- **0.6.2** — chain-anchor `edge_dim_aggregations:` regime closes the third `anchor_kind` after single (account-style) and pair (k=2 composite); vectorized `AdjacencyIndex` load path (pyarrow `group_by` + lazy per-key materialization) for cold-start latency cleanup; column-selective `neighbors_*_window` accessors with motif enumerator migration for `bipartite_burst`, `fan_out`, `fan_in`, `cycle_2`; new project skill `profile-before-plan` gating hot-path refactors on real-data cProfile. Additive only — sphere format stays at 2.4 (the originally proposed persisted-artifact path was empirically refuted; vectorized loader ships without any on-disk change).
|
|
12
|
+
- **0.6.3** — `edge_dim_aggregations:` expansion along four axes: three additional canonical aggregates per source dim (`_std`, `_p95`, `_count_above_threshold` with population p95 cutoff); k>2 composite anchor support (tripartite and beyond) via positional `key_cols` to edge endpoints; per-source-dim subset selector (`dims:` accepts list form for back-compat all-five sugar or mapping form `{dim: [agg, ...]}` for explicit per-dim subset); `_count_above_threshold` cutoffs persisted into the calibration epoch JSON with cross-epoch drift surfacing through `compare_calibrations.edge_dim_threshold_drift`. Spheres declaring `edge_dim_aggregations:` must rebuild; sphere format stays at 2.4.
|
|
13
|
+
- **0.6.4** — chain-coherent investigative loop: `find_chains_with_coherent_anomaly` flags chains where consecutive entity-anchor positions are individually anomalous on the same dominant delta dim (chain composition vs chain shape — orthogonal to `find_anomalies` on the chain pattern); `anomaly_propagation_in_chain` returns the per-chain hop-by-hop anomaly trace; `classify_chain_typology` labels each chain along five operational axes (shape, peak_position, position_in_chain, extension_signals, dominant_top_dim); `extend_chain` suggests boundary extension entities via the chain reverse index. Plus `find_motif_by_hops.anomaly_seed_filter` parameter to prune the BFS frontier to anomalous entities, and a routing fix that drops the per-call scoped edge-table read in favour of the cached global adjacency. Critical correctness fix in parallel chain extraction: worker-local `chain_id` counters were producing colliding ids in the merged output — post-merge dedup now reassigns from the global merged index, restoring `primary_key` uniqueness in the chain pattern points table. Spheres built before the fix carry colliding chain_ids; rebuild required. Sphere format stays at 2.4.
|
|
12
14
|
|
|
13
15
|
See [CHANGELOG](CHANGELOG.md) for the full feature list.
|
|
14
16
|
|