## BaraDB Search Benchmarks — HNSW recall, FTS performance, scalability import std/monotimes import std/times import std/random import std/strutils import std/tables import std/sets import std/math import std/algorithm import ../src/barabadb/vector/engine as vengine import ../src/barabadb/fts/engine as fts import ../src/barabadb/search/hnsw_opt type LatencyStats = tuple[avg, p50, p95, p99: float64] const sampleDocs = [ "The quick brown fox jumps over the lazy dog near the river bank", "Database indexing strategies include B-trees hash indexes and inverted indexes", "Vector similarity search uses approximate nearest neighbor algorithms like HNSW", "Full text search engines use inverted indexes with BM25 ranking", "Natural language processing requires tokenization stemming and embedding", "Machine learning models transform raw data into meaningful insights", "Distributed systems handle network partitions and consistency tradeoffs", "Graph databases traverse relationships between connected entities efficiently", "Time series databases optimize for sequential write patterns", "Columnar storage accelerates analytical queries across large datasets", "Query optimization involves cost-based planning and execution strategies", "Memory management uses reference counting for deterministic cleanup", "Concurrent data structures enable lock-free parallel processing", "Cryptographic hashing provides integrity verification for stored data", "Replication strategies ensure high availability across multiple nodes", "Sharding distributes data based on consistent hashing algorithms", "ACID transactions guarantee atomicity consistency isolation durability", "Event sourcing captures state changes as immutable sequence of events", "Microservices architecture decomposes applications into independent services", "API design principles emphasize simplicity consistency and discoverability", ] proc elapsed(start: MonoTime): float64 = let ns = float64((getMonoTime() - start).inNanoseconds) return ns / 1_000_000_000.0 proc percentile(values: seq[float64], p: int): float64 = if values.len == 0: return 0.0 var sorted = values sorted.sort() let idx = (p * sorted.len) div 100 if idx >= sorted.len: return sorted[^1] return sorted[idx] proc latencyStats(latencies: seq[float64]): LatencyStats = if latencies.len == 0: return (0.0, 0.0, 0.0, 0.0) var sum = 0.0 for v in latencies: sum += v result.avg = sum / float64(latencies.len) result.p50 = percentile(latencies, 50) result.p95 = percentile(latencies, 95) result.p99 = percentile(latencies, 99) proc formatMs(ms: float64): string = if ms < 0.01: return ms.formatFloat(ffDecimal, 4) & "ms" return ms.formatFloat(ffDecimal, 2) & "ms" proc formatOps(ops: int, secs: float64): string = let rate = float64(ops) / secs if rate > 1_000_000: return $(rate / 1_000_000).formatFloat(ffDecimal, 1) & "M ops/s" elif rate > 1_000: return $(rate / 1_000).formatFloat(ffDecimal, 1) & "K ops/s" else: return $rate.formatFloat(ffDecimal, 1) & " ops/s" proc computeGroundTruth(query: Vector, vectors: seq[(uint64, Vector)], k: int): seq[(uint64, float64)] = var dists: seq[(float64, uint64)] = @[] for (id, vec) in vectors: let dist = cosineDistance(query, vec) dists.add((dist, id)) dists.sort(proc(a, b: (float64, uint64)): int = cmp(a[0], b[0])) let n = min(k, dists.len) result = newSeq[(uint64, float64)](n) for i in 0.. 0: for startPos in positions[0]: var match = true for i in 1..