hypertopos 0.3.2__tar.gz → 0.4.0__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.2 → hypertopos-0.4.0}/CHANGELOG.md +38 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/LICENSE.md +1 -1
- {hypertopos-0.3.2 → hypertopos-0.4.0}/PKG-INFO +1 -1
- hypertopos-0.4.0/README.md +103 -0
- hypertopos-0.4.0/ROADMAP.md +83 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/SECURITY.md +1 -1
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/api-reference.md +8 -5
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/nyc-taxi/sphere/prepare_trips.py +10 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/concepts.md +50 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/configuration.md +59 -15
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/data-format.md +3 -0
- hypertopos-0.4.0/hypertopos/builder/_bootstrap.py +140 -0
- hypertopos-0.4.0/hypertopos/builder/_bregman.py +402 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/builder/builder.py +964 -470
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/cli/build.py +20 -17
- hypertopos-0.4.0/hypertopos/engine/adjacency.py +107 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/engine/aggregation.py +11 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/engine/chains.py +5 -6
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/engine/geometry.py +79 -10
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/engine/investigation.py +41 -2
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/engine/lance_sql_agg.py +10 -2
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/model/objects.py +2 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/model/sphere.py +1 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/navigation/navigator.py +246 -172
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/sphere.py +3 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/storage/_schemas.py +4 -2
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/storage/reader.py +12 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/pyproject.toml +1 -1
- hypertopos-0.4.0/tests/test_adjacency.py +180 -0
- hypertopos-0.4.0/tests/test_bootstrap.py +132 -0
- hypertopos-0.4.0/tests/test_bregman.py +346 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_builder.py +2 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_builder_derived.py +173 -0
- hypertopos-0.4.0/tests/test_kind_detect.py +275 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_navigation.py +182 -3
- hypertopos-0.3.2/README.md +0 -69
- hypertopos-0.3.2/ROADMAP.md +0 -104
- {hypertopos-0.3.2 → hypertopos-0.4.0}/.github/workflows/publish-pypi.yml +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/.gitignore +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/README.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/architecture.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/LICENSE +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/README.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/README.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/SUMMARY.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-settings.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-settings.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-settings.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-settings.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-settings.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-settings.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/sphere/prepare_accounts.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/sphere/prepare_cpty_banks.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/sphere/prepare_districts.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/sphere/prepare_loan_accounts.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/sphere/prepare_operations.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/sphere/prepare_orders.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/sphere/prepare_transactions.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/sphere/prepare_tx_types.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/berka/sphere/sphere.yaml +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/ibm-aml/README.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/ibm-aml/_layer2_cross_eval.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/ibm-aml/_layer3_cross_eval.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_accounts.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_currencies.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_payment_formats.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_transactions.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/ibm-aml/hi_small_sphere/sphere.yaml +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/ibm-aml/layer1_passive_scan.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/ibm-aml/layer2_xgboost_sweep.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/ibm-aml/layer3_typology_filter.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/ibm-aml/li_small_sphere/prepare_accounts.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/ibm-aml/li_small_sphere/prepare_currencies.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/ibm-aml/li_small_sphere/prepare_payment_formats.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/ibm-aml/li_small_sphere/prepare_transactions.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/ibm-aml/li_small_sphere/sphere.yaml +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/ibm-aml/passive-scan-calibration.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/nyc-taxi/README.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/nyc-taxi/results/0.1.0/SUMMARY.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-c-report.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-settings.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-c-report.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-settings.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-c-report.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-settings.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmark/nyc-taxi/sphere/sphere.yaml +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/benchmarks.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/images/build-pipeline.svg +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/images/core-objects.svg +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/images/cutting-plane.svg +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/images/directory-layout.svg +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/images/hypertopos-overview.svg +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/images/model-lifecycle.svg +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/images/navigation-primitives.svg +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/images/three-scales.svg +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/introduction.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/docs/quickstart.md +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/__init__.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/builder/__init__.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/builder/_scatter.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/builder/_stats.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/builder/_writer.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/builder/derived.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/builder/dim_blocks.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/builder/mapping.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/cli/__init__.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/cli/__main__.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/cli/info.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/cli/main.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/cli/schema.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/cli/sources.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/engine/__init__.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/engine/calibration.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/engine/composition.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/engine/fdr.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/engine/forecast.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/engine/heredity.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/engine/invalidation.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/engine/selection.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/model/__init__.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/model/manifest.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/navigation/__init__.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/navigation/scanner.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/storage/__init__.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/storage/cache.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/storage/writer.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/utils/__init__.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/hypertopos/utils/arrow.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/.gitkeep +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/conftest.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/fixtures/generate_fixtures.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_aggregation_engine.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_arrow_utils.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_builder_alias.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_builder_chunking.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_builder_contagion.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_builder_edges.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_builder_rolling_z.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_builder_scatter.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_builder_temporal_perf.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_cache.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_calibration.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_chains.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_cli.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_cli_alias.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_cli_sources.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_compaction.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_composition.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_continuous_event_dims.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_data_quality_prop.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_detection.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_dim_blocks.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_edge_table.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_engine.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_fdr.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_forecast.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_fts.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_geometric_path.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_geometry_stats.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_heredity.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_hybrid_search.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_incremental.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_invalidation.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_investigation.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_lance_sql_agg.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_mapping.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_model.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_mvcc_session.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_navigator_alerts.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_navigator_fdr_select.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_observability.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_precision_stack.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_reputation.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_row_id_cache.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_scanner.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_selection.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_sphere.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_sphere_overview_perf.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_stats_guard.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_storage.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_streaming_reads.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_temporal_centroids.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_trajectory_ann.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_witness_cohort.py +0 -0
- {hypertopos-0.3.2 → hypertopos-0.4.0}/tests/test_witness_set.py +0 -0
|
@@ -7,6 +7,44 @@ Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.4.0] — 2026-04-15
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- Distribution-aware Bregman divergence with per-dimension kind tags (gaussian/poisson/bernoulli). Auto-detected from dimension type; YAML `kind:` override per dimension.
|
|
14
|
+
- Per-dimension anomaly threshold (hyper-ellipsoid boundary) replacing uniform decomposition (hyper-sphere).
|
|
15
|
+
- `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.
|
|
16
|
+
- `bregman_divergence` stored alongside `delta_norm` in geometry.
|
|
17
|
+
- `dimension_kinds` per pattern in sphere.json metadata.
|
|
18
|
+
- `find_anomalies` returns edges on polygons (both fast path and in-process path).
|
|
19
|
+
- `find_neighborhood` raises `GDSNavigationError` for continuous-mode patterns instead of silently returning empty results.
|
|
20
|
+
- In-memory adjacency index for graph operations — lazy build on first graph call, cached on session reader.
|
|
21
|
+
- Build pipeline per-pattern parallelism: geometry → temporal as concurrent pipeline (up to 4 threads).
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
- `explain_anomaly` returns per-dimension Bregman contributions (additive, kind-labeled) instead of absolute z-score deltas when dimension_kinds available.
|
|
25
|
+
- Sphere format bumped to 2.3. Old spheres must be rebuilt.
|
|
26
|
+
- Chain extraction uses temporal bisect for neighbor filtering instead of linear timestamp scan.
|
|
27
|
+
|
|
28
|
+
### Fixed
|
|
29
|
+
- `find_anomalies` pagination: deterministic ordering on tied `delta_norm` values prevents entity duplication across page boundaries.
|
|
30
|
+
- `hub_score_history` clamps negative `hub_score`/`alive_edges_est` to zero for early temporal slices.
|
|
31
|
+
- `anomalous_edges` deduplicates by `event_key` for self-loops (`from_key == to_key`).
|
|
32
|
+
- `find_clusters`, `find_drifting_entities`, `compare_time_windows`, `find_regime_changes` use `pattern.dim_labels` for dimension names, including event dimensions.
|
|
33
|
+
- `find_geometric_path` default `beam_width` increased from 10 to 50; auto-scales for deep searches.
|
|
34
|
+
- `aggregate` raises explicit error when `group_by_line` matches multiple relations on the same pattern.
|
|
35
|
+
- `search_entities` JSON serialization handles datetime columns.
|
|
36
|
+
- `sphere_overview` mode detection uses `sample_size=200` instead of full geometry table read.
|
|
37
|
+
- Weighted Bregman norms for `metric="bregman"` in `find_anomalies`.
|
|
38
|
+
|
|
39
|
+
## [0.3.3] — 2026-04-13
|
|
40
|
+
|
|
41
|
+
### Added
|
|
42
|
+
|
|
43
|
+
- `dim_mask` parameter on `find_similar_entities` — compute distance only on named dimensions. Focuses similarity search on specific aspects of geometry (e.g., only the dimensions driving an anomaly).
|
|
44
|
+
- `metric` parameter on `find_similar_entities` — `"L2"` (default Euclidean) or `"cosine"` (shape similarity ignoring magnitude). Cosine compares anomaly profile direction, not severity.
|
|
45
|
+
- `metric` parameter on `find_anomalies` (π5) — `"L2"` (default, pre-computed) or `"Linf"` (max single-dimension |delta|, runtime scan). Linf catches single-dimension spikes that L2 dilutes.
|
|
46
|
+
- `push-mirrors.sh --from-ref` mode for incremental mirror pushes between tagged releases, with pre/post author verification guard.
|
|
47
|
+
|
|
10
48
|
## [0.3.2] — 2026-04-13
|
|
11
49
|
|
|
12
50
|
### 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-15
|
|
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.0
|
|
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
|
|
@@ -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 → storage → features → feature store → ML → serving → decision
|
|
17
|
+
hypertopos: data → hypertopos (WIP) → ML
|
|
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 | Why it matters | What others do instead | Since |
|
|
39
|
+
|---|---|---|---|---|
|
|
40
|
+
| Population-relative coordinates | Represents each entity as its deviation from the population (in sigma units). `delta = (shape - mu) / sigma`, computed in one aggregation pass. | Anomaly detection, clustering, and comparison all work on the same coordinate — no separate pipelines. | node2vec/GNN: learned embeddings, latent dims, retraining on shift. Feature stores: static columns, no population calibration. | `0.1.0` |
|
|
41
|
+
| Self-calibrating threshold | Anomaly when `\|\|delta\|\| > theta`, where `theta = percentile(\|\|delta\|\|, 95)`. Adapts to any population shape. | Works on banking, logistics, healthcare without parameter tuning or labeled data. | PyOD/Isolation Forest: fit model, choose contamination rate. Sigma rules: assume Gaussian. | `0.1.0` |
|
|
42
|
+
| Named dimension attribution | `explain_anomaly` ranks dimensions by contribution: `loan_count: +3.2 sigma`, `has_email: -1.8 sigma`. Contributions sum to the total anomaly score. | Every anomaly is immediately interpretable — analyst sees which structural property drives it. | SHAP/LIME: explain a model's prediction on latent features. Here there is no model — dimensions ARE the explanation. | `0.1.0` |
|
|
43
|
+
| Temporal deformation log | Append-only log of delta vectors at each structural change. Three drift metrics: displacement (net), path length (cumulative), directionality (displacement/path). | Behavioral change is geometric movement — "how far", "how fast", and "in which direction" are one query. | Time-series DBs store metric values. Here the time series is the entity's trajectory through coordinate space. | `0.1.0` |
|
|
44
|
+
| Stateful navigation | 12 typed primitives (`walk_line`, `jump_polygon`, `dive_solid`, `attract_anomaly`, ...). Position type (None/Point/Polygon/Solid) constrains valid operations at runtime. | AI agents navigate structure with guardrails — invalid operations are rejected by the type system, not by error handling. | SQL/GraphQL: stateless queries. REST APIs: stateless endpoints. | `0.1.0` |
|
|
45
|
+
| Cross-sphere comparison | `\|\|delta\|\|` is dimensionless (units of sigma). 4.2 in a banking sphere = 4.2 in a logistics sphere. No shared schema or feature alignment required. | Compare structural deviation across domains without joint training or manual normalization. | Cross-domain comparison typically requires shared features or joint embeddings. | `0.1.0` |
|
|
46
|
+
| Counterfactual simulation | `simulate_edges(entity, add=[(type, 5)])` recomputes delta against fixed mu/sigma (population baseline unchanged). Reports if entity crosses threshold. | Answers "what if this entity had 5 more transactions?" deterministically, without building a causal model. | Causal inference: requires explicit DAG. What-if in SQL: manual re-aggregation. | `0.1.0` |
|
|
47
|
+
| Graph contagion scoring | `contagion_score` measures mean `\|\|delta\|\|` of connected entities. `propagate_influence` computes Cohen's d between connected and control groups. | Measures how anomaly propagates through relationships — not who is central, but whose behavior spreads. | PageRank/betweenness measure graph topology, not behavioral propagation through edges. | `0.2.0` |
|
|
48
|
+
| Witness cohort | `find_witness_cohort` finds entities with similar deltas that are NOT directly connected. Combines delta cosine, witness Jaccard, trajectory cosine. | Validates an anomaly is a pattern rather than a one-off — "others behave the same way." | No direct equivalent in common tools. Nearest: k-NN on features, but witness cohort explicitly excludes graph neighbors. | `0.2.1` |
|
|
49
|
+
| FDR-controlled detection | `find_anomalies(fdr_alpha=0.05)` applies Benjamini-Hochberg to rank-based p-values of `\|\|delta\|\|`. Returns per-entity q-values. | At alpha=0.05, at most 5% of flagged entities are false discoveries. Statistical guarantee instead of heuristic thresholding. | BH correction exists in biostatistics, but not combined with geometric anomaly detection in one system. | `0.3.1` |
|
|
50
|
+
| Regime change detection | `attract_regime_change` computes per-bucket centroids, flags intervals where centroid shift exceeds `mean + 2*std`. Self-calibrating. | Detects shifts in population structure, not just individual entity drift — systemic changes visible. | Evidently/NannyML monitor model prediction drift, not coordinate-space population structure. | `0.1.0` |
|
|
51
|
+
| Diverse anomaly selection | `find_anomalies(select="diverse")` uses facility location (Nemhauser-Wolsey-Fisher) to cover distinct anomaly regions. | Returns representative anomalies across the anomaly space, not redundant extremes from one cluster. | Top-N by score returns extremes from the same region. | `0.3.1` |
|
|
52
|
+
| Distribution-aware scoring | Each dimension gets a `kind` tag (gaussian/poisson/bernoulli). Anomaly score uses the matching Bregman divergence per dimension — KL for counts, KL for binary, squared z-score for continuous. Contributions are exactly additive (Pythagorean property). | A count dimension with value 1 vs population mean 50 is scored differently than a continuous amount with the same z-score. Attribution sums to 100% — no approximation. | PyOD/sklearn: uniform distance metric across all features. SHAP: approximate, model-dependent attribution. | `0.4.0` |
|
|
53
|
+
| Anomaly confidence | `anomaly_confidence: 0-1` per entity via bootstrap resampling. Measures how stable the anomaly verdict is if the population composition changes. `min_confidence` filter on `find_anomalies`. | Agent distinguishes solid anomalies (confidence=0.95) from borderline cases (confidence=0.3) without manual threshold exploration. | No equivalent in standard anomaly detectors — binary verdict with no stability signal. | `0.4.0` |
|
|
54
|
+
| In-memory graph index | All graph operations use a lazily-built adjacency index with O(1) neighbor lookups. Cached on the session reader after first graph call. | `find_counterparties`, `discover_chains`, `contagion_score`, `find_geometric_path` run without per-call disk reads — interactive latency on million-edge graphs. | Neo4j/NetworkX: separate graph DB or in-memory load. Here the index is part of the sphere session. | `0.4.0` |
|
|
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.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# hypertopos — Roadmap
|
|
2
|
+
|
|
3
|
+
> Planned direction. Priorities may change based on feedback.
|
|
4
|
+
|
|
5
|
+
## Plan: 0.5.0
|
|
6
|
+
|
|
7
|
+
Investigation depth, detection quality, edge-derived geometry, and advanced analytics.
|
|
8
|
+
|
|
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
|
+
- **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
|
+
- **Geometric edge potential** — relationship anomaly scoring via endpoint geometric distance; flags edges connecting geometrically distant entities.
|
|
12
|
+
- **Geometric dark matter** — population density gap detection; identifies coordinate-space regions that should have entities but are empty (anomaly by absence).
|
|
13
|
+
- **Gradient alignment on drift** — drift direction signal (normalizing vs deteriorating) on `find_drifting_entities` and `dive_solid`.
|
|
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
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 0.4.0
|
|
21
|
+
|
|
22
|
+
Bregman geometry, anomaly confidence, distribution-aware calibration, build pipeline, graph acceleration.
|
|
23
|
+
|
|
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.x** — Native graph algorithms as dimensions — PageRank, community detection (label propagation), betweenness centrality, triangle count, connected components computed at build time via adjacency index. Continuous features as derived dimensions, categorical features as group_by_property.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 0.3.0
|
|
30
|
+
|
|
31
|
+
Lance perf upgrade, FDR control, builder intelligence.
|
|
32
|
+
|
|
33
|
+
- **0.3.0** — Aggregate engine rewritten around Lance SQL, precomputed contagion stats, format 2.2, edge table auto-detect fix.
|
|
34
|
+
- **0.3.1** — Benjamini-Hochberg FDR control, submodular facility location, vectorized build with adaptive memory chunking.
|
|
35
|
+
- **0.3.2** — NumPy graph features, chunked pre-computation, Lance compact tuning, per-dim index removal. Generalized dimension blocks (g/t/s), geometric heredity (`find_novel_entities`).
|
|
36
|
+
- **0.3.3** — Agent navigation policy (investigation memory, failure guards, decision scoring). Dimension-selective similarity (`dim_mask`, `metric="cosine"`, `metric="Linf"`). Sphere-specific hardcoding removed from 6 skill guidance texts.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 0.2.0
|
|
41
|
+
|
|
42
|
+
Graph meets geometry — edge table, runtime traversal, contagion/influence.
|
|
43
|
+
|
|
44
|
+
- **0.2.0** — Edge table, +11 navigator functions, contagion/influence primitives.
|
|
45
|
+
- **0.2.1** — Witness cohort discovery, investigative peer ranking.
|
|
46
|
+
- **0.2.2** — As-of graph reconstruction, `detect_cross_pattern_discrepancy` latency fix.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 0.1.0
|
|
51
|
+
|
|
52
|
+
First public release — full GDS stack, π1–π12, builder, MCP server, validation suite.
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Future
|
|
57
|
+
|
|
58
|
+
**Detection quality**
|
|
59
|
+
- Edge-derived dimensions + temporal motif matcher
|
|
60
|
+
- Confidence scoring, robust estimators, multi-scale resolution — improve anomaly precision and reduce false positives on heavy-tail and multi-modal populations
|
|
61
|
+
|
|
62
|
+
**Builder evolution**
|
|
63
|
+
- Incremental rebuild — geometry-only without `--force` wipe
|
|
64
|
+
|
|
65
|
+
**PassiveScanner evolution**
|
|
66
|
+
- Native temporal source support for direct temporal inputs, without requiring manual dataset plumbing in benchmark scripts
|
|
67
|
+
- Optional weighted scoring mode that uses continuous intensity instead of binary counts
|
|
68
|
+
- **SphereProfiler** — autonomous sphere scanner that profiles all patterns, runs calibration sweeps across source combinations, proposes optimal PassiveScanner composition for Layer 1 surveillance.
|
|
69
|
+
|
|
70
|
+
**Code refactoring**
|
|
71
|
+
- Break up oversized modules into smaller, domain-focused components
|
|
72
|
+
- Reduce coupling between core layers
|
|
73
|
+
- Consolidate repeated orchestration logic into shared helpers
|
|
74
|
+
|
|
75
|
+
**Cross-sphere capabilities**
|
|
76
|
+
- Cross-sphere comparison — dimensionless metrics across independently calibrated coordinate spaces
|
|
77
|
+
- What-if analysis — hypothetical edge changes producing modified coordinate vectors
|
|
78
|
+
|
|
79
|
+
**Enterprise / governance**
|
|
80
|
+
- Dimension access control — per-agent visibility constraints on delta dimensions
|
|
81
|
+
|
|
82
|
+
**Tooling**
|
|
83
|
+
- Runtime latency benchmarks in package docs
|
|
@@ -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)` |
|
|
@@ -141,9 +141,9 @@ 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
|
-
| `find_similar_entities(primary_key, pattern_id, top_n)` | ANN search for nearest entities in delta-space. Returns `SimilarityResult` |
|
|
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) |
|
|
148
148
|
| `composite_risk(primary_key, line_id)` | Fisher's method combination of conformal p-values across patterns |
|
|
149
149
|
| `composite_risk_batch(primary_keys, line_id)` | Batch Fisher combination for multiple entities |
|
|
@@ -213,9 +213,9 @@ builder = GDSBuilder(
|
|
|
213
213
|
| `add_graph_features(anchor_line, event_line, from_col, to_col, features)` | Auto-compute graph structural features (in/out-degree, reciprocity) |
|
|
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,53 @@ 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
|
+
|
|
101
|
+
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`.
|
|
102
|
+
|
|
103
|
+
## Anomaly Confidence
|
|
104
|
+
|
|
105
|
+
Bootstrap confidence measures how stable an entity's anomaly classification is under random resampling of the calibration population.
|
|
106
|
+
|
|
107
|
+
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.
|
|
108
|
+
|
|
109
|
+
**Interpretation:**
|
|
110
|
+
- `1.0` — entity is anomalous under every bootstrap resample; classification is robust
|
|
111
|
+
- `0.5–0.99` — entity sits near the boundary; classification may flip with slightly different calibration data
|
|
112
|
+
- `< 0.5` — entity is nominally anomalous (delta_norm > theta) but unstable; treat with caution
|
|
113
|
+
|
|
114
|
+
`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`.
|
|
115
|
+
|
|
116
|
+
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.
|
|
117
|
+
|
|
71
118
|
## Three Scales
|
|
72
119
|
|
|
73
120
|

|
|
@@ -172,6 +219,9 @@ Chains (both build-time `chain_lines` and runtime `discover_chains`) are sequenc
|
|
|
172
219
|
| **Delta norm** | L2 magnitude of the deviation -- basis for similarity, clustering, and anomaly scoring |
|
|
173
220
|
| **Theta threshold** | Statistical boundary derived from the population distribution (used for anomaly classification) |
|
|
174
221
|
| **Deformation log** | History of changes that produced the current solid |
|
|
222
|
+
| **Bregman divergence** | Distribution-aware anomaly distance summed across per-dimension Bregman terms |
|
|
223
|
+
| **Anomaly confidence** | Bootstrap stability score (0–1) for anomaly classification under population resampling |
|
|
224
|
+
| **Dimension kind** | Distribution family tag per dimension (`gaussian`, `poisson`, `bernoulli`) driving Bregman scoring |
|
|
175
225
|
|
|
176
226
|
Every dimension has a meaning tied to a relation or tracked property.
|
|
177
227
|
|
|
@@ -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,44 @@ 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
|
+
| `geo_properties`, `metric_properties` | `gaussian` | Continuous measurements |
|
|
568
|
+
|
|
569
|
+
**Override via `kind:`** on individual dimension entries (precomputed, derived). Override takes precedence over auto-detection. Event dimensions use auto-detection only.
|
|
570
|
+
|
|
532
571
|
---
|
|
533
572
|
|
|
534
573
|
## Composite Lines
|
|
@@ -595,6 +634,7 @@ patterns:
|
|
|
595
634
|
| `edge_max` | int or `"auto"` | `"auto"` | Fixed normalization cap, or auto-compute from percentile. |
|
|
596
635
|
| `percentile` | float | `99.0` | Percentile for auto edge_max computation. |
|
|
597
636
|
| `display_name` | string | `null` | Human-readable dimension label. |
|
|
637
|
+
| `kind` | string | auto | Distribution family for Bregman scoring: `"gaussian"`, `"poisson"`, or `"bernoulli"`. Auto-detected when omitted. |
|
|
598
638
|
|
|
599
639
|
---
|
|
600
640
|
|
|
@@ -904,8 +944,9 @@ hypertopos build --config sphere.yaml --force --verbose
|
|
|
904
944
|
|
|
905
945
|
The builder parallelizes where possible:
|
|
906
946
|
- **Points write** — parallel across lines (ThreadPoolExecutor, up to 4 workers)
|
|
907
|
-
- **
|
|
908
|
-
- **
|
|
947
|
+
- **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.
|
|
948
|
+
- **Geometry-only mode** (no `temporal:` or `--no-temporal`) — geometry runs in parallel across patterns (up to 4 threads)
|
|
949
|
+
- **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
950
|
|
|
910
951
|
### Build timing
|
|
911
952
|
|
|
@@ -915,15 +956,11 @@ Source 'transactions': 5,078,345 rows, 18 cols
|
|
|
915
956
|
Source 'accounts': 515,080 rows, 11 cols
|
|
916
957
|
Sources total: 0.6s
|
|
917
958
|
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
|
|
959
|
+
Chains extracted: 290,784
|
|
960
|
+
Chains total: 9.5s
|
|
961
|
+
Building geometry + temporal (pipeline)...
|
|
962
|
+
Geometry + temporal total: 304.9s
|
|
963
|
+
Build total: 315.5s
|
|
927
964
|
```
|
|
928
965
|
|
|
929
966
|
### Skip flags (iterative build)
|
|
@@ -945,10 +982,17 @@ hypertopos build --config sphere.yaml --force --verbose
|
|
|
945
982
|
|
|
946
983
|
| Sphere | First run | Cached run |
|
|
947
984
|
|--------|-----------|-----------|
|
|
948
|
-
| Berka (4.5K accounts, 1M tx) |
|
|
949
|
-
|
|
|
950
|
-
| AML HI-Small (515K accts, 5M tx, 300K chains) | ~
|
|
951
|
-
|
|
985
|
+
| Berka (4.5K accounts, 1M tx) | ~35s | ~25s |
|
|
986
|
+
| NYC Taxi (265 zones, 7.5M trips) | ~3.2 min | ~2.8 min |
|
|
987
|
+
| AML HI-Small (515K accts, 5M tx, 300K chains) | ~5.3 min | ~6.7 min |
|
|
988
|
+
|
|
989
|
+
### Benchmark sphere configurations
|
|
990
|
+
|
|
991
|
+
| Sphere | Edge table | Chains | Temporal | Composites | Key features |
|
|
992
|
+
|--------|-----------|--------|----------|------------|--------------|
|
|
993
|
+
| Berka | none | none | 3 patterns (90d) | account×bank pairs | NB-Split (accounts + accounts_stress + loan_accounts), precomputed dims, group_by_property |
|
|
994
|
+
| 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 |
|
|
995
|
+
| 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
996
|
|
|
953
997
|
### Parallel chain extraction
|
|
954
998
|
|
|
@@ -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.
|