hypertopos 0.2.0__tar.gz → 0.2.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.
Files changed (200) hide show
  1. hypertopos-0.2.2/.github/workflows/publish-pypi.yml +35 -0
  2. {hypertopos-0.2.0 → hypertopos-0.2.2}/.gitignore +40 -40
  3. {hypertopos-0.2.0 → hypertopos-0.2.2}/CHANGELOG.md +188 -156
  4. {hypertopos-0.2.0 → hypertopos-0.2.2}/LICENSE.md +83 -83
  5. {hypertopos-0.2.0 → hypertopos-0.2.2}/PKG-INFO +1 -1
  6. {hypertopos-0.2.0 → hypertopos-0.2.2}/README.md +121 -120
  7. hypertopos-0.2.2/ROADMAP.md +58 -0
  8. {hypertopos-0.2.0 → hypertopos-0.2.2}/SECURITY.md +15 -15
  9. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/README.md +38 -38
  10. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/api-reference.md +445 -444
  11. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/architecture.md +330 -326
  12. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/LICENSE +190 -190
  13. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/README.md +129 -129
  14. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/README.md +287 -287
  15. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/SUMMARY.md +271 -271
  16. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-a-report.md +421 -421
  17. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-a-scoring.md +14 -14
  18. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-b-report.md +409 -409
  19. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-b-scoring.md +17 -17
  20. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-settings.md +38 -38
  21. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-a-report.md +391 -391
  22. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-a-scoring.md +75 -75
  23. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-b-report.md +433 -433
  24. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-b-scoring.md +17 -17
  25. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-settings.md +37 -37
  26. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-a-report.md +322 -322
  27. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-a-scoring.md +114 -114
  28. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-b-report.md +484 -484
  29. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-b-scoring.md +19 -19
  30. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-settings.md +38 -38
  31. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-a-report.md +158 -158
  32. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-a-scoring.md +114 -114
  33. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-b-report.md +328 -328
  34. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-b-scoring.md +19 -19
  35. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-settings.md +39 -39
  36. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-a-report.md +208 -208
  37. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-a-scoring.md +128 -128
  38. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-b-report.md +419 -419
  39. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-b-scoring.md +25 -25
  40. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-settings.md +39 -39
  41. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-a-report.md +281 -281
  42. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-a-scoring.md +100 -100
  43. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-b-report.md +413 -413
  44. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-b-scoring.md +26 -26
  45. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-settings.md +47 -47
  46. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/sphere/prepare_accounts.py +195 -195
  47. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/sphere/prepare_cpty_banks.py +20 -20
  48. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/sphere/prepare_districts.py +24 -24
  49. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/sphere/prepare_loan_accounts.py +20 -20
  50. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/sphere/prepare_operations.py +20 -20
  51. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/sphere/prepare_orders.py +40 -40
  52. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/sphere/prepare_transactions.py +51 -51
  53. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/sphere/prepare_tx_types.py +20 -20
  54. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/berka/sphere/sphere.yaml +222 -222
  55. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/ibm-aml/README.md +349 -349
  56. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/ibm-aml/_layer2_cross_eval.py +292 -292
  57. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/ibm-aml/_layer3_cross_eval.py +335 -335
  58. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_accounts.py +209 -209
  59. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_currencies.py +30 -30
  60. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_payment_formats.py +30 -30
  61. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_transactions.py +93 -93
  62. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/ibm-aml/hi_small_sphere/sphere.yaml +202 -202
  63. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/ibm-aml/layer1_passive_scan.py +419 -419
  64. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/ibm-aml/layer2_xgboost_sweep.py +381 -381
  65. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/ibm-aml/layer3_typology_filter.py +292 -292
  66. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/ibm-aml/li_small_sphere/prepare_accounts.py +209 -209
  67. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/ibm-aml/li_small_sphere/prepare_currencies.py +30 -30
  68. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/ibm-aml/li_small_sphere/prepare_payment_formats.py +30 -30
  69. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/ibm-aml/li_small_sphere/prepare_transactions.py +93 -93
  70. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/ibm-aml/li_small_sphere/sphere.yaml +202 -202
  71. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/ibm-aml/passive-scan-calibration.md +231 -231
  72. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/nyc-taxi/README.md +291 -291
  73. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/nyc-taxi/results/0.1.0/SUMMARY.md +281 -281
  74. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-a-report.md +301 -301
  75. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-a-scoring.md +23 -23
  76. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-b-report.md +321 -321
  77. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-b-scoring.md +20 -20
  78. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-c-report.md +492 -492
  79. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-settings.md +84 -84
  80. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-a-report.md +269 -269
  81. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-a-scoring.md +42 -42
  82. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-b-report.md +253 -253
  83. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-b-scoring.md +20 -20
  84. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-c-report.md +388 -388
  85. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-settings.md +91 -91
  86. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-a-report.md +331 -331
  87. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-a-scoring.md +24 -24
  88. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-b-report.md +335 -335
  89. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-b-scoring.md +20 -20
  90. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-c-report.md +455 -455
  91. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-settings.md +91 -91
  92. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/nyc-taxi/sphere/prepare_trips.py +203 -203
  93. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmark/nyc-taxi/sphere/sphere.yaml +159 -159
  94. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/benchmarks.md +64 -64
  95. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/concepts.md +266 -265
  96. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/configuration.md +980 -980
  97. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/data-format.md +197 -197
  98. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/images/build-pipeline.svg +83 -83
  99. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/images/core-objects.svg +131 -131
  100. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/images/cutting-plane.svg +42 -42
  101. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/images/directory-layout.svg +98 -98
  102. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/images/hypertopos-overview.svg +172 -172
  103. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/images/model-lifecycle.svg +110 -110
  104. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/images/navigation-primitives.svg +113 -113
  105. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/images/three-scales.svg +96 -96
  106. {hypertopos-0.2.0 → hypertopos-0.2.2}/docs/quickstart.md +113 -113
  107. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/__init__.py +19 -19
  108. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/builder/__init__.py +25 -25
  109. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/builder/_stats.py +351 -351
  110. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/builder/_writer.py +248 -248
  111. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/builder/builder.py +3708 -3708
  112. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/builder/derived.py +828 -828
  113. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/builder/mapping.py +243 -243
  114. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/cli/__init__.py +14 -14
  115. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/cli/__main__.py +10 -10
  116. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/cli/build.py +972 -972
  117. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/cli/info.py +63 -63
  118. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/cli/main.py +110 -110
  119. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/cli/schema.py +850 -850
  120. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/cli/sources.py +230 -230
  121. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/engine/__init__.py +4 -4
  122. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/engine/aggregation.py +2418 -2418
  123. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/engine/calibration.py +125 -125
  124. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/engine/chains.py +491 -491
  125. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/engine/composition.py +180 -180
  126. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/engine/datafusion_agg.py +602 -602
  127. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/engine/forecast.py +327 -327
  128. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/engine/geometry.py +1119 -1036
  129. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/engine/invalidation.py +4 -4
  130. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/engine/investigation.py +61 -61
  131. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/engine/subprocess_agg.py +742 -742
  132. {hypertopos-0.2.0/hypertopos/storage → hypertopos-0.2.2/hypertopos/model}/__init__.py +4 -4
  133. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/model/manifest.py +42 -42
  134. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/model/objects.py +123 -123
  135. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/model/sphere.py +313 -313
  136. {hypertopos-0.2.0/hypertopos/model → hypertopos-0.2.2/hypertopos/navigation}/__init__.py +4 -4
  137. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/navigation/navigator.py +9070 -8461
  138. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/navigation/scanner.py +838 -832
  139. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/sphere.py +295 -295
  140. {hypertopos-0.2.0/hypertopos/navigation → hypertopos-0.2.2/hypertopos/storage}/__init__.py +4 -4
  141. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/storage/_schemas.py +50 -50
  142. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/storage/cache.py +30 -30
  143. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/storage/reader.py +1311 -1311
  144. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/storage/writer.py +931 -931
  145. hypertopos-0.2.2/hypertopos/utils/__init__.py +4 -0
  146. {hypertopos-0.2.0 → hypertopos-0.2.2}/hypertopos/utils/arrow.py +111 -111
  147. {hypertopos-0.2.0 → hypertopos-0.2.2}/pyproject.toml +50 -50
  148. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/conftest.py +83 -83
  149. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/fixtures/generate_fixtures.py +275 -275
  150. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_aggregation_engine.py +1884 -1884
  151. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_arrow_utils.py +183 -183
  152. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_builder.py +1810 -1810
  153. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_builder_alias.py +103 -103
  154. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_builder_derived.py +1228 -1228
  155. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_builder_edges.py +147 -147
  156. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_cache.py +41 -41
  157. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_calibration.py +279 -279
  158. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_chains.py +435 -435
  159. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_cli.py +129 -129
  160. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_cli_alias.py +257 -257
  161. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_cli_sources.py +343 -343
  162. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_compaction.py +4 -4
  163. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_composition.py +60 -60
  164. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_continuous_event_dims.py +533 -533
  165. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_data_quality_prop.py +291 -291
  166. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_datafusion_agg.py +788 -788
  167. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_detection.py +431 -406
  168. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_edge_table.py +189 -189
  169. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_engine.py +2119 -2119
  170. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_forecast.py +317 -317
  171. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_fts.py +511 -511
  172. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_geometric_path.py +682 -582
  173. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_geometry_stats.py +354 -354
  174. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_hybrid_search.py +284 -284
  175. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_incremental.py +233 -233
  176. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_invalidation.py +4 -4
  177. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_investigation.py +71 -71
  178. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_mapping.py +386 -386
  179. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_model.py +938 -938
  180. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_mvcc_session.py +261 -261
  181. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_navigation.py +7633 -7633
  182. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_navigator_alerts.py +49 -49
  183. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_observability.py +1361 -1361
  184. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_precision_stack.py +870 -870
  185. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_reputation.py +76 -76
  186. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_row_id_cache.py +205 -205
  187. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_scanner.py +659 -647
  188. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_sphere.py +205 -205
  189. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_sphere_overview_perf.py +75 -75
  190. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_stats_guard.py +41 -41
  191. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_storage.py +3354 -3354
  192. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_streaming_reads.py +144 -144
  193. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_subprocess_agg.py +961 -961
  194. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_temporal_centroids.py +358 -358
  195. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_trajectory_ann.py +259 -259
  196. hypertopos-0.2.2/tests/test_witness_cohort.py +223 -0
  197. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/test_witness_set.py +56 -56
  198. hypertopos-0.2.0/ROADMAP.md +0 -73
  199. hypertopos-0.2.0/hypertopos/utils/__init__.py +0 -4
  200. {hypertopos-0.2.0 → hypertopos-0.2.2}/tests/.gitkeep +0 -0
@@ -0,0 +1,35 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ build-and-publish:
13
+ name: Build and publish to PyPI
14
+ runs-on: ubuntu-latest
15
+ environment: pypi
16
+ permissions:
17
+ id-token: write # required for PyPI Trusted Publishing (OIDC)
18
+
19
+ steps:
20
+ - name: Checkout
21
+ uses: actions/checkout@v4
22
+
23
+ - name: Set up Python
24
+ uses: actions/setup-python@v5
25
+ with:
26
+ python-version: "3.12"
27
+
28
+ - name: Install build
29
+ run: python -m pip install --upgrade build
30
+
31
+ - name: Build sdist and wheel
32
+ run: python -m build
33
+
34
+ - name: Publish to PyPI
35
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -1,40 +1,40 @@
1
- # Python
2
- __pycache__/
3
- *.py[cod]
4
- *.pyo
5
- *.egg-info/
6
- dist/
7
- build/
8
- .venv/
9
- venv/
10
-
11
- # Testing
12
- .pytest_cache/
13
- .coverage
14
- htmlcov/
15
-
16
- # Type checking
17
- .mypy_cache/
18
-
19
- # Linting
20
- .ruff_cache/
21
-
22
- # IDE
23
- .idea/
24
- .vscode/
25
- .cursor/
26
- *.iml
27
-
28
- # Claude Code
29
- .claude/
30
- .worktrees/
31
- .agents/
32
-
33
- # Generated test fixtures
34
- tests/fixtures/gds/
35
-
36
- # Built spheres (output of hypertopos build)
37
- **/sphere/gds_*/
38
-
39
- # Build CLI cache (source parquet + chain pickle)
40
- .cache/
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.pyo
5
+ *.egg-info/
6
+ dist/
7
+ build/
8
+ .venv/
9
+ venv/
10
+
11
+ # Testing
12
+ .pytest_cache/
13
+ .coverage
14
+ htmlcov/
15
+
16
+ # Type checking
17
+ .mypy_cache/
18
+
19
+ # Linting
20
+ .ruff_cache/
21
+
22
+ # IDE
23
+ .idea/
24
+ .vscode/
25
+ .cursor/
26
+ *.iml
27
+
28
+ # Claude Code
29
+ .claude/
30
+ .worktrees/
31
+ .agents/
32
+
33
+ # Generated test fixtures
34
+ tests/fixtures/gds/
35
+
36
+ # Built spheres (output of hypertopos build)
37
+ **/sphere/gds_*/
38
+
39
+ # Build CLI cache (source parquet + chain pickle)
40
+ .cache/
@@ -1,156 +1,188 @@
1
- # Changelog
2
-
3
- All notable changes to hypertopos will be documented in this file.
4
-
5
- Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
- Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
-
8
- ## [0.2.0] — 2026-04-10
9
-
10
- ### Added
11
-
12
- **Edge Table**
13
- - Lance-based edge table per event pattern — auto-emitted at build time from FK data
14
- - BTREE indexes on `from_key`/`to_key` — O(log n) lookups at any scale
15
- - `GDSWriter.write_edges()`, `append_edges()`, `create_edge_indexes()`
16
- - `GDSReader.read_edges()`, `has_edge_table()`, `edge_table_stats()`
17
- - MVCC session pinning for edge tables
18
- - YAML `edge_table` config (optional, auto-detected from graph_features/relations)
19
- - `--no-edges` CLI flag
20
-
21
- **Navigation**
22
- - `find_geometric_path()` — beam search with geometric/anomaly/shortest/amount scoring
23
- - `discover_chains()` — runtime temporal BFS on edge table (no build-time extraction needed)
24
- - `find_counterparties()` — edge table fast path with BTREE lookup and amount aggregates
25
- - `entity_flow()` — net flow per counterparty via edge table
26
- - `contagion_score()` / `contagion_score_batch()` — anomaly neighborhood scoring via edge table
27
- - `degree_velocity()` — temporal connection velocity (degree change over time buckets)
28
- - `investigation_coverage()` — agent guidance: explored vs unexplored counterparty coverage
29
- - `propagate_influence()` — BFS influence propagation with geometric decay and tx_count weighting
30
- - `cluster_bridges()` — geometry+graph fusion: find entities bridging geometric clusters
31
- - `anomalous_edges()` — event-level scoring between entity pairs (uses event geometry, not anchor)
32
- - Amount-weighted scoring mode for `find_geometric_path` — `scoring="amount"`
33
- - Lazy adjacency expansion — never loads full edge table into memory
34
- - Anchor pattern resolution for geometric scoring (event pattern edge table → anchor pattern deltas)
35
- - Score interpretation hint in `find_geometric_path` summary
36
-
37
- **PassiveScanner**
38
- - `"graph"` source type — contagion scoring via edge table + geometry anomaly check
39
- - `add_graph_source()` — register graph contagion source with configurable threshold
40
- - `auto_discover()` — auto-detects graph sources for event patterns with edge tables
41
-
42
- **MCP Tools**
43
- - `find_geometric_path` — path finding with geometric coherence scoring (+ amount mode)
44
- - `discover_chains` — runtime chain discovery without pre-built chain lines
45
- - `edge_stats` — edge table statistics (row count, degree, timestamp/amount range)
46
- - `entity_flow` — net flow analysis per counterparty
47
- - `contagion_score` / `contagion_score_batch` — anomaly neighborhood scoring
48
- - `degree_velocity` — temporal connection velocity
49
- - `investigation_coverage` — agent guidance for investigation coverage
50
- - `propagate_influence` — BFS influence propagation with geometric decay and tx_count weighting
51
- - `cluster_bridges` — geometry+graph fusion cluster bridge analysis
52
- - `anomalous_edges` — event-level edge scoring between entity pairs
53
- - Output cap (top 20 paths / top 100 influenced) with warning when truncated
54
-
55
- **Builder**
56
- - Edge table emission in all build paths (standard, streaming, chunked)
57
- - Adjacency deduplication — one entry per unique neighbor
58
- - Self-loop filtering in graph traversal and temporal chain BFS
59
- - Edge stats cached at build time (`_gds_meta/edge_stats/`) for instant reads
60
- - Timestamp string parsing with sample-based format detection (6 formats supported)
61
- - Windows timezone database fallback in timestamp parsing
62
- - Edge table auto-detect infers `timestamp_col` and `amount_col` from common column names (`timestamp`/`ts`/`event_time`/`created_at`/`tx_date`/`date` and `amount_received`/`amount`/`amount_paid`/`value`/`total`/`amt`) when not explicitly configured
63
- - `sphere.json` edge_table metadata persists full config (`from_col`, `to_col`, plus `timestamp_col`/`amount_col` when set)
64
-
65
- ---
66
-
67
- ## [0.1.0] — 2026-04-07
68
-
69
- First public release. Core GDS stack.
70
-
71
- ### Added
72
-
73
- **Sphere Builder**
74
- - Declarative YAML config (`sphere.yaml`) with CLI: `hypertopos build`, `validate`, `info`
75
- - Three source tiers: single file (CSV/Parquet), multi-file join, Python script
76
- - Derived dimensions (count, sum, avg, windowed metrics, IET)
77
- - Precomputed dimensions with `edge_max` continuous mode
78
- - Graph features: `in_degree`, `out_degree`, `reciprocity`, `counterpart_overlap`
79
- - Composite lines (multi-key entities)
80
- - Chain lines (temporal BFS extraction with parallel processing)
81
- - Aliases with cutting-plane sub-populations
82
- - Temporal snapshot builder
83
- - `dimension_weights: kurtosis` automatic weighting
84
- - Incremental update (`GDSBuilder.incremental_update()`)
85
-
86
- **Navigation (π1–π12)**
87
- - π1 `walk_line` — step along a line
88
- - π2 `jump_polygon` — cross to related line via edge
89
- - π3 `dive_solid` — enter temporal history
90
- - π4 `emerge` — return to surface
91
- - π5 `attract_anomaly` — find outliers in population
92
- - π6 `attract_boundary` — find entities near alias boundary
93
- - π7 `attract_hub` — find most connected entities
94
- - π8 `attract_cluster` — discover geometric archetypes (k-means++)
95
- - π9 `attract_drift` — find entities with highest temporal drift
96
- - π10 `attract_trajectory` — find entities with similar trajectory (ANN)
97
- - π11 `attract_population_compare` — compare geometry across time windows
98
- - π12 `attract_regime_change` — detect structural shifts in population
99
-
100
- **Analysis & Investigation**
101
- - `explain_anomaly` — structured explanation with witness set, repair set, severity, reputation
102
- - `contrast_populations` — dimension-by-dimension comparison (Cohen's d)
103
- - `find_similar_entities` — ANN search in delta-space
104
- - `centroid_map` — group centroids for sub-population positioning
105
- - `composite_risk` — cross-pattern risk scoring (Fisher's method)
106
- - `cross_pattern_profile` — multi-pattern risk view for one entity
107
- - Full-text search (`search_entities_fts`) and hybrid search (semantic + FTS with RRF)
108
- - 10 detection recipes: cross-pattern discrepancy, neighbor contamination, trajectory anomaly, segment shift, event rate anomaly, hub concentration, subgroup inflation, collective drift, temporal burst, data quality
109
-
110
- **Forecasting**
111
- - Trajectory extrapolation (exponentially-weighted linear regression)
112
- - `forecast_anomaly_status` — predict future anomaly state
113
- - `forecast_segment_crossing` — predict boundary crossings
114
- - Pluggable `ForecastProvider` protocol for external backends
115
-
116
- **Model**
117
- - Point, Edge, Polygon, Solid, SolidSlice
118
- - Line, Pattern, Alias, Manifest, Contract
119
- - CalibrationTracker (online Welford drift detection)
120
- - MVCC sessions (version-pinned reads per agent)
121
-
122
- **Engine**
123
- - Delta vector computation with z-score normalization
124
- - Anomaly detection: theta threshold + conformal p-values
125
- - Mahalanobis variant (ellipsoidal boundary via Cholesky decomposition)
126
- - K-means++ clustering with automatic k selection (silhouette)
127
- - DTW trajectory comparison
128
- - Reputation scoring (Beta distribution posterior)
129
- - Investigation engine (witness set, anti-witness, severity classification)
130
- - Composition: Fisher's method for p-value combination, co-dispersion (Spearman)
131
-
132
- **Storage**
133
- - Arrow IPC format with Lance vector index (IVF-PQ)
134
- - BTREE, BITMAP, FTS indices on points
135
- - Append-only writes, LRU polygon cache
136
- - Geometry stats cache, temporal centroid cache, trajectory ANN index
137
- - Optional DataFusion SQL aggregation (~30x speedup on 5M+ events)
138
-
139
- **PassiveScanner**
140
- - Multi-source batch screening: geometry, borderline, points, compound sources
141
- - `auto_discover` — automatic source registration from sphere structure
142
- - Density boost, weighted scoring mode
143
- - 4 operating stages
144
-
145
- **Validation**
146
- - Berka banking benchmark (skill calibration, 6 runs)
147
- - NYC Yellow Taxi benchmark (domain generalization, 3 runs)
148
- - IBM AML benchmark (3-layer pipeline with cross-validation)
149
-
150
- **Documentation**
151
- - Quick Start guide
152
- - Core Concepts with mathematical foundation
153
- - API Reference with navigation primitive families
154
- - Configuration YAML reference with aliases
155
- - Physical data format reference
156
- - Architecture overview
1
+ # Changelog
2
+
3
+ All notable changes to hypertopos will be documented in this file.
4
+
5
+ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
+ Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.2.2] — 2026-04-11
9
+
10
+ ### Added
11
+
12
+ **Temporal as-of reconstruction across edge-table graph primitives**
13
+ - `contagion_score()`, `contagion_score_batch()` — optional keyword-only `timestamp_cutoff: float | None` parameter. When set, only edges with `timestamp <= timestamp_cutoff` are considered. Batch forwards the cutoff to every per-entity call.
14
+ - `entity_flow()` — same `timestamp_cutoff` parameter; both outgoing and incoming edge reads honor the cutoff, so net flow reflects the as-of graph state.
15
+ - `degree_velocity()` — same parameter; buckets derive from the filtered edge set so the last bucket endpoint is naturally `<= timestamp_cutoff`.
16
+ - `propagate_influence()` — same parameter; threaded through the BFS `_expand_neighbors` closure so expansion follows only edges with `timestamp <= cutoff`.
17
+ - `find_counterparties()` — same parameter on the edge-table fast path via `_find_counterparties_via_edges`. The points-scan fallback has no timestamp column and **raises `GDSNavigationError`** when `timestamp_cutoff` is supplied — fail loudly instead of silently returning unfiltered results.
18
+
19
+ The semantic mirrors the existing `WitnessCohortConfig.timestamp_cutoff` from 0.2.1: edges with `timestamp <= timestamp_cutoff` are included. Enables agents to reconstruct contagion, flow, connection velocity, and influence propagation state at a prior point in time — useful for incident forensics ("what did this neighborhood look like on the day the alert fired?"), retroactive detection validation, and historical-snapshot comparisons.
20
+
21
+ ### Fixed
22
+
23
+ - `detect_cross_pattern_discrepancy` no longer triggers full edge-table scans through `PassiveScanner.auto_discover`. The scanner gains an `include_graph: bool = True` keyword-only parameter; `detect_cross_pattern_discrepancy` calls it with `include_graph=False` because graph contagion plays no role in the downstream geometry-disagreement check. Eliminates the dominant latency regression on multi-pattern spheres with edge tables — the discrepancy detector previously paid one full edge-table read per event pattern with no signal benefit. Every other `auto_discover` caller (`composite_risk`, explicit scanner use) stays at the graph-enabled default.
24
+
25
+ ## [0.2.1] — 2026-04-11
26
+
27
+ ### Added
28
+
29
+ **Witness cohort discovery**
30
+ - `find_witness_cohort()` — rank entities that share the target's witness signature. **Investigative peer ranking, not edge forecasting.**
31
+ - Combines four signals: `exp(-distance/theta)` delta similarity (absolute, pool-independent), witness Jaccard overlap, trajectory cosine alignment (optional), graded anomaly bonus from `delta_rank_pct / 100`
32
+ - Excludes already-connected entities via BTREE edge lookup; bidirectional check by default; `timestamp_cutoff` for as-of evaluation in temporal hold-out
33
+ - Auto-resolves the event pattern with edge table covering an anchor's entity line; explicit `edge_pattern_id` override is validated
34
+ - Trajectory branch decided once per call (not per candidate) — when ref has trajectory, missing candidates get neutral 0.5 instead of mixed renormalization
35
+ - Batch trajectory load via single Lance scan instead of per-candidate (~11× speedup over the per-candidate path)
36
+ - `WitnessCohortConfig` and `WitnessCohortWeights` dataclasses group all tunable parameters; navigator API takes a single `config=` keyword
37
+ - `CohortMember` and `WitnessCohortResult` frozen dataclasses with per-component scores, exclusion counts, and reproducibility metadata
38
+ - `GDSEngine.witness_jaccard()`, `GDSEngine.trajectory_cosine()`, `GDSEngine.composite_link_score()` — pure scoring helpers exposed for reuse
39
+
40
+ ## [0.2.0] — 2026-04-10
41
+
42
+ ### Added
43
+
44
+ **Edge Table**
45
+ - Lance-based edge table per event pattern — auto-emitted at build time from FK data
46
+ - BTREE indexes on `from_key`/`to_key` — O(log n) lookups at any scale
47
+ - `GDSWriter.write_edges()`, `append_edges()`, `create_edge_indexes()`
48
+ - `GDSReader.read_edges()`, `has_edge_table()`, `edge_table_stats()`
49
+ - MVCC session pinning for edge tables
50
+ - YAML `edge_table` config (optional, auto-detected from graph_features/relations)
51
+ - `--no-edges` CLI flag
52
+
53
+ **Navigation**
54
+ - `find_geometric_path()` — beam search with geometric/anomaly/shortest/amount scoring
55
+ - `discover_chains()` — runtime temporal BFS on edge table (no build-time extraction needed)
56
+ - `find_counterparties()` — edge table fast path with BTREE lookup and amount aggregates
57
+ - `entity_flow()` — net flow per counterparty via edge table
58
+ - `contagion_score()` / `contagion_score_batch()` — anomaly neighborhood scoring via edge table
59
+ - `degree_velocity()` — temporal connection velocity (degree change over time buckets)
60
+ - `investigation_coverage()` — agent guidance: explored vs unexplored counterparty coverage
61
+ - `propagate_influence()` — BFS influence propagation with geometric decay and tx_count weighting
62
+ - `cluster_bridges()` — geometry+graph fusion: find entities bridging geometric clusters
63
+ - `anomalous_edges()` — event-level scoring between entity pairs (uses event geometry, not anchor)
64
+ - Amount-weighted scoring mode for `find_geometric_path` — `scoring="amount"`
65
+ - Lazy adjacency expansion — never loads full edge table into memory
66
+ - Anchor pattern resolution for geometric scoring (event pattern edge table → anchor pattern deltas)
67
+ - Score interpretation hint in `find_geometric_path` summary
68
+
69
+ **PassiveScanner**
70
+ - `"graph"` source type — contagion scoring via edge table + geometry anomaly check
71
+ - `add_graph_source()` — register graph contagion source with configurable threshold
72
+ - `auto_discover()` — auto-detects graph sources for event patterns with edge tables
73
+
74
+ **MCP Tools**
75
+ - `find_geometric_path` — path finding with geometric coherence scoring (+ amount mode)
76
+ - `discover_chains` — runtime chain discovery without pre-built chain lines
77
+ - `edge_stats` — edge table statistics (row count, degree, timestamp/amount range)
78
+ - `entity_flow` — net flow analysis per counterparty
79
+ - `contagion_score` / `contagion_score_batch` — anomaly neighborhood scoring
80
+ - `degree_velocity` — temporal connection velocity
81
+ - `investigation_coverage` — agent guidance for investigation coverage
82
+ - `propagate_influence` — BFS influence propagation with geometric decay and tx_count weighting
83
+ - `cluster_bridges` — geometry+graph fusion cluster bridge analysis
84
+ - `anomalous_edges` — event-level edge scoring between entity pairs
85
+ - Output cap (top 20 paths / top 100 influenced) with warning when truncated
86
+
87
+ **Builder**
88
+ - Edge table emission in all build paths (standard, streaming, chunked)
89
+ - Adjacency deduplication — one entry per unique neighbor
90
+ - Self-loop filtering in graph traversal and temporal chain BFS
91
+ - Edge stats cached at build time (`_gds_meta/edge_stats/`) for instant reads
92
+ - Timestamp string parsing with sample-based format detection (6 formats supported)
93
+ - Windows timezone database fallback in timestamp parsing
94
+ - Edge table auto-detect infers `timestamp_col` and `amount_col` from common column names (`timestamp`/`ts`/`event_time`/`created_at`/`tx_date`/`date` and `amount_received`/`amount`/`amount_paid`/`value`/`total`/`amt`) when not explicitly configured
95
+ - `sphere.json` edge_table metadata persists full config (`from_col`, `to_col`, plus `timestamp_col`/`amount_col` when set)
96
+
97
+ ---
98
+
99
+ ## [0.1.0] — 2026-04-07
100
+
101
+ First public release. Core GDS stack.
102
+
103
+ ### Added
104
+
105
+ **Sphere Builder**
106
+ - Declarative YAML config (`sphere.yaml`) with CLI: `hypertopos build`, `validate`, `info`
107
+ - Three source tiers: single file (CSV/Parquet), multi-file join, Python script
108
+ - Derived dimensions (count, sum, avg, windowed metrics, IET)
109
+ - Precomputed dimensions with `edge_max` continuous mode
110
+ - Graph features: `in_degree`, `out_degree`, `reciprocity`, `counterpart_overlap`
111
+ - Composite lines (multi-key entities)
112
+ - Chain lines (temporal BFS extraction with parallel processing)
113
+ - Aliases with cutting-plane sub-populations
114
+ - Temporal snapshot builder
115
+ - `dimension_weights: kurtosis` automatic weighting
116
+ - Incremental update (`GDSBuilder.incremental_update()`)
117
+
118
+ **Navigation (π1–π12)**
119
+ - π1 `walk_line` — step along a line
120
+ - π2 `jump_polygon` — cross to related line via edge
121
+ - π3 `dive_solid` — enter temporal history
122
+ - π4 `emerge` — return to surface
123
+ - π5 `attract_anomaly` — find outliers in population
124
+ - π6 `attract_boundary` — find entities near alias boundary
125
+ - π7 `attract_hub` — find most connected entities
126
+ - π8 `attract_cluster` — discover geometric archetypes (k-means++)
127
+ - π9 `attract_drift` — find entities with highest temporal drift
128
+ - π10 `attract_trajectory` — find entities with similar trajectory (ANN)
129
+ - π11 `attract_population_compare` — compare geometry across time windows
130
+ - π12 `attract_regime_change` — detect structural shifts in population
131
+
132
+ **Analysis & Investigation**
133
+ - `explain_anomaly` — structured explanation with witness set, repair set, severity, reputation
134
+ - `contrast_populations` — dimension-by-dimension comparison (Cohen's d)
135
+ - `find_similar_entities` — ANN search in delta-space
136
+ - `centroid_map` — group centroids for sub-population positioning
137
+ - `composite_risk` — cross-pattern risk scoring (Fisher's method)
138
+ - `cross_pattern_profile` — multi-pattern risk view for one entity
139
+ - Full-text search (`search_entities_fts`) and hybrid search (semantic + FTS with RRF)
140
+ - 10 detection recipes: cross-pattern discrepancy, neighbor contamination, trajectory anomaly, segment shift, event rate anomaly, hub concentration, subgroup inflation, collective drift, temporal burst, data quality
141
+
142
+ **Forecasting**
143
+ - Trajectory extrapolation (exponentially-weighted linear regression)
144
+ - `forecast_anomaly_status` — predict future anomaly state
145
+ - `forecast_segment_crossing` — predict boundary crossings
146
+ - Pluggable `ForecastProvider` protocol for external backends
147
+
148
+ **Model**
149
+ - Point, Edge, Polygon, Solid, SolidSlice
150
+ - Line, Pattern, Alias, Manifest, Contract
151
+ - CalibrationTracker (online Welford drift detection)
152
+ - MVCC sessions (version-pinned reads per agent)
153
+
154
+ **Engine**
155
+ - Delta vector computation with z-score normalization
156
+ - Anomaly detection: theta threshold + conformal p-values
157
+ - Mahalanobis variant (ellipsoidal boundary via Cholesky decomposition)
158
+ - K-means++ clustering with automatic k selection (silhouette)
159
+ - DTW trajectory comparison
160
+ - Reputation scoring (Beta distribution posterior)
161
+ - Investigation engine (witness set, anti-witness, severity classification)
162
+ - Composition: Fisher's method for p-value combination, co-dispersion (Spearman)
163
+
164
+ **Storage**
165
+ - Arrow IPC format with Lance vector index (IVF-PQ)
166
+ - BTREE, BITMAP, FTS indices on points
167
+ - Append-only writes, LRU polygon cache
168
+ - Geometry stats cache, temporal centroid cache, trajectory ANN index
169
+ - Optional DataFusion SQL aggregation (~30x speedup on 5M+ events)
170
+
171
+ **PassiveScanner**
172
+ - Multi-source batch screening: geometry, borderline, points, compound sources
173
+ - `auto_discover` — automatic source registration from sphere structure
174
+ - Density boost, weighted scoring mode
175
+ - 4 operating stages
176
+
177
+ **Validation**
178
+ - Berka banking benchmark (skill calibration, 6 runs)
179
+ - NYC Yellow Taxi benchmark (domain generalization, 3 runs)
180
+ - IBM AML benchmark (3-layer pipeline with cross-validation)
181
+
182
+ **Documentation**
183
+ - Quick Start guide
184
+ - Core Concepts with mathematical foundation
185
+ - API Reference with navigation primitive families
186
+ - Configuration YAML reference with aliases
187
+ - Physical data format reference
188
+ - Architecture overview