@delali/narsil 0.2.2-next.29 → 0.2.3-next.32
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.
- package/README.md +12 -9
- package/dist/adapters/filesystem.d.ts +1 -1
- package/dist/adapters/filesystem.mjs +1 -1
- package/dist/adapters/indexeddb.d.ts +1 -1
- package/dist/adapters/indexeddb.mjs +1 -1
- package/dist/adapters/memory.d.ts +1 -1
- package/dist/{adapters-CVqI5NBt.d.ts → adapters-79OIa4xm.d.ts} +1 -1
- package/dist/brute-force-DbHYCTc3.d.ts +8 -0
- package/dist/chunk-BFIH7OV5.mjs +185 -0
- package/dist/chunk-C6VVLMRX.mjs +63 -0
- package/dist/{chunk-UNJZ7ZDB.mjs → chunk-EMI63EXP.mjs} +33 -2
- package/dist/chunk-MFFAJ2NR.mjs +135 -0
- package/dist/chunk-OBXS7OZM.mjs +376 -0
- package/dist/{chunk-ASI6AOW2.mjs → chunk-RO4EFWE6.mjs} +7833 -3524
- package/dist/{chunk-WLR5BFL3.mjs → chunk-TEAJO7CU.mjs} +3067 -2087
- package/dist/{chunk-S7RJJMHI.mjs → chunk-WDL632CN.mjs} +699 -222
- package/dist/{chunk-BKAI2WXI.mjs → chunk-WTONLDU3.mjs} +5 -0
- package/dist/client-DQHB_swQ.d.ts +793 -0
- package/dist/client.d.ts +6 -0
- package/dist/client.mjs +843 -0
- package/dist/{config-DXypXAfN.d.ts → config-ChZ7lfqc.d.ts} +3 -3
- package/dist/direct-executor-YARCDMJF.mjs +8 -0
- package/dist/distribution/coordinator/etcd.d.ts +3 -3
- package/dist/distribution/coordinator/etcd.mjs +471 -2
- package/dist/distribution/coordinator/in-memory.d.ts +3 -3
- package/dist/distribution/coordinator/in-memory.mjs +286 -1
- package/dist/distribution/transport/grpc.d.ts +45 -0
- package/dist/distribution/transport/grpc.mjs +586 -0
- package/dist/distribution/transport/in-memory.d.ts +118 -0
- package/dist/distribution/transport/in-memory.mjs +214 -0
- package/dist/distribution/transport/tcp.d.ts +27 -0
- package/dist/distribution/transport/tcp.mjs +595 -0
- package/dist/distribution.d.ts +241 -192
- package/dist/distribution.mjs +6620 -4795
- package/dist/embeddings/openai.d.ts +1 -1
- package/dist/embeddings/openai.mjs +1 -1
- package/dist/{engine-CO9Wnfie.d.ts → engine-DScGlT2Z.d.ts} +30 -3
- package/dist/index.browser.mjs +10035 -3914
- package/dist/index.d.ts +8 -8
- package/dist/index.mjs +8 -5
- package/dist/invalidation/broadcast-channel.d.ts +1 -1
- package/dist/invalidation/filesystem.d.ts +1 -1
- package/dist/invalidation/filesystem.mjs +3 -1
- package/dist/invalidation/noop.d.ts +1 -1
- package/dist/options-BORJg5XB.d.ts +234 -0
- package/dist/persistence/durability/checkpoint-worker.d.ts +4 -2
- package/dist/persistence/durability/checkpoint-worker.mjs +8 -5
- package/dist/react.d.ts +340 -0
- package/dist/react.mjs +687 -0
- package/dist/{schema-CE6S_aAr.d.ts → schema-emTQfEiX.d.ts} +21 -7
- package/dist/{search-DLBtiPdQ.d.ts → search-CQ-9bKxo.d.ts} +226 -14
- package/dist/server.d.ts +42 -356
- package/dist/server.mjs +493 -106
- package/dist/tasks-CnMLpfk-.d.ts +274 -0
- package/dist/types-BQDlIvfS.d.ts +34 -0
- package/dist/{types-BV3nAKTL.d.ts → types-Bfhhnh3G.d.ts} +23 -1
- package/dist/types-D5OwhtsQ.d.ts +97 -0
- package/dist/vector/hnsw-build-worker.d.ts +2 -7
- package/dist/vector/hnsw-build-worker.mjs +2 -1
- package/dist/vector/search-worker.d.ts +373 -0
- package/dist/vector/search-worker.mjs +279 -0
- package/dist/workers/entry.mjs +43 -25
- package/package.json +42 -2
- package/dist/chunk-FKK76OR7.mjs +0 -456
- package/dist/chunk-RQLXC2YS.mjs +0 -269
- package/dist/direct-executor-3W4QRA4E.mjs +0 -5
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
import { createArenaSimd } from './chunk-WDL632CN.mjs';
|
|
2
|
+
|
|
3
|
+
// src/vector/scalar-quantization-math.ts
|
|
4
|
+
function deriveSq8Constants(alpha, offset, dimensions) {
|
|
5
|
+
return {
|
|
6
|
+
alpha,
|
|
7
|
+
offset,
|
|
8
|
+
alphaSquared: alpha * alpha,
|
|
9
|
+
alphaTimesOffset: alpha * offset,
|
|
10
|
+
dimensionsTimesOffsetSquared: dimensions * offset * offset,
|
|
11
|
+
invAlpha: alpha > 0 ? 1 / alpha : 0
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function quantizeVectorInto(target, vector, dimensions, constants) {
|
|
15
|
+
const { offset, invAlpha } = constants;
|
|
16
|
+
let sum = 0;
|
|
17
|
+
let sumSq = 0;
|
|
18
|
+
for (let d = 0; d < dimensions; d++) {
|
|
19
|
+
const normalized = (vector[d] - offset) * invAlpha;
|
|
20
|
+
const scaled = normalized + 0.5;
|
|
21
|
+
const q = scaled < 0 ? 0 : scaled > 255 ? 255 : scaled | 0;
|
|
22
|
+
target[d] = q;
|
|
23
|
+
sum += q;
|
|
24
|
+
sumSq += q * q;
|
|
25
|
+
}
|
|
26
|
+
return { sum, sumSq };
|
|
27
|
+
}
|
|
28
|
+
function quantizedMagnitude(constants, sumSq, sum) {
|
|
29
|
+
const val = constants.alphaSquared * sumSq + 2 * constants.alphaTimesOffset * sum + constants.dimensionsTimesOffsetSquared;
|
|
30
|
+
return val > 0 ? Math.sqrt(val) : 0;
|
|
31
|
+
}
|
|
32
|
+
function realDotFromInt(constants, intDot, querySum, documentSum) {
|
|
33
|
+
return constants.alphaSquared * intDot + constants.alphaTimesOffset * (querySum + documentSum) + constants.dimensionsTimesOffsetSquared;
|
|
34
|
+
}
|
|
35
|
+
function scalarQuantizedDistance(codes, documentSums, documentMagnitudes, dimensions, constants, queryQuantized, querySum, queryMagnitude, ordinal, metric) {
|
|
36
|
+
const base = ordinal * dimensions;
|
|
37
|
+
if (metric === "euclidean") {
|
|
38
|
+
let intSqDist = 0;
|
|
39
|
+
for (let d = 0; d < dimensions; d++) {
|
|
40
|
+
const diff = queryQuantized[d] - codes[base + d];
|
|
41
|
+
intSqDist += diff * diff;
|
|
42
|
+
}
|
|
43
|
+
return constants.alpha * Math.sqrt(intSqDist);
|
|
44
|
+
}
|
|
45
|
+
let intDot = 0;
|
|
46
|
+
for (let d = 0; d < dimensions; d++) {
|
|
47
|
+
intDot += queryQuantized[d] * codes[base + d];
|
|
48
|
+
}
|
|
49
|
+
const realDot = realDotFromInt(constants, intDot, querySum, documentSums[ordinal]);
|
|
50
|
+
if (metric === "dotProduct") {
|
|
51
|
+
return -realDot;
|
|
52
|
+
}
|
|
53
|
+
const vecMag = documentMagnitudes[ordinal];
|
|
54
|
+
if (!vecMag || vecMag === 0 || queryMagnitude === 0) return 1;
|
|
55
|
+
return 1 - realDot / (queryMagnitude * vecMag);
|
|
56
|
+
}
|
|
57
|
+
function arenaQuantizedDistance(simd, queryByteOffset, codeByteOffset, dimensions, constants, querySum, queryMagnitude, documentSum, documentMagnitude, metric) {
|
|
58
|
+
if (metric === "euclidean") {
|
|
59
|
+
const intSqDist = simd.sqdist_u8(queryByteOffset, codeByteOffset, dimensions);
|
|
60
|
+
return constants.alpha * Math.sqrt(intSqDist);
|
|
61
|
+
}
|
|
62
|
+
const intDot = simd.dot_u8(queryByteOffset, codeByteOffset, dimensions);
|
|
63
|
+
const realDot = realDotFromInt(constants, intDot, querySum, documentSum);
|
|
64
|
+
if (metric === "dotProduct") {
|
|
65
|
+
return -realDot;
|
|
66
|
+
}
|
|
67
|
+
if (!documentMagnitude || documentMagnitude === 0 || queryMagnitude === 0) return 1;
|
|
68
|
+
return 1 - realDot / (queryMagnitude * documentMagnitude);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// src/vector/scalar-quantization-calibration.ts
|
|
72
|
+
var PADDING_FACTOR = 0.01;
|
|
73
|
+
function computeCalibrationBounds(vectors, dimensions) {
|
|
74
|
+
let globalMin = Number.POSITIVE_INFINITY;
|
|
75
|
+
let globalMax = Number.NEGATIVE_INFINITY;
|
|
76
|
+
let count = 0;
|
|
77
|
+
for (const vec of vectors) {
|
|
78
|
+
for (let d = 0; d < dimensions; d++) {
|
|
79
|
+
const val = vec[d];
|
|
80
|
+
if (val < globalMin) globalMin = val;
|
|
81
|
+
if (val > globalMax) globalMax = val;
|
|
82
|
+
}
|
|
83
|
+
count++;
|
|
84
|
+
}
|
|
85
|
+
if (count === 0) return null;
|
|
86
|
+
const range = globalMax - globalMin;
|
|
87
|
+
const pad = range * PADDING_FACTOR;
|
|
88
|
+
globalMin -= pad;
|
|
89
|
+
globalMax += pad;
|
|
90
|
+
if (globalMin === globalMax) {
|
|
91
|
+
globalMin -= 1e-3;
|
|
92
|
+
globalMax += 1e-3;
|
|
93
|
+
}
|
|
94
|
+
return { alpha: (globalMax - globalMin) / 255, offset: globalMin };
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// src/vector/scalar-quantization.ts
|
|
98
|
+
var INITIAL_CAPACITY = 16;
|
|
99
|
+
var PAGE_BYTES = 65536;
|
|
100
|
+
function createScalarQuantizer(dimensions, ordinalSource) {
|
|
101
|
+
const docToOrd = /* @__PURE__ */ new Map();
|
|
102
|
+
let simd = createArenaSimd();
|
|
103
|
+
const arenaByteOffset = simd ? Math.max(16, Math.ceil(dimensions / 16) * 16) : 0;
|
|
104
|
+
let capacity = 0;
|
|
105
|
+
let quantizedArena = simd ? new Uint8Array(simd.memory.buffer, arenaByteOffset) : new Uint8Array(0);
|
|
106
|
+
let scratch = simd ? new Uint8Array(simd.memory.buffer, 0, arenaByteOffset) : new Uint8Array(0);
|
|
107
|
+
let sums = new Float64Array(0);
|
|
108
|
+
let sumSqs = new Float64Array(0);
|
|
109
|
+
let mags = new Float64Array(0);
|
|
110
|
+
let present = new Uint8Array(0);
|
|
111
|
+
let selfNextOrd = 0;
|
|
112
|
+
let liveCount = 0;
|
|
113
|
+
let constants = deriveSq8Constants(0, 0, dimensions);
|
|
114
|
+
let calibrated = false;
|
|
115
|
+
function ensureCapacity(needed) {
|
|
116
|
+
if (needed <= capacity) return;
|
|
117
|
+
let newCap = capacity === 0 ? INITIAL_CAPACITY : capacity;
|
|
118
|
+
while (newCap < needed) newCap *= 2;
|
|
119
|
+
const nextSums = new Float64Array(newCap);
|
|
120
|
+
nextSums.set(sums);
|
|
121
|
+
sums = nextSums;
|
|
122
|
+
const nextSumSqs = new Float64Array(newCap);
|
|
123
|
+
nextSumSqs.set(sumSqs);
|
|
124
|
+
sumSqs = nextSumSqs;
|
|
125
|
+
const nextMags = new Float64Array(newCap);
|
|
126
|
+
nextMags.set(mags);
|
|
127
|
+
mags = nextMags;
|
|
128
|
+
const nextPresent = new Uint8Array(newCap);
|
|
129
|
+
nextPresent.set(present);
|
|
130
|
+
present = nextPresent;
|
|
131
|
+
if (simd) {
|
|
132
|
+
const requiredBytes = arenaByteOffset + newCap * dimensions;
|
|
133
|
+
const have = simd.memory.buffer.byteLength;
|
|
134
|
+
if (requiredBytes > have) {
|
|
135
|
+
try {
|
|
136
|
+
simd.memory.grow(Math.ceil((requiredBytes - have) / PAGE_BYTES));
|
|
137
|
+
} catch {
|
|
138
|
+
const migrated = new Uint8Array(newCap * dimensions);
|
|
139
|
+
migrated.set(quantizedArena.subarray(0, capacity * dimensions));
|
|
140
|
+
quantizedArena = migrated;
|
|
141
|
+
simd = null;
|
|
142
|
+
capacity = newCap;
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
quantizedArena = new Uint8Array(simd.memory.buffer, arenaByteOffset);
|
|
147
|
+
scratch = new Uint8Array(simd.memory.buffer, 0, arenaByteOffset);
|
|
148
|
+
} else {
|
|
149
|
+
const nextArena = new Uint8Array(newCap * dimensions);
|
|
150
|
+
nextArena.set(quantizedArena);
|
|
151
|
+
quantizedArena = nextArena;
|
|
152
|
+
}
|
|
153
|
+
capacity = newCap;
|
|
154
|
+
}
|
|
155
|
+
function resolveOrdinal(docId) {
|
|
156
|
+
const fromSource = ordinalSource?.getOrdinal(docId);
|
|
157
|
+
if (fromSource !== void 0) return fromSource;
|
|
158
|
+
const known = docToOrd.get(docId);
|
|
159
|
+
if (known !== void 0) return known;
|
|
160
|
+
return selfNextOrd++;
|
|
161
|
+
}
|
|
162
|
+
function quantizeInto(ord, vector) {
|
|
163
|
+
const base = ord * dimensions;
|
|
164
|
+
const { sum, sumSq } = quantizeVectorInto(
|
|
165
|
+
quantizedArena.subarray(base, base + dimensions),
|
|
166
|
+
vector,
|
|
167
|
+
dimensions,
|
|
168
|
+
constants
|
|
169
|
+
);
|
|
170
|
+
sums[ord] = sum;
|
|
171
|
+
sumSqs[ord] = sumSq;
|
|
172
|
+
mags[ord] = quantizedMagnitude(constants, sumSq, sum);
|
|
173
|
+
}
|
|
174
|
+
function storeEntry(docId, ord) {
|
|
175
|
+
if (present[ord] === 0) {
|
|
176
|
+
present[ord] = 1;
|
|
177
|
+
liveCount++;
|
|
178
|
+
}
|
|
179
|
+
docToOrd.set(docId, ord);
|
|
180
|
+
}
|
|
181
|
+
function calibrateFromVectors(vectors) {
|
|
182
|
+
const bounds = computeCalibrationBounds(vectors, dimensions);
|
|
183
|
+
if (bounds === null) return;
|
|
184
|
+
constants = deriveSq8Constants(bounds.alpha, bounds.offset, dimensions);
|
|
185
|
+
calibrated = true;
|
|
186
|
+
}
|
|
187
|
+
function isOutsideBounds(vector) {
|
|
188
|
+
const currentMin = constants.offset;
|
|
189
|
+
const currentMax = constants.offset + constants.alpha * 255;
|
|
190
|
+
for (let d = 0; d < dimensions; d++) {
|
|
191
|
+
if (vector[d] < currentMin || vector[d] > currentMax) {
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
function distanceScalar(queryQuantized, querySum, queryMagnitude, ord, metric) {
|
|
198
|
+
if (ord < 0 || ord >= capacity || present[ord] === 0) return Number.POSITIVE_INFINITY;
|
|
199
|
+
return scalarQuantizedDistance(
|
|
200
|
+
quantizedArena,
|
|
201
|
+
sums,
|
|
202
|
+
mags,
|
|
203
|
+
dimensions,
|
|
204
|
+
constants,
|
|
205
|
+
queryQuantized,
|
|
206
|
+
querySum,
|
|
207
|
+
queryMagnitude,
|
|
208
|
+
ord,
|
|
209
|
+
metric
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
return {
|
|
213
|
+
get dimensions() {
|
|
214
|
+
return dimensions;
|
|
215
|
+
},
|
|
216
|
+
get size() {
|
|
217
|
+
return liveCount;
|
|
218
|
+
},
|
|
219
|
+
get calibration() {
|
|
220
|
+
return calibrated ? { alpha: constants.alpha, offset: constants.offset } : null;
|
|
221
|
+
},
|
|
222
|
+
isCalibrated() {
|
|
223
|
+
return calibrated;
|
|
224
|
+
},
|
|
225
|
+
calibrate(vectors) {
|
|
226
|
+
calibrateFromVectors(vectors);
|
|
227
|
+
},
|
|
228
|
+
needsRecalibration(vector) {
|
|
229
|
+
if (!calibrated) return false;
|
|
230
|
+
return isOutsideBounds(vector);
|
|
231
|
+
},
|
|
232
|
+
recalibrateAll(vectors) {
|
|
233
|
+
const collected = [];
|
|
234
|
+
const rawVectors = [];
|
|
235
|
+
for (const pair of vectors) {
|
|
236
|
+
collected.push(pair);
|
|
237
|
+
rawVectors.push(pair[1]);
|
|
238
|
+
}
|
|
239
|
+
calibrateFromVectors(rawVectors);
|
|
240
|
+
docToOrd.clear();
|
|
241
|
+
present.fill(0);
|
|
242
|
+
liveCount = 0;
|
|
243
|
+
for (const [docId, vec] of collected) {
|
|
244
|
+
const ord = resolveOrdinal(docId);
|
|
245
|
+
ensureCapacity(ord + 1);
|
|
246
|
+
quantizeInto(ord, vec);
|
|
247
|
+
storeEntry(docId, ord);
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
quantize(docId, vector) {
|
|
251
|
+
if (!calibrated) {
|
|
252
|
+
calibrateFromVectors([vector]);
|
|
253
|
+
}
|
|
254
|
+
const ord = resolveOrdinal(docId);
|
|
255
|
+
ensureCapacity(ord + 1);
|
|
256
|
+
quantizeInto(ord, vector);
|
|
257
|
+
storeEntry(docId, ord);
|
|
258
|
+
},
|
|
259
|
+
remove(docId) {
|
|
260
|
+
const ord = docToOrd.get(docId);
|
|
261
|
+
if (ord === void 0) return;
|
|
262
|
+
docToOrd.delete(docId);
|
|
263
|
+
if (present[ord] === 1) {
|
|
264
|
+
present[ord] = 0;
|
|
265
|
+
liveCount--;
|
|
266
|
+
}
|
|
267
|
+
},
|
|
268
|
+
getQuantized(docId) {
|
|
269
|
+
const ord = docToOrd.get(docId);
|
|
270
|
+
if (ord === void 0 || present[ord] === 0) return void 0;
|
|
271
|
+
const base = ord * dimensions;
|
|
272
|
+
return quantizedArena.subarray(base, base + dimensions);
|
|
273
|
+
},
|
|
274
|
+
prepareQuery(query) {
|
|
275
|
+
if (!calibrated) return null;
|
|
276
|
+
const quantized = new Uint8Array(dimensions);
|
|
277
|
+
const { sum, sumSq } = quantizeVectorInto(quantized, query, dimensions, constants);
|
|
278
|
+
const mag = quantizedMagnitude(constants, sumSq, sum);
|
|
279
|
+
return { quantized, sum, sumSq, magnitude: mag };
|
|
280
|
+
},
|
|
281
|
+
distanceFromPrepared(prepared, docId, metric) {
|
|
282
|
+
const ord = docToOrd.get(docId);
|
|
283
|
+
if (ord === void 0) return Number.POSITIVE_INFINITY;
|
|
284
|
+
return distanceScalar(prepared.quantized, prepared.sum, prepared.magnitude, ord, metric);
|
|
285
|
+
},
|
|
286
|
+
distanceFromPreparedByOrdinal(prepared, ordinal, metric) {
|
|
287
|
+
return distanceScalar(prepared.quantized, prepared.sum, prepared.magnitude, ordinal, metric);
|
|
288
|
+
},
|
|
289
|
+
prepareQueryArena(query) {
|
|
290
|
+
if (!calibrated || !simd) return null;
|
|
291
|
+
const { sum, sumSq } = quantizeVectorInto(scratch, query, dimensions, constants);
|
|
292
|
+
const magnitude = quantizedMagnitude(constants, sumSq, sum);
|
|
293
|
+
return { sum, sumSq, magnitude };
|
|
294
|
+
},
|
|
295
|
+
distanceFromArena(prepared, ordinal, metric) {
|
|
296
|
+
if (!simd || ordinal < 0 || ordinal >= capacity || present[ordinal] === 0) {
|
|
297
|
+
return Number.POSITIVE_INFINITY;
|
|
298
|
+
}
|
|
299
|
+
const arenaOffset = arenaByteOffset + ordinal * dimensions;
|
|
300
|
+
return arenaQuantizedDistance(
|
|
301
|
+
simd,
|
|
302
|
+
0,
|
|
303
|
+
arenaOffset,
|
|
304
|
+
dimensions,
|
|
305
|
+
constants,
|
|
306
|
+
prepared.sum,
|
|
307
|
+
prepared.magnitude,
|
|
308
|
+
sums[ordinal],
|
|
309
|
+
mags[ordinal],
|
|
310
|
+
metric
|
|
311
|
+
);
|
|
312
|
+
},
|
|
313
|
+
hasOrdinal(ordinal) {
|
|
314
|
+
return ordinal >= 0 && ordinal < capacity && present[ordinal] === 1;
|
|
315
|
+
},
|
|
316
|
+
restoreCalibration(restoredAlpha, restoredOffset) {
|
|
317
|
+
constants = deriveSq8Constants(restoredAlpha, restoredOffset, dimensions);
|
|
318
|
+
calibrated = true;
|
|
319
|
+
},
|
|
320
|
+
restoreEntry(docId, quantized, sum, sumSq) {
|
|
321
|
+
const ord = resolveOrdinal(docId);
|
|
322
|
+
ensureCapacity(ord + 1);
|
|
323
|
+
const base = ord * dimensions;
|
|
324
|
+
quantizedArena.set(quantized.subarray(0, dimensions), base);
|
|
325
|
+
sums[ord] = sum;
|
|
326
|
+
sumSqs[ord] = sumSq;
|
|
327
|
+
mags[ord] = quantizedMagnitude(constants, sumSq, sum);
|
|
328
|
+
storeEntry(docId, ord);
|
|
329
|
+
},
|
|
330
|
+
copyStateInto(codes, targetSums, targetSumSqs, targetMagnitudes, targetPresent) {
|
|
331
|
+
const copySlots = Math.min(capacity, Math.floor(codes.length / dimensions));
|
|
332
|
+
if (copySlots <= 0) return;
|
|
333
|
+
codes.set(quantizedArena.subarray(0, copySlots * dimensions));
|
|
334
|
+
targetSums.set(sums.subarray(0, copySlots));
|
|
335
|
+
targetSumSqs.set(sumSqs.subarray(0, copySlots));
|
|
336
|
+
targetMagnitudes.set(mags.subarray(0, copySlots));
|
|
337
|
+
targetPresent.set(present.subarray(0, copySlots));
|
|
338
|
+
},
|
|
339
|
+
serialize() {
|
|
340
|
+
const serializedVectors = {};
|
|
341
|
+
const serializedSums = {};
|
|
342
|
+
const serializedSumSqs = {};
|
|
343
|
+
for (const [docId, ord] of docToOrd) {
|
|
344
|
+
if (present[ord] === 0) continue;
|
|
345
|
+
const base = ord * dimensions;
|
|
346
|
+
serializedVectors[docId] = Array.from(quantizedArena.subarray(base, base + dimensions));
|
|
347
|
+
serializedSums[docId] = sums[ord];
|
|
348
|
+
serializedSumSqs[docId] = sumSqs[ord];
|
|
349
|
+
}
|
|
350
|
+
return {
|
|
351
|
+
alpha: constants.alpha,
|
|
352
|
+
offset: constants.offset,
|
|
353
|
+
quantizedVectors: serializedVectors,
|
|
354
|
+
vectorSums: serializedSums,
|
|
355
|
+
vectorSumSqs: serializedSumSqs
|
|
356
|
+
};
|
|
357
|
+
},
|
|
358
|
+
clear() {
|
|
359
|
+
docToOrd.clear();
|
|
360
|
+
if (!simd) {
|
|
361
|
+
quantizedArena = new Uint8Array(0);
|
|
362
|
+
}
|
|
363
|
+
sums = new Float64Array(0);
|
|
364
|
+
sumSqs = new Float64Array(0);
|
|
365
|
+
mags = new Float64Array(0);
|
|
366
|
+
present = new Uint8Array(0);
|
|
367
|
+
capacity = 0;
|
|
368
|
+
selfNextOrd = 0;
|
|
369
|
+
liveCount = 0;
|
|
370
|
+
constants = deriveSq8Constants(0, 0, dimensions);
|
|
371
|
+
calibrated = false;
|
|
372
|
+
}
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
export { arenaQuantizedDistance, createScalarQuantizer, deriveSq8Constants, quantizeVectorInto, quantizedMagnitude, scalarQuantizedDistance };
|