Reshape precinct from a nearest-region similarity index into the
high-dimensional index for regions-as-objects: the serving layer for trained
region embeddings. Point-ANN indexes points; R-trees index regions but collapse
above ~10 dims; trained region embeddings are 64-200 dims, so neither fits.
Three query families now:
- nearest (search): unchanged, center index + true-distance rerank.
- membership (containing): regions enclosing a point. Backed by a power-distance
lift -- each region is lifted to u = (2c, r^2 - ||c||^2) over its bounding ball
(MIPS->L2 reduced), so the candidate ranking respects extent and surfaces an
enclosing region even when its center is far from the query. That far-centered
enclosure is exactly what a center-only index misses, and the new
containing_finds_far_centered_enclosing_box test pins it.
- subsumption (subsumers/subsumees): region-to-region containment retrieval (a
concept's hypernyms/hyponyms), via candidate-generate + contains_region filter.
Two HNSW graphs: routing nearest through the lift measured ~4 points worse
recall@10 on GloVe (the power proxy optimizes extent, not pure proximity), so
nearest keeps the center graph (92.1%/10x unchanged) and containment uses the
lift. ~2x graph memory, each query on the index that serves it.
Region gains bounding_ball + contains_region (breaking for custom impls;
AxisBox and Ball covered). Design: docs/design/region-index.md (local-only).