chore(deps): bump modernc.org/sqlite from 1.51.0 to 1.56.0 in the all-go-deps group across 1 directory - #5
Closed
dependabot[bot] wants to merge 63 commits into
Closed
Conversation
Pure Go ANN search library using Vamana (DiskANN) graph with RaBitQ 1-bit compression, backed by SQLite (modernc.org/sqlite, CGO_ENABLED=0). - 99.2% recall@10 on 10K vectors dim 128 - 388μs search latency, 47ns POPCOUNT - Incremental insert, async rebuild, LRU cache, concurrent search Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
horosvec_schem.md documents Vamana+RaBitQ architecture, SQLite storage, search flows, and all public types. CLAUDE.md updated with schema-first ref. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…UDE:SUMMARY annotations Search now dynamically selects strategy based on index size: - <= BruteForceThreshold (50K): exact L2 scan, 100% recall, ~1ms - > threshold: RaBitQ beam search (pre-computed query centering) + L2 rerank on top-500 Also: EfSearch default 64→128, RerankTopN 50→500 for better recall on large shards. Added CLAUDE:SUMMARY annotations to all source files. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…pragmas - serial.go: add serializeInt64s/deserializeInt64s for neighbor list migration - vamana.go: migrate graphNode.id, searchCandidate.nodeID, neighbors, and all function signatures from int32 to int64 (SQLite native rowid) - cache.go: migrate cachedNode.nodeID and nodeCache.items map to int64 - pragma.go: new file with configureSQLite() applying WAL, busy_timeout, synchronous, cache_size, mmap_size, page_size pragmas at connection open - schema.go: rename tables vec_nodes→vindex_nodes, vec_meta→vindex_meta; rename column rabitq→quantized; remove staging tables (vec_nodes_new, vec_meta_new) and swapIndex; use fixed SQL strings instead of fmt.Sprintf table interpolation; return int64 from getMaxNodeID/loadIndex - horosvec.go: migrate Index.medoid/nextID to int64; wire configureSQLite in New(); update all SQL to use vindex_nodes/vindex_meta/quantized; simplify rebuildInternal to delete+reinsert instead of staging table swap - tests: update table/column references, remove manual PRAGMA calls (now handled by configureSQLite via New()) All 16 tests pass. Recall@10 = 100% at 10K scale. https://claude.ai/code/session_01EKRZsDNuf6BvrCDSPbhhJW
Update CLAUDE.md principles and horosvec_schem.md consumers section to reflect HORAG indexmgr integration (Build/Insert/RebuildAsync with 3 regimes based on BuildThreshold). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…Insert errors
Linter cleanup (golangci-lint + staticcheck):
- Remove dead code: serializeInt32s, deserializeInt32s, serializeFloat64,
deserializeFloat64, cosineSimilarity, insertNode, nodeCache.size
- Fix errcheck: defer tx.Rollback() → defer func() { _ = tx.Rollback() }()
- Fix benchmark error handling
Bug fixes found in manual audit:
- vamanaSearch: pre-sized results slice could contain nil-ID entries with
Score 0 when ext_id lookup fails — now uses append to skip failures
- Insert.setNeighbors: silently ignored DB errors, could persist nodes
with empty neighbors — now returns error, critical call checked
New tests:
- TestSearchResultsValid: verifies all results have non-nil IDs, non-negative
scores, and sorted order (forces Vamana path with BruteForceThreshold=0)
- TestInsertNeighborsConnected: verifies inserted nodes have neighbors persisted
in the DB and are findable by search
All 22 tests pass. All linters clean. 100% recall@10 at all scales.
https://claude.ai/code/session_01EKRZsDNuf6BvrCDSPbhhJW
…c hot path
Before: 18.8ms, 16.5MB, 90K allocs/query
After: 1.3ms, 352B, 1 alloc/query (10K vectors, dim 128)
Changes:
- Flat contiguous vector storage for brute-force: eliminates 90K SQLite
scan+deserialize allocs. Populated at Build, maintained through Insert,
loaded on reload (New).
- Pooled searchState (sync.Pool): bitset visited set (replaces map[int64]bool),
typed min-heap (eliminates interface{} boxing from container/heap),
pre-allocated sorted best list. Zero-alloc steady state.
- Read-only cache access (loadNodeReadOnly/getReadOnly): no LRU write lock
on search hot path, enabling true concurrent read scaling.
- ext_id served from cache: eliminates per-result SQL queries in vamanaSearch.
cachedNode now stores extID, populated during Build/Insert/loadNode.
Vamana search now beats brute-force at 10K (1.3ms vs 2.0ms) and scales
O(log n) vs O(n) for larger indices.
https://claude.ai/code/session_01EKRZsDNuf6BvrCDSPbhhJW
BENCHMARK.md: detailed performance report for publication, covering: - Search latency scaling by dataset size and dimension - Vamana+RaBitQ vs brute-force crossover analysis - RaBitQ primitive benchmarks (encode, asym dist, precomp, POPCOUNT) - L2 exact distance baseline - Concurrent search throughput (178K qps on 16 cores) - Search state pool efficiency (21ns acquire/release) - Recall@10 at all scales (100% with brute-force path) - RaBitQ approximation quality (Spearman ρ ≈ 0.83) - Memory profile (DB size, flat vecs, cache estimate) - End-to-end timing breakdown - Allocation analysis (before: 90K allocs → after: 1 alloc) - Build and insert costs - Design decision rationale bench_report_test.go: 14-section benchmark suite with: - Parametric benchmarks across scales (1K/5K/10K) and dims (64-1024) - Forced Vamana path benchmarks - Concurrent search with RunParallel - Memory and recall measurement tests - Formatted table output for report generation https://claude.ai/code/session_01EKRZsDNuf6BvrCDSPbhhJW
Phase A du plan tests HOROS — fondations CI. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Research and compare horosvec against sqlite-vec, vectorlite, hnswlib, FAISS, USearch, and DiskANN with real published benchmark data. Sections added: - Landscape overview (7 libraries, CGO/language/algorithm matrix) - Brute-force KNN comparison at small scale (10K, 3K vectors) - ANN search comparison on SIFT-1M (QPS vs recall@10) - Memory efficiency per vector - RaBitQ vs PQ quantization quality (SIGMOD 2024) - Build time comparison - SQLite-based solutions comparison (modernc.org/sqlite compat) - When to use horosvec vs alternatives - Sources with links to papers and benchmarks Key findings: horosvec is the only pure Go (CGO_ENABLED=0) solution. At 10K brute-force: 1.33ms vs sqlite-vec ~17ms. At 1M scale, C++ libraries (hnswlib, FAISS) are 10-100x faster due to SIMD — the QPS gap reflects language-level difference, not algorithmic weakness. https://claude.ai/code/session_01EKRZsDNuf6BvrCDSPbhhJW
Refactor: Migrate to int64 node IDs and simplify index rebuild
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- errcheck/govet: fixed lint findings across 6 files - Reduced test dataset sizes (n=5000→1000-2000, dim=128→64) to stay within 120s timeout with -race detector while preserving algorithm correctness validation Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- bench_report_test.go: check idx.Search errors, reduce dataset sizes - horosvec_test.go: reduce n from 2000→1000, 1000→500 for CI -race - audit_test.go: reduce n from 5000→2000, 2000→1000 for CI -race Correctness validation preserved with smaller but sufficient datasets Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reduce test datasets more aggressively for GitHub Actions runners which are ~2-3x slower than local with -race detector: - RaBitQUsed: keep n=1000 (needed for RaBitQ to have visible effect) but reduce dim from 128 to 64 - InsertDegradation: n=1000→500 - SearchVsBruteForce: remove n=1000 scale - GraphConnectivity: remove n=1000 scale - DegreeDistribution: already at n=1000 - InsertNeighborsConnected: n=500→300 - EndToEndTimings: n=2000→500 - RaBitQCorrelation: n=500→200, remove dim=512 - RecallAtScale: remove n=1000 scale - MemoryProfile: n=1000→500, n=500→200 Total local time: 38s (was 90s), gives ~95s headroom on CI Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Phase B C8: 5 recovery tests verifying horosvec handles corruption gracefully (no panics): corrupted nodes, corrupt file, truncated DB, deleted meta, empty index search. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add dependabot.yml (weekly gomod grouped + github-actions) - Add concurrency group with cancel-in-progress - Add timeout-minutes: 10 on lint and test jobs - Add .gitignore (*.db, *.db-wal, *.db-shm, .env) - Add README.md Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…QLite Extracted from the horos55 ecosystem. Two-stage search (RaBitQ beam preselection, exact L2 rerank), transactional inserts (memory state applied post-commit only), context cancellation as errors, hardened binary import, centroid-drift rebuilds. Measured recall@10: 1.000 uniform / 0.982 gaussian clusters / 1.000 real bge-m3 embeddings (deterministic benches included). 42 tests, 85.9% coverage. MIT.
…v0.1.0 issue de horos55 Arbre v0.1.0 conserve integralement (strategie ours) ; recupere du prototype : .github (CI lint+test+race, dependabot — go-version alignee 1.24 -> 1.26) et .gitignore. Les fichiers du prototype (Makefile, BENCHMARK.md, METAVEC.md, CLAUDE.md, anciens tests) ne sont pas repris : la lignee de production horos55 (durcissement, overlay transactionnel, ctx, bancs recall synthetique+reel) les remplace.
…mmuable pour le proxy Go)
added 4 commits
July 7, 2026 10:46
Companion piece to the French article on hazyhaar.fr. Two-stage Vamana+RaBitQ design, measured recall (incl. real bge-m3 embeddings), hardening story, honest limits.
…120s -> 900s The empty critical section at horosvec_test.go was an intentional wait-for-rebuild barrier; state is now read under the lock (same semantics, satisfies staticcheck). The 120s test timeout was the archived prototype's budget: the real suite ships deterministic recall benches (~20s plain) that the race detector multiplies.
…r loop (16x real-world speedup) pprof on real bge-m3 workload (14k vectors, dim 1024) showed 84.6% of Search time in rabitqDistanceAsymPrecomp: a dim-iteration scalar loop with a bit-test branch per dimension, costing more than the exact float L2 it approximates. The fix is the classic fastscan approach: build once per query a partial-sum lookup table (256 patterns per code byte, pooled in searchState, incremental O(256)/byte construction), then each distance is dim/8 table lookups instead of dim branches. Stored format, graph, public API and search semantics unchanged: the LUT distance is mathematically identical (equivalence test vs the kept AsymPrecomp oracle, 800 random pairs across dims 8/60/64/1024, 1e-9 tolerance; tail bits of a partial last byte handled). Measured on the real-data bench, k=10: p50 28ms -> 1.7ms, 35 -> ~570 QPS at recall 1.000 across EfSearch 64-512. The unit microbenchmark (117 -> 44 ns/op) understates the gain: fixed-pattern codes let the branch predictor flatter the old loop; real random bits do not. Coverage 86.2%, 45 tests.
…cross its useful range Found on the SIFT bench: recall and QPS were identical from ef=64 to ef=512. vamanaSearch inflated the beam to max(EfSearch, RerankTopN=500), so the knob had no effect below 500 and the speed/recall trade-off was unreachable through the API. The coupling is now reversed: the beam is the user's knob (floored only at 3*topK), and rerank adapts to the beam (rerankN = min(RerankTopN, efSearch)). New oracle test counts heap pops via the existing test hook: ef=32 -> 36 pops, ef=512 -> 514 (previously ~500 regardless). Measured on SIFT-100k the curve now spreads: recall 0.48@8460qps (ef=32) to 0.955@885qps (ef=512). Note: defaults (EfSearch=128) are now genuinely narrower than the old inflated beam — faster, lower recall; tune EfSearch per workload. Recall saturates at ~0.955 beyond ef=512 on SIFT: graph/estimator ceiling on anisotropic low-dim data, tracked separately (rotation, M5).
…s (A1-A5, B1-B3) Groupe A — machine à états : - A1 node_count écrit DANS la transaction d'Insert + réconciliation COUNT(*) au chargement (O3) ; la méta n'est plus crue sur parole. - A2 erreur de getMaxNodeID propagée au chargement (plus d'index zombie nextID=0). - A3 médoïde illisible → erreur dure propagée ; voisin illisible → dégradation tolérée comptée (DegradedNeighborLoads) + Warn. - A4 garde de longueur len==dim*4 (vecFromBlobChecked) aux trois sites de désérialisation non fiable : repli rerank SQL, bruteForceSQLite, chargement flat (blob court → flat désactivé fail-loud). Compteur MalformedVectorSkips. - A5 échec d'extension du plan chaud compté (PlaneDegraded) + slog.Error. Groupe B : - B1 accumulation float64 interne du CentroidTracker (API float32 inchangée). - B2 sonde ctx.Err() toutes les ~4096 itérations dans bruteForceArena/bruteForceFlat. - B3 garde int32 fail-loud du cumul offsets du plan chaud (checkInt32Offset). Compteurs d'observabilité rétro-compatibles (fail-soft). Tests d'oracle par mécanisme, prouvés rouge-avant/vert-après (fixes2_oracle_test.go). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
CLAUDE.md : identité (bibliothèque Go embarquée, pas un service), module et frontières, invariants durs, consommateurs horos55, compteurs d'observabilité, gates. doc.go : documentation de la limite ~33M nœuds (offsets int32 du plan chaud). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Suite au finding soft de l'auto-audit : l'ancien TestA1 n'assertait que la consistance d'état final (node_count meta == COUNT(*)), déjà satisfaite par l'écriture post-commit best-effort de HEAD — donc vert-avant, ne prouvant pas le mécanisme. Le nouveau test lit node_count DANS la transaction via le hook testBeforeInsertCommit : après A1 la méta y vaut déjà le nouveau compte, sur HEAD elle valait l'ancien (rouge-avant vérifié). ext_ids distincts pour éviter le REPLACE sur la contrainte UNIQUE(ext_id). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Le re-classement du mode db-blob relisait 128 vecteurs par recherche via loadNodeReadOnly (cache LRU sous RWMutex, verrou franchi 128x/recherche) et un tas dispersé. Le miroir plat fp32 flatVecs, deja entretenu par l'Insert et indexe dense par node_id, est desormais charge a toute echelle en mode db-blob (ArenaPath vide) et lu directement par offset au rerank, sans verrou, sans cache LRU, sans SQL. Ordre de priorite: arene -> flatVecs -> loadNodeReadOnly. Le mode arene et le contrat transactionnel de l'Insert sont inchanges. flatVecs reste fp32. Test de parite rerank_flatvecs_test.go: top-K identique flatVecs vs SQL (ext_id, ordre, scores), RerankSQLLoads=0 sur le chemin flatVecs. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
La garde Config.FlatVecsMaxBytes ne protegeait que le rechargement (New()), laissant un premier Build() a grande echelle et la croissance runtime par Insert() peupler flatVecs sans borne (constat convergent de deux audits externes). Centralise la formule d'estimation dans flatVecsExceedsBudget(), appliquee desormais a Build, au rebuild async et a l'Insert (semantique retenue : gel de la croissance des que le budget serait depasse, flatVecs partiel). Durcit bruteForceSearch pour n'emprunter le chemin flat que sur couverture complete (sinon repli SQLite exact). Ajoute le ledger manquant audits/2026-07-10_flatvecs_garde_ram.md et deux tests decidables (TestFlatVecsBudgetGuardBuild, TestFlatVecsBudgetGuardInsertRuntime).
dependabot
Bot
force-pushed
the
dependabot/go_modules/all-go-deps-c8f7276110
branch
from
July 11, 2026 01:03
eaf30e8 to
231af2a
Compare
…-bit mesurée (bascule B≈8, gel adversarial), goulot marche greedy, notes d'analyse critique Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…tion fidèle et mmap derrière tags de build (P3) P4 : ARCHITECTURE.md §4 — db-blob-flat mode de travail à parité de débit, arène format de publication par shard, pont périodique en veille, arène segmentée archivée non-intégrée, note d'impact consommateurs. Zéro code. P3 : doc.go décrit la rotation Hadamard active (graine persistée) ; syscall.Mmap/Munmap isolés dans mmap_unix.go/mmap_stub.go (GOOS=windows compile-only best-effort, arène fail-loud hors Unix). Gates verts : build unix+windows, go test -count=1 (49 s), gofmt, vet. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…é (recall −0,0050 max sous +50% inserts, RAM shard-mois bornée) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Prolonge la rétrospective de juillet : campagne de qualification (P0 incrémental, P1 BM25 écarté, P2 SIMD abandonné), fondation arbre-de-fil, affichage par fil, texte des commentaires, chaîne delta deux-curseurs, fédération live. Documente les bugs débusqués au sol (budget-0-illimité, convergence des curseurs, artefact de lecture WAL, incident 502 freshness sans index ts) et l'aboutissement : une story postée le jour même en tête de recherche, corpus qui ne finit plus en 2021. Ajoute l'audit d'état du 13. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
dependabot
Bot
force-pushed
the
dependabot/go_modules/all-go-deps-c8f7276110
branch
from
July 18, 2026 01:03
231af2a to
f0b36b7
Compare
dependabot
Bot
force-pushed
the
dependabot/go_modules/all-go-deps-c8f7276110
branch
from
July 25, 2026 11:10
f0b36b7 to
1be9d11
Compare
…débit Les identifiants des candidats à re-classer sont tous connus avant la première lecture, mais la boucle les lisait un par un : chaque page absente provoquait un défaut servi de façon synchrone, et le processus attendait le disque autant de fois qu'il y avait de candidats. Sur un support capable d'en servir des dizaines simultanément, cette sérialisation n'était imposée que par l'ordre du code. Le correctif annonce au noyau, en une fois et avant la boucle, les plages que le re-classement va lire. Les lectures partent alors en parallèle, et elles sont bornées aux plages utiles au lieu d'étendre chaque défaut à sa fenêtre de lecture anticipée — jusqu'à 128 Kio pour 1 Kio demandé. Mesuré sur un index réel de 26 691 317 vecteurs en dimension 512, arène de 27,3 Go, 34,3 Go résidents, données plus grandes que la mémoire disponible : latence médiane 21,3 ms -> 1,9 ms (11,1x) défauts de page majeurs 28 827 -> 0 volume lu, 200 requêtes 2 311 Mo -> 107 Mo (21x) débit à 8 recherches || 261 req/s -> 1 940 req/s (7,4x) centile 99 à 8 en || 45,2 ms -> 6,4 ms Sémantique inchangée : sur 200 requêtes, les régimes avec et sans rendent un top-10 identique, même ordre et mêmes distances. Réglable par Config.PrefetchRerank, actif par défaut ; seul cas défavorable mesuré, 4,4 % de surcoût quand l'arène tient intégralement en cache. Ce commit apporte également deux noyaux de calcul réécrits et l'instrumentation qui a permis de trouver le défaut ci-dessus. Re-classement fusionné : la distance exacte se mesure directement sur les octets demi-précision de l'arène, sans matérialiser de tranche float32 intermédiaire. Le déballage par huit reproduit celui de l2DistanceSquared, ce qui rend le résultat égal au bit près à la voie remplacée. 427,7 ns par candidat contre 1 240, soit 2,90x. La conversion arithmétique sans table a été mesurée et écartée : 1 952 ns. Marche dans le graphe : l'estimation de distance approchée passe par cinq plans de bits au lieu d'une table de correspondance de 128 Kio reconstruite à chaque requête. 28,4 ns par distance contre 30,9, et 2 630 ns de préparation par requête contre 17 490, sans allocation. Rappel inchangé, vérifié contre la base. Ces deux noyaux ne produisent aucun gain mesurable à l'échelle de 26,7 millions, où le temps était dominé par l'attente disque ; ils restent acquis pour la mémoire économisée et la simplification. Le détail figure dans docs/MESURES-2026-08-prefetch.md, qui consigne aussi les sept pistes essayées puis écartées, chacune avec la mesure qui l'a écartée. Ajoute IOStats : lectures disque effectives, octets d'appels système, défauts de page majeurs et mineurs, empreinte résidente. Ce défaut valait un facteur huit et demi et a traversé plusieurs campagnes sans être vu, parce qu'elles chronométraient la recherche sans jamais demander d'où venait le temps. Ajoute enfin deux tests gravant les contrôles de dimension dont dépend l'absence de panique dans les deux noyaux, vérifiés par mutation. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… d'audit CLAUDE.md porte les instructions de travail internes du dépôt ; audits/ contient huit rapports datés produits lors des campagnes de juillet. Ni les uns ni les autres ne s'adressent à qui consomme la bibliothèque : ce sont des documents de travail, utiles dans le dépôt de développement où ils restent. Ils étaient déjà écartés de la copie vers la zone de publication, mais avaient été committés avant que cette exclusion existe. L'exclusion est reprise dans .gitignore pour qu'un ajout manuel ne les réintroduise pas. Les fichiers restent présents dans l'historique des commits antérieurs : ce retrait les sort des versions futures, il ne les efface pas du passé. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Le commit 644c58c n'avait enregistré que .gitignore : les fichiers avaient été retirés de l'index par « git rm --cached » mais laissés sur le disque, et « git commit -- <chemins> » commite l'état de l'ARBRE DE TRAVAIL sous ces chemins, non celui de l'index. Les suppressions ont donc été annulées au moment même du commit censé les enregistrer. Ce commit-ci les supprime réellement de la zone de publication, qui est de toute façon reconstruite par synchronisation depuis le dépôt de développement — lequel conserve ces documents et les exclut déjà de la copie. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Document de revue interne daté de juillet 2026 : forces et faiblesses de l'architecture, chantiers proposés. Il s'adresse à qui développe la bibliothèque, non à qui la consomme, et ses renvois pointent des chemins locaux du poste de développement, sans valeur pour un lecteur extérieur. Il rejoint CLAUDE.md et audits/ dans .gitignore. Le dépôt de développement le conserve. Comme pour le retrait précédent, le fichier demeure dans l'historique des commits antérieurs. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…s groupés Trois chantiers, et deux rectifications de mesures que ce dépôt annonçait. Quantification multi-bits (RaBitQ étendu). Config.CodeBits, de 1 à 8, vaut 1 par défaut : un index existant est strictement inchangé. La grille est symétrique et impaire, ℓ(c) = 2c − (2^B − 1) : à B = 1 elle vaut exactement le signe et le schéma se réduit trait pour trait au code d'origine, vérifié octet pour octet par test. Les plans sont rangés du poids fort au poids faible, si bien que les premiers (dim+7)/8 octets d'un code multi-bits SONT le code à un bit du même vecteur — l'affinage incrémental de la littérature reste ouvert. La largeur est celle de la construction, persistée en métadonnée : un index rouvert relit la largeur de ses propres codes, jamais celle que réclame la configuration. Sur corpus peu structuré, le gain est net : la présélection des 128 meilleurs candidats passe de 58 % à 88 % des vrais plus proches voisins entre un et trois bits, et le rappel de bout en bout de 0,76 à 0,97. Sur des plongements réels normalisés, en revanche, il ne rapporte que 0,8 point pour 45 % de latence en plus : le choix se mesure corpus par corpus et n'a pas de valeur par défaut. Plan chaud : le code, la norme carrée et la norme L1 sont entrelacés à pas fixe, et la taille du code est arrondie au multiple de huit, ce qui permet à la boucle de comptage de bits de lire des mots de 64 bits sans les recomposer — mesuré, cette recomposition passe de 12,4 % à 2,3 % du temps processeur. L'entrelacement lui-même ne gagne rien : quatre agencements comparés sur 26,7 millions de nœuds sont équivalents, entre 62 et 68 ns par accès, la latence d'un accès aléatoire en mémoire principale dominant tout. Il est conservé pour porter l'alignement et remplacer trois tranches par une, non pour accélérer. Préchargement : les plages du lot de re-classement sont annoncées au noyau en un seul appel système quand il le permet (process_madvise), au lieu d'un par candidat. Le temps processeur baisse de 8,4 %. Rectifications. Le rappel de l'index de référence de 26,7 millions de vecteurs est de 0,973, non de 0,470 : ce dernier chiffre avait été mesuré sur un corpus de vecteurs uniformes aléatoires — le cas pathologique de la recherche approchée — et attribué à tort. Et l'hypothèse expliquant le faible rendement de l'entrelacement par un chevauchement de lignes de cache est fausse : l'agencement aligné, qui devrait gagner, ne gagne pas. Protocole et mesures complètes dans docs/MESURES-2026-08-prefetch.md. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A write-up of the change shipped in cda2089, aimed at readers outside the project: what was slow, what the CPU profile did not show, why 96 major page faults per query did not have to be sequential, and what announcing the batch to the kernel returned. Median search latency on the 26.7M-vector reference index went from 21.28 ms to 1.79 ms with recall unchanged at 0.9733, measured against exhaustive brute force rather than against another approximate configuration. The article also carries the four abandoned paths with the measurement that killed each — CPU prefetch cannot fault a page in, memory layout of the hot plane is within noise across four variants, Go's experimental SIMD package costs around 90 cycles per shift or permute — and the correction of a recall figure attributed to the wrong corpus. Two files: the Markdown source, diffable and recompilable, and its Word render produced by DoWi55 (profile hn_post, print_light theme). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Bumps the all-go-deps group with 1 update in the / directory: [modernc.org/sqlite](https://gitlab.com/cznic/sqlite). Updates `modernc.org/sqlite` from 1.51.0 to 1.56.0 - [Changelog](https://gitlab.com/cznic/sqlite/blob/master/CHANGELOG.md) - [Commits](https://gitlab.com/cznic/sqlite/compare/v1.51.0...v1.56.0) --- updated-dependencies: - dependency-name: modernc.org/sqlite dependency-version: 1.53.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-go-deps ... Signed-off-by: dependabot[bot] <support@github.com>
dependabot
Bot
force-pushed
the
dependabot/go_modules/all-go-deps-c8f7276110
branch
from
August 15, 2026 01:03
1be9d11 to
20e9be6
Compare
Author
|
This pull request was built based on a group rule. Closing it will not ignore any of these versions in future pull requests. To ignore these dependencies, configure ignore rules in dependabot.yml |
dependabot
Bot
deleted the
dependabot/go_modules/all-go-deps-c8f7276110
branch
August 28, 2026 07:20
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bumps the all-go-deps group with 1 update in the / directory: modernc.org/sqlite.
Updates
modernc.org/sqlitefrom 1.51.0 to 1.56.0Changelog
Sourced from modernc.org/sqlite's changelog.
... (truncated)
Commits
cc920f9lib, vec: re-vendor, bump libc to v1.74.4, sweep the docs581eb45sqlite: validate the connector dsn with getVFSName, not a bare ParseQuerye7a39d2sqlite: document that a constructed Driver is not the registered one2c7e3ebsqlite: add NewConnector, a driver.Connector for sql.OpenDBcfb9734CHANGELOG.md: document the DSN validation-order change0895392sqlite: validate all DSN parameters before applying any of them63a57e4sqlite: select DSN shorthand aliases by presence, matching mattn (!134 follow...d7210fcCHANGELOG.md: correct the !134 DSN shorthand-key entryb31f521Merge branch 'dsn-compat-keys' into 'master'266b979sqlite: validate mattn-compat DSN keys and fix auto_vacuum apply order