hypertopos 0.3.1__tar.gz → 0.3.3__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 (215) hide show
  1. {hypertopos-0.3.1 → hypertopos-0.3.3}/CHANGELOG.md +29 -0
  2. {hypertopos-0.3.1 → hypertopos-0.3.3}/LICENSE.md +1 -1
  3. {hypertopos-0.3.1 → hypertopos-0.3.3}/PKG-INFO +1 -1
  4. hypertopos-0.3.3/README.md +69 -0
  5. hypertopos-0.3.3/ROADMAP.md +84 -0
  6. {hypertopos-0.3.1 → hypertopos-0.3.3}/SECURITY.md +2 -1
  7. hypertopos-0.3.3/docs/README.md +22 -0
  8. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/api-reference.md +2 -1
  9. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/configuration.md +34 -0
  10. hypertopos-0.3.3/docs/introduction.md +57 -0
  11. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/quickstart.md +5 -1
  12. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/builder/_writer.py +2 -2
  13. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/builder/builder.py +399 -80
  14. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/builder/derived.py +268 -1
  15. hypertopos-0.3.3/hypertopos/builder/dim_blocks.py +110 -0
  16. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/cli/build.py +9 -0
  17. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/cli/schema.py +45 -0
  18. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/engine/geometry.py +70 -9
  19. hypertopos-0.3.3/hypertopos/engine/heredity.py +109 -0
  20. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/navigation/navigator.py +151 -6
  21. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/storage/writer.py +7 -5
  22. {hypertopos-0.3.1 → hypertopos-0.3.3}/pyproject.toml +1 -1
  23. hypertopos-0.3.3/tests/test_builder_temporal_perf.py +309 -0
  24. hypertopos-0.3.3/tests/test_dim_blocks.py +324 -0
  25. hypertopos-0.3.3/tests/test_heredity.py +320 -0
  26. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_navigation.py +182 -3
  27. hypertopos-0.3.1/README.md +0 -121
  28. hypertopos-0.3.1/ROADMAP.md +0 -94
  29. hypertopos-0.3.1/docs/README.md +0 -38
  30. {hypertopos-0.3.1 → hypertopos-0.3.3}/.github/workflows/publish-pypi.yml +0 -0
  31. {hypertopos-0.3.1 → hypertopos-0.3.3}/.gitignore +0 -0
  32. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/architecture.md +0 -0
  33. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/LICENSE +0 -0
  34. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/README.md +0 -0
  35. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/README.md +0 -0
  36. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/SUMMARY.md +0 -0
  37. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-a-report.md +0 -0
  38. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-a-scoring.md +0 -0
  39. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-b-report.md +0 -0
  40. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-b-scoring.md +0 -0
  41. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-settings.md +0 -0
  42. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-a-report.md +0 -0
  43. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-a-scoring.md +0 -0
  44. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-b-report.md +0 -0
  45. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-b-scoring.md +0 -0
  46. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-settings.md +0 -0
  47. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-a-report.md +0 -0
  48. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-a-scoring.md +0 -0
  49. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-b-report.md +0 -0
  50. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-b-scoring.md +0 -0
  51. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-settings.md +0 -0
  52. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-a-report.md +0 -0
  53. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-a-scoring.md +0 -0
  54. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-b-report.md +0 -0
  55. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-b-scoring.md +0 -0
  56. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-settings.md +0 -0
  57. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-a-report.md +0 -0
  58. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-a-scoring.md +0 -0
  59. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-b-report.md +0 -0
  60. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-b-scoring.md +0 -0
  61. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-settings.md +0 -0
  62. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-a-report.md +0 -0
  63. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-a-scoring.md +0 -0
  64. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-b-report.md +0 -0
  65. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-b-scoring.md +0 -0
  66. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-settings.md +0 -0
  67. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/sphere/prepare_accounts.py +0 -0
  68. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/sphere/prepare_cpty_banks.py +0 -0
  69. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/sphere/prepare_districts.py +0 -0
  70. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/sphere/prepare_loan_accounts.py +0 -0
  71. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/sphere/prepare_operations.py +0 -0
  72. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/sphere/prepare_orders.py +0 -0
  73. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/sphere/prepare_transactions.py +0 -0
  74. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/sphere/prepare_tx_types.py +0 -0
  75. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/berka/sphere/sphere.yaml +0 -0
  76. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/ibm-aml/README.md +0 -0
  77. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/ibm-aml/_layer2_cross_eval.py +0 -0
  78. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/ibm-aml/_layer3_cross_eval.py +0 -0
  79. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_accounts.py +0 -0
  80. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_currencies.py +0 -0
  81. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_payment_formats.py +0 -0
  82. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_transactions.py +0 -0
  83. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/ibm-aml/hi_small_sphere/sphere.yaml +0 -0
  84. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/ibm-aml/layer1_passive_scan.py +0 -0
  85. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/ibm-aml/layer2_xgboost_sweep.py +0 -0
  86. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/ibm-aml/layer3_typology_filter.py +0 -0
  87. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/ibm-aml/li_small_sphere/prepare_accounts.py +0 -0
  88. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/ibm-aml/li_small_sphere/prepare_currencies.py +0 -0
  89. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/ibm-aml/li_small_sphere/prepare_payment_formats.py +0 -0
  90. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/ibm-aml/li_small_sphere/prepare_transactions.py +0 -0
  91. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/ibm-aml/li_small_sphere/sphere.yaml +0 -0
  92. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/ibm-aml/passive-scan-calibration.md +0 -0
  93. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/nyc-taxi/README.md +0 -0
  94. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/nyc-taxi/results/0.1.0/SUMMARY.md +0 -0
  95. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-a-report.md +0 -0
  96. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-a-scoring.md +0 -0
  97. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-b-report.md +0 -0
  98. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-b-scoring.md +0 -0
  99. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-c-report.md +0 -0
  100. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-settings.md +0 -0
  101. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-a-report.md +0 -0
  102. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-a-scoring.md +0 -0
  103. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-b-report.md +0 -0
  104. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-b-scoring.md +0 -0
  105. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-c-report.md +0 -0
  106. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-settings.md +0 -0
  107. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-a-report.md +0 -0
  108. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-a-scoring.md +0 -0
  109. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-b-report.md +0 -0
  110. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-b-scoring.md +0 -0
  111. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-c-report.md +0 -0
  112. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-settings.md +0 -0
  113. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/nyc-taxi/sphere/prepare_trips.py +0 -0
  114. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmark/nyc-taxi/sphere/sphere.yaml +0 -0
  115. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/benchmarks.md +0 -0
  116. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/concepts.md +0 -0
  117. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/data-format.md +0 -0
  118. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/images/build-pipeline.svg +0 -0
  119. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/images/core-objects.svg +0 -0
  120. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/images/cutting-plane.svg +0 -0
  121. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/images/directory-layout.svg +0 -0
  122. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/images/hypertopos-overview.svg +0 -0
  123. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/images/model-lifecycle.svg +0 -0
  124. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/images/navigation-primitives.svg +0 -0
  125. {hypertopos-0.3.1 → hypertopos-0.3.3}/docs/images/three-scales.svg +0 -0
  126. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/__init__.py +0 -0
  127. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/builder/__init__.py +0 -0
  128. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/builder/_scatter.py +0 -0
  129. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/builder/_stats.py +0 -0
  130. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/builder/mapping.py +0 -0
  131. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/cli/__init__.py +0 -0
  132. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/cli/__main__.py +0 -0
  133. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/cli/info.py +0 -0
  134. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/cli/main.py +0 -0
  135. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/cli/sources.py +0 -0
  136. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/engine/__init__.py +0 -0
  137. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/engine/aggregation.py +0 -0
  138. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/engine/calibration.py +0 -0
  139. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/engine/chains.py +0 -0
  140. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/engine/composition.py +0 -0
  141. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/engine/fdr.py +0 -0
  142. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/engine/forecast.py +0 -0
  143. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/engine/invalidation.py +0 -0
  144. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/engine/investigation.py +0 -0
  145. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/engine/lance_sql_agg.py +0 -0
  146. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/engine/selection.py +0 -0
  147. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/model/__init__.py +0 -0
  148. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/model/manifest.py +0 -0
  149. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/model/objects.py +0 -0
  150. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/model/sphere.py +0 -0
  151. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/navigation/__init__.py +0 -0
  152. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/navigation/scanner.py +0 -0
  153. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/sphere.py +0 -0
  154. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/storage/__init__.py +0 -0
  155. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/storage/_schemas.py +0 -0
  156. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/storage/cache.py +0 -0
  157. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/storage/reader.py +0 -0
  158. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/utils/__init__.py +0 -0
  159. {hypertopos-0.3.1 → hypertopos-0.3.3}/hypertopos/utils/arrow.py +0 -0
  160. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/.gitkeep +0 -0
  161. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/conftest.py +0 -0
  162. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/fixtures/generate_fixtures.py +0 -0
  163. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_aggregation_engine.py +0 -0
  164. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_arrow_utils.py +0 -0
  165. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_builder.py +0 -0
  166. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_builder_alias.py +0 -0
  167. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_builder_chunking.py +0 -0
  168. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_builder_contagion.py +0 -0
  169. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_builder_derived.py +0 -0
  170. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_builder_edges.py +0 -0
  171. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_builder_rolling_z.py +0 -0
  172. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_builder_scatter.py +0 -0
  173. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_cache.py +0 -0
  174. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_calibration.py +0 -0
  175. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_chains.py +0 -0
  176. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_cli.py +0 -0
  177. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_cli_alias.py +0 -0
  178. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_cli_sources.py +0 -0
  179. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_compaction.py +0 -0
  180. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_composition.py +0 -0
  181. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_continuous_event_dims.py +0 -0
  182. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_data_quality_prop.py +0 -0
  183. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_detection.py +0 -0
  184. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_edge_table.py +0 -0
  185. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_engine.py +0 -0
  186. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_fdr.py +0 -0
  187. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_forecast.py +0 -0
  188. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_fts.py +0 -0
  189. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_geometric_path.py +0 -0
  190. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_geometry_stats.py +0 -0
  191. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_hybrid_search.py +0 -0
  192. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_incremental.py +0 -0
  193. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_invalidation.py +0 -0
  194. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_investigation.py +0 -0
  195. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_lance_sql_agg.py +0 -0
  196. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_mapping.py +0 -0
  197. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_model.py +0 -0
  198. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_mvcc_session.py +0 -0
  199. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_navigator_alerts.py +0 -0
  200. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_navigator_fdr_select.py +0 -0
  201. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_observability.py +0 -0
  202. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_precision_stack.py +0 -0
  203. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_reputation.py +0 -0
  204. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_row_id_cache.py +0 -0
  205. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_scanner.py +0 -0
  206. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_selection.py +0 -0
  207. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_sphere.py +0 -0
  208. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_sphere_overview_perf.py +0 -0
  209. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_stats_guard.py +0 -0
  210. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_storage.py +0 -0
  211. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_streaming_reads.py +0 -0
  212. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_temporal_centroids.py +0 -0
  213. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_trajectory_ann.py +0 -0
  214. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_witness_cohort.py +0 -0
  215. {hypertopos-0.3.1 → hypertopos-0.3.3}/tests/test_witness_set.py +0 -0
@@ -5,6 +5,35 @@ 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.3.3] — 2026-04-13
11
+
12
+ ### Added
13
+
14
+ - `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).
15
+ - `metric` parameter on `find_similar_entities` — `"L2"` (default Euclidean) or `"cosine"` (shape similarity ignoring magnitude). Cosine compares anomaly profile direction, not severity.
16
+ - `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.
17
+ - `push-mirrors.sh --from-ref` mode for incremental mirror pushes between tagged releases, with pre/post author verification guard.
18
+
19
+ ## [0.3.2] — 2026-04-13
20
+
21
+ ### Added
22
+
23
+ - Generalized dimension blocks (g/t/s). `geo_properties`, `metric_properties`, and `semantic_dim` optional fields on pattern config. Geographic and metric blocks use empirical mu/sigma normalization; semantic block applies SVD-based PCA dimensionality reduction. Dimension names are prefixed (`g:lat`, `t:balance`, `s:pc0`) for identification in `explain_anomaly` output. All optional — existing configs unaffected.
24
+ - `find_novel_entities(pattern_id)` navigator method. Ranks entities by geometric deviation from neighbor-expected position using edge table adjacency. High novelty_score = entity doesn't behave like its neighborhood. Requires a pattern with an edge table.
25
+ - `engine/heredity.py` module: `compute_expected_delta`, `compute_novelty_score`, `compute_novelty_decomposition` — pure NumPy scoring functions for geometric heredity.
26
+ - `builder/dim_blocks.py` module: `normalize_metric_block`, `normalize_geo_block`, `normalize_semantic_block` — normalization helpers for generalized dimension blocks.
27
+
28
+ ### Changed
29
+
30
+ - Temporal build: `reciprocity` and `counterpart_overlap` graph features replaced per-window Arrow fallback with NumPy integer-encoded set operations. One-time entity encoding via `pc.index_in`, then per-bucket `np.unique` + `np.intersect1d` + `np.bincount`. Eliminates Arrow table construction and hash joins per temporal window.
31
+ - Temporal build: `in_degree`/`out_degree` use single-pass Arrow `group_by([key, bucket]).aggregate([count_distinct])` across all buckets. Eliminates O(n_buckets) per-window iterations.
32
+ - Temporal build: chunked path pre-computes derived-dim groupby tables and graph feature tensors once before the entity chunk loop. Eliminates redundant full event-table scans per chunk.
33
+ - Geometry build: per-dimension BTREE scalar indices (`delta_dim_0` through `delta_dim_N`) replaced with Lance zone-map filtering. Saves sequential index builds proportional to dimension count.
34
+ - Geometry build: streaming path keeps `is_anomaly` in memory instead of re-reading from Lance after finalization.
35
+ - Lance compaction `target_rows_per_fragment` raised from 1M to 4M for temporal, geometry, and geometry chunk finalization — fewer fragments to merge during compaction.
36
+
8
37
  ## [0.3.1] — 2026-04-12
9
38
 
10
39
  ### 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-12
29
+ **Change Date:** 2029-04-13
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.1
3
+ Version: 0.3.3
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,69 @@
1
+ # hypertopos
2
+
3
+ > Understand the structure of your data — without training machine learning models.
4
+
5
+ [![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue.svg)](https://www.python.org/downloads/)
6
+ [![License: BSL 1.1](https://img.shields.io/badge/license-BSL%201.1-orange.svg)](LICENSE.md)
7
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.19482069.svg)](https://doi.org/10.5281/zenodo.19482069)
8
+ [![PyArrow](https://img.shields.io/badge/format-PyArrow-red.svg)](https://arrow.apache.org/docs/python/)
9
+ [![Lance](https://img.shields.io/badge/storage-Lance-blueviolet.svg)](https://github.com/lance-format/lance)
10
+ [![MCP](https://img.shields.io/badge/MCP-compatible-green.svg)](https://modelcontextprotocol.io)
11
+ [![Version](https://img.shields.io/badge/version-0.3.3-%235500FF.svg)](pyproject.toml)
12
+
13
+ hypertopos transforms relational data into a geometric space where every entity gets a coordinate derived from its relationships. Distance from the population center reveals anomalies. Proximity between entities reveals similarity. Movement over time reveals drift. No training, no labels — geometry is computed from the data.
14
+
15
+ ```bash
16
+ pip install hypertopos
17
+ ```
18
+
19
+ ![hypertopos overview](docs/images/hypertopos-overview.svg)
20
+
21
+ ## What you can do with it
22
+
23
+ - Detect anomalies without training ML models or labeling data
24
+ - Discover clusters and structural archetypes
25
+ - Track behavioral drift over time
26
+ - Compare populations to find what differentiates them
27
+ - Explore datasets with AI agents that navigate rather than query
28
+
29
+ ## How it works
30
+
31
+ 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.
32
+
33
+ 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.
34
+
35
+ For the full picture: [Introduction](docs/introduction.md) · [Core Concepts](docs/concepts.md) · [Quick Start](docs/quickstart.md)
36
+
37
+ ## Benchmarks
38
+
39
+ Validated on three domains with the same engine, zero domain rules, zero labels:
40
+
41
+ | Domain | Dataset | Key result |
42
+ |--------|---------|------------|
43
+ | Banking | Berka (Czech, real data) | 85.5% recall on loan defaults |
44
+ | AML | IBM AML (synthetic) | 80.4% recall, zero labels |
45
+ | Transport | NYC Yellow Taxi (7.6M trips) | 8/8 anomaly categories detected |
46
+
47
+ 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.
48
+
49
+ Full results: [Benchmarks](docs/benchmarks.md)
50
+
51
+ ## Documentation
52
+
53
+ | | |
54
+ |---|---|
55
+ | [Introduction](docs/introduction.md) | The idea and where it stands |
56
+ | [Quick Start](docs/quickstart.md) | Install, build, navigate |
57
+ | [Core Concepts](docs/concepts.md) | Mathematical foundation |
58
+ | [Configuration](docs/configuration.md) | Sphere builder YAML reference |
59
+ | [API Reference](docs/api-reference.md) | Python API |
60
+ | [Data Format](docs/data-format.md) | On-disk storage format |
61
+ | [Architecture](docs/architecture.md) | Package layers and design |
62
+
63
+ ## Status
64
+
65
+ Research-stage project. Working code, reproducible benchmarks, active development. API may change.
66
+
67
+ ## License
68
+
69
+ [Business Source License 1.1](LICENSE.md). Free for internal use, development, testing, and research. See LICENSE.md for details.
@@ -0,0 +1,84 @@
1
+ # hypertopos — Roadmap
2
+
3
+ > Planned direction. Priorities may change based on feedback.
4
+
5
+ ## Plan: 0.4.0
6
+
7
+ Investigation depth + detection quality — new geometric primitives, agent trust, calibration.
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
+ - **Theta calibration fix** — builder writes correct theta_norm to sphere.json at build time; eliminates miscalibration on mixed-type patterns.
12
+ - **Geometric edge potential** — relationship anomaly scoring via endpoint geometric distance; flags edges connecting geometrically distant entities.
13
+ - **Geometric dark matter** — population density gap detection; identifies coordinate-space regions that should have entities but are empty (anomaly by absence).
14
+ - **Gradient alignment on drift** — drift direction signal (normalizing vs deteriorating) on `find_drifting_entities` and `dive_solid`.
15
+ - **Interpretive MCP output** — computed interpretation fields on tool responses (`passive_scan`, `find_similar_entities`, `dive_solid`, `find_regime_changes`) so agents stop misreading raw numbers.
16
+ - **Anomaly confidence via bootstrap** — `anomaly_confidence: 0–1` per entity quantifying how stable the anomaly verdict is under population perturbation.
17
+
18
+ ---
19
+
20
+ ## Plan: 0.5.0
21
+
22
+ Edge-derived geometry + advanced analytics.
23
+
24
+ - **Edge-derived dimensions on event patterns** — pair-level and node-derived features computed at build time as geometric dimensions.
25
+ - **`find_motif` — structural pattern matching on edge table** — per-hop predicates for subgraph patterns invisible to flat queries.
26
+ - **Advanced coordinate space analytics** — new methods leveraging properties unique to population-relative coordinate construction.
27
+
28
+ ---
29
+
30
+ ## 0.3.0
31
+
32
+ Lance perf upgrade, FDR control, builder intelligence.
33
+
34
+ - **0.3.0** — Aggregate engine rewritten around Lance SQL, precomputed contagion stats, format 2.2, edge table auto-detect fix.
35
+ - **0.3.1** — Benjamini-Hochberg FDR control, submodular facility location, vectorized build with adaptive memory chunking.
36
+ - **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`).
37
+ - **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.
38
+
39
+ ---
40
+
41
+ ## 0.2.0
42
+
43
+ Graph meets geometry — edge table, runtime traversal, contagion/influence.
44
+
45
+ - **0.2.0** — Edge table, +11 navigator functions, contagion/influence primitives.
46
+ - **0.2.1** — Witness cohort discovery, investigative peer ranking.
47
+ - **0.2.2** — As-of graph reconstruction, `detect_cross_pattern_discrepancy` latency fix.
48
+
49
+ ---
50
+
51
+ ## 0.1.0
52
+
53
+ First public release — full GDS stack, π1–π12, builder, MCP server, validation suite.
54
+
55
+ ---
56
+
57
+ ## Future
58
+
59
+ **Detection quality**
60
+ - Edge-derived dimensions + temporal motif matcher
61
+ - Confidence scoring, robust estimators, multi-scale resolution — improve anomaly precision and reduce false positives on heavy-tail and multi-modal populations
62
+
63
+ **Builder evolution**
64
+ - Incremental rebuild — geometry-only without `--force` wipe
65
+
66
+ **PassiveScanner evolution**
67
+ - Native temporal source support for direct temporal inputs, without requiring manual dataset plumbing in benchmark scripts
68
+ - Optional weighted scoring mode that uses continuous intensity instead of binary counts
69
+ - **SphereProfiler** — autonomous sphere scanner that profiles all patterns, runs calibration sweeps across source combinations, proposes optimal PassiveScanner composition for Layer 1 surveillance.
70
+
71
+ **Code refactoring**
72
+ - Break up oversized modules into smaller, domain-focused components
73
+ - Reduce coupling between core layers
74
+ - Consolidate repeated orchestration logic into shared helpers
75
+
76
+ **Cross-sphere capabilities**
77
+ - Cross-sphere comparison — dimensionless metrics across independently calibrated coordinate spaces
78
+ - What-if analysis — hypothetical edge changes producing modified coordinate vectors
79
+
80
+ **Enterprise / governance**
81
+ - Dimension access control — per-agent visibility constraints on delta dimensions
82
+
83
+ **Tooling**
84
+ - Runtime latency benchmarks in package docs
@@ -1,6 +1,6 @@
1
1
  # Security
2
2
 
3
- ## Current version: 0.3.0
3
+ ## Current version: 0.3.3
4
4
 
5
5
  hypertopos runs locally. No network services, no auth layer, no multi-tenancy.
6
6
 
@@ -9,6 +9,7 @@ hypertopos runs locally. No network services, no auth layer, no multi-tenancy.
9
9
  - **Pickle files** — chain cache (`.cache/chains_*.pkl`) uses pickle. Don't load cache files from untrusted sources.
10
10
  - **Sphere paths** — `HyperSphere.open(path)` reads from the local filesystem. Don't point it at user-controlled paths without validation.
11
11
  - **MCP server** — communicates over stdio. Not designed for network exposure.
12
+ - **SQL injection protection** — `lance_sql_agg` validates user-controlled SQL inputs. Filter values are escaped (doubles single quotes, rejects backslash and ASCII control chars). Column identifiers are validated against `^[A-Za-z_][A-Za-z0-9_]*$`.
12
13
 
13
14
  ## Reporting
14
15
 
@@ -0,0 +1,22 @@
1
+ # hypertopos Documentation
2
+
3
+ hypertopos turns relational data into navigable geometric space — a coordinate system where structure, anomalies, and change become directly observable.
4
+
5
+ **New here?** Read the [Introduction](introduction.md) for the idea, then [Quick Start](quickstart.md) to try it.
6
+
7
+ **Want depth?** [Core Concepts](concepts.md) covers the mathematical foundation, objects, and vocabulary.
8
+
9
+ **Building something?** Jump to the reference docs below.
10
+
11
+ ## Documents
12
+
13
+ | Document | What it covers |
14
+ |----------|----------------|
15
+ | [Introduction](introduction.md) | The idea, how it works, where it stands |
16
+ | [Quick Start](quickstart.md) | Install, build a sphere, connect an agent |
17
+ | [Core Concepts](concepts.md) | Mathematical foundation, objects, population model |
18
+ | [Architecture](architecture.md) | Package layers, runtime flow, design decisions |
19
+ | [Configuration](configuration.md) | Sphere builder YAML reference |
20
+ | [API Reference](api-reference.md) | Python API — classes, methods, errors |
21
+ | [Data Format](data-format.md) | On-disk layout, Arrow schemas, sphere.json |
22
+ | [Benchmarks](benchmarks.md) | Validation results — banking, AML, transportation |
@@ -133,6 +133,7 @@ with sphere.session("agent-1") as session:
133
133
  | `cluster_bridges(pattern_id, n_clusters=5, top_n_bridges=10)` | Find entities bridging geometric clusters via edge table. Runs π8 clustering then identifies cross-cluster edges and bridge entities |
134
134
  | `anomalous_edges(from_key, to_key, pattern_id, top_n=10)` | Find edges between two entities enriched with event-level geometry (delta_norm, is_anomaly). Unlike path tools which score entities (anchor), this scores individual transactions (event geometry) |
135
135
  | `find_witness_cohort(primary_key, pattern_id, top_n=10, *, config=None, edge_pattern_id=None)` | Rank entities that share the target's witness signature. Investigative peer ranking — NOT edge forecasting. Combines four signals: `exp(-distance/theta)` delta similarity, witness Jaccard overlap, trajectory cosine alignment (optional), and graded anomaly bonus from `delta_rank_pct`. Excludes entities already connected via BTREE edge lookup — this is the function's main contribution over plain ANN. Configure via `WitnessCohortConfig(weights=WitnessCohortWeights(...), candidate_pool, min_witness_overlap, min_score, use_trajectory, bidirectional_check, timestamp_cutoff)`. Returns `WitnessCohortResult` with ranked `CohortMember` items, per-component scores, exclusion counts, and reproducibility metadata |
136
+ | `find_novel_entities(pattern_id, top_n=10, sample_size=5000)` | Rank entities by geometric deviation from neighbor-expected position using edge table adjacency. High `novelty_score` = entity doesn't behave like its neighborhood. Requires a pattern with an edge table. Returns list of dicts with `primary_key`, `novelty_score`, and per-dimension decomposition |
136
137
 
137
138
  ### Analysis and Detection
138
139
 
@@ -142,7 +143,7 @@ with sphere.session("agent-1") as session:
142
143
  |--------|-------------|
143
144
  | `explain_anomaly(primary_key, pattern_id)` | Structured investigation: severity, witness set, repair set, conformal p-value, reputation |
144
145
  | `explain_anomaly_chain(primary_key, pattern_id, max_hops)` | Trace anomaly propagation through geometric neighbors |
145
- | `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` |
146
147
  | `contrast_populations(pattern_id, group_a, group_b)` | Dimension-by-dimension comparison of two entity groups (Cohen's d) |
147
148
  | `composite_risk(primary_key, line_id)` | Fisher's method combination of conformal p-values across patterns |
148
149
  | `composite_risk_batch(primary_keys, line_id)` | Batch Fisher combination for multiple entities |
@@ -394,6 +394,40 @@ patterns:
394
394
 
395
395
  To skip edge table emission entirely (e.g. for faster iterative builds), use the `--no-edges` CLI flag.
396
396
 
397
+ ### Generalized Dimension Blocks
398
+
399
+ Patterns optionally accept three additional dimension block fields that inject geographic, metric, or semantic columns from the entity line into the delta vector. All three are optional — existing configs are unaffected.
400
+
401
+ ```yaml
402
+ patterns:
403
+ account_pattern:
404
+ type: anchor
405
+ entity_line: accounts
406
+ # ... existing fields (derived_dimensions, relations, etc.) ...
407
+
408
+ # Generalized dimension blocks (optional)
409
+ geo_properties: # list of geographic column names from entity line
410
+ - latitude
411
+ - longitude
412
+ metric_properties: # list of numeric column names from entity line
413
+ - balance
414
+ - credit_limit
415
+ semantic_dim: # embedding dimensionality reduction
416
+ columns:
417
+ - description_embedding
418
+ n_components: 8 # target PCA dimensions
419
+ ```
420
+
421
+ | Field | Type | Default | Description |
422
+ |-------|------|---------|-------------|
423
+ | `geo_properties` | list | `null` | Geographic columns. Normalized with empirical mu/sigma. Dimensions prefixed `g:` (e.g. `g:lat`). |
424
+ | `metric_properties` | list | `null` | Numeric columns. Normalized with empirical mu/sigma. Dimensions prefixed `t:` (e.g. `t:balance`). |
425
+ | `semantic_dim` | dict | `null` | Embedding columns reduced via SVD-based PCA. Dimensions prefixed `s:` (e.g. `s:pc0`). |
426
+ | `semantic_dim.columns` | list | — | **Required** (within `semantic_dim`). List of embedding column names. |
427
+ | `semantic_dim.n_components` | int | — | **Required** (within `semantic_dim`). Target number of PCA dimensions. |
428
+
429
+ Dimension prefixes (`g:`, `t:`, `s:`) appear in `explain_anomaly` output, making it clear which block a dimension belongs to.
430
+
397
431
  ### Multiple patterns on the same entity line
398
432
 
399
433
  You can define multiple patterns for the same anchor line with different calibration:
@@ -0,0 +1,57 @@
1
+ # Introduction
2
+
3
+ ## The problem
4
+
5
+ Relational databases store entities and their relationships. SQL retrieves specific records that match filters. That works when you know what you're looking for.
6
+
7
+ But some questions aren't filters:
8
+
9
+ - Which entities are behaving differently from the rest of the population?
10
+ - How is that difference changing over time?
11
+ - What structural patterns exist that nobody thought to query for?
12
+
13
+ These are exploration questions. They require context — not just a row, but how that row relates to every other row in the system. SQL doesn't naturally express this.
14
+
15
+ ## The idea
16
+
17
+ hypertopos maps every entity in a relational dataset into a shared geometric space.
18
+
19
+ The coordinate of each entity is derived from its typed relationships — who it connects to, through which channels, how often, which properties are filled or missing. This produces a position vector that captures the entity's structural identity relative to the population.
20
+
21
+ From there, geometric operations become analytical operations:
22
+
23
+ - **Distance from center** — anomaly detection
24
+ - **Proximity to other entities** — similarity and clustering
25
+ - **Movement over time** — drift tracking
26
+ - **Group differences** — population comparison
27
+
28
+ No models are trained. No labels are required. The geometry is computed directly from the relational structure of the data.
29
+
30
+ ## How it works
31
+
32
+ The process has two phases:
33
+
34
+ **Build.** You describe your data sources and their relationships in a YAML configuration. hypertopos reads the data, computes population statistics (mean, standard deviation, empirical thresholds per dimension), and produces a sphere — a directory of pre-computed geometry stored in Apache Arrow format.
35
+
36
+ **Navigate.** An AI agent (or Python code) opens the sphere and moves through it. Twelve navigation primitives cover the common exploratory operations: walking along entity collections, jumping across relationships, finding clusters, detecting outliers, comparing groups, and tracking temporal change. Each step is stateful — where you are determines what you see next.
37
+
38
+ The sphere is designed for on-demand loading. Opening it reads a few kilobytes of metadata. Everything else is loaded as navigation requires it.
39
+
40
+ ## What you can do with it
41
+
42
+ - Detect anomalies without training ML models or labeling data
43
+ - Discover clusters and structural archetypes in a population
44
+ - Track how entities drift from their historical behavior
45
+ - Compare groups to find which dimensions differentiate them
46
+ - Explore unknown datasets with AI agents that navigate rather than query
47
+ - Build investigation workflows that chain geometric operations
48
+
49
+ ## Where this is now
50
+
51
+ hypertopos is a research-stage project with working code and reproducible benchmarks.
52
+
53
+ It has been validated on three domains — banking (Berka), anti-money laundering (IBM AML), and transportation (NYC Taxi) — using the same engine with zero domain-specific rules. Benchmark scripts and data preparation are included in the repository.
54
+
55
+ The library is under active development. The API may change. Contributions and feedback are welcome.
56
+
57
+ For the mathematical foundation, see [Core Concepts](concepts.md). To try it, see [Quick Start](quickstart.md).
@@ -1,6 +1,10 @@
1
1
  # Quick Start
2
2
 
3
- > Build a sphere from your data, then let AI agents navigate it.
3
+ > From zero to a navigable geometric space.
4
+
5
+ This guide walks you through building a sphere from a relational dataset and connecting it to an AI agent. You will define entity types and their relationships in YAML, compute population-relative coordinates for every entity, and produce a sphere that agents can explore.
6
+
7
+ For the idea behind this, see [Introduction](introduction.md).
4
8
 
5
9
  ## Install
6
10
 
@@ -179,9 +179,9 @@ def finalize_geometry_chunks(
179
179
  return
180
180
 
181
181
  # Compact fragments from multiple appends into fewer files.
182
- # target_rows_per_fragment=1M merges small chunks into large fragments
182
+ # target_rows_per_fragment=4M merges small chunks into large fragments
183
183
  # for better sequential scan performance (fewer random I/O ops).
184
- ds.optimize.compact_files(target_rows_per_fragment=1_048_576)
184
+ ds.optimize.compact_files(target_rows_per_fragment=4_194_304)
185
185
  ds = _lance.dataset(str(lance_path)) # re-open after compaction
186
186
 
187
187
  # Detect list_size for index building