verso-db 0.1.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +81 -49
  3. package/dist/BinaryHeap.d.ts +16 -5
  4. package/dist/BinaryHeap.d.ts.map +1 -1
  5. package/dist/BinaryHeap.js +138 -0
  6. package/dist/BinaryHeap.js.map +1 -0
  7. package/dist/Collection.d.ts +98 -17
  8. package/dist/Collection.d.ts.map +1 -1
  9. package/dist/Collection.js +1186 -0
  10. package/dist/Collection.js.map +1 -0
  11. package/dist/HNSWIndex.d.ts +170 -15
  12. package/dist/HNSWIndex.d.ts.map +1 -1
  13. package/dist/HNSWIndex.js +2818 -0
  14. package/dist/HNSWIndex.js.map +1 -0
  15. package/dist/MaxBinaryHeap.d.ts +2 -60
  16. package/dist/MaxBinaryHeap.d.ts.map +1 -1
  17. package/dist/MaxBinaryHeap.js +5 -0
  18. package/dist/MaxBinaryHeap.js.map +1 -0
  19. package/dist/SearchWorker.d.ts +104 -0
  20. package/dist/SearchWorker.d.ts.map +1 -0
  21. package/dist/SearchWorker.js +573 -0
  22. package/dist/SearchWorker.js.map +1 -0
  23. package/dist/VectorDB.d.ts +19 -5
  24. package/dist/VectorDB.d.ts.map +1 -1
  25. package/dist/VectorDB.js +246 -0
  26. package/dist/VectorDB.js.map +1 -0
  27. package/dist/WorkerPool.d.ts +92 -0
  28. package/dist/WorkerPool.d.ts.map +1 -0
  29. package/dist/WorkerPool.js +266 -0
  30. package/dist/WorkerPool.js.map +1 -0
  31. package/dist/backends/JsDistanceBackend.d.ts +3 -20
  32. package/dist/backends/JsDistanceBackend.d.ts.map +1 -1
  33. package/dist/backends/JsDistanceBackend.js +163 -0
  34. package/dist/backends/JsDistanceBackend.js.map +1 -0
  35. package/dist/encoding/DeltaEncoder.d.ts +2 -2
  36. package/dist/encoding/DeltaEncoder.d.ts.map +1 -1
  37. package/dist/encoding/DeltaEncoder.js +199 -0
  38. package/dist/encoding/DeltaEncoder.js.map +1 -0
  39. package/dist/errors.js +97 -0
  40. package/dist/errors.js.map +1 -0
  41. package/dist/index.d.ts +16 -17
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +61 -3419
  44. package/dist/index.js.map +1 -0
  45. package/dist/presets.d.ts +9 -9
  46. package/dist/presets.d.ts.map +1 -1
  47. package/dist/presets.js +205 -0
  48. package/dist/presets.js.map +1 -0
  49. package/dist/quantization/ScalarQuantizer.d.ts +10 -34
  50. package/dist/quantization/ScalarQuantizer.d.ts.map +1 -1
  51. package/dist/quantization/ScalarQuantizer.js +346 -0
  52. package/dist/quantization/ScalarQuantizer.js.map +1 -0
  53. package/dist/storage/BatchWriter.d.ts.map +1 -1
  54. package/dist/storage/BatchWriter.js +351 -0
  55. package/dist/storage/BatchWriter.js.map +1 -0
  56. package/dist/storage/BunStorageBackend.d.ts +12 -5
  57. package/dist/storage/BunStorageBackend.d.ts.map +1 -1
  58. package/dist/storage/BunStorageBackend.js +182 -0
  59. package/dist/storage/BunStorageBackend.js.map +1 -0
  60. package/dist/storage/MemoryBackend.d.ts.map +1 -1
  61. package/dist/storage/MemoryBackend.js +109 -0
  62. package/dist/storage/MemoryBackend.js.map +1 -0
  63. package/dist/storage/OPFSBackend.d.ts +9 -1
  64. package/dist/storage/OPFSBackend.d.ts.map +1 -1
  65. package/dist/storage/OPFSBackend.js +325 -0
  66. package/dist/storage/OPFSBackend.js.map +1 -0
  67. package/dist/storage/StorageBackend.d.ts +1 -1
  68. package/dist/storage/StorageBackend.js +12 -0
  69. package/dist/storage/StorageBackend.js.map +1 -0
  70. package/dist/storage/WriteAheadLog.d.ts +15 -11
  71. package/dist/storage/WriteAheadLog.d.ts.map +1 -1
  72. package/dist/storage/WriteAheadLog.js +321 -0
  73. package/dist/storage/WriteAheadLog.js.map +1 -0
  74. package/dist/storage/createStorageBackend.d.ts +4 -0
  75. package/dist/storage/createStorageBackend.d.ts.map +1 -1
  76. package/dist/storage/createStorageBackend.js +119 -0
  77. package/dist/storage/createStorageBackend.js.map +1 -0
  78. package/dist/storage/index.d.ts +3 -3
  79. package/dist/storage/index.js +33 -0
  80. package/dist/storage/index.js.map +1 -0
  81. package/dist/storage/nodeFsRuntime.d.ts +14 -0
  82. package/dist/storage/nodeFsRuntime.d.ts.map +1 -0
  83. package/dist/storage/nodeFsRuntime.js +105 -0
  84. package/dist/storage/nodeFsRuntime.js.map +1 -0
  85. package/package.json +47 -23
  86. package/dist/Storage.d.ts +0 -54
  87. package/dist/Storage.d.ts.map +0 -1
  88. package/dist/backends/DistanceBackend.d.ts +0 -5
  89. package/dist/backends/DistanceBackend.d.ts.map +0 -1
  90. package/src/BinaryHeap.ts +0 -131
  91. package/src/Collection.ts +0 -695
  92. package/src/HNSWIndex.ts +0 -1839
  93. package/src/MaxBinaryHeap.ts +0 -175
  94. package/src/Storage.ts +0 -435
  95. package/src/VectorDB.ts +0 -109
  96. package/src/backends/DistanceBackend.ts +0 -17
  97. package/src/backends/JsDistanceBackend.ts +0 -227
  98. package/src/encoding/DeltaEncoder.ts +0 -217
  99. package/src/errors.ts +0 -110
  100. package/src/index.ts +0 -138
  101. package/src/presets.ts +0 -229
  102. package/src/quantization/ScalarQuantizer.ts +0 -383
  103. package/src/storage/BatchWriter.ts +0 -336
  104. package/src/storage/BunStorageBackend.ts +0 -161
  105. package/src/storage/MemoryBackend.ts +0 -120
  106. package/src/storage/OPFSBackend.ts +0 -250
  107. package/src/storage/StorageBackend.ts +0 -74
  108. package/src/storage/WriteAheadLog.ts +0 -326
  109. package/src/storage/createStorageBackend.ts +0 -137
  110. package/src/storage/index.ts +0 -53
@@ -0,0 +1,266 @@
1
+ /**
2
+ * Worker pool for parallel query processing.
3
+ * Dispatches queries to workers via round-robin for concurrent execution.
4
+ * Falls back to sequential processing when workers are unavailable.
5
+ */
6
+ import { VectorDBError } from './errors.js';
7
+ export class WorkerPool {
8
+ numWorkers;
9
+ workers = [];
10
+ nextQueryId = 0;
11
+ roundRobinIndex = 0;
12
+ initialized = false;
13
+ fallbackIndex = null;
14
+ /**
15
+ * Create a worker pool for parallel HNSW search.
16
+ *
17
+ * @param numWorkers Number of workers (default: available hardware concurrency or 4)
18
+ */
19
+ constructor(numWorkers) {
20
+ this.numWorkers = numWorkers;
21
+ if (!numWorkers) {
22
+ this.numWorkers = typeof navigator !== 'undefined'
23
+ ? (navigator.hardwareConcurrency ?? 4)
24
+ : 4;
25
+ }
26
+ }
27
+ /**
28
+ * Initialize workers with shared index data.
29
+ * When the index uses SharedArrayBuffer, workers receive zero-copy
30
+ * views into the same vector memory. Otherwise, data is copied.
31
+ *
32
+ * @param index The HNSW index to distribute to workers
33
+ */
34
+ async init(index) {
35
+ this.fallbackIndex = index;
36
+ // Check if Worker is available
37
+ if (typeof Worker === 'undefined') {
38
+ // Workers not available, will use fallback
39
+ this.initialized = true;
40
+ return;
41
+ }
42
+ // Enable SharedArrayBuffer on the index for zero-copy vector sharing
43
+ index.enableSharedMemory();
44
+ const sharedData = index.getSharedSearchData();
45
+ if (!sharedData) {
46
+ // Index can't produce shared data, use fallback
47
+ this.initialized = true;
48
+ return;
49
+ }
50
+ const workerModulePath = import.meta.url.endsWith('.ts')
51
+ ? './SearchWorker.ts'
52
+ : './SearchWorker.js';
53
+ const workerUrl = new URL(workerModulePath, import.meta.url).href;
54
+ const initPromises = [];
55
+ for (let i = 0; i < this.numWorkers; i++) {
56
+ try {
57
+ const worker = new Worker(workerUrl, { type: 'module' });
58
+ const handle = {
59
+ worker,
60
+ readyResolve: null,
61
+ pendingResolve: new Map(),
62
+ pendingReject: new Map(),
63
+ };
64
+ worker.onmessage = (event) => {
65
+ const msg = event.data;
66
+ if (msg.type === 'ready') {
67
+ if (handle.readyResolve) {
68
+ handle.readyResolve();
69
+ handle.readyResolve = null;
70
+ }
71
+ }
72
+ else if (msg.type === 'result') {
73
+ const resolve = handle.pendingResolve.get(msg.queryId);
74
+ if (resolve) {
75
+ handle.pendingResolve.delete(msg.queryId);
76
+ handle.pendingReject.delete(msg.queryId);
77
+ resolve(msg.results);
78
+ }
79
+ }
80
+ else if (msg.type === 'error') {
81
+ const reject = handle.pendingReject.get(msg.queryId);
82
+ if (reject) {
83
+ handle.pendingResolve.delete(msg.queryId);
84
+ handle.pendingReject.delete(msg.queryId);
85
+ reject(new Error(msg.error));
86
+ }
87
+ }
88
+ };
89
+ worker.onerror = (event) => {
90
+ for (const reject of handle.pendingReject.values()) {
91
+ reject(new Error(`Worker error: ${event.message}`));
92
+ }
93
+ handle.pendingResolve.clear();
94
+ handle.pendingReject.clear();
95
+ };
96
+ const readyPromise = new Promise((resolve) => {
97
+ handle.readyResolve = resolve;
98
+ });
99
+ worker.postMessage({
100
+ type: 'init',
101
+ ...sharedData,
102
+ });
103
+ this.workers.push(handle);
104
+ initPromises.push(readyPromise);
105
+ }
106
+ catch {
107
+ // Worker creation failed, will use fallback for remaining
108
+ break;
109
+ }
110
+ }
111
+ if (initPromises.length > 0) {
112
+ const timeout = new Promise((_, reject) => {
113
+ const timer = setTimeout(() => reject(new Error('WorkerPool initialization timed out after 10s')), 10000);
114
+ if (typeof timer === 'object' && 'unref' in timer) {
115
+ timer.unref();
116
+ }
117
+ });
118
+ await Promise.race([Promise.all(initPromises), timeout]);
119
+ }
120
+ this.initialized = true;
121
+ }
122
+ /**
123
+ * Search for k nearest neighbors using worker pool.
124
+ * Dispatches to next available worker via round-robin.
125
+ *
126
+ * @param query Query vector
127
+ * @param k Number of results
128
+ * @param efSearch Search effort parameter
129
+ * @returns Array of {id, distance} results
130
+ */
131
+ async search(query, k, efSearch) {
132
+ if (!this.initialized) {
133
+ throw new VectorDBError('WorkerPool not initialized. Call init() first.', 'VALIDATION_ERROR');
134
+ }
135
+ // Fallback to sequential if no workers available
136
+ if (this.workers.length === 0 && this.fallbackIndex) {
137
+ return this.fallbackIndex.searchKNN(query, k, efSearch);
138
+ }
139
+ const queryId = this.nextQueryId++;
140
+ const workerIdx = this.roundRobinIndex % this.workers.length;
141
+ this.roundRobinIndex++;
142
+ const handle = this.workers[workerIdx];
143
+ return new Promise((resolve, reject) => {
144
+ handle.pendingResolve.set(queryId, resolve);
145
+ handle.pendingReject.set(queryId, reject);
146
+ handle.worker.postMessage({
147
+ type: 'search',
148
+ queryId,
149
+ query,
150
+ k,
151
+ efSearch: efSearch || Math.max(k * 2, 50),
152
+ });
153
+ });
154
+ }
155
+ /**
156
+ * Quantized search using worker pool.
157
+ * Workers perform int8 candidate scan + float32 rescore.
158
+ *
159
+ * @param query Query vector
160
+ * @param k Number of results
161
+ * @param candidateMultiplier Multiplier for rescore candidates
162
+ * @param efSearch Search effort parameter
163
+ * @returns Array of {id, distance} results
164
+ */
165
+ async searchQuantized(query, k, candidateMultiplier = 3, efSearch) {
166
+ if (!this.initialized) {
167
+ throw new VectorDBError('WorkerPool not initialized. Call init() first.', 'VALIDATION_ERROR');
168
+ }
169
+ // Fallback to sequential
170
+ if (this.workers.length === 0 && this.fallbackIndex) {
171
+ return this.fallbackIndex.searchKNNQuantized(query, k, candidateMultiplier, efSearch);
172
+ }
173
+ const queryId = this.nextQueryId++;
174
+ const workerIdx = this.roundRobinIndex % this.workers.length;
175
+ this.roundRobinIndex++;
176
+ const handle = this.workers[workerIdx];
177
+ return new Promise((resolve, reject) => {
178
+ handle.pendingResolve.set(queryId, resolve);
179
+ handle.pendingReject.set(queryId, reject);
180
+ handle.worker.postMessage({
181
+ type: 'search',
182
+ queryId,
183
+ query,
184
+ k,
185
+ efSearch: efSearch || Math.max(k * candidateMultiplier * 2, 50),
186
+ quantized: true,
187
+ candidateMultiplier,
188
+ });
189
+ });
190
+ }
191
+ /**
192
+ * Batch search: dispatch multiple queries in parallel across workers.
193
+ *
194
+ * @param queries Array of query vectors
195
+ * @param k Number of results per query
196
+ * @param efSearch Search effort parameter
197
+ * @returns Array of results, one per query
198
+ */
199
+ async searchBatch(queries, k, efSearch) {
200
+ if (!this.initialized) {
201
+ throw new VectorDBError('WorkerPool not initialized. Call init() first.', 'VALIDATION_ERROR');
202
+ }
203
+ // Fallback to sequential
204
+ if (this.workers.length === 0 && this.fallbackIndex) {
205
+ return queries.map(q => this.fallbackIndex.searchKNN(q, k, efSearch));
206
+ }
207
+ const promises = queries.map(q => this.search(q, k, efSearch));
208
+ return Promise.all(promises);
209
+ }
210
+ /**
211
+ * Batch quantized search across workers.
212
+ */
213
+ async searchBatchQuantized(queries, k, candidateMultiplier = 3, efSearch) {
214
+ if (!this.initialized) {
215
+ throw new VectorDBError('WorkerPool not initialized. Call init() first.', 'VALIDATION_ERROR');
216
+ }
217
+ if (this.workers.length === 0 && this.fallbackIndex) {
218
+ return queries.map(q => this.fallbackIndex.searchKNNQuantized(q, k, candidateMultiplier, efSearch));
219
+ }
220
+ const promises = queries.map(q => this.searchQuantized(q, k, candidateMultiplier, efSearch));
221
+ return Promise.all(promises);
222
+ }
223
+ /**
224
+ * Send incremental graph updates to all workers.
225
+ * Workers update their neighbor lists without full re-initialization.
226
+ * New vectors are already visible via SharedArrayBuffer.
227
+ */
228
+ broadcastGraphUpdate(newNodes, entryPointId, maxLevel) {
229
+ for (const handle of this.workers) {
230
+ handle.worker.postMessage({
231
+ type: 'graphUpdate',
232
+ newNodes,
233
+ });
234
+ if (entryPointId !== undefined && maxLevel !== undefined) {
235
+ handle.worker.postMessage({
236
+ type: 'updateEntryPoint',
237
+ entryPointId,
238
+ maxLevel,
239
+ });
240
+ }
241
+ }
242
+ }
243
+ /**
244
+ * Terminate all workers and clean up.
245
+ */
246
+ destroy() {
247
+ for (const handle of this.workers) {
248
+ handle.worker.terminate();
249
+ for (const reject of handle.pendingReject.values()) {
250
+ reject(new Error('Worker pool destroyed'));
251
+ }
252
+ handle.pendingResolve.clear();
253
+ handle.pendingReject.clear();
254
+ }
255
+ this.workers = [];
256
+ this.initialized = false;
257
+ this.fallbackIndex = null;
258
+ }
259
+ /**
260
+ * Get the number of active workers.
261
+ */
262
+ get workerCount() {
263
+ return this.workers.length;
264
+ }
265
+ }
266
+ //# sourceMappingURL=WorkerPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerPool.js","sourceRoot":"","sources":["../src/WorkerPool.ts"],"names":[],"mappings":"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"}
@@ -1,31 +1,14 @@
1
- import { DistanceBackend } from './DistanceBackend';
2
1
  /**
3
- * Optimized JavaScript distance backend with SIMD-style 4-wide unrolling.
4
- * This provides ~1.5-2x speedup over naive loops by reducing loop overhead
2
+ * Optimized JavaScript distance functions with SIMD-style unrolling.
3
+ * These provide ~1.5-2x speedup over naive loops by reducing loop overhead
5
4
  * and enabling better CPU pipelining.
6
5
  */
7
- export declare class JsDistanceBackend implements DistanceBackend {
8
- batchL2(base: Float32Array, dim: number, ids: Uint32Array, query: Float32Array, out: Float32Array): void;
9
- batchDot(base: Float32Array, dim: number, ids: Uint32Array, query: Float32Array, out: Float32Array): void;
10
- /**
11
- * Compute dot product with 4-wide manual unrolling for better performance.
12
- * Uses separate accumulators to enable instruction-level parallelism.
13
- */
14
- private dotProductUnrolled;
15
- /**
16
- * Compute L2 squared distance with 4-wide manual unrolling.
17
- */
18
- private l2SquaredUnrolled;
19
- }
20
- /**
21
- * Fast inline distance functions for single-vector comparisons.
22
- * These avoid the batch interface overhead for point-to-point distance calculations.
23
- */
24
6
  export declare function dotProductFast(a: Float32Array, b: Float32Array): number;
25
7
  export declare function l2SquaredFast(a: Float32Array, b: Float32Array): number;
26
8
  /**
27
9
  * Normalize a vector in place.
28
10
  * Uses 8-wide unrolling for better ILP.
11
+ * Returns the original norm of the vector.
29
12
  */
30
13
  export declare function normalizeInPlace(v: Float32Array): number;
31
14
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"JsDistanceBackend.d.ts","sourceRoot":"","sources":["../../src/backends/JsDistanceBackend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;GAIG;AACH,qBAAa,iBAAkB,YAAW,eAAe;IACvD,OAAO,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,GAAG,IAAI;IAQxG,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,GAAG,IAAI;IAQzG;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAyB1B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CA0BvE;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAmCtE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CA6BxD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,aAAa,UAAQ,EAAE,aAAa,UAAQ,GAAG,MAAM,CAsCzH"}
1
+ {"version":3,"file":"JsDistanceBackend.d.ts","sourceRoot":"","sources":["../../src/backends/JsDistanceBackend.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH,wBAAgB,cAAc,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CA2BvE;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAoCtE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAoCxD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,aAAa,UAAQ,EAAE,aAAa,UAAQ,GAAG,MAAM,CAuCzH"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Optimized JavaScript distance functions with SIMD-style unrolling.
3
+ * These provide ~1.5-2x speedup over naive loops by reducing loop overhead
4
+ * and enabling better CPU pipelining.
5
+ */
6
+ /**
7
+ * Fast inline distance functions for single-vector comparisons.
8
+ * Uses 8-wide unrolling with separate accumulators for instruction-level parallelism.
9
+ */
10
+ import { DimensionMismatchError } from '../errors.js';
11
+ function assertMatchingDimensions(a, b, context) {
12
+ if (a.length !== b.length) {
13
+ throw new DimensionMismatchError(a.length, b.length, context);
14
+ }
15
+ }
16
+ export function dotProductFast(a, b) {
17
+ assertMatchingDimensions(a, b, 'dotProductFast');
18
+ const len = a.length;
19
+ // Use 8 accumulators for better ILP (instruction-level parallelism)
20
+ let sum0 = 0, sum1 = 0, sum2 = 0, sum3 = 0;
21
+ let sum4 = 0, sum5 = 0, sum6 = 0, sum7 = 0;
22
+ let i = 0;
23
+ // 8-wide unrolling for high-dimensional vectors (768D, 1536D)
24
+ const limit8 = len - 7;
25
+ for (; i < limit8; i += 8) {
26
+ sum0 += a[i] * b[i];
27
+ sum1 += a[i + 1] * b[i + 1];
28
+ sum2 += a[i + 2] * b[i + 2];
29
+ sum3 += a[i + 3] * b[i + 3];
30
+ sum4 += a[i + 4] * b[i + 4];
31
+ sum5 += a[i + 5] * b[i + 5];
32
+ sum6 += a[i + 6] * b[i + 6];
33
+ sum7 += a[i + 7] * b[i + 7];
34
+ }
35
+ // Handle remaining elements
36
+ for (; i < len; i++) {
37
+ sum0 += a[i] * b[i];
38
+ }
39
+ return sum0 + sum1 + sum2 + sum3 + sum4 + sum5 + sum6 + sum7;
40
+ }
41
+ export function l2SquaredFast(a, b) {
42
+ assertMatchingDimensions(a, b, 'l2SquaredFast');
43
+ const len = a.length;
44
+ // Use 8 accumulators for better ILP
45
+ let sum0 = 0, sum1 = 0, sum2 = 0, sum3 = 0;
46
+ let sum4 = 0, sum5 = 0, sum6 = 0, sum7 = 0;
47
+ let i = 0;
48
+ // 8-wide unrolling for high-dimensional vectors
49
+ const limit8 = len - 7;
50
+ for (; i < limit8; i += 8) {
51
+ const d0 = a[i] - b[i];
52
+ const d1 = a[i + 1] - b[i + 1];
53
+ const d2 = a[i + 2] - b[i + 2];
54
+ const d3 = a[i + 3] - b[i + 3];
55
+ const d4 = a[i + 4] - b[i + 4];
56
+ const d5 = a[i + 5] - b[i + 5];
57
+ const d6 = a[i + 6] - b[i + 6];
58
+ const d7 = a[i + 7] - b[i + 7];
59
+ sum0 += d0 * d0;
60
+ sum1 += d1 * d1;
61
+ sum2 += d2 * d2;
62
+ sum3 += d3 * d3;
63
+ sum4 += d4 * d4;
64
+ sum5 += d5 * d5;
65
+ sum6 += d6 * d6;
66
+ sum7 += d7 * d7;
67
+ }
68
+ // Handle remaining elements
69
+ for (; i < len; i++) {
70
+ const d = a[i] - b[i];
71
+ sum0 += d * d;
72
+ }
73
+ return sum0 + sum1 + sum2 + sum3 + sum4 + sum5 + sum6 + sum7;
74
+ }
75
+ /**
76
+ * Normalize a vector in place.
77
+ * Uses 8-wide unrolling for better ILP.
78
+ * Returns the original norm of the vector.
79
+ */
80
+ export function normalizeInPlace(v) {
81
+ const len = v.length;
82
+ let s0 = 0, s1 = 0, s2 = 0, s3 = 0;
83
+ let s4 = 0, s5 = 0, s6 = 0, s7 = 0;
84
+ let i = 0;
85
+ const limit8 = len - 7;
86
+ for (; i < limit8; i += 8) {
87
+ s0 += v[i] * v[i];
88
+ s1 += v[i + 1] * v[i + 1];
89
+ s2 += v[i + 2] * v[i + 2];
90
+ s3 += v[i + 3] * v[i + 3];
91
+ s4 += v[i + 4] * v[i + 4];
92
+ s5 += v[i + 5] * v[i + 5];
93
+ s6 += v[i + 6] * v[i + 6];
94
+ s7 += v[i + 7] * v[i + 7];
95
+ }
96
+ for (; i < len; i++) {
97
+ s0 += v[i] * v[i];
98
+ }
99
+ const norm = Math.sqrt(s0 + s1 + s2 + s3 + s4 + s5 + s6 + s7);
100
+ if (norm < 1e-10) {
101
+ // Zero or near-zero vector: leave as-is to avoid Infinity/NaN from division
102
+ return norm;
103
+ }
104
+ const invNorm = 1 / norm;
105
+ // 8-wide unrolling for the division loop matches the norm computation above
106
+ const divLimit8 = len - 7;
107
+ let j = 0;
108
+ for (; j < divLimit8; j += 8) {
109
+ v[j] *= invNorm;
110
+ v[j + 1] *= invNorm;
111
+ v[j + 2] *= invNorm;
112
+ v[j + 3] *= invNorm;
113
+ v[j + 4] *= invNorm;
114
+ v[j + 5] *= invNorm;
115
+ v[j + 6] *= invNorm;
116
+ v[j + 7] *= invNorm;
117
+ }
118
+ for (; j < len; j++)
119
+ v[j] *= invNorm;
120
+ return norm;
121
+ }
122
+ /**
123
+ * Compute cosine distance between two vectors.
124
+ * For pre-normalized vectors, this is simply 1 - dot(a, b).
125
+ * Uses 8-wide unrolling for norm computation.
126
+ */
127
+ export function cosineDistanceFast(a, b, aIsNormalized = false, bIsNormalized = false) {
128
+ assertMatchingDimensions(a, b, 'cosineDistanceFast');
129
+ const dot = dotProductFast(a, b);
130
+ if (aIsNormalized && bIsNormalized) {
131
+ // Both vectors are normalized, cosine distance = 1 - dot
132
+ const dist = 1 - dot;
133
+ return dist < 1e-10 ? 0 : dist;
134
+ }
135
+ // Need to compute norms with 8-wide unrolling
136
+ const len = a.length;
137
+ let nA0 = 0, nA1 = 0, nA2 = 0, nA3 = 0;
138
+ let nB0 = 0, nB1 = 0, nB2 = 0, nB3 = 0;
139
+ let i = 0;
140
+ const limit8 = len - 7;
141
+ for (; i < limit8; i += 8) {
142
+ nA0 += a[i] * a[i] + a[i + 4] * a[i + 4];
143
+ nA1 += a[i + 1] * a[i + 1] + a[i + 5] * a[i + 5];
144
+ nA2 += a[i + 2] * a[i + 2] + a[i + 6] * a[i + 6];
145
+ nA3 += a[i + 3] * a[i + 3] + a[i + 7] * a[i + 7];
146
+ nB0 += b[i] * b[i] + b[i + 4] * b[i + 4];
147
+ nB1 += b[i + 1] * b[i + 1] + b[i + 5] * b[i + 5];
148
+ nB2 += b[i + 2] * b[i + 2] + b[i + 6] * b[i + 6];
149
+ nB3 += b[i + 3] * b[i + 3] + b[i + 7] * b[i + 7];
150
+ }
151
+ for (; i < len; i++) {
152
+ nA0 += a[i] * a[i];
153
+ nB0 += b[i] * b[i];
154
+ }
155
+ const normA = nA0 + nA1 + nA2 + nA3;
156
+ const normB = nB0 + nB1 + nB2 + nB3;
157
+ const magnitude = Math.sqrt(normA) * Math.sqrt(normB);
158
+ if (magnitude === 0)
159
+ return 1;
160
+ const dist = 1 - (dot / magnitude);
161
+ return dist < 1e-10 ? 0 : dist;
162
+ }
163
+ //# sourceMappingURL=JsDistanceBackend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JsDistanceBackend.js","sourceRoot":"","sources":["../../src/backends/JsDistanceBackend.ts"],"names":[],"mappings":"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"}
@@ -33,7 +33,7 @@ export declare function varintSize(value: number): number;
33
33
  * Delta-encode a sorted array of neighbor IDs
34
34
  * Returns the encoded buffer
35
35
  */
36
- export declare function deltaEncodeNeighbors(neighbors: number[]): Uint8Array;
36
+ export declare function deltaEncodeNeighbors(neighbors: number[], preSorted?: boolean): Uint8Array;
37
37
  /**
38
38
  * Decode a delta-encoded neighbor list
39
39
  * Returns the original neighbor IDs (sorted)
@@ -43,7 +43,7 @@ export declare function deltaDecodeNeighbors(buffer: Uint8Array, count: number):
43
43
  * Calculate the encoded size for a neighbor list without actually encoding
44
44
  * Useful for calculating total buffer size before serialization
45
45
  */
46
- export declare function deltaEncodedSize(neighbors: number[]): number;
46
+ export declare function deltaEncodedSize(neighbors: number[], preSorted?: boolean): number;
47
47
  /**
48
48
  * Batch encode multiple neighbor lists efficiently
49
49
  * Returns a single buffer with all encoded lists concatenated
@@ -1 +1 @@
1
- {"version":3,"file":"DeltaEncoder.d.ts","sourceRoot":"","sources":["../../src/encoding/DeltaEncoder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAWtF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAqBjF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQhD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,UAAU,CAkCpE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAoBhF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAgB5D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,GAAG;IAC3D,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAqBA;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,MAAM,EAAE,EACjB,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,MAAM,EAAE,GACf,MAAM,EAAE,EAAE,CAaZ"}
1
+ {"version":3,"file":"DeltaEncoder.d.ts","sourceRoot":"","sources":["../../src/encoding/DeltaEncoder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAWtF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA0BjF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQhD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,SAAS,UAAQ,GAAG,UAAU,CAyCvF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAoBhF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,SAAS,UAAQ,GAAG,MAAM,CAuB/E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,GAAG;IAC3D,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CA0BA;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,MAAM,EAAE,EACjB,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,MAAM,EAAE,GACf,MAAM,EAAE,EAAE,CAaZ"}