hypertopos 0.3.3__tar.gz → 0.4.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.
- {hypertopos-0.3.3 → hypertopos-0.4.1}/CHANGELOG.md +37 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/LICENSE.md +1 -1
- {hypertopos-0.3.3 → hypertopos-0.4.1}/PKG-INFO +4 -1
- hypertopos-0.4.1/README.md +103 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/ROADMAP.md +10 -10
- {hypertopos-0.3.3 → hypertopos-0.4.1}/SECURITY.md +1 -1
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/api-reference.md +9 -6
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/nyc-taxi/sphere/prepare_trips.py +10 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/concepts.md +53 -1
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/configuration.md +68 -17
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/data-format.md +3 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/__init__.py +1 -1
- hypertopos-0.4.1/hypertopos/builder/_bootstrap.py +140 -0
- hypertopos-0.4.1/hypertopos/builder/_bregman.py +402 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/builder/builder.py +964 -470
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/builder/derived.py +39 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/cli/build.py +20 -17
- hypertopos-0.4.1/hypertopos/engine/adjacency.py +107 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/engine/aggregation.py +11 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/engine/chains.py +5 -6
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/engine/geometry.py +9 -1
- hypertopos-0.4.1/hypertopos/engine/graph_algorithms.py +142 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/engine/investigation.py +41 -2
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/engine/lance_sql_agg.py +10 -2
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/model/objects.py +2 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/model/sphere.py +1 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/navigation/navigator.py +310 -215
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/sphere.py +3 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/storage/_schemas.py +4 -2
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/storage/reader.py +12 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/pyproject.toml +5 -1
- hypertopos-0.4.1/tests/test_adjacency.py +180 -0
- hypertopos-0.4.1/tests/test_bootstrap.py +132 -0
- hypertopos-0.4.1/tests/test_bregman.py +346 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_builder.py +2 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_builder_derived.py +173 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_builder_temporal_perf.py +53 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_geometric_path.py +18 -0
- hypertopos-0.4.1/tests/test_graph_algorithms.py +168 -0
- hypertopos-0.4.1/tests/test_kind_detect.py +275 -0
- hypertopos-0.3.3/README.md +0 -69
- {hypertopos-0.3.3 → hypertopos-0.4.1}/.github/workflows/publish-pypi.yml +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/.gitignore +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/README.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/architecture.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/LICENSE +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/README.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/README.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/SUMMARY.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-settings.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-settings.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-settings.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-settings.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-settings.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-settings.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/sphere/prepare_accounts.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/sphere/prepare_cpty_banks.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/sphere/prepare_districts.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/sphere/prepare_loan_accounts.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/sphere/prepare_operations.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/sphere/prepare_orders.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/sphere/prepare_transactions.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/sphere/prepare_tx_types.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/berka/sphere/sphere.yaml +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/ibm-aml/README.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/ibm-aml/_layer2_cross_eval.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/ibm-aml/_layer3_cross_eval.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_accounts.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_currencies.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_payment_formats.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_transactions.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/ibm-aml/hi_small_sphere/sphere.yaml +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/ibm-aml/layer1_passive_scan.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/ibm-aml/layer2_xgboost_sweep.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/ibm-aml/layer3_typology_filter.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/ibm-aml/li_small_sphere/prepare_accounts.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/ibm-aml/li_small_sphere/prepare_currencies.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/ibm-aml/li_small_sphere/prepare_payment_formats.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/ibm-aml/li_small_sphere/prepare_transactions.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/ibm-aml/li_small_sphere/sphere.yaml +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/ibm-aml/passive-scan-calibration.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/nyc-taxi/README.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/nyc-taxi/results/0.1.0/SUMMARY.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-c-report.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-settings.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-c-report.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-settings.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-c-report.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-settings.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmark/nyc-taxi/sphere/sphere.yaml +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/benchmarks.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/images/build-pipeline.svg +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/images/core-objects.svg +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/images/cutting-plane.svg +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/images/directory-layout.svg +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/images/hypertopos-overview.svg +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/images/model-lifecycle.svg +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/images/navigation-primitives.svg +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/images/three-scales.svg +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/introduction.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/docs/quickstart.md +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/builder/__init__.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/builder/_scatter.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/builder/_stats.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/builder/_writer.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/builder/dim_blocks.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/builder/mapping.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/cli/__init__.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/cli/__main__.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/cli/info.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/cli/main.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/cli/schema.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/cli/sources.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/engine/__init__.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/engine/calibration.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/engine/composition.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/engine/fdr.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/engine/forecast.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/engine/heredity.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/engine/invalidation.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/engine/selection.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/model/__init__.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/model/manifest.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/navigation/__init__.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/navigation/scanner.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/storage/__init__.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/storage/cache.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/storage/writer.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/utils/__init__.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/hypertopos/utils/arrow.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/.gitkeep +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/conftest.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/fixtures/generate_fixtures.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_aggregation_engine.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_arrow_utils.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_builder_alias.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_builder_chunking.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_builder_contagion.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_builder_edges.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_builder_rolling_z.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_builder_scatter.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_cache.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_calibration.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_chains.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_cli.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_cli_alias.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_cli_sources.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_compaction.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_composition.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_continuous_event_dims.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_data_quality_prop.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_detection.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_dim_blocks.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_edge_table.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_engine.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_fdr.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_forecast.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_fts.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_geometry_stats.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_heredity.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_hybrid_search.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_incremental.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_invalidation.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_investigation.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_lance_sql_agg.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_mapping.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_model.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_mvcc_session.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_navigation.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_navigator_alerts.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_navigator_fdr_select.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_observability.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_precision_stack.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_reputation.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_row_id_cache.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_scanner.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_selection.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_sphere.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_sphere_overview_perf.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_stats_guard.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_storage.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_streaming_reads.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_temporal_centroids.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_trajectory_ann.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_witness_cohort.py +0 -0
- {hypertopos-0.3.3 → hypertopos-0.4.1}/tests/test_witness_set.py +0 -0
|
@@ -7,6 +7,43 @@ Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.4.1] — 2026-04-16
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- Native graph algorithms as geometry dimensions: `pagerank`, `connected_component`, `clustering_coefficient`, `community` (label propagation), `betweenness` (sampled Brandes). Computed at build time on the adjacency index — no external dependencies. Add to `graph_features.features` list in sphere YAML.
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
- `find_geometric_path` rewritten from beam search to bidirectional BFS for reliable path discovery in sparse graphs.
|
|
17
|
+
|
|
18
|
+
## [0.4.0] — 2026-04-15
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
- Distribution-aware Bregman divergence with per-dimension kind tags (gaussian/poisson/bernoulli). Auto-detected from dimension type; YAML `kind:` override per dimension.
|
|
22
|
+
- Per-dimension anomaly threshold (hyper-ellipsoid boundary) replacing uniform decomposition (hyper-sphere).
|
|
23
|
+
- `anomaly_confidence` per entity via stratified bootstrap resampling. Configurable `bootstrap_iterations` (default 200, 0 to skip). Skipped for populations > 50K (use `conformal_p`), `group_by_property`, and `use_mahalanobis` patterns.
|
|
24
|
+
- `bregman_divergence` stored alongside `delta_norm` in geometry.
|
|
25
|
+
- `dimension_kinds` per pattern in sphere.json metadata.
|
|
26
|
+
- `find_anomalies` returns edges on polygons (both fast path and in-process path).
|
|
27
|
+
- `find_neighborhood` raises `GDSNavigationError` for continuous-mode patterns instead of silently returning empty results.
|
|
28
|
+
- In-memory adjacency index for graph operations — lazy build on first graph call, cached on session reader.
|
|
29
|
+
- Build pipeline per-pattern parallelism: geometry → temporal as concurrent pipeline (up to 4 threads).
|
|
30
|
+
|
|
31
|
+
### Changed
|
|
32
|
+
- `explain_anomaly` returns per-dimension Bregman contributions (additive, kind-labeled) instead of absolute z-score deltas when dimension_kinds available.
|
|
33
|
+
- Sphere format bumped to 2.3. Old spheres must be rebuilt.
|
|
34
|
+
- Chain extraction uses temporal bisect for neighbor filtering instead of linear timestamp scan.
|
|
35
|
+
|
|
36
|
+
### Fixed
|
|
37
|
+
- `find_anomalies` pagination: deterministic ordering on tied `delta_norm` values prevents entity duplication across page boundaries.
|
|
38
|
+
- `hub_score_history` clamps negative `hub_score`/`alive_edges_est` to zero for early temporal slices.
|
|
39
|
+
- `anomalous_edges` deduplicates by `event_key` for self-loops (`from_key == to_key`).
|
|
40
|
+
- `find_clusters`, `find_drifting_entities`, `compare_time_windows`, `find_regime_changes` use `pattern.dim_labels` for dimension names, including event dimensions.
|
|
41
|
+
- `find_geometric_path` default `beam_width` increased from 10 to 50; auto-scales for deep searches.
|
|
42
|
+
- `aggregate` raises explicit error when `group_by_line` matches multiple relations on the same pattern.
|
|
43
|
+
- `search_entities` JSON serialization handles datetime columns.
|
|
44
|
+
- `sphere_overview` mode detection uses `sample_size=200` instead of full geometry table read.
|
|
45
|
+
- Weighted Bregman norms for `metric="bregman"` in `find_anomalies`.
|
|
46
|
+
|
|
10
47
|
## [0.3.3] — 2026-04-13
|
|
11
48
|
|
|
12
49
|
### 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-04-
|
|
29
|
+
**Change Date:** 2029-04-16
|
|
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.
|
|
3
|
+
Version: 0.4.1
|
|
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
|
|
@@ -15,10 +15,13 @@ Requires-Dist: pyarrow>=14.0
|
|
|
15
15
|
Requires-Dist: pylance<5.0,>=4.0
|
|
16
16
|
Requires-Dist: pyyaml>=6.0
|
|
17
17
|
Provides-Extra: dev
|
|
18
|
+
Requires-Dist: igraph>=0.11; extra == 'dev'
|
|
18
19
|
Requires-Dist: mypy; extra == 'dev'
|
|
19
20
|
Requires-Dist: pytest; extra == 'dev'
|
|
20
21
|
Requires-Dist: pytest-cov; extra == 'dev'
|
|
21
22
|
Requires-Dist: ruff; extra == 'dev'
|
|
23
|
+
Provides-Extra: graph
|
|
24
|
+
Requires-Dist: igraph>=0.11; extra == 'graph'
|
|
22
25
|
Provides-Extra: mcp
|
|
23
26
|
Requires-Dist: mcp[cli]>=1.20; extra == 'mcp'
|
|
24
27
|
Requires-Dist: tzdata>=2024.1; extra == 'mcp'
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# hypertopos
|
|
2
|
+
|
|
3
|
+
> A behavioral feature layer for graph and temporal data — turning behavior into coordinates, trajectories, and explanations.
|
|
4
|
+
|
|
5
|
+
[](https://www.python.org/downloads/)
|
|
6
|
+
[](LICENSE.md)
|
|
7
|
+
[](https://doi.org/10.5281/zenodo.19482069)
|
|
8
|
+
[](https://arrow.apache.org/docs/python/)
|
|
9
|
+
[](https://github.com/lance-format/lance)
|
|
10
|
+
[](https://modelcontextprotocol.io)
|
|
11
|
+
[](pyproject.toml)
|
|
12
|
+
|
|
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
|
+
|
|
15
|
+
```
|
|
16
|
+
typical: data → features → feature store → ML → decision
|
|
17
|
+
hypertopos: data → representation (hypertopos) → ML / decision
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
pip install hypertopos
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+

|
|
25
|
+
|
|
26
|
+
## How it works
|
|
27
|
+
|
|
28
|
+
You describe your data in YAML — entity types, sources, relationships. hypertopos computes population statistics and produces a sphere: pre-computed geometry stored in Apache Arrow format.
|
|
29
|
+
|
|
30
|
+
Agents (or Python code) open the sphere and navigate it using twelve primitives that cover movement, clustering, anomaly detection, population comparison, and temporal analysis. Each step is stateful — where you are determines what you see next.
|
|
31
|
+
|
|
32
|
+
For the full picture: [Introduction](docs/introduction.md) · [Core Concepts](docs/concepts.md) · [Quick Start](docs/quickstart.md)
|
|
33
|
+
|
|
34
|
+
## What's different
|
|
35
|
+
|
|
36
|
+
Each capability below emerges from treating entities as points in a shared, population-calibrated space.
|
|
37
|
+
|
|
38
|
+
| Capability | What it does | Compared to | Since |
|
|
39
|
+
|---|---|---|---|
|
|
40
|
+
| Population-relative coordinates | `delta = (shape - mu) / sigma` — one coordinate for anomaly, clustering, drift | node2vec/GNN: latent dims, retraining on shift | `0.1.0` |
|
|
41
|
+
| Self-calibrating threshold | `theta = percentile(norms, 95)` — no tuning, no labels | PyOD: choose contamination rate | `0.1.0` |
|
|
42
|
+
| Named dimension attribution | `explain_anomaly` → `loan_count: +3.2σ (42%)`. Sums to 100% | SHAP/LIME: approximate, model-dependent | `0.1.0` |
|
|
43
|
+
| Temporal deformation | Append-only delta log. Displacement, path length, directionality | Time-series DBs: metric values, not trajectories | `0.1.0` |
|
|
44
|
+
| Stateful navigation | 12 typed primitives. Position type constrains valid ops | SQL/GraphQL: stateless queries | `0.1.0` |
|
|
45
|
+
| Cross-sphere comparison | `\|\|delta\|\|` is dimensionless — 4.2σ means the same in any domain | Requires shared features or joint embeddings | `0.1.0` |
|
|
46
|
+
| Counterfactual simulation | `simulate_edges` recomputes delta against fixed baseline | Causal inference: explicit DAG required | `0.1.0` |
|
|
47
|
+
| Regime change detection | Per-bucket centroids, self-calibrating shift threshold | Evidently/NannyML: model prediction drift | `0.1.0` |
|
|
48
|
+
| Graph contagion | Mean `\|\|delta\|\|` of neighbors. Cohen's d vs control group | PageRank: topology, not behavioral propagation | `0.2.0` |
|
|
49
|
+
| Witness cohort | Similar deltas, NOT connected. Validates pattern vs one-off | k-NN on features (includes neighbors) | `0.2.1` |
|
|
50
|
+
| FDR-controlled detection | Benjamini-Hochberg on rank p-values. Per-entity q-values | BH not combined with geometric detection | `0.3.1` |
|
|
51
|
+
| Diverse anomaly selection | Facility location covers distinct anomaly regions | Top-N returns redundant extremes | `0.3.1` |
|
|
52
|
+
| Distribution-aware scoring | Per-dim Bregman divergence (gaussian/poisson/bernoulli). Additive | PyOD/sklearn: uniform metric across all features | `0.4.0` |
|
|
53
|
+
| Anomaly confidence | Bootstrap `anomaly_confidence: 0-1`. `min_confidence` filter | No equivalent — binary verdict, no stability signal | `0.4.0` |
|
|
54
|
+
| Graph algorithm dimensions | PageRank, betweenness, community, clustering as geometry dims | Separate graph DB + manual joins | `0.4.1` |
|
|
55
|
+
|
|
56
|
+
### What changes in practice
|
|
57
|
+
|
|
58
|
+
The same problems look different when graph, time, and statistics are unified:
|
|
59
|
+
|
|
60
|
+
| Problem | Typical approach | With hypertopos |
|
|
61
|
+
|---|---|---|
|
|
62
|
+
| Detect anomalies | Train model, engineer features, choose contamination rate, retrain on shift | `hypertopos build` from YAML, `find_anomalies()` — threshold auto-calibrated from population |
|
|
63
|
+
| Explain an anomaly | SHAP on trained model — feature importance for latent dimensions | `explain_anomaly(entity)` — ranked real dimensions: `loan_count: +3.2 sigma (42%)` |
|
|
64
|
+
| Compare across domains | Align schemas, build shared features, normalize units | Compare `\|\|delta\|\|` directly — 4.2 sigma means the same in any sphere |
|
|
65
|
+
| Track behavioral drift | Export to time-series DB, build dashboard, set manual thresholds | `attract_drift(window)` — displacement, path length, directionality per entity |
|
|
66
|
+
| Validate anomaly is real | Manual investigation, ask domain expert | `find_witness_cohort(entity)` — similar non-connected entities confirming the pattern |
|
|
67
|
+
| Understand propagation | PageRank, manual path tracing, cross-table joins | `propagate_influence(source)` — Cohen's d between connected vs control group |
|
|
68
|
+
| Trust an anomaly verdict | Re-run with different thresholds, manual sensitivity analysis | `find_anomalies(min_confidence=0.8)` — only entities stable under population perturbation |
|
|
69
|
+
| Understand why anomalous | SHAP on black-box model, approximate feature importance | `explain_anomaly` — per-dimension Bregman contribution with distribution kind, sums to 100% |
|
|
70
|
+
|
|
71
|
+
## Benchmarks
|
|
72
|
+
|
|
73
|
+
Validated on three domains with the same engine, zero domain rules, zero labels:
|
|
74
|
+
|
|
75
|
+
| Domain | Dataset | Key result |
|
|
76
|
+
|--------|---------|------------|
|
|
77
|
+
| Banking | Berka (Czech, real data) | 85.5% recall on loan defaults |
|
|
78
|
+
| AML | IBM AML (synthetic) | 80.4% recall, zero labels |
|
|
79
|
+
| Transport | NYC Yellow Taxi (7.6M trips) | 8/8 anomaly categories detected |
|
|
80
|
+
|
|
81
|
+
Benchmark scripts and data preparation are included. Results are reproducible. Numbers are from the pre-0.1.0 validation run and have not been re-evaluated against recent releases.
|
|
82
|
+
|
|
83
|
+
Full results: [Benchmarks](docs/benchmarks.md)
|
|
84
|
+
|
|
85
|
+
## Documentation
|
|
86
|
+
|
|
87
|
+
| | |
|
|
88
|
+
|---|---|
|
|
89
|
+
| [Introduction](docs/introduction.md) | The idea and where it stands |
|
|
90
|
+
| [Quick Start](docs/quickstart.md) | Install, build, navigate |
|
|
91
|
+
| [Core Concepts](docs/concepts.md) | Mathematical foundation |
|
|
92
|
+
| [Configuration](docs/configuration.md) | Sphere builder YAML reference |
|
|
93
|
+
| [API Reference](docs/api-reference.md) | Python API |
|
|
94
|
+
| [Data Format](docs/data-format.md) | On-disk storage format |
|
|
95
|
+
| [Architecture](docs/architecture.md) | Package layers and design |
|
|
96
|
+
|
|
97
|
+
## Status
|
|
98
|
+
|
|
99
|
+
Research-stage project. Working code, reproducible benchmarks, active development. API may change.
|
|
100
|
+
|
|
101
|
+
## License
|
|
102
|
+
|
|
103
|
+
[Business Source License 1.1](LICENSE.md). Free for internal use, development, testing, and research. See LICENSE.md for details.
|
|
@@ -2,28 +2,28 @@
|
|
|
2
2
|
|
|
3
3
|
> Planned direction. Priorities may change based on feedback.
|
|
4
4
|
|
|
5
|
-
## Plan: 0.
|
|
5
|
+
## Plan: 0.5.0
|
|
6
6
|
|
|
7
|
-
Investigation depth
|
|
7
|
+
Investigation depth, detection quality, edge-derived geometry, and advanced analytics.
|
|
8
8
|
|
|
9
9
|
- **Lazy chain geometry** — on-demand chain delta vectors via sampled population calibration; `discover_chains(include_geometry=True)` supplements build-time `chain_lines` for per-entity investigation without rebuild cost.
|
|
10
10
|
- **Multi-hop anomaly explanation chains** — automate the trace-to-root-cause workflow: anomalous entity → top dimension → edge entity → hub check → neighbor check → explanation chain with per-hop evidence. Collapses 4–6 tool calls into one.
|
|
11
|
-
- **Theta calibration fix** — builder writes correct theta_norm to sphere.json at build time; eliminates miscalibration on mixed-type patterns.
|
|
12
11
|
- **Geometric edge potential** — relationship anomaly scoring via endpoint geometric distance; flags edges connecting geometrically distant entities.
|
|
13
12
|
- **Geometric dark matter** — population density gap detection; identifies coordinate-space regions that should have entities but are empty (anomaly by absence).
|
|
14
13
|
- **Gradient alignment on drift** — drift direction signal (normalizing vs deteriorating) on `find_drifting_entities` and `dive_solid`.
|
|
15
|
-
- **
|
|
16
|
-
-
|
|
14
|
+
- **Edge-derived dimensions on event patterns** — pair-level and node-derived features computed at build time as geometric dimensions.
|
|
15
|
+
- **`find_motif` — structural pattern matching on edge table** — per-hop predicates for subgraph patterns invisible to flat queries.
|
|
16
|
+
- **Advanced coordinate space analytics** — new methods leveraging properties unique to population-relative coordinate construction.
|
|
17
17
|
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
##
|
|
20
|
+
## 0.4.0
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
Bregman geometry, anomaly confidence, distribution-aware calibration, build pipeline, graph acceleration.
|
|
23
23
|
|
|
24
|
-
- **
|
|
25
|
-
-
|
|
26
|
-
- **
|
|
24
|
+
- **0.4.0** — Distribution-aware Bregman divergence with per-dimension kind tags. Per-dimension anomaly threshold (hyper-ellipsoid). Theta calibration fix. Anomaly confidence via stratified bootstrap. Interpretive MCP output (`explain_anomaly` returns Bregman contributions). Sphere format 2.3. Per-pattern pipeline parallelism (geometry → temporal overlap, up to 4 threads). In-memory adjacency index — full graph in dict, O(1) neighbor lookups replacing Lance BTREE scans across all graph operations. Temporal bisect in chain extraction.
|
|
25
|
+
- **0.4.1** — Native graph algorithms as geometry dimensions (igraph C backend): PageRank, betweenness centrality (edge-sampled), community detection (label propagation), clustering coefficient, connected components. Stress test fixes: find_anomalies edges and pagination, hub_score_history clamp, detect_pattern type guard, aggregate ambiguity guard, dim_labels in find_clusters.
|
|
26
|
+
- **0.4.2** — Intrinsic/extrinsic decomposition (entity-caused vs population-caused position changes). Entity influence scoring (hidden influencer detection). Cross-pattern temporal lead-lag discovery. Bidirectional BFS for find_geometric_path (guaranteed path finding). Storey adaptive pi0 estimation for FDR.
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
@@ -103,7 +103,7 @@ with sphere.session("agent-1") as session:
|
|
|
103
103
|
|
|
104
104
|
| Primitive | Method | What it does | Returns |
|
|
105
105
|
|-----------|--------|--------------|---------|
|
|
106
|
-
| π5 | `π5_attract_anomaly(pattern_id, radius, top_n, fdr_alpha, fdr_method, select)` | Find most anomalous polygons | `(list[Polygon], int, list, dict)` |
|
|
106
|
+
| π5 | `π5_attract_anomaly(pattern_id, radius, top_n, fdr_alpha, fdr_method, select, min_confidence)` | Find most anomalous polygons | `(list[Polygon], int, list, dict)` |
|
|
107
107
|
| π6 | `π6_attract_boundary(alias_id, pattern_id, direction, top_n, fdr_alpha, fdr_method, select)` | Find entities nearest to alias cutting plane | `list[(Polygon, float)]` |
|
|
108
108
|
| π7 | `π7_attract_hub(pattern_id, top_n, line_id_filter, fdr_alpha, fdr_method, select)` | Find entities with highest connectivity | `list[(str, int, float)]` |
|
|
109
109
|
| π7+ | `π7_attract_hub_and_stats(pattern_id, top_n, line_id_filter)` | Hub ranking + population hub score statistics in one scan | `(list, dict)` |
|
|
@@ -122,7 +122,7 @@ with sphere.session("agent-1") as session:
|
|
|
122
122
|
|
|
123
123
|
| Method | Description |
|
|
124
124
|
|--------|-------------|
|
|
125
|
-
| `find_geometric_path(from_key, to_key, pattern_id, max_depth=5, beam_width=
|
|
125
|
+
| `find_geometric_path(from_key, to_key, pattern_id, max_depth=5, beam_width=50, scoring="geometric")` | Bidirectional BFS for paths between two entities via the edge table, scored by geometric coherence. Scoring modes: `"geometric"` (witness overlap + delta alignment + anomaly preservation), `"amount"` (geometric score modulated by log(transaction amount)), `"anomaly"` (prefer paths through anomalous entities), `"shortest"` (plain BFS, no geometric scoring). Returns top `beam_width` paths by score |
|
|
126
126
|
| `discover_chains(primary_key, pattern_id, time_window_hours=168, max_hops=10, min_hops=2, max_chains=100, direction="forward")` | Runtime temporal BFS on the edge table to discover entity chains from a starting point. Unlike `find_chains_for_entity()` which queries pre-computed chains, this performs live traversal -- works without build-time chain extraction |
|
|
127
127
|
| `entity_flow(primary_key, pattern_id, top_n=20, *, timestamp_cutoff=None)` | Net flow analysis per counterparty via edge table. Two edge lookups (outgoing + incoming), sum amounts, compute per-counterparty net flow. `timestamp_cutoff` (Unix seconds) restricts to edges with `timestamp <= cutoff`. Returns outgoing/incoming totals, net_flow, flow_direction, counterparties sorted by abs(net_flow) |
|
|
128
128
|
| `contagion_score(primary_key, pattern_id, *, timestamp_cutoff=None)` | Score how many of an entity's counterparties are anomalous via edge table + geometry check. `timestamp_cutoff` enables as-of contagion reconstruction. Returns score (0.0–1.0), total/anomalous counterparty counts |
|
|
@@ -141,7 +141,7 @@ with sphere.session("agent-1") as session:
|
|
|
141
141
|
|
|
142
142
|
| Method | Description |
|
|
143
143
|
|--------|-------------|
|
|
144
|
-
| `explain_anomaly(primary_key, pattern_id)` | Structured investigation: severity, witness set, repair set, conformal p-value, reputation |
|
|
144
|
+
| `explain_anomaly(primary_key, pattern_id)` | Structured investigation: severity, witness set, repair set, conformal p-value, reputation, and Bregman contributions returned under `top_dimensions[]` (fields: `dim`, `kind`, `bregman`, `pct_of_total`) |
|
|
145
145
|
| `explain_anomaly_chain(primary_key, pattern_id, max_hops)` | Trace anomaly propagation through geometric neighbors |
|
|
146
146
|
| `find_similar_entities(primary_key, pattern_id, top_n, dim_mask, metric)` | ANN search for nearest entities in delta-space. `dim_mask`: list of dimension names to restrict distance. `metric`: `"L2"` or `"cosine"`. Returns `SimilarityResult` |
|
|
147
147
|
| `contrast_populations(pattern_id, group_a, group_b)` | Dimension-by-dimension comparison of two entity groups (Cohen's d) |
|
|
@@ -210,12 +210,12 @@ builder = GDSBuilder(
|
|
|
210
210
|
| `add_derived_dimension(anchor_line, event_line, anchor_fk, metric, metric_col, dimension_name)` | Dimension derived from event aggregation (count, sum, max, std, mean) |
|
|
211
211
|
| `add_composite_line(anchor_line, event_line, anchor_fk, ...)` | Create composite anchor line from event-anchor join |
|
|
212
212
|
| `add_precomputed_dimension(anchor_line, dimension_name, edge_max)` | Dimension from a column already on the entity table |
|
|
213
|
-
| `add_graph_features(anchor_line, event_line, from_col, to_col, features)` | Auto-compute graph structural features (
|
|
213
|
+
| `add_graph_features(anchor_line, event_line, from_col, to_col, features)` | Auto-compute graph structural features (degree, reciprocity, pagerank, betweenness, community, clustering, components) |
|
|
214
214
|
| `add_chain_line(line_id, chains, features)` | Create anchor line from extracted chain dicts |
|
|
215
215
|
| `add_alias(alias_id, base_pattern_id, cutting_plane_dimension, cutting_plane_threshold)` | Register an alias with a cutting plane for sub-population analysis |
|
|
216
|
-
| `build()` | Validate, compute statistics, write all files. Returns output path |
|
|
216
|
+
| `build(temporal_configs=None)` | Validate, compute statistics, write all files. Pass `temporal_configs` to run geometry→temporal pipeline per pattern. Returns output path |
|
|
217
217
|
| `incremental_update(pattern_id, changed_entities, deleted_keys)` | Update geometry incrementally with drift tracking |
|
|
218
|
-
| `build_temporal(time_col, time_window)` | Generate temporal snapshots from time-windowed event data. Call after `build()` |
|
|
218
|
+
| `build_temporal(time_col, time_window)` | Generate temporal snapshots from time-windowed event data. Call after `build()` when not using pipeline mode |
|
|
219
219
|
|
|
220
220
|
### RelationSpec
|
|
221
221
|
|
|
@@ -304,6 +304,8 @@ Key methods: `current_version()`, `has_fts()`.
|
|
|
304
304
|
| `is_anomaly` | `bool` | Whether delta_norm >= theta_norm |
|
|
305
305
|
| `edges` | `list[Edge]` | All edges in this polygon |
|
|
306
306
|
| `delta_rank_pct` | `float \| None` | Percentile rank within population (0-100) |
|
|
307
|
+
| `bregman_divergence` | `float \| None` | Per-entity Bregman divergence score — distribution-aware anomaly distance computed per dimension using its `kind` tag. `None` on pre-2.3 spheres. |
|
|
308
|
+
| `anomaly_confidence` | `float \| None` | Bootstrap stability score (0–1): fraction of bootstrap samples in which the entity is classified as anomalous. `None` when bootstrap was skipped (N > 50K, `group_by_property`, or `use_mahalanobis`). |
|
|
307
309
|
|
|
308
310
|
Key methods: `is_event()`, `is_anchor()`, `alive_edges()`, `edges_for_line(line_id)`.
|
|
309
311
|
|
|
@@ -343,6 +345,7 @@ Key methods: `slice_at(timestamp)` -- binary search for the slice active at a gi
|
|
|
343
345
|
| `version` | `int` | Pattern version |
|
|
344
346
|
| `prop_columns` | `list[str]` | Boolean property columns tracked as dimensions |
|
|
345
347
|
| `dimension_weights` | `np.ndarray \| None` | Per-dimension importance weights |
|
|
348
|
+
| `dimension_kinds` | `list[str] \| None` | Per-dimension distribution family: `"gaussian"`, `"poisson"`, or `"bernoulli"`. Populated at build time; `None` on pre-2.3 spheres. |
|
|
346
349
|
|
|
347
350
|
Key properties: `theta_norm`, `dim_labels`, `delta_dim()`, `is_continuous`, `max_hub_score`.
|
|
348
351
|
|
|
@@ -79,6 +79,16 @@ def _prepare_trips() -> pa.Table:
|
|
|
79
79
|
)
|
|
80
80
|
raw = raw.append_column("tip_pct", tip_pct)
|
|
81
81
|
|
|
82
|
+
# Filter out-of-range timestamps (TLC data contains rare bad dates 2008–2088)
|
|
83
|
+
_pickup_ts = raw["tpep_pickup_datetime"]
|
|
84
|
+
_ts_min = pa.scalar(1546300800000000, pa.int64()) # 2019-01-01 00:00 UTC in us
|
|
85
|
+
_ts_max = pa.scalar(1548979200000000, pa.int64()) # 2019-02-01 00:00 UTC in us
|
|
86
|
+
_pickup_int = pc.cast(_pickup_ts, pa.int64())
|
|
87
|
+
raw = raw.filter(pc.and_(
|
|
88
|
+
pc.greater_equal(_pickup_int, _ts_min),
|
|
89
|
+
pc.less(_pickup_int, _ts_max),
|
|
90
|
+
))
|
|
91
|
+
|
|
82
92
|
# Cast to timestamp without tz (Windows tzdata workaround)
|
|
83
93
|
pickup_no_tz = raw["tpep_pickup_datetime"].cast(pa.timestamp("us"))
|
|
84
94
|
# Pickup hour and day of week
|
|
@@ -68,6 +68,55 @@ Two opt-in post-processing stages can be applied to any attract primitive that s
|
|
|
68
68
|
|
|
69
69
|
Both stages compose: `fdr_alpha=0.05, select="diverse"` first filters to FDR-controlled discoveries, then picks the K most geometrically diverse among them.
|
|
70
70
|
|
|
71
|
+
## Bregman Divergence
|
|
72
|
+
|
|
73
|
+
Standard anomaly scoring in GDS uses `‖δ‖₂` — a single Euclidean distance that treats every dimension identically. This is fast and works well when dimensions are roughly Gaussian.
|
|
74
|
+
|
|
75
|
+
**Bregman divergence** generalises the scoring: each dimension contributes an anomaly score computed from the generator function matched to its distribution family (`kind`). For a dimension with kind `gaussian`, the generator is squared loss (identical to L2). For `poisson`, it is the Kullback-Leibler divergence for counts. For `bernoulli`, it is binary cross-entropy.
|
|
76
|
+
|
|
77
|
+
The per-dimension Bregman scores are summed to produce `bregman_divergence` — a single float stored alongside `delta_norm` in the geometry file. Dimensions with a poor match between their assumed family and actual data shape produce disproportionately large Bregman terms, making them visible in `explain_anomaly` output.
|
|
78
|
+
|
|
79
|
+
**What this enables:**
|
|
80
|
+
- Binary FK dimensions (bernoulli) no longer inflate the total score when an entity is merely "active" in that relation — the scoring accounts for the 0/1 nature of the edge
|
|
81
|
+
- Count-based derived features (poisson) are scored against their expected arrival rate rather than a z-score
|
|
82
|
+
- `explain_anomaly` returns per-dimension Bregman contributions with `kind` and `pct_of_total`, identifying which distribution mismatch is the primary driver
|
|
83
|
+
|
|
84
|
+
`bregman_divergence` is stored in sphere format ≥ 2.3. Pre-2.3 spheres return `None` for this field.
|
|
85
|
+
|
|
86
|
+
### Dimension Kinds
|
|
87
|
+
|
|
88
|
+
Every dimension in a pattern carries a `kind` tag — the distribution family used for Bregman scoring. The builder auto-detects kinds at build time using the following rules:
|
|
89
|
+
|
|
90
|
+
| Dimension source | Inferred kind |
|
|
91
|
+
|-----------------|---------------|
|
|
92
|
+
| Binary FK (`edge_max = null`) | `bernoulli` |
|
|
93
|
+
| `count`, `count_distinct`, `count:window=*` | `poisson` |
|
|
94
|
+
| `sum:col`, `avg:col`, `std:col`, `iet_*` | `gaussian` |
|
|
95
|
+
| `max:col`, `min:col` | `gaussian` |
|
|
96
|
+
| `precomputed_dimension` with `edge_max: 1` | `bernoulli` |
|
|
97
|
+
| `precomputed_dimension`, otherwise | `gaussian` |
|
|
98
|
+
| `graph_features` in/out-degree (`edge_max > 1`) | `poisson` |
|
|
99
|
+
| `graph_features` reciprocity, overlap (`edge_max = 1`) | `bernoulli` |
|
|
100
|
+
| `graph_features` pagerank, betweenness, clustering_coefficient | auto |
|
|
101
|
+
| `graph_features` community, connected_component | auto |
|
|
102
|
+
|
|
103
|
+
Override via `kind:` on individual dimension entries in `sphere.yaml`. The resulting kind list is stored in `Pattern.dimension_kinds` and surfaced in `sphere_overview` as `dimension_kinds`.
|
|
104
|
+
|
|
105
|
+
## Anomaly Confidence
|
|
106
|
+
|
|
107
|
+
Bootstrap confidence measures how stable an entity's anomaly classification is under random resampling of the calibration population.
|
|
108
|
+
|
|
109
|
+
The builder draws `bootstrap_iterations` bootstrap samples from the population (default 200), recomputes mu/sigma/theta on each sample, and records whether the entity's delta_norm exceeds the resampled theta. `anomaly_confidence` is the fraction of samples in which the entity is classified as anomalous.
|
|
110
|
+
|
|
111
|
+
**Interpretation:**
|
|
112
|
+
- `1.0` — entity is anomalous under every bootstrap resample; classification is robust
|
|
113
|
+
- `0.5–0.99` — entity sits near the boundary; classification may flip with slightly different calibration data
|
|
114
|
+
- `< 0.5` — entity is nominally anomalous (delta_norm > theta) but unstable; treat with caution
|
|
115
|
+
|
|
116
|
+
`anomaly_confidence` is skipped when the pattern uses `group_by_property` (bootstrap is per-group, cost grows multiplicatively), `use_mahalanobis` (full covariance bootstrap is expensive), or N > 50K entities. In those cases the field is `None`.
|
|
117
|
+
|
|
118
|
+
Filter `find_anomalies` by minimum confidence using `min_confidence` — for example `min_confidence=0.8` returns only entities whose anomaly classification is stable across at least 80% of bootstrap samples.
|
|
119
|
+
|
|
71
120
|
## Three Scales
|
|
72
121
|
|
|
73
122
|

|
|
@@ -139,7 +188,7 @@ An edge table is a flat Lance dataset that links anchor entities through an even
|
|
|
139
188
|
**When it exists:** The builder emits an edge table automatically for event patterns with 2+ FK relations to the same anchor line (e.g. an event pattern with `from_entity` and `to_entity` both pointing to the same anchor line). It can also be configured explicitly in YAML.
|
|
140
189
|
|
|
141
190
|
**What it enables:**
|
|
142
|
-
- **Runtime graph traversal** -- `find_geometric_path` uses
|
|
191
|
+
- **Runtime graph traversal** -- `find_geometric_path` uses bidirectional BFS over the edge table, scoring discovered paths by geometric coherence of intermediate entities
|
|
143
192
|
- **Lazy chain discovery** -- `discover_chains` performs temporal BFS on edges without requiring build-time chain extraction
|
|
144
193
|
- **Edge statistics** -- row counts, unique entity counts, timestamp and amount ranges
|
|
145
194
|
- **Witness cohort discovery** -- `find_witness_cohort` ranks entities that share the target's witness signature by combining delta similarity, witness overlap, trajectory alignment, and a graded anomaly bonus, while excluding entities already connected via the edge table. **Investigative peer ranking, not edge forecasting** — surfaces existing peers rather than predicting future edges. Uniquely possible because population-relative geometry, witness sets, temporal solids, and the edge table all live in one storage layer
|
|
@@ -172,6 +221,9 @@ Chains (both build-time `chain_lines` and runtime `discover_chains`) are sequenc
|
|
|
172
221
|
| **Delta norm** | L2 magnitude of the deviation -- basis for similarity, clustering, and anomaly scoring |
|
|
173
222
|
| **Theta threshold** | Statistical boundary derived from the population distribution (used for anomaly classification) |
|
|
174
223
|
| **Deformation log** | History of changes that produced the current solid |
|
|
224
|
+
| **Bregman divergence** | Distribution-aware anomaly distance summed across per-dimension Bregman terms |
|
|
225
|
+
| **Anomaly confidence** | Bootstrap stability score (0–1) for anomaly classification under population resampling |
|
|
226
|
+
| **Dimension kind** | Distribution family tag per dimension (`gaussian`, `poisson`, `bernoulli`) driving Bregman scoring |
|
|
175
227
|
|
|
176
228
|
Every dimension has a meaning tied to a relation or tracked property.
|
|
177
229
|
|
|
@@ -361,6 +361,7 @@ patterns:
|
|
|
361
361
|
| `graph_features` | dict | `null` | Auto-compute graph structural features from event from/to columns. |
|
|
362
362
|
| `description` | string | `null` | Human-readable description. Stored in sphere.json — visible to agents via `get_sphere_info`. |
|
|
363
363
|
| `edge_table` | dict | `null` | Explicit edge table config (see below). Auto-emitted for event patterns with 2+ FK relations to same anchor line. |
|
|
364
|
+
| `bootstrap_iterations` | int | `200` | Number of bootstrap resamples used to compute `anomaly_confidence` per entity. Skipped automatically for N > 50K, `group_by_property`, or `use_mahalanobis`. |
|
|
364
365
|
|
|
365
366
|
### Edge Table
|
|
366
367
|
|
|
@@ -529,6 +530,46 @@ derived_dimensions:
|
|
|
529
530
|
IET requires a `temporal` config for the pattern (provides `timestamp_col`).
|
|
530
531
|
Temporal column is auto-resolved from the temporal config — no explicit time_col needed.
|
|
531
532
|
|
|
533
|
+
**Dimension `kind` on derived dimensions:** Each derived feature can carry an explicit `kind` tag to override auto-detection. Add it as an extra property alongside the feature spec:
|
|
534
|
+
|
|
535
|
+
```yaml
|
|
536
|
+
derived_dimensions:
|
|
537
|
+
- from_pattern: tx_pattern
|
|
538
|
+
features:
|
|
539
|
+
- tx_count: count
|
|
540
|
+
kind: poisson # override auto-detection
|
|
541
|
+
- total_spend: sum:amount
|
|
542
|
+
kind: gaussian
|
|
543
|
+
- has_foreign: count_distinct:country
|
|
544
|
+
kind: bernoulli # treat as 0/1 presence indicator
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
When omitted, `kind` is auto-detected from the metric type — see below.
|
|
548
|
+
|
|
549
|
+
---
|
|
550
|
+
|
|
551
|
+
### Dimension Kind Auto-Detection
|
|
552
|
+
|
|
553
|
+
The builder assigns a `kind` tag to every dimension at build time. The tag drives Bregman divergence scoring: each dimension contributes an anomaly score calibrated to its own distribution family rather than a single global metric.
|
|
554
|
+
|
|
555
|
+
**Auto-detection rules:**
|
|
556
|
+
|
|
557
|
+
| Dimension source | Inferred kind | Rationale |
|
|
558
|
+
|-----------------|---------------|-----------|
|
|
559
|
+
| Binary FK (`edge_max = null`) | `bernoulli` | 0/1 presence indicator |
|
|
560
|
+
| `count`, `count_distinct`, `count:window=*` | `poisson` | Event counts follow Poisson arrival models |
|
|
561
|
+
| `sum:col`, `avg:col`, `std:col`, `iet_*` | `gaussian` | Continuous magnitudes |
|
|
562
|
+
| `max:col`, `min:col` | `gaussian` | Extremal statistics |
|
|
563
|
+
| `precomputed_dimension` with `edge_max: 1` | `bernoulli` | Binary column indicator |
|
|
564
|
+
| `precomputed_dimension`, otherwise | `gaussian` | Default continuous |
|
|
565
|
+
| `graph_features` (`in_degree`, `out_degree`) | `poisson` | Degree counts (`edge_max > 1`) |
|
|
566
|
+
| `graph_features` (`reciprocity`, `counterpart_overlap`) | `bernoulli` | Binary presence (`edge_max = 1`) |
|
|
567
|
+
| `graph_features` (`pagerank`, `betweenness`, `clustering_coefficient`) | auto | Continuous scores (igraph C backend) |
|
|
568
|
+
| `graph_features` (`community`, `connected_component`) | auto | Integer IDs (categorical) |
|
|
569
|
+
| `geo_properties`, `metric_properties` | `gaussian` | Continuous measurements |
|
|
570
|
+
|
|
571
|
+
**Override via `kind:`** on individual dimension entries (precomputed, derived). Override takes precedence over auto-detection. Event dimensions use auto-detection only.
|
|
572
|
+
|
|
532
573
|
---
|
|
533
574
|
|
|
534
575
|
## Composite Lines
|
|
@@ -595,6 +636,7 @@ patterns:
|
|
|
595
636
|
| `edge_max` | int or `"auto"` | `"auto"` | Fixed normalization cap, or auto-compute from percentile. |
|
|
596
637
|
| `percentile` | float | `99.0` | Percentile for auto edge_max computation. |
|
|
597
638
|
| `display_name` | string | `null` | Human-readable dimension label. |
|
|
639
|
+
| `kind` | string | auto | Distribution family for Bregman scoring: `"gaussian"`, `"poisson"`, or `"bernoulli"`. Auto-detected when omitted. |
|
|
598
640
|
|
|
599
641
|
---
|
|
600
642
|
|
|
@@ -609,7 +651,7 @@ patterns:
|
|
|
609
651
|
event_line: transactions
|
|
610
652
|
from_col: from_account
|
|
611
653
|
to_col: to_account
|
|
612
|
-
features: [in_degree, out_degree, reciprocity, counterpart_overlap]
|
|
654
|
+
features: [in_degree, out_degree, reciprocity, counterpart_overlap, pagerank, betweenness, community, clustering_coefficient, connected_component]
|
|
613
655
|
```
|
|
614
656
|
|
|
615
657
|
**Supported features:**
|
|
@@ -617,13 +659,18 @@ patterns:
|
|
|
617
659
|
- `out_degree` — number of unique outgoing edges
|
|
618
660
|
- `reciprocity` — fraction of counterparties with bidirectional flow
|
|
619
661
|
- `counterpart_overlap` — Jaccard similarity of in/out counterparty sets
|
|
662
|
+
- `pagerank` — network centrality (igraph C backend)
|
|
663
|
+
- `betweenness` — bridge score between communities (edge-sampled on large graphs)
|
|
664
|
+
- `community` — community ID via label propagation
|
|
665
|
+
- `clustering_coefficient` — local triangle density
|
|
666
|
+
- `connected_component` — isolated subgraph membership
|
|
620
667
|
|
|
621
668
|
| Field | Type | Default | Description |
|
|
622
669
|
|-------|------|---------|-------------|
|
|
623
670
|
| `event_line` | string | — | **Required.** Event line with from/to columns. |
|
|
624
671
|
| `from_col` | string | — | **Required.** Source entity FK column. |
|
|
625
672
|
| `to_col` | string | — | **Required.** Destination entity FK column. |
|
|
626
|
-
| `features` | list | all
|
|
673
|
+
| `features` | list | all nine | Which features to compute. Requires `pip install hypertopos[graph]` for pagerank/betweenness/community/clustering_coefficient/connected_component. |
|
|
627
674
|
|
|
628
675
|
---
|
|
629
676
|
|
|
@@ -904,8 +951,9 @@ hypertopos build --config sphere.yaml --force --verbose
|
|
|
904
951
|
|
|
905
952
|
The builder parallelizes where possible:
|
|
906
953
|
- **Points write** — parallel across lines (ThreadPoolExecutor, up to 4 workers)
|
|
907
|
-
- **
|
|
908
|
-
- **
|
|
954
|
+
- **Pipeline mode** (when `temporal:` is configured) — each pattern runs geometry → temporal as a sequential pipeline, with up to 4 patterns executing concurrently. Temporal for a pattern starts immediately after its geometry completes, without waiting for other patterns.
|
|
955
|
+
- **Geometry-only mode** (no `temporal:` or `--no-temporal`) — geometry runs in parallel across patterns (up to 4 threads)
|
|
956
|
+
- **Temporal adaptive chunking** — when the shape tensor exceeds available RAM, the temporal phase uses adaptive memory chunking (auto-detected via platform API, 4 GB fallback)
|
|
909
957
|
|
|
910
958
|
### Build timing
|
|
911
959
|
|
|
@@ -915,15 +963,11 @@ Source 'transactions': 5,078,345 rows, 18 cols
|
|
|
915
963
|
Source 'accounts': 515,080 rows, 11 cols
|
|
916
964
|
Sources total: 0.6s
|
|
917
965
|
Extracting chains for 'tx_chains'...
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
Geometry total: 263s
|
|
924
|
-
Building temporal for 'account_pattern' (2d windows)...
|
|
925
|
-
Temporal total: 305s
|
|
926
|
-
Build total: 527s
|
|
966
|
+
Chains extracted: 290,784
|
|
967
|
+
Chains total: 9.5s
|
|
968
|
+
Building geometry + temporal (pipeline)...
|
|
969
|
+
Geometry + temporal total: 304.9s
|
|
970
|
+
Build total: 315.5s
|
|
927
971
|
```
|
|
928
972
|
|
|
929
973
|
### Skip flags (iterative build)
|
|
@@ -945,10 +989,17 @@ hypertopos build --config sphere.yaml --force --verbose
|
|
|
945
989
|
|
|
946
990
|
| Sphere | First run | Cached run |
|
|
947
991
|
|--------|-----------|-----------|
|
|
948
|
-
| Berka (4.5K accounts, 1M tx) |
|
|
949
|
-
|
|
|
950
|
-
| AML HI-Small (515K accts, 5M tx, 300K chains) | ~
|
|
951
|
-
|
|
992
|
+
| Berka (4.5K accounts, 1M tx) | ~35s | ~25s |
|
|
993
|
+
| NYC Taxi (265 zones, 7.5M trips) | ~3.2 min | ~2.8 min |
|
|
994
|
+
| AML HI-Small (515K accts, 5M tx, 300K chains) | ~5.3 min | ~6.7 min |
|
|
995
|
+
|
|
996
|
+
### Benchmark sphere configurations
|
|
997
|
+
|
|
998
|
+
| Sphere | Edge table | Chains | Temporal | Composites | Key features |
|
|
999
|
+
|--------|-----------|--------|----------|------------|--------------|
|
|
1000
|
+
| Berka | none | none | 3 patterns (90d) | account×bank pairs | NB-Split (accounts + accounts_stress + loan_accounts), precomputed dims, group_by_property |
|
|
1001
|
+
| NYC Taxi | auto-detected (trip_pattern: pu_zone → do_zone) | none | 2 patterns (7d) | none | NB-Split (zones_pickup + zones_dropoff), 6 event dims, 2 anchor patterns |
|
|
1002
|
+
| AML HI-Small | explicit (tx_pattern: from_account → to_account, timestamp, amount) | 300K (seeded BFS) | 3 patterns (2d) | account pairs | graph_features, precomputed ratios, IET metrics, Mahalanobis |
|
|
952
1003
|
|
|
953
1004
|
### Parallel chain extraction
|
|
954
1005
|
|
|
@@ -109,6 +109,9 @@ Domain columns vary per line. The `primary_key` column is always present and alw
|
|
|
109
109
|
| `delta` | fixed_size_list\<float32\> | Z-scored delta vector (deviation from mu) |
|
|
110
110
|
| `delta_norm` | float32 | L2 norm of delta (distance from population center -- used for scoring, clustering, and similarity) |
|
|
111
111
|
| `delta_rank_pct` | float32 | Percentile rank of delta_norm (0--100) |
|
|
112
|
+
| `conformal_p` | float32 | Conformal p-value (null when not computed) |
|
|
113
|
+
| `bregman_divergence` | float32 | Sum of per-dimension Bregman terms (distribution-aware anomaly distance). Null on pre-2.3 spheres. |
|
|
114
|
+
| `anomaly_confidence` | float32 | Bootstrap stability score: fraction of bootstrap resamples in which entity is anomalous. Null when bootstrap was skipped. |
|
|
112
115
|
| `edges` | list\<struct\> | Edge list: line_id, point_key, direction, status |
|
|
113
116
|
|
|
114
117
|
The `delta` vector length equals the number of dimensions in the pattern. Geometry datasets carry an IVF-PQ ANN index on the `delta` column for trajectory similarity search.
|