{"repo":"RyanCodrai/turbovec","free":true,"listed":false,"github":"https://github.com/RyanCodrai/turbovec","clone":"git clone https://github.com/RyanCodrai/turbovec.git","description":"A vector index built on TurboQuant, written in Rust with Python bindings","language":"Rust","stars":14799,"topics":["ann","avx512","embedding","embeddings","faiss","nearest-neighbor","neon","python","quant","quantization","rag","rust","simd","turboquant","vector-search"],"license":"MIT","category":"dev_tool","readme_excerpt":"<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/RyanCodrai/turbovec/main/docs/header.png\" alt=\"turbovec — Google's TurboQuant for vector search\" width=\"100%\">\n</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/RyanCodrai/turbovec/blob/main/LICENSE\"><img src=\"https://img.shields.io/pypi/l/turbovec\" alt=\"License\"></a>\n  <a href=\"https://pypi.org/project/turbovec/\"><img src=\"https://img.shields.io/pypi/v/turbovec?label=pypi&color=blue\" alt=\"PyPI version\"></a>\n  <a href=\"https://crates.io/crates/turbovec\"><img src=\"https://img.shields.io/crates/v/turbovec?label=crates.io&color=blue\" alt=\"crates.io version\"></a>\n  <a href=\"https://arxiv.org/abs/2504.19874\"><img src=\"https://img.shields.io/badge/paper-arXiv-b31b1b.svg\" alt=\"TurboQuant paper\"></a>\n</p>\n\n---\n\n**A 10 million document corpus takes 31 GB of RAM as float32. turbovec fits it in 4 GB - and searches it faster than FAISS.**\n\nturbovec is a Rust vector index with Python bindings, built on Google Research's [**TurboQuant**](https://arxiv.org/abs/2504.19874) algorithm — a data-oblivious quantizer with near-optimal distortion and no separate training phase.\n\n- **Online ingest.** Add vectors, they're indexed — no train step, no parameter tuning, no rebuilds as the corpus grows.\n- **Fast SIMD search.** Hand-written kernels — NEON SDOT/SMMLA on ARM, AVX-512 VNNI and `vpermb` on x86, with AVX2 and scalar fallbacks — beat FAISS IndexPQFastScan in every measured config, averaging 3.4× at 4-bit and 23% at 2-bit across the eight cells of each width, on both architectures.\n- **Incremental saves.** `sync(path)` persists just what changed since the last sync — one fsync per call, crash-safe at any byte, and a removal or a small append costs milliseconds however large the index. `write`/`load` stay for whole-file snapshots.\n- **Filter at search time.** Pass an id allowlist (or a slot bitmask) to `search()` and the kernel honours it directly. You always get up to `k` results from the allowed set — no over-fetching, no recall hit on selective filters.\n- **Pure local.** No managed service, no data leaving your machine or VPC. Pair with any open-source embedding model for a fully air-gapped RAG stack.\n\nBuilding RAG where privacy, memory, or latency matters? **You're in the right place.**\n\n## Python\n\n```bash\npip install turbovec\n```\n\n```python\nfrom turbovec import TurboQuantIndex\n\nindex = TurboQuantIndex(dim=1536, bit_width=4)\nindex.add(vectors)\nindex.add(more_vectors)\n\nscores, indices = index.search(query, k=10)\n\nindex.write(\"my_index.tv\")\nloaded = TurboQuantIndex.load(\"my_index.tv\")\n\nindex.sync(\"my_index.tv\")   # after more changes: durable incremental save\n```\n\n`vectors` and `query` are 2-D `float32` arrays of shape `(n, dim)` — other dtypes are rejected rather than silently converted, so cast with `np.asarray(x, dtype=np.float32)` first if needed.\n\nNeed stable ids that survive deletes? Use `IdMapIndex`:\n\n```python\nimport numpy as np\nfrom turbovec import IdMapIndex\n\nindex = IdMapIndex(dim=1536, bit_width=4)\nindex.add_with_ids(vectors, np.array([1001, 1002, 1003], dtype=np.uint64))\n\nscores, ids = index.search(query, k=10)   # ids are your uint64 external ids\nindex.remove(1002)                         # O(1) by id\n\nindex.write(\"my_index.tvim\")\nloaded = IdMapIndex.load(\"my_index.tvim\")\n\nindex.sync(\"my_index.tvim\")   # durable incremental save, ids included\n```\n\n### Hybrid retrieval (filtered search)\n\nRestrict results to a candidate set produced by another system (SQL, BM25, ACL, time window, …):\n\n```python\nimport numpy as np\nfrom turbovec import IdMapIndex\n\nidx = IdMapIndex(dim=1536, bit_width=4)\nidx.add_with_ids(vectors, ids)\n\n# Stage 1: external system narrows to candidate ids.\nallowed = np.array(db.execute(\"SELECT id FROM docs WHERE tenant=?\", (t,)).fetchall(),\n                   dtype=np.uint64)\n\n# Stage 2: dense rerank within the candidate set.\nscores, ids = idx.search(query, k=10, allowlist=allowed)\n```\n\nFiltering happens inside the SIMD kernel at 32-vector block granularity: blocks with no allowed slots are short-circuited before any LUT lookup or scoring work, and individual non-allowed slots inside scored blocks are dropped at heap-insert. Selective allowlists (small fraction of the index allowed) therefore avoid most of the SIMD cost rather than paying it and discarding the result afterwards.\n\nThe output length is `min(k, n_allowed)`, where `n_allowed` counts *distinct* allowed vectors — when fewer vectors are allowed than `k` you get exactly that many results rather than padded fallbacks.\n\nSee [`docs/api.md`](https://github.com/RyanCodrai/turbovec/blob/main/docs/api.md) for the full reference.\n\n### Framework integrations\n\nDrop-in replacements for the in-tree reference vector / document stores in each framework. Same public surface, same persistence semantics, same retriever and pipeline wiring — swap the import and keep your pipeline.\n\n- [LangChain](https://github.com/RyanCodrai/turbovec/blob/main/docs/integrations/langchain.md) — `pip install turbovec[langchain]` · replaces `langchain_core.vectorstores.InMemoryVectorStore`\n- [LlamaIndex](https://github.com/RyanCodrai/turbovec/blob/main/docs/integrations/llama_index.md) — `pip install turbovec[llama-index]` · replaces `llama_index.core.vector_stores.SimpleVectorStore`\n- [Haystack](https://github.com/RyanCodrai/turbovec/blob/main/docs/integrations/haystack.md) — `pip install turbovec[haystack]` · replaces `haystack.document_stores.in_memory.InMemoryDocumentStore`\n- [Agno](https://github.com/RyanCodrai/turbovec/blob/main/docs/integrations/agno.md) — `pip install turbovec[agno]` · replaces `agno.vectordb.lancedb.LanceDb`\n\n## Rust\n\n```bash\ncargo add turbovec\n```\n\n```rust\nuse turbovec::TurboQuantIndex;\n\nlet mut index = TurboQuantIndex::new(1536, 4).unwrap();\nindex.add(&vectors);\nlet results = index.search(&queries, 10);\nindex.write(\"index.tv\").unwrap();\nlet loaded = TurboQuantIndex::load(\"index.tv\").unwrap();\n```\n\nFor stable external ids that survive deletes:\n\n```rust\nuse turbovec::IdMapIndex;\n\nlet mut index = IdMapIndex::new(1536, 4).unwrap();\nindex.add_with_ids(&vectors, &[1001, 1002, 1003]).unwrap();\nlet (scores, ids) = index.search(&queries, 10);\nindex.remove(1002);\nindex.write(\"index.tvim\").unwrap();\nlet loaded = IdMapIndex::load(\"index.tvim\").unwrap();\n```\n\n## Recall\n\nTurboQuant vs FAISS `IndexPQ` (LUT256, nbits=8) — the paper's Section 4.4 baseline. 100K vectors, k=64. FAISS PQ sub-quantizer counts sized to match TurboQuant's bit rate (m=d/4 at 2-bit, m=d/2 at 4-bit).\n\n![Recall GloVe d=200](https://raw.githubusercontent.com/RyanCodrai/turbovec/main/docs/recall_glove.svg)\n\n![Recall d=1536](https://raw.githubusercontent.com/RyanCodrai/turbovec/main/docs/recall_d1536.svg)\n\n![Recall d=3072](https://raw.githubusercontent.com/RyanCodrai/turbovec/main/docs/recall_d3072.svg)\n\nThe charts plot calibrated TurboQuant (TQ+). Across OpenAI d=1536 and d=3072, TQ+ beats FAISS at R@1 on three of four cells (by 0.9–2.9 points; d=1536 4-bit trails by 0.7), and both reach 1.0 by k=8 (≥0.997 already at k≤4). GloVe d=200 is the harder regime — at low dim the asymptotic Beta assumption is looser. TQ+ lands ahead of FAISS at R@1 at both bit widths (+1.9 at 4-bit, +0.8 at 2-bit), with FAISS keeping a slim edge at 2-bit from k≈8. Uncalibrated numbers are in the JSONs (`tq_recalls`).\n\n**A note on baselines.** We compare against FAISS `IndexPQ` (LUT256, nbits=8, float32 LUT) because it's the default production-grade PQ most users would reach for. This is a stronger baseline than the custom u8-LUT PQ in the [TurboQuant paper](https://arxiv.org/abs/2504.19874) — FAISS uses a higher-precision LUT at scoring time and k-means++ for codebook training. We reproduce the paper's TurboQuant numbers on OpenAI d=1536 / d=3072 and hit similar numbers to other community reference implementations on low-dim embeddings (see [`turboquant-py`](https://pypi.org/project/turboquant-py/) at d=384). On GloVe (d=200) — the low-dim regime where the asymptotic Beta assumption is loosest — TurboQuant lands ahead of FAISS at 4-bit but trails it at 2-bit; TQ+ calibration recovers the 2-bit deficit at R@1 (0.572 vs FAISS's 0.564), with FAISS keeping a slim edge at deeper k.\n\nFull results: [d=1536 2-bit](https://github.com/RyanCodrai/turbovec/blob/main/benchmarks/results/recall_d1536_2bit.json), [d=1536 4-bit](https://github.com/RyanCodrai/turbovec/blob/main/benchmarks/results/recall_d1536_4bit.json), [d=3072 2-bit](https://github.com/RyanCodrai/turbovec/blob/main/benchmarks/results/recall_d3072_2bit.json), [d=3072 4-bit](https://github.com/RyanCodrai/turbovec/blob/main/benchmarks/results/recall_d3072_4bit.json), [GloVe 2-bit](https://github.com/RyanCodrai/turbovec/blob/main/benchmarks/results/recall_glove_2bit.json), [GloVe 4-bit](https://github.com/RyanCodrai/turbovec/blob/main/benchmarks/results/recall_glove_4bit.json).\n\n## Compression\n\n![Compression](https://raw.githubusercontent.com/RyanCodrai/turbovec/main/docs/compression.svg)\n\n## Search Speed\n\nAll benchmarks: 100K vectors, 1K queries, k=64, median of 5 runs.\n\n### ARM (GCP c4a-standard-8, Google Axion, 8 vCPUs)\n\n![ARM Speed — Single-threaded](https://raw.githubusercontent.com/RyanCodrai/turbovec/main/docs/arm_speed_st.svg)\n\n![ARM Speed — Multi-threaded](https://raw.githubusercontent.com/RyanCodrai/turbovec/main/docs/arm_speed_mt.svg)\n\nOn ARM, TurboQuant beats FAISS FastScan in every config, averaging 3.5× at 4-bit (3.4–3.7× across cells — the SDOT/SMMLA dot-product kernels score the vector-major layout directly) and 26% at 2-bit (22–29%).\n\n### x86 (Intel Xeon Platinum 8481C / Sapphire Rapids, 8 vCPUs)\n\n![x86 Speed — Single-threaded](https://raw.githubusercontent.com/RyanCodrai/turbovec/main/docs/x86_speed_st.svg)\n\n![x86 Speed — Multi-threaded](https://raw.githubusercontent.com/RyanCodrai/turbovec/main/docs/x86_speed_mt.svg)\n\nOn x86, TurboQuant wins every config, averaging 3.4× at 4-bit (3.2–3.5× across cells — the AVX-512 VNNI dot-product kernel on the vector-major layout) and 20% at 2-bit (5–32%)","default_branch":"main","files":379,"tree":[".cargo/config.toml",".claude/settings.json",".claude/skills/s/SKILL.md",".github/CODEOWNERS",".github/PULL_REQUEST_TEMPLATE.md",".github/scripts/changelog_gate.py",".github/scripts/dep_floors.py",".github/scripts/escape_hatch.py",".github/scripts/test_changelog_gate.py",".github/workflows/changelog.yml",".github/workflows/ci.yml",".github/workflows/claude.yml",".github/workflows/intake.yml",".github/workflows/mutants.yml",".github/workflows/pr-review.yml",".github/workflows/release-crates.yml",".github/workflows/release-pypi.yml",".github/workflows/review-stamp.yml",".github/workflows/security-audit.yml",".github/workflows/summarize-command.yml",".github/workflows/supply-chain.yml",".gitignore","CHANGELOG.md","CONTRIBUTING.md","Cargo.lock","Cargo.toml","LICENSE","README.md","SECURITY.md","benchmarks/create_diagrams.py","benchmarks/download_data.py","benchmarks/hillclimb/GOAL_2bit.md","benchmarks/hillclimb/GOAL_mutate.md","benchmarks/hillclimb/GOAL_persist.md","benchmarks/hillclimb/LOG.md","benchmarks/hillclimb/LOG_2bit.md","benchmarks/hillclimb/LOG_mutate.md","benchmarks/hillclimb/LOG_persist.md","benchmarks/hillclimb/LOG_search.md","benchmarks/hillclimb/LOG_sync.md","benchmarks/hillclimb/arm_nq1_loop.s","benchmarks/hillclimb/arm_nq1_q8.s","benchmarks/hillclimb/bench_mutate.py","benchmarks/hillclimb/bench_ops.py","benchmarks/hillclimb/bench_persist.py","benchmarks/hillclimb/bench_sync.py","benchmarks/hillclimb/bitlinear_recall.py","benchmarks/hillclimb/cells.py","benchmarks/hillclimb/cells_2bit.py","benchmarks/hillclimb/clip_recall.py","benchmarks/hillclimb/data/base_arm_all.json","benchmarks/hillclimb/data/base_x86_all.json","benchmarks/hillclimb/data/baseline_both.json","benchmarks/hillclimb/data/candidate_both.json","benchmarks/hillclimb/data/candsoak_x86_all.json","benchmarks/hillclimb/data/h2soak_arm_all.json","benchmarks/hillclimb/data/h3soak_arm_all.json","benchmarks/hillclimb/data/h4soak_arm_all.json","benchmarks/hillclimb/data/h5soak_arm_all.json","benchmarks/hillclimb/data/parity_base_arm.json","benchmarks/hillclimb/data/parity_base_x86.json","benchmarks/hillclimb/faiss_nq1.py","benchmarks/hillclimb/isa_rates.c","benchmarks/hillclimb/mem_rates.c","benchmarks/hillclimb/mt_roofline_nq1.py","benchmarks/hillclimb/parity_2bit.py","benchmarks/hillclimb/parity_mutate.py","benchmarks/hillclimb/permute_dot_recall.py","benchmarks/hillclimb/pq_recall.py","benchmarks/hillclimb/probe_p2.rs","benchmarks/hillclimb/probe_p4.py","benchmarks/hillclimb/scan_probe.c","benchmarks/hillclimb/score_cells.py","benchmarks/hillclimb/sq2_vs_pq.py","benchmarks/hillclimb/sweep_2bit.py","benchmarks/hillclimb/sweep_paired.py","benchmarks/hillclimb/whm_2bit.py","benchmarks/hillclimb/whm_mutate.py","benchmarks/hillclimb/whm_persist.py","benchmarks/hillclimb/whm_sync.py","benchmarks/hillclimb/x86_nq100_loop.s","benchmarks/results/compression.json","benchmarks/results/hillclimb_baseline.json","benchmarks/results/persist_baseline.json","benchmarks/results/recall_d1536_2bit.json","benchmarks/results/recall_d1536_4bit.json","benchmarks/results/recall_d3072_2bit.json","benchmarks/results/recall_d3072_4bit.json","benchmarks/results/recall_glove_2bit.json","benchmarks/results/recall_glove_4bit.json","benchmarks/results/speed_d1536_2bit_arm_mt.json","benchmarks/results/speed_d1536_2bit_arm_st.json","benchmarks/results/speed_d1536_2bit_x86_mt.json","benchmarks/results/speed_d1536_2bit_x86_st.json","benchmarks/results/speed_d1536_4bit_arm_mt.json","benchmarks/results/speed_d1536_4bit_arm_st.json","benchmarks/results/speed_d1536_4bit_x86_mt.json","benchmarks/results/speed_d1536_4bit_x86_st.json","benchmarks/results/speed_d3072_2bit_arm_mt.json","benchmarks/results/speed_d3072_2bit_arm_st.json","benchmarks/results/speed_d3072_2bit_x86_mt.json","benchmarks/results/speed_d3072_2bit_x86_st.json","benchmarks/results/speed_d3072_4bit_arm_mt.json","benchmarks/results/speed_d3072_4bit_arm_st.json","benchmarks/results/speed_d3072_4bit_x86_mt.json","benchmarks/results/speed_d3072_4bit_x86_st.json","benchmarks/results/speed_insert_d1536_2bit_arm_mt.json","benchmarks/results/speed_insert_d1536_2bit_arm_st.json","benchmarks/results/speed_insert_d1536_2bit_x86_mt.json","benchmarks/results/speed_insert_d1536_2bit_x86_st.json","benchmarks/results/speed_insert_d1536_4bit_arm_mt.json","benchmarks/results/speed_insert_d1536_4bit_arm_st.json","benchmarks/results/speed_insert_d1536_4bit_x86_mt.json","benchmarks/results/speed_insert_d1536_4bit_x86_st.json","benchmarks/results/speed_insert_d3072_2bit_arm_mt.json","benchmarks/results/speed_insert_d3072_2bit_arm_st.json","benchmarks/results/speed_insert_d3072_2bit_x86_mt.json","benchmarks/results/speed_insert_d3072_2bit_x86_st.json","benchmarks/results/speed_insert_d3072_4bit_arm_mt.json","benchmarks/results/speed_insert_d3072_4bit_arm_st.json","benchmarks/results/speed_insert_d3072_4bit_x86_mt.json","benchmarks/results/speed_insert_d3072_4bit_x86_st.json","benchmarks/results/speed_persist_d1536_2bit_arm_mt.json","benchmarks/results/speed_persist_d1536_2bit_arm_st.json","benchmarks/results/speed_persist_d1536_2bit_x86_mt.json","benchmarks/results/speed_persist_d1536_2bit_x86_st.json","benchmarks/results/speed_persist_d1536_4bit_arm_mt.json","benchmarks/results/speed_persist_d1536_4bit_arm_st.json","benchmarks/results/speed_persist_d1536_4bit_x86_mt.json","benchmarks/results/speed_persist_d1536_4bit_x86_st.json","benchmarks/results/speed_persist_d3072_2bit_arm_mt.json","benchmarks/results/speed_persist_d3072_2bit_arm_st.json","benchmarks/results/speed_persist_d3072_2bit_x86_mt.json","benchmarks/results/speed_persist_d3072_2bit_x86_st.json","benchmarks/results/speed_persist_d3072_4bit_arm_mt.json","benchmarks/results/speed_persist_d3072_4bit_arm_st.json","benchmarks/results/speed_persist_d3072_4bit_x86_mt.json","benchmarks/results/speed_persist_d3072_4bit_x86_st.json","benchmarks/results/speed_remove_d1536_2bit_arm_mt.json","benchmarks/results/speed_remove_d1536_2bit_arm_st.json","benchmarks/results/speed_remove_d1536_2bit_x86_mt.json","benchmarks/results/speed_remove_d1536_2bit_x86_st.json","benchmarks/results/speed_remove_d1536_4bit_arm_mt.json","benchmarks/results/speed_remove_d1536_4bit_arm_st.json","benchmarks/results/speed_remove_d1536_4bit_x86_mt.json","benchmarks/results/speed_remove_d1536_4bit_x86_st.json","benchmarks/results/speed_remove_d3072_2bit_arm_mt.json","benchmarks/results/speed_remove_d3072_2bit_arm_st.json","benchmarks/results/speed_remove_d3072_2bit_x86_mt.json","benchmarks/results/speed_remove_d3072_2bit_x86_st.json","benchmarks/results/speed_remove_d3072_4bit_arm_mt.json","benchmarks/results/speed_remove_d3072_4bit_arm_st.json","benchmarks/results/speed_remove_d3072_4bit_x86_mt.json","benchmarks/results/speed_remove_d3072_4bit_x86_st.json","benchmarks/results/speed_sync_d1536_2bit_arm_mt.json","benchmarks/results/speed_sync_d1536_2bit_arm_st.json","benchmarks/results/speed_sync_d1536_2bit_x86_mt.json","benchmarks/results/speed_sync_d1536_2bit_x86_st.json","benchmarks/results/sync_baseline.json","benchmarks/suite/compression.py","benchmarks/suite/recall_d1536_2bit.py","benchmarks/suite/recall_d1536_4bit.py","benchmarks/suite/recall_d3072_2bit.py","benchmarks/suite/recall_d3072_4bit.py","benchmarks/suite/recall_glove_2bit.py","benchmarks/suite/recall_glove_4bit.py","benchmarks/suite/speed_d1536_2bit_arm_mt.py","benchmarks/suite/speed_d1536_2bit_arm_st.py","benchmarks/suite/speed_d1536_2bit_x86_mt.py","benchmarks/suite/speed_d1536_2bit_x86_st.py","benchmarks/suite/speed_d1536_4bit_arm_mt.py","benchmarks/suite/speed_d1536_4bit_arm_st.py","benchmarks/suite/speed_d1536_4bit_x86_mt.py","benchmarks/suite/speed_d1536_4bit_x86_st.py","benchmarks/suite/speed_d3072_2bit_arm_mt.py","benchmarks/suite/speed_d3072_2bit_arm_st.py","benchmarks/suite/speed_d3072_2bit_x86_mt.py","benchmarks/suite/speed_d3072_2bit_x86_st.py","benchmarks/suite/speed_d3072_4bit_arm_mt.py","benchmarks/suite/speed_d3072_4bit_arm_st.py","benchmarks/suite/speed_d3072_4bit_x86_mt.py","benchmarks/suite/speed_d3072_4bit_x86_st.py","benchmarks/suite/speed_insert_d1536_2bit_arm_mt.py","benchmarks/suite/speed_insert_d1536_2bit_arm_st.py","benchmarks/suite/speed_insert_d1536_2bit_x86_mt.py","benchmarks/suite/speed_insert_d1536_2bit_x86_st.py","benchmarks/suite/speed_insert_d1536_4bit_arm_mt.py","benchmarks/suite/speed_insert_d1536_4bit_arm_st.py","benchmarks/suite/speed_insert_d1536_4bit_x86_mt.py","benchmarks/suite/speed_insert_d1536_4bit_x86_st.py","benchmarks/suite/speed_insert_d3072_2bit_arm_mt.py","benchmarks/suite/speed_insert_d3072_2bit_arm_st.py","benchmarks/suite/speed_insert_d3072_2bit_x86_mt.py","benchmarks/suite/speed_insert_d3072_2bit_x86_st.py","benchmarks/suite/speed_insert_d3072_4bit_arm_mt.py","benchmarks/suite/speed_insert_d3072_4bit_arm_st.py","benchmarks/suite/speed_insert_d3072_4bit_x86_mt.py","benchmarks/suite/speed_insert_d3072_4bit_x86_st.py","benchmarks/suite/speed_persist_d1536_2bit_arm_mt.py","benchmarks/suite/speed_persist_d1536_2bit_arm_st.py","benchmarks/suite/speed_persist_d1536_2bit_x86_mt.py","benchmarks/suite/speed_persist_d1536_2bit_x86_st.py","benchmarks/suite/speed_persist_d1536_4bit_arm_mt.py","benchmarks/suite/speed_persist_d1536_4bit_arm_st.py","benchmarks/suite/speed_persist_d1536_4bit_x86_mt.py","benchmarks/suite/speed_persist_d1536_4bit_x86_st.py","benchmarks/suite/speed_persist_d3072_2bit_arm_mt.py","benchmarks/suite/speed_persist_d3072_2bit_arm_st.py","benchmarks/suite/speed_persist_d3072_2bit_x86_mt.py","benchmarks/suite/speed_persist_d3072_2bit_x86_st.py","benchmarks/suite/speed_persist_d3072_4bit_arm_mt.py","benchmarks/suite/speed_persist_d3072_4bit_arm_st.py","benchmarks/suite/speed_persist_d3072_4bit_x86_mt.py","benchmarks/suite/speed_persist_d3072_4bit_x86_st.py","benchmarks/suite/speed_remove_d1536_2bit_arm_mt.py","benchmarks/suite/speed_remove_d1536_2bit_arm_st.py","benchmarks/suite/speed_remove_d1536_2bit_x86_mt.py","benchmarks/suite/speed_remove_d1536_2bit_x86_st.py","benchmarks/suite/speed_remove_d1536_4bit_arm_mt.py","benchmarks/suite/speed_remove_d1536_4bit_arm_st.py","benchmarks/suite/speed_remove_d1536_4bit_x86_mt.py","benchmarks/suite/speed_remove_d1536_4bit_x86_st.py","benchmarks/suite/speed_remove_d3072_2bit_arm_mt.py","benchmarks/suite/speed_remove_d3072_2bit_arm_st.py","benchmarks/suite/speed_remove_d3072_2bit_x86_mt.py","benchmarks/suite/speed_remove_d3072_2bit_x86_st.py","benchmarks/suite/speed_remove_d3072_4bit_arm_mt.py","benchmarks/suite/speed_remove_d3072_4bit_arm_st.py","benchmarks/suite/speed_remove_d3072_4bit_x86_mt.py","benchmarks/suite/speed_remove_d3072_4bit_x86_st.py","benchmarks/suite/speed_sync_d1536_2bit_arm_mt.py","benchmarks/suite/speed_sync_d1536_2bit_arm_st.py","benchmarks/suite/speed_sync_d1536_2bit_x86_mt.py","benchmarks/suite/speed_sync_d1536_2bit_x86_st.py","benchmarks/whm.py","deny.toml","docs/api.md","docs/arm_insert_online_st.svg","docs/arm_persist_mt.svg","docs/arm_persist_st.svg","docs/arm_remove_online_st.svg","docs/arm_speed_mt.svg","docs/arm_speed_st.svg","docs/compression.svg","docs/header.png","docs/integrations/agno.md","docs/integrations/haystack.md","docs/integrations/langchain.md","docs/integrations/llama_index.md","docs/recall_d1536.svg","docs/recall_d3072.svg","docs/recall_glove.svg","docs/x86_insert_online_st.svg","docs/x86_persist_mt.svg","docs/x86_persist_st.svg","docs/x86_remove_online_st.svg","docs/x86_speed_mt.svg","docs/x86_speed_st.svg","examples/downstream-smoke/Cargo.lock","examples/downstream-smoke/Cargo.toml","examples/downstream-smoke/src/main.rs","turbovec-python/Cargo.toml","turbovec-python/README.md","turbovec-python/build.rs","turbovec-python/pyproject.toml","turbovec-python/python/turbovec/__init__.py","turbovec-python/python/turbovec/_dedup.py","turbovec-python/python/turbovec/_interruptible.py","turbovec-python/python/turbovec/_persist.py","turbovec-python/python/turbovec/_similarity.py","turbovec-python/python/turbovec/agno.py","turbovec-python/python/turbovec/haystack.py","turbovec-python/python/turbovec/langchain.py","turbovec-python/python/turbovec/llama_index.py","turbovec-python/src/lib.rs","turbovec-python/src/par_copy.rs","turbovec-python/tests/conftest.py","turbovec-python/tests/fixtures/legacy_pre_similarity/agno/docstore.json","turbovec-python/tests/fixtures/legacy_pre_similarity/agno/index.tvim","turbovec-python/tests/fixtures/legacy_pre_similarity/haystack/docstore.json","turbovec-python/tests/fixtures/legacy_pre_similarity/haystack/index.tvim","turbovec-python/tests/fixtures/legacy_pre_similarity/langchain/docstore.json","turbovec-python/tests/fixtures/legacy_pre_similarity/langchain/index.tvim","turbovec-python/tests/fixtures/legacy_pre_similarity/llama_index/store.nodes.json","turbovec-python/tests/fixtures/legacy_pre_similarity/llama_index/store.tvim","turbovec-python/tests/test_agno.py","turbovec-python/tests/test_argument_errors.py","turbovec-python/tests/test_async_offload.py","turbovec-python/tests/test_calibration.py","turbovec-python/tests/test_dedup.py","turbovec-python/tests/test_filtering.py","turbovec-python/tests/test_fork_safety.py","turbovec-python/tests/test_gil_release.py","turbovec-python/tests/test_haystack.py","turbovec-python/tests/test_id_map.py","turbovec-python/tests/test_index.py","turbovec-python/tests/test_interruptible.py","turbovec-python/tests/test_langchain.py","turbovec-python/tests/test_llama_index.py","turbovec-python/tests/test_object_model.py","turbovec-python/tests/test_persist.py","turbovec-python/tests/test_pickle_copy.py","turbovec-python/tests/test_rayon_env.py","turbovec-python/tests/test_remove_fast_path.py","turbovec-python/tests/test_security.py","turbovec-python/tests/test_similarity_modes.py","turbovec-python/tests/test_snap_retention.py","turbovec-python/tests/test_store_thread_safety.py","turbovec-python/tests/test_sync.py","turbovec-python/tests/test_version.py","turbovec/Cargo.toml","turbovec/LICENSE","turbovec/examples/encode_hash.rs","turbovec/examples/insert_bench.rs","turbovec/examples/kernel_roofline.rs","turbovec/examples/kernel_roofline_neon.rs","turbovec/examples/kernel_xtest.rs","turbovec/examples/load_bench_v7.rs","turbovec/examples/probe_2bit_lutstream.rs","turbovec/examples/probe_2bit_sdot.rs","turbovec/examples/probe_2bit_vnni.rs","turbovec/examples/stream_bw.rs","turbovec/examples/sve_tbl_probe.rs","turbovec/examples/sync_bench_v7.rs","turbovec/examples/vector_major_check.rs","turbovec/examples/vnni_fullscan.rs","turbovec/examples/vnni_probe.rs","turbovec/examples/x86_permute_dot.rs","turbovec/src/codebook.rs","turbovec/src/encode.rs","turbovec/src/error.rs","turbovec/src/id_map.rs","turbovec/src/io.rs","turbovec/src/io_v7.rs","turbovec/src/kernel_tests.rs","turbovec/src/lib.rs","turbovec/src/pack.rs","turbovec/src/rotation.rs","turbovec/src/search.rs","turbovec/src/warning.rs","turbovec/tests/adversarial_durability.rs","turbovec/tests/adversarial_durability_edges.rs","turbovec/tests/adversarial_durability_fuzz.rs","turbovec/tests/adversarial_durability_round2.rs","turbovec/tests/adversarial_gen_reuse.rs","turbovec/tests/adversarial_load_memory.rs","turbovec/tests/allocation_hot_paths.rs","turbovec/tests/avx512_tail_simulation.rs","turbovec/tests/batch_matches_single.rs","turbovec/tests/bytes_io.rs","turbovec/tests/calibration_bounds.rs","turbovec/tests/codebook_determinism.rs","turbovec/tests/common/fingerprint.rs","turbovec/tests/concurrent_search.rs","turbovec/tests/crate_api.rs","turbovec/tests/encode_fingerprint.rs","turbovec/tests/explicit_calibration.rs","turbovec/tests/filtering.rs","turbovec/tests/from_parts.rs","turbovec/tests/id_map.rs","turbovec/tests/input_validation.rs","turbovec/tests/input_validation_reporting.rs","turbovec/tests/io_hardening.rs","turbovec/tests/io_v6.rs","turbovec/tests/io_versioning.rs","turbovec/tests/kernel_correctness.rs","turbovec/tests/lazy_init.rs","turbovec/tests/query_scale_invariance.rs","turbovec/tests/recall_sanity.rs","turbovec/tests/rotation.rs","turbovec/tests/rotation_determinism.rs","turbovec/tests/state_sequences.rs","turbovec/tests/swap_remove.rs","turbovec/tests/sync_v7.rs","turbovec/tests/sync_v7_idmap.rs","turbovec/tests/tmp_sweep.rs","turbovec/tests/tqplus_calibration.rs","turbovec/tests/v7_bytes_entry_points.rs","turbovec/tests/warning_hook.rs"],"storefront":"/r/RyanCodrai","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/RyanCodrai/turbovec/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}