{
  "config": {
    "corpus": "50-center signed-orthant Gaussian-ish LCG mixture, jitter ±0.15 -- IDENTICAL technique to tests/vector_tiering.rs::clustered_vec/caustic_shrink2_recall_gate, just at DIM=768 instead of that test's DIM=64 fast-smoke width.",
    "corpus_seed": "0xCA05_71C0_DE00_1234",
    "dim": 768,
    "k": 10,
    "methodology": "Same corpus/query set built ONCE and reused across all four configs (f32 brute-force truth, RaBitq, Caustic shrink=2, Caustic shrink=4) -- an apples-to-apples A/B, not four independent runs. recall@10 and mean top-1 neighbor quality are measured against the f32 brute-force truth's own top-k/top-1. bytes_per_vector.raw_per_row comes from the ACTUAL codec's own `code_bytes()` (RaBitqCodec::encode / CausticCodec::encode_residual), not a hardcoded formula. amortized_centroid_share = dim*4 / avg_posting_len, using the index's OWN num_centroids()/len() post-build. whole_search_wall_secs is SpannIndex::search end-to-end (navigator routing + tier-2 estimate scan + tier-3 exact rerank) -- labeled 'whole_search', not an isolated tier-2 number, because SpannIndex::search does not expose a way to isolate tier-2 without duplicating its internals here.",
    "n": 10000,
    "n_clusters": 50,
    "queries": 100,
    "seed": "0x5A5ABEAC",
    "spann_params": "SpannParams::default() except `codec` (varies per row below)"
  },
  "date": "2026-07-26",
  "machine": {
    "arch": "aarch64",
    "os": "linux",
    "scope": "local"
  },
  "origin": {
    "build": "release",
    "kind": "measured",
    "tool": "examples/caustic_bench.rs"
  },
  "results": [
    {
      "avg_posting_len": 10000.0,
      "bytes_per_vector": {
        "amortized_centroid_share": 0.0,
        "amortized_total": 3072.0,
        "raw_per_row": 3072.0
      },
      "codec": "none (brute-force exact cosine, the recall oracle)",
      "config": "f32_truth",
      "figure_of_merit_recall_at_10_per_byte_amortized": 0.0003255208333333333,
      "mean_top1_neighbor_quality_cosine": 1.0,
      "num_centroids": 1,
      "recall_at_10": 1.0,
      "whole_search_qps": 669.262,
      "whole_search_wall_secs_over_100_queries": 0.149,
      "x_vs_f32_amortized": 1.0
    },
    {
      "avg_posting_len": 2000.0,
      "bytes_per_vector": {
        "amortized_centroid_share": 1.536,
        "amortized_total": 101.536,
        "raw_per_row": 100.0
      },
      "codec": "RaBitq",
      "config": "rabitq",
      "figure_of_merit_recall_at_10_per_byte_amortized": 0.009799479987393635,
      "mean_top1_neighbor_quality_cosine": 1.0,
      "num_centroids": 5,
      "recall_at_10": 0.995,
      "whole_search_qps": 102.048,
      "whole_search_wall_secs_over_100_queries": 0.98,
      "x_vs_f32_amortized": 30.255
    },
    {
      "avg_posting_len": 2000.0,
      "bytes_per_vector": {
        "amortized_centroid_share": 1.536,
        "amortized_total": 57.536,
        "raw_per_row": 56.0
      },
      "codec": "Caustic { shrink: 2 }",
      "config": "caustic_shrink2",
      "figure_of_merit_recall_at_10_per_byte_amortized": 0.017293520578420467,
      "mean_top1_neighbor_quality_cosine": 1.0,
      "num_centroids": 5,
      "recall_at_10": 0.995,
      "whole_search_qps": 126.128,
      "whole_search_wall_secs_over_100_queries": 0.793,
      "x_vs_f32_amortized": 53.393
    },
    {
      "avg_posting_len": 2000.0,
      "bytes_per_vector": {
        "amortized_centroid_share": 1.536,
        "amortized_total": 33.536,
        "raw_per_row": 32.0
      },
      "codec": "Caustic { shrink: 4 }",
      "config": "caustic_shrink4",
      "figure_of_merit_recall_at_10_per_byte_amortized": 0.029669608778625955,
      "mean_top1_neighbor_quality_cosine": 1.0,
      "num_centroids": 5,
      "recall_at_10": 0.995,
      "whole_search_qps": 146.271,
      "whole_search_wall_secs_over_100_queries": 0.684,
      "x_vs_f32_amortized": 91.603
    }
  ],
  "schema": "kynetra.benchmark/v1",
  "status": "local_evidence",
  "suite": "caustic_subbit_quantization_768dim"
}
