hypertopos 0.5.0__tar.gz → 0.5.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {hypertopos-0.5.0 → hypertopos-0.5.2}/CHANGELOG.md +35 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/LICENSE.md +1 -1
- {hypertopos-0.5.0 → hypertopos-0.5.2}/PKG-INFO +1 -1
- {hypertopos-0.5.0 → hypertopos-0.5.2}/README.md +3 -1
- {hypertopos-0.5.0 → hypertopos-0.5.2}/ROADMAP.md +6 -2
- {hypertopos-0.5.0 → hypertopos-0.5.2}/SECURITY.md +1 -1
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/api-reference.md +453 -453
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/concepts.md +1 -1
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/builder/builder.py +2 -2
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/navigation/navigator.py +11672 -11200
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/navigation/scanner.py +26 -9
- {hypertopos-0.5.0 → hypertopos-0.5.2}/pyproject.toml +1 -1
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_builder.py +39 -0
- hypertopos-0.5.2/tests/test_motif.py +2889 -0
- hypertopos-0.5.2/tests/test_profile_motif_perf_smoke.py +27 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_scanner.py +161 -0
- hypertopos-0.5.0/tests/test_motif.py +0 -932
- {hypertopos-0.5.0 → hypertopos-0.5.2}/.github/workflows/publish-pypi.yml +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/.gitignore +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/README.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/architecture.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/LICENSE +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/README.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/README.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/SUMMARY.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-settings.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-settings.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-settings.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-settings.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-settings.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-settings.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/sphere/prepare_accounts.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/sphere/prepare_cpty_banks.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/sphere/prepare_districts.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/sphere/prepare_loan_accounts.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/sphere/prepare_operations.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/sphere/prepare_orders.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/sphere/prepare_transactions.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/sphere/prepare_tx_types.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/berka/sphere/sphere.yaml +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/ibm-aml/README.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/ibm-aml/_layer2_cross_eval.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/ibm-aml/_layer3_cross_eval.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_accounts.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_currencies.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_payment_formats.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_transactions.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/ibm-aml/hi_small_sphere/sphere.yaml +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/ibm-aml/layer1_passive_scan.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/ibm-aml/layer2_xgboost_sweep.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/ibm-aml/layer3_typology_filter.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/ibm-aml/li_small_sphere/prepare_accounts.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/ibm-aml/li_small_sphere/prepare_currencies.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/ibm-aml/li_small_sphere/prepare_payment_formats.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/ibm-aml/li_small_sphere/prepare_transactions.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/ibm-aml/li_small_sphere/sphere.yaml +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/ibm-aml/passive-scan-calibration.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/nyc-taxi/README.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/nyc-taxi/results/0.1.0/SUMMARY.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-c-report.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-settings.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-c-report.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-settings.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-c-report.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-settings.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/nyc-taxi/sphere/prepare_trips.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmark/nyc-taxi/sphere/sphere.yaml +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/benchmarks.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/configuration.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/data-format.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/images/build-pipeline.svg +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/images/core-objects.svg +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/images/cutting-plane.svg +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/images/directory-layout.svg +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/images/hypertopos-overview.svg +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/images/model-lifecycle.svg +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/images/navigation-primitives.svg +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/images/three-scales.svg +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/introduction.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/docs/quickstart.md +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/__init__.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/builder/__init__.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/builder/_bootstrap.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/builder/_bregman.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/builder/_scatter.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/builder/_stats.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/builder/_writer.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/builder/derived.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/builder/dim_blocks.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/builder/mapping.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/cli/__init__.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/cli/__main__.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/cli/build.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/cli/info.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/cli/main.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/cli/schema.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/cli/sources.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/engine/__init__.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/engine/adjacency.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/engine/aggregation.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/engine/calibration.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/engine/chains.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/engine/composition.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/engine/fdr.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/engine/forecast.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/engine/geometry.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/engine/graph_algorithms.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/engine/heredity.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/engine/invalidation.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/engine/investigation.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/engine/lance_sql_agg.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/engine/selection.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/model/__init__.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/model/manifest.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/model/objects.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/model/sphere.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/navigation/__init__.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/sphere.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/storage/__init__.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/storage/_schemas.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/storage/cache.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/storage/reader.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/storage/writer.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/utils/__init__.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/hypertopos/utils/arrow.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/.gitkeep +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/conftest.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/fixtures/generate_fixtures.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_adjacency.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_aggregation_engine.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_arrow_utils.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_bootstrap.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_bregman.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_builder_alias.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_builder_chunking.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_builder_contagion.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_builder_derived.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_builder_edges.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_builder_rolling_z.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_builder_scatter.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_builder_temporal_perf.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_cache.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_calibration.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_chains.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_cli.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_cli_alias.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_cli_sources.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_compaction.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_composition.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_continuous_event_dims.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_data_quality_prop.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_detection.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_dim_blocks.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_edge_potential.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_edge_table.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_engine.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_fdr.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_forecast.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_fts.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_geometric_path.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_geometry_stats.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_gradient_alignment.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_graph_algorithms.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_heredity.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_hybrid_search.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_incremental.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_invalidation.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_investigation.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_kind_detect.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_lance_sql_agg.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_mapping.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_model.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_mvcc_session.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_navigation.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_navigator_alerts.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_navigator_fdr_select.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_observability.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_precision_stack.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_reputation.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_root_cause_trace.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_row_id_cache.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_selection.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_sphere.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_sphere_overview_perf.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_stats_guard.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_storage.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_streaming_reads.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_temporal_centroids.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_trajectory_ann.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_witness_cohort.py +0 -0
- {hypertopos-0.5.0 → hypertopos-0.5.2}/tests/test_witness_set.py +0 -0
|
@@ -5,6 +5,41 @@ All notable changes to hypertopos will be documented in this file.
|
|
|
5
5
|
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
6
6
|
Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.5.2] — 2026-04-28
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- Two new closed-vocabulary motifs extending the 0.5.1 catalog:
|
|
14
|
+
- `split_recombine` — diamond scatter-gather: source S → k distinct intermediaries M = {m₁,…,mₖ} → single sink D, with stacked-bipartite temporal order (all split-hops precede all recombine-hops within the window). Seed picks whether to enumerate forward from the source (`direction="forward"`) or backward from the sink (`direction="backward"`). Default window 24h, `min_k` default 3. Covers AML scatter-gather smurfing, parallel layering, and concentrator/sink atoms (forward from source vs backward from sink) without amount gating — for amount-gated chains use `structuring`. Canonical definition follows Starnini et al. 2021 and the IBM AMLSim stacked-bipartite spec.
|
|
15
|
+
- `bipartite_burst` — complete K_{k,m} bipartite subgraph within a tight time window: k distinct sources each send to every one of m distinct sinks. Greedy single-core enumeration (not maximal): enumerate seed-as-source first, fall back to seed-as-sink. Parameters `min_k` (sources, default 3), `min_m` (sinks, default 3), default window 24h. Covers coordinated-burst and parallel-collusion atoms; complements `fan_out` + `fan_in` by requiring completeness on both sides rather than single-anchor density.
|
|
16
|
+
- `score_motif` and `find_high_potential_motifs` accept `direction` (`split_recombine`) and `min_m` (`bipartite_burst`) parameters. `min_k` override now applies to `split_recombine` and `bipartite_burst` in addition to `fan_out` / `fan_in`. Registry size grows from 6 to 8.
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
- chain_k motif enumerator now uses per-k adaptive frontier cap (k=3,4: 1000; k=5: 500; k=6: 250; k=7: 125; k=8: 100) instead of a static 1000-cap. Bounds worst-case FHPM cold latency at higher k while preserving the generous cap for k=3,4 where measurements show no fragility. Public API unchanged (k=3..8 still accepted); `frontier_truncated=true` may surface more often at higher k as a result.
|
|
20
|
+
- Single-seed motif enumeration (fan_out, fan_in, cycle_2, cycle_3, structuring, chain_k) now delegates to the in-memory adjacency-path enumerator instead of issuing per-call Lance read_edges scans. Single source of truth per motif type — single-seed dispatch follows the same hot path as find_high_potential_motifs ranking.
|
|
21
|
+
- `_score_motif_from_edges` batches endpoint delta reads into a single filtered Lance scan and reuses the warm AdjacencyIndex pair_counts cache, mirroring the fast-path used by find_high_potential_motifs. Cuts found=true scoring tail latency from O(num_edges × per-endpoint Lance read) to O(1) batched scan. trace_root_cause's motif_potential auto-attach branch benefits transitively.
|
|
22
|
+
- bipartite_burst K-set intersection now starts from the smallest neighbour-set (size-ascending sink/source ordering) instead of alphabetic order, bounding the running intersection by the smallest set. Result identical (set intersection is commutative); protects against worst-case dense graphs where one sink dominates.
|
|
23
|
+
- `_enumerate_structuring` no longer raises `GDSNavigationError` when the underlying edge table lacks an amount column. The post-refactor adjacency path always carries amounts (defaulting to 1.0 when unspecified), so the predicate `amt >= amt1_min` returns an empty result cleanly. Now consistent with how the other 7 motifs handle no-match.
|
|
24
|
+
- cycle_3 motif enumerator now pre-filters intermediary candidates via 2-step adjacency traversal before the inner pair loop, skipping intermediaries that have no return-edge to the seed within the time window. Result equivalence preserved (semantic no-op on the candidate space).
|
|
25
|
+
- bipartite_burst K_{k,m} dispatcher now pre-checks seed in/out degree before invoking the per-side enumerator. Correctness-preserving; skips fruitless fail-fast work for seeds that don't qualify on either side.
|
|
26
|
+
|
|
27
|
+
## [0.5.1] — 2026-04-21
|
|
28
|
+
|
|
29
|
+
### Added
|
|
30
|
+
- Two new closed-vocabulary motifs extending the 0.5.0 structural catalog:
|
|
31
|
+
- `fan_in` — k distinct sources → one sink within a sliding time window, mirror of `fan_out`. Seed = sink. Surfaces concentrator/sink accounts (T13) and destination-side parallel layering (T12) as a single-call atomic query, so the agent no longer has to invert the graph by hand.
|
|
32
|
+
- `chain_k` — open directed chain A→B→…→Z of length `k` (3 ≤ k ≤ 8, k-1 edges), no cycle closure, no node revisit, strict monotone timestamps, total span ≤ window. Covers multi-stage layering typologies (T5 Long-Cycle Multi-Stage, T18 Multi-Jurisdiction Latency) that `cycle_3` and `structuring` could not express — `cycle_3` requires closure back to the seed and `structuring` is amount-gated with a 1h window; `chain_k` is the open-chain, amount-free variant that matches layering-over-days semantics. Each `chain_k` instance carries a `frontier_truncated: bool` flag — truthy when `_CHAIN_K_MAX_FRONTIER = 1000` was hit while expanding partial paths on at least one hop, signalling that the returned chains are real but the ranking may miss longer chains (recommended agent response: retry with a tighter `time_window_hours` or a lower `k`). Surfaces on both `score_motif` and `find_high_potential_motifs` result dicts.
|
|
33
|
+
- `score_motif` and `find_high_potential_motifs` gain a `k` parameter (default 4, validated 3–8 for `chain_k`, ignored for other types). `k` participates in the ranking cache key so different chain lengths are cached separately. `score_motif` additionally gains a `min_k: int | None = None` override on the single-seed path — when provided (must be ≥ 1), it plumbs through to the `fan_out` / `fan_in` enumerators, so callers can check e.g. "is this sink fed by ≥ 10 distinct sources?" without falling back on `find_high_potential_motifs` and triggering a pattern-wide cold cache. When None (default), enumerators fall back to their built-in `min_k = 3`, preserving the original behaviour exactly. Ignored for motif types that don't accept it (`cycle_2`, `cycle_3`, `structuring`, `chain_k`).
|
|
34
|
+
- `find_high_potential_motifs`'s `min_k` parameter now applies to `fan_in` in addition to `fan_out` (default 3).
|
|
35
|
+
- Numeric stability for the motif catalog: every motif scorer returns `log_score` (sum of `log(edge_potential)` over non-zero edges, `-inf` when any edge is zero) and `score_clamped: bool` alongside `score`. The raw `score` is clamped at `_MOTIF_SCORE_MAX = 1e300` when the edge-potential product would overflow (mirror of the existing `_MOTIF_SCORE_EPSILON = 1e-30` underflow clamp), and the ranking sort key in `_rank_motifs` switched from `-score` to `-log_score` so large-`k` motifs rank correctly regardless of clamp. Observed on AML HI-small: `fan_out` / `fan_in` hubs with k in the low thousands produced `score = +inf` that survived JSON serialisation, tied `score_rank_pct` to `100.0` across every affected result, and destroyed ordering at the top of the ranking.
|
|
36
|
+
|
|
37
|
+
### Fixed
|
|
38
|
+
- `passive_scan` chain and composite sources report entity-specific `related_count` instead of the total pattern population count.
|
|
39
|
+
- `detect_trajectory_anomaly` navigator method accepts `sample_size` to cap entity streaming on large patterns.
|
|
40
|
+
- Builder writes `null` (not `0.0`) for `anomaly_confidence` when bootstrap is skipped, preventing agents from misinterpreting zero as a computed confidence score.
|
|
41
|
+
- Single-seed motif enumerators for `fan_out`, `cycle_2`, and `cycle_3` computed their time-window threshold in microseconds against float-seconds timestamps (`EDGE_TABLE_SCHEMA` declares `timestamp: float64` = epoch seconds, as produced by `builder._to_epoch_seconds`). The µs-scaled threshold could never be exceeded by seconds-scale deltas, silently disabling the window filter in production — `score_motif(entity, motif_type, pattern_id, time_window_hours=H)` returned results as if no window was set. Flipped all three enumerators to seconds arithmetic, matching `_enumerate_structuring`, every `_enum_*_via_adj` adjacency path, and the new `_enumerate_fan_in` / `_enumerate_chain_k`. **Observable behaviour change on `score_motif`** for these three motif types: users who relied on the broken "all-time" behaviour may see fewer results on narrow windows. `find_high_potential_motifs` is unaffected (its adjacency ranking path was already correct). Test helper `_hour_us` retired in favour of `_hour_sec` so fixture semantics align with the production edge table; five tight-window parity regression guards (one per migrated enumerator plus the two shipping with the new motifs) prevent future unit reversion.
|
|
42
|
+
|
|
8
43
|
## [0.5.0] — 2026-04-19
|
|
9
44
|
|
|
10
45
|
### 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-28
|
|
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.5.
|
|
3
|
+
Version: 0.5.2
|
|
4
4
|
Summary: Understand the structure of your data — without training machine learning models
|
|
5
5
|
Project-URL: Homepage, https://github.com/hypertopos/hypertopos-py
|
|
6
6
|
Project-URL: Documentation, https://github.com/hypertopos/hypertopos-py/tree/main/docs
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
[](https://arrow.apache.org/docs/python/)
|
|
9
9
|
[](https://github.com/lance-format/lance)
|
|
10
10
|
[](https://modelcontextprotocol.io)
|
|
11
|
-
[](pyproject.toml)
|
|
12
12
|
|
|
13
13
|
hypertopos is not a database, and not a machine learning model. It is a layer that turns relational data into a coordinate system where every entity gets a position derived from its relationships and the population around it.
|
|
14
14
|
|
|
@@ -57,6 +57,8 @@ Each capability below emerges from treating entities as points in a shared, popu
|
|
|
57
57
|
| One-call root cause | `trace_root_cause` returns bounded evidence DAG — witness, edge-counterparty, contamination, hub | Manual chain of `explain_anomaly → find_counterparties → contagion_score → π7 hub` | `0.5.0` |
|
|
58
58
|
| Geometric edge potential | `\|\|delta_from − delta_to\|\| × (1/pair_tx_count)` — per-edge layering signature | Node-level `delta_norm` misses one-off transactions between divergent accounts | `0.5.0` |
|
|
59
59
|
| Structural motif scoring | Product of `edge_potential` across closed-vocab motifs (fan_out, cycle_2, cycle_3, structuring) | Graph DB motif matching has no geometric rarity score | `0.5.0` |
|
|
60
|
+
| Extended motif catalog | `fan_in` (sink-centric concentrator) and `chain_k` (open directed chain, 3 ≤ k ≤ 8) extend the motif vocabulary; window-filter correctness fix on fan_out/cycle_2/cycle_3 | Prior motifs silently ignored declared `time_window_hours` in production | `0.5.1` |
|
|
61
|
+
| Bipartite motif catalog | `split_recombine` (diamond scatter-gather S → k intermediaries → D, forward/backward seed anchoring) and `bipartite_burst` (complete K_{k,m} bipartite subgraph in tight window) cover scatter-gather smurfing, parallel layering, and coordinated-burst atoms | Closed-vocabulary atomic queries — no manual graph inversion or per-side enumeration glue | `0.5.2` |
|
|
60
62
|
|
|
61
63
|
### What changes in practice
|
|
62
64
|
|
|
@@ -17,9 +17,13 @@ Any item may slip to 0.7.0 if scope pressure requires. The multi-epoch retention
|
|
|
17
17
|
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
##
|
|
20
|
+
## 0.5.0
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
Detection-quality and investigation-workflow push.
|
|
23
|
+
|
|
24
|
+
- **0.5.0** — Storey adaptive π₀ FDR + chi² p-values (power recovery in moderate-super-anomaly regimes without chasing the Storey estimator off a rank-based null). Drift direction on `π9_attract_drift` — `gradient_alignment` and `drift_direction ∈ {normalizing, deteriorating, neutral}` on every entity. Multi-hop root-cause tracing (`trace_root_cause` DAG) replacing `explain_anomaly_chain`. Geometric edge potential — per-edge anomaly score via `||δ_from − δ_to|| × (1/pair_tx_count)` sourced from the shared `AdjacencyIndex.pair_counts()` cache. Structural motif scoring — `score_motif` and `find_high_potential_motifs` over four closed-vocabulary atoms (`fan_out`, `cycle_2`, `cycle_3`, `structuring`) composing `edge_potential` via product, with 0.5.0 AdjacencyIndex-reuse refactor consolidating motif ranking / edge_potential / eight graph primitives onto one shared adjacency build per session. The "architecture-emergent analytics" side of the original plan was re-scoped to 0.6.0 because the prerequisite infrastructure (multi-epoch calibration retention in the builder) was larger than the advertised features.
|
|
25
|
+
- **0.5.1** — Two new closed-vocabulary motifs extending the 0.5.0 catalog: `fan_in` (mirror of `fan_out`, sink-centric, covers T12 destination-side parallel layering and T13 concentrator/sink) and `chain_k` (open directed chain of parametric length 3 ≤ k ≤ 8, no cycle closure, no node revisit, covers T5 multi-stage layering and T18 multi-jurisdiction latency). Reuses the 0.5.0 `MotifSpec` / `_score_motif_from_edges` / AdjacencyIndex machinery without touching the format. `score_motif` and `find_high_potential_motifs` grow a `k` parameter (default 4, validated 3–8 for `chain_k`, ignored otherwise); `min_k` now applies to `fan_in` in addition to `fan_out`. `split_recombine` and `bipartite_burst` remain under consideration for 0.5.2.
|
|
26
|
+
- **0.5.2** — Closes the structural motif catalog with two bipartite atoms — `split_recombine` (diamond scatter-gather S → k intermediaries → D, stacked-bipartite temporal order, `direction ∈ {"forward","backward"}` for source vs sink seed anchoring) and `bipartite_burst` (complete K_{k,m} bipartite subgraph in a tight window, asymmetric `min_k` / `min_m` cardinality controls) — covering T1 / T12 / T13 / T16 atoms unreachable by the 0.5.0 / 0.5.1 vocabulary. Registry grows from six to eight types. Same release ships a perf-hardening pass on the existing catalog: single-seed enumeration unified onto the in-memory adjacency path, `_score_motif_from_edges` batched, `cycle_3` two-step pre-filter on hub seeds, `chain_k` per-k adaptive frontier cap, `bipartite_burst` size-ascending K-set intersection, and `_enumerate_structuring` consistency fix. No format change.
|
|
23
27
|
|
|
24
28
|
---
|
|
25
29
|
|