@soulcraft/brainy 0.41.0 → 0.44.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.
- package/README.md +605 -194
- package/dist/augmentationFactory.d.ts.map +1 -0
- package/dist/augmentationFactory.js +342 -0
- package/dist/augmentationFactory.js.map +1 -0
- package/dist/augmentationPipeline.d.ts.map +1 -0
- package/dist/augmentationPipeline.js +472 -0
- package/dist/augmentationPipeline.js.map +1 -0
- package/dist/augmentationRegistry.d.ts.map +1 -0
- package/dist/augmentationRegistry.js +105 -0
- package/dist/augmentationRegistry.js.map +1 -0
- package/dist/augmentationRegistryLoader.d.ts.map +1 -0
- package/dist/augmentationRegistryLoader.js +213 -0
- package/dist/augmentationRegistryLoader.js.map +1 -0
- package/dist/augmentations/conduitAugmentations.js +1158 -0
- package/dist/augmentations/conduitAugmentations.js.map +1 -0
- package/dist/augmentations/memoryAugmentations.d.ts +2 -0
- package/dist/augmentations/memoryAugmentations.d.ts.map +1 -1
- package/dist/augmentations/memoryAugmentations.js +270 -0
- package/dist/augmentations/memoryAugmentations.js.map +1 -0
- package/dist/augmentations/serverSearchAugmentations.js +531 -0
- package/dist/augmentations/serverSearchAugmentations.js.map +1 -0
- package/dist/brainyData.d.ts.map +1 -0
- package/dist/brainyData.js +3999 -0
- package/dist/brainyData.js.map +1 -0
- package/dist/browserFramework.d.ts +15 -0
- package/dist/browserFramework.d.ts.map +1 -0
- package/dist/browserFramework.js +31 -0
- package/dist/browserFramework.js.map +1 -0
- package/dist/coreTypes.d.ts.map +1 -0
- package/dist/coreTypes.js +5 -0
- package/dist/coreTypes.js.map +1 -0
- package/dist/demo.d.ts +106 -0
- package/dist/demo.d.ts.map +1 -0
- package/dist/demo.js +201 -0
- package/dist/demo.js.map +1 -0
- package/dist/distributed/configManager.d.ts.map +1 -0
- package/dist/distributed/configManager.js +322 -0
- package/dist/distributed/configManager.js.map +1 -0
- package/dist/distributed/domainDetector.d.ts.map +1 -0
- package/dist/distributed/domainDetector.js +307 -0
- package/dist/distributed/domainDetector.js.map +1 -0
- package/dist/distributed/hashPartitioner.d.ts.map +1 -0
- package/dist/distributed/hashPartitioner.js +146 -0
- package/dist/distributed/hashPartitioner.js.map +1 -0
- package/dist/distributed/healthMonitor.d.ts.map +1 -0
- package/dist/distributed/healthMonitor.js +244 -0
- package/dist/distributed/healthMonitor.js.map +1 -0
- package/dist/distributed/index.d.ts.map +1 -0
- package/dist/distributed/index.js +9 -0
- package/dist/distributed/index.js.map +1 -0
- package/dist/distributed/operationalModes.d.ts.map +1 -0
- package/dist/distributed/operationalModes.js +201 -0
- package/dist/distributed/operationalModes.js.map +1 -0
- package/dist/errors/brainyError.d.ts.map +1 -0
- package/dist/errors/brainyError.js +113 -0
- package/dist/errors/brainyError.js.map +1 -0
- package/dist/examples/basicUsage.js +118 -0
- package/dist/examples/basicUsage.js.map +1 -0
- package/dist/hnsw/distributedSearch.js +452 -0
- package/dist/hnsw/distributedSearch.js.map +1 -0
- package/dist/hnsw/hnswIndex.js +602 -0
- package/dist/hnsw/hnswIndex.js.map +1 -0
- package/dist/hnsw/hnswIndexOptimized.js +471 -0
- package/dist/hnsw/hnswIndexOptimized.js.map +1 -0
- package/dist/hnsw/optimizedHNSWIndex.js +313 -0
- package/dist/hnsw/optimizedHNSWIndex.js.map +1 -0
- package/dist/hnsw/partitionedHNSWIndex.js +304 -0
- package/dist/hnsw/partitionedHNSWIndex.js.map +1 -0
- package/dist/hnsw/scaledHNSWSystem.js +559 -0
- package/dist/hnsw/scaledHNSWSystem.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +81 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/brainyMCPAdapter.js +142 -0
- package/dist/mcp/brainyMCPAdapter.js.map +1 -0
- package/dist/mcp/brainyMCPService.js +248 -0
- package/dist/mcp/brainyMCPService.js.map +1 -0
- package/dist/mcp/index.js +17 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/mcpAugmentationToolset.js +180 -0
- package/dist/mcp/mcpAugmentationToolset.js.map +1 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +590 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/sequentialPipeline.d.ts.map +1 -0
- package/dist/sequentialPipeline.js +417 -0
- package/dist/sequentialPipeline.js.map +1 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +46 -0
- package/dist/setup.js.map +1 -0
- package/dist/storage/adapters/baseStorageAdapter.js +349 -0
- package/dist/storage/adapters/baseStorageAdapter.js.map +1 -0
- package/dist/storage/adapters/batchS3Operations.js +287 -0
- package/dist/storage/adapters/batchS3Operations.js.map +1 -0
- package/dist/storage/adapters/fileSystemStorage.js +846 -0
- package/dist/storage/adapters/fileSystemStorage.js.map +1 -0
- package/dist/storage/adapters/memoryStorage.js +532 -0
- package/dist/storage/adapters/memoryStorage.js.map +1 -0
- package/dist/storage/adapters/opfsStorage.d.ts.map +1 -1
- package/dist/storage/adapters/opfsStorage.js +1118 -0
- package/dist/storage/adapters/opfsStorage.js.map +1 -0
- package/dist/storage/adapters/optimizedS3Search.js +248 -0
- package/dist/storage/adapters/optimizedS3Search.js.map +1 -0
- package/dist/storage/adapters/s3CompatibleStorage.js +2026 -0
- package/dist/storage/adapters/s3CompatibleStorage.js.map +1 -0
- package/dist/storage/baseStorage.js +603 -0
- package/dist/storage/baseStorage.js.map +1 -0
- package/dist/storage/cacheManager.js +1306 -0
- package/dist/storage/cacheManager.js.map +1 -0
- package/dist/storage/enhancedCacheManager.js +520 -0
- package/dist/storage/enhancedCacheManager.js.map +1 -0
- package/dist/storage/readOnlyOptimizations.js +425 -0
- package/dist/storage/readOnlyOptimizations.js.map +1 -0
- package/dist/storage/storageFactory.d.ts +0 -1
- package/dist/storage/storageFactory.d.ts.map +1 -1
- package/dist/storage/storageFactory.js +227 -0
- package/dist/storage/storageFactory.js.map +1 -0
- package/dist/types/augmentations.js +16 -0
- package/dist/types/augmentations.js.map +1 -0
- package/dist/types/brainyDataInterface.js +8 -0
- package/dist/types/brainyDataInterface.js.map +1 -0
- package/dist/types/distributedTypes.js +6 -0
- package/dist/types/distributedTypes.js.map +1 -0
- package/dist/types/fileSystemTypes.js +8 -0
- package/dist/types/fileSystemTypes.js.map +1 -0
- package/dist/types/graphTypes.js +247 -0
- package/dist/types/graphTypes.js.map +1 -0
- package/dist/types/mcpTypes.js +22 -0
- package/dist/types/mcpTypes.js.map +1 -0
- package/dist/types/paginationTypes.js +5 -0
- package/dist/types/paginationTypes.js.map +1 -0
- package/dist/types/pipelineTypes.js +7 -0
- package/dist/types/pipelineTypes.js.map +1 -0
- package/dist/types/tensorflowTypes.js +6 -0
- package/dist/types/tensorflowTypes.js.map +1 -0
- package/dist/unified.d.ts.map +1 -0
- package/dist/unified.js +52 -128251
- package/dist/unified.js.map +1 -0
- package/dist/utils/autoConfiguration.js +341 -0
- package/dist/utils/autoConfiguration.js.map +1 -0
- package/dist/utils/cacheAutoConfig.js +261 -0
- package/dist/utils/cacheAutoConfig.js.map +1 -0
- package/dist/utils/crypto.js +45 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/distance.js +239 -0
- package/dist/utils/distance.js.map +1 -0
- package/dist/utils/embedding.d.ts.map +1 -1
- package/dist/utils/embedding.js +702 -0
- package/dist/utils/embedding.js.map +1 -0
- package/dist/utils/environment.js +75 -0
- package/dist/utils/environment.js.map +1 -0
- package/dist/utils/fieldNameTracking.js +90 -0
- package/dist/utils/fieldNameTracking.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/jsonProcessing.js +179 -0
- package/dist/utils/jsonProcessing.js.map +1 -0
- package/dist/utils/logger.js +129 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/operationUtils.js +126 -0
- package/dist/utils/operationUtils.js.map +1 -0
- package/dist/utils/robustModelLoader.d.ts +14 -0
- package/dist/utils/robustModelLoader.d.ts.map +1 -1
- package/dist/utils/robustModelLoader.js +537 -0
- package/dist/utils/robustModelLoader.js.map +1 -0
- package/dist/utils/searchCache.js +248 -0
- package/dist/utils/searchCache.js.map +1 -0
- package/dist/utils/statistics.js +25 -0
- package/dist/utils/statistics.js.map +1 -0
- package/dist/utils/statisticsCollector.js +224 -0
- package/dist/utils/statisticsCollector.js.map +1 -0
- package/dist/utils/textEncoding.js +309 -0
- package/dist/utils/textEncoding.js.map +1 -0
- package/dist/utils/typeUtils.js +40 -0
- package/dist/utils/typeUtils.js.map +1 -0
- package/dist/utils/version.d.ts +15 -3
- package/dist/utils/version.d.ts.map +1 -1
- package/dist/utils/version.js +24 -0
- package/dist/utils/version.js.map +1 -0
- package/dist/utils/workerUtils.js +458 -0
- package/dist/utils/workerUtils.js.map +1 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +54 -0
- package/dist/worker.js.map +1 -0
- package/package.json +30 -29
- package/dist/brainy.js +0 -90220
- package/dist/brainy.min.js +0 -12511
- package/dist/patched-platform-node.d.ts +0 -17
- package/dist/statistics/statisticsManager.d.ts +0 -121
- package/dist/storage/fileSystemStorage.d.ts +0 -73
- package/dist/storage/fileSystemStorage.d.ts.map +0 -1
- package/dist/storage/opfsStorage.d.ts +0 -236
- package/dist/storage/opfsStorage.d.ts.map +0 -1
- package/dist/storage/s3CompatibleStorage.d.ts +0 -157
- package/dist/storage/s3CompatibleStorage.d.ts.map +0 -1
- package/dist/testing/prettyReporter.d.ts +0 -23
- package/dist/testing/prettySummaryReporter.d.ts +0 -22
- package/dist/unified.min.js +0 -16153
- package/dist/utils/environmentDetection.d.ts +0 -47
- package/dist/utils/environmentDetection.d.ts.map +0 -1
- package/dist/utils/tensorflowUtils.d.ts +0 -17
- package/dist/utils/tensorflowUtils.d.ts.map +0 -1
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optimized HNSW (Hierarchical Navigable Small World) Index implementation
|
|
3
|
+
* Extends the base HNSW implementation with support for large datasets
|
|
4
|
+
* Uses product quantization for dimensionality reduction and disk-based storage when needed
|
|
5
|
+
*/
|
|
6
|
+
import { HNSWIndex } from './hnswIndex.js';
|
|
7
|
+
// Default configuration for the optimized HNSW index
|
|
8
|
+
const DEFAULT_OPTIMIZED_CONFIG = {
|
|
9
|
+
M: 16,
|
|
10
|
+
efConstruction: 200,
|
|
11
|
+
efSearch: 50,
|
|
12
|
+
ml: 16,
|
|
13
|
+
memoryThreshold: 1024 * 1024 * 1024, // 1GB default threshold
|
|
14
|
+
productQuantization: {
|
|
15
|
+
enabled: false,
|
|
16
|
+
numSubvectors: 16,
|
|
17
|
+
numCentroids: 256
|
|
18
|
+
},
|
|
19
|
+
useDiskBasedIndex: false
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Product Quantization implementation
|
|
23
|
+
* Reduces vector dimensionality by splitting vectors into subvectors
|
|
24
|
+
* and quantizing each subvector to the nearest centroid
|
|
25
|
+
*/
|
|
26
|
+
class ProductQuantizer {
|
|
27
|
+
constructor(numSubvectors = 16, numCentroids = 256) {
|
|
28
|
+
this.centroids = [];
|
|
29
|
+
this.subvectorSize = 0;
|
|
30
|
+
this.initialized = false;
|
|
31
|
+
this.dimension = 0;
|
|
32
|
+
this.numSubvectors = numSubvectors;
|
|
33
|
+
this.numCentroids = numCentroids;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Initialize the product quantizer with training data
|
|
37
|
+
* @param vectors Training vectors to use for learning centroids
|
|
38
|
+
*/
|
|
39
|
+
train(vectors) {
|
|
40
|
+
if (vectors.length === 0) {
|
|
41
|
+
throw new Error('Cannot train product quantizer with empty vector set');
|
|
42
|
+
}
|
|
43
|
+
this.dimension = vectors[0].length;
|
|
44
|
+
this.subvectorSize = Math.ceil(this.dimension / this.numSubvectors);
|
|
45
|
+
// Initialize centroids for each subvector
|
|
46
|
+
for (let i = 0; i < this.numSubvectors; i++) {
|
|
47
|
+
// Extract subvectors from training data
|
|
48
|
+
const subvectors = vectors.map((vector) => {
|
|
49
|
+
const start = i * this.subvectorSize;
|
|
50
|
+
const end = Math.min(start + this.subvectorSize, this.dimension);
|
|
51
|
+
return vector.slice(start, end);
|
|
52
|
+
});
|
|
53
|
+
// Initialize centroids for this subvector using k-means++
|
|
54
|
+
this.centroids[i] = this.kMeansPlusPlus(subvectors, this.numCentroids);
|
|
55
|
+
}
|
|
56
|
+
this.initialized = true;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Quantize a vector using product quantization
|
|
60
|
+
* @param vector Vector to quantize
|
|
61
|
+
* @returns Array of centroid indices, one for each subvector
|
|
62
|
+
*/
|
|
63
|
+
quantize(vector) {
|
|
64
|
+
if (!this.initialized) {
|
|
65
|
+
throw new Error('Product quantizer not initialized. Call train() first.');
|
|
66
|
+
}
|
|
67
|
+
if (vector.length !== this.dimension) {
|
|
68
|
+
throw new Error(`Vector dimension mismatch: expected ${this.dimension}, got ${vector.length}`);
|
|
69
|
+
}
|
|
70
|
+
const codes = [];
|
|
71
|
+
// Quantize each subvector
|
|
72
|
+
for (let i = 0; i < this.numSubvectors; i++) {
|
|
73
|
+
const start = i * this.subvectorSize;
|
|
74
|
+
const end = Math.min(start + this.subvectorSize, this.dimension);
|
|
75
|
+
const subvector = vector.slice(start, end);
|
|
76
|
+
// Find nearest centroid
|
|
77
|
+
let minDist = Number.MAX_VALUE;
|
|
78
|
+
let nearestCentroidIndex = 0;
|
|
79
|
+
for (let j = 0; j < this.centroids[i].length; j++) {
|
|
80
|
+
const centroid = this.centroids[i][j];
|
|
81
|
+
const dist = this.euclideanDistanceSquared(subvector, centroid);
|
|
82
|
+
if (dist < minDist) {
|
|
83
|
+
minDist = dist;
|
|
84
|
+
nearestCentroidIndex = j;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
codes.push(nearestCentroidIndex);
|
|
88
|
+
}
|
|
89
|
+
return codes;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Reconstruct a vector from its quantized representation
|
|
93
|
+
* @param codes Array of centroid indices
|
|
94
|
+
* @returns Reconstructed vector
|
|
95
|
+
*/
|
|
96
|
+
reconstruct(codes) {
|
|
97
|
+
if (!this.initialized) {
|
|
98
|
+
throw new Error('Product quantizer not initialized. Call train() first.');
|
|
99
|
+
}
|
|
100
|
+
if (codes.length !== this.numSubvectors) {
|
|
101
|
+
throw new Error(`Code length mismatch: expected ${this.numSubvectors}, got ${codes.length}`);
|
|
102
|
+
}
|
|
103
|
+
const reconstructed = [];
|
|
104
|
+
// Reconstruct each subvector
|
|
105
|
+
for (let i = 0; i < this.numSubvectors; i++) {
|
|
106
|
+
const centroidIndex = codes[i];
|
|
107
|
+
const centroid = this.centroids[i][centroidIndex];
|
|
108
|
+
// Add centroid components to reconstructed vector
|
|
109
|
+
for (const component of centroid) {
|
|
110
|
+
reconstructed.push(component);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Trim to original dimension if needed
|
|
114
|
+
return reconstructed.slice(0, this.dimension);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Compute squared Euclidean distance between two vectors
|
|
118
|
+
* @param a First vector
|
|
119
|
+
* @param b Second vector
|
|
120
|
+
* @returns Squared Euclidean distance
|
|
121
|
+
*/
|
|
122
|
+
euclideanDistanceSquared(a, b) {
|
|
123
|
+
let sum = 0;
|
|
124
|
+
const length = Math.min(a.length, b.length);
|
|
125
|
+
for (let i = 0; i < length; i++) {
|
|
126
|
+
const diff = a[i] - b[i];
|
|
127
|
+
sum += diff * diff;
|
|
128
|
+
}
|
|
129
|
+
return sum;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Implement k-means++ algorithm to initialize centroids
|
|
133
|
+
* @param vectors Vectors to cluster
|
|
134
|
+
* @param k Number of clusters
|
|
135
|
+
* @returns Array of centroids
|
|
136
|
+
*/
|
|
137
|
+
kMeansPlusPlus(vectors, k) {
|
|
138
|
+
if (vectors.length < k) {
|
|
139
|
+
// If we have fewer vectors than centroids, use the vectors as centroids
|
|
140
|
+
return [...vectors];
|
|
141
|
+
}
|
|
142
|
+
const centroids = [];
|
|
143
|
+
// Choose first centroid randomly
|
|
144
|
+
const firstIndex = Math.floor(Math.random() * vectors.length);
|
|
145
|
+
centroids.push([...vectors[firstIndex]]);
|
|
146
|
+
// Choose remaining centroids
|
|
147
|
+
for (let i = 1; i < k; i++) {
|
|
148
|
+
// Compute distances to nearest centroid for each vector
|
|
149
|
+
const distances = vectors.map((vector) => {
|
|
150
|
+
let minDist = Number.MAX_VALUE;
|
|
151
|
+
for (const centroid of centroids) {
|
|
152
|
+
const dist = this.euclideanDistanceSquared(vector, centroid);
|
|
153
|
+
minDist = Math.min(minDist, dist);
|
|
154
|
+
}
|
|
155
|
+
return minDist;
|
|
156
|
+
});
|
|
157
|
+
// Compute sum of distances
|
|
158
|
+
const distSum = distances.reduce((sum, dist) => sum + dist, 0);
|
|
159
|
+
// Choose next centroid with probability proportional to distance
|
|
160
|
+
let r = Math.random() * distSum;
|
|
161
|
+
let nextIndex = 0;
|
|
162
|
+
for (let j = 0; j < distances.length; j++) {
|
|
163
|
+
r -= distances[j];
|
|
164
|
+
if (r <= 0) {
|
|
165
|
+
nextIndex = j;
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
centroids.push([...vectors[nextIndex]]);
|
|
170
|
+
}
|
|
171
|
+
return centroids;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Get the centroids for each subvector
|
|
175
|
+
* @returns Array of centroid arrays
|
|
176
|
+
*/
|
|
177
|
+
getCentroids() {
|
|
178
|
+
return this.centroids;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Set the centroids for each subvector
|
|
182
|
+
* @param centroids Array of centroid arrays
|
|
183
|
+
*/
|
|
184
|
+
setCentroids(centroids) {
|
|
185
|
+
this.centroids = centroids;
|
|
186
|
+
this.numSubvectors = centroids.length;
|
|
187
|
+
this.numCentroids = centroids[0].length;
|
|
188
|
+
this.initialized = true;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Get the dimension of the vectors
|
|
192
|
+
* @returns Dimension
|
|
193
|
+
*/
|
|
194
|
+
getDimension() {
|
|
195
|
+
return this.dimension;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Set the dimension of the vectors
|
|
199
|
+
* @param dimension Dimension
|
|
200
|
+
*/
|
|
201
|
+
setDimension(dimension) {
|
|
202
|
+
this.dimension = dimension;
|
|
203
|
+
this.subvectorSize = Math.ceil(dimension / this.numSubvectors);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Optimized HNSW Index implementation
|
|
208
|
+
* Extends the base HNSW implementation with support for large datasets
|
|
209
|
+
* Uses product quantization for dimensionality reduction and disk-based storage when needed
|
|
210
|
+
*/
|
|
211
|
+
export class HNSWIndexOptimized extends HNSWIndex {
|
|
212
|
+
constructor(config = {}, distanceFunction, storage = null) {
|
|
213
|
+
// Initialize base HNSW index with standard config
|
|
214
|
+
super(config, distanceFunction);
|
|
215
|
+
this.productQuantizer = null;
|
|
216
|
+
this.storage = null;
|
|
217
|
+
this.useDiskBasedIndex = false;
|
|
218
|
+
this.useProductQuantization = false;
|
|
219
|
+
this.quantizedVectors = new Map();
|
|
220
|
+
this.memoryUsage = 0;
|
|
221
|
+
this.vectorCount = 0;
|
|
222
|
+
// Thread safety for memory usage tracking
|
|
223
|
+
this.memoryUpdateLock = Promise.resolve();
|
|
224
|
+
// Set optimized config
|
|
225
|
+
this.optimizedConfig = { ...DEFAULT_OPTIMIZED_CONFIG, ...config };
|
|
226
|
+
// Set storage adapter
|
|
227
|
+
this.storage = storage;
|
|
228
|
+
// Initialize product quantizer if enabled
|
|
229
|
+
if (this.optimizedConfig.productQuantization?.enabled) {
|
|
230
|
+
this.useProductQuantization = true;
|
|
231
|
+
this.productQuantizer = new ProductQuantizer(this.optimizedConfig.productQuantization.numSubvectors, this.optimizedConfig.productQuantization.numCentroids);
|
|
232
|
+
}
|
|
233
|
+
// Set disk-based index flag
|
|
234
|
+
this.useDiskBasedIndex = this.optimizedConfig.useDiskBasedIndex || false;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Thread-safe method to update memory usage
|
|
238
|
+
* @param memoryDelta Change in memory usage (can be negative)
|
|
239
|
+
* @param vectorCountDelta Change in vector count (can be negative)
|
|
240
|
+
*/
|
|
241
|
+
async updateMemoryUsage(memoryDelta, vectorCountDelta) {
|
|
242
|
+
this.memoryUpdateLock = this.memoryUpdateLock.then(async () => {
|
|
243
|
+
this.memoryUsage = Math.max(0, this.memoryUsage + memoryDelta);
|
|
244
|
+
this.vectorCount = Math.max(0, this.vectorCount + vectorCountDelta);
|
|
245
|
+
});
|
|
246
|
+
await this.memoryUpdateLock;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Thread-safe method to get current memory usage
|
|
250
|
+
* @returns Current memory usage and vector count
|
|
251
|
+
*/
|
|
252
|
+
async getMemoryUsageAsync() {
|
|
253
|
+
await this.memoryUpdateLock;
|
|
254
|
+
return {
|
|
255
|
+
memoryUsage: this.memoryUsage,
|
|
256
|
+
vectorCount: this.vectorCount
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Add a vector to the index
|
|
261
|
+
* Uses product quantization if enabled and memory threshold is exceeded
|
|
262
|
+
*/
|
|
263
|
+
async addItem(item) {
|
|
264
|
+
// Check if item is defined
|
|
265
|
+
if (!item) {
|
|
266
|
+
throw new Error('Item is undefined or null');
|
|
267
|
+
}
|
|
268
|
+
const { id, vector } = item;
|
|
269
|
+
// Check if vector is defined
|
|
270
|
+
if (!vector) {
|
|
271
|
+
throw new Error('Vector is undefined or null');
|
|
272
|
+
}
|
|
273
|
+
// Estimate memory usage for this vector
|
|
274
|
+
const vectorMemory = vector.length * 8; // 8 bytes per number (Float64)
|
|
275
|
+
const connectionsMemory = this.optimizedConfig.M * this.optimizedConfig.ml * 16; // Estimate for connections
|
|
276
|
+
const totalMemory = vectorMemory + connectionsMemory;
|
|
277
|
+
// Update memory usage estimate (thread-safe)
|
|
278
|
+
await this.updateMemoryUsage(totalMemory, 1);
|
|
279
|
+
// Check if we should switch to product quantization
|
|
280
|
+
const currentMemoryUsage = await this.getMemoryUsageAsync();
|
|
281
|
+
if (this.useProductQuantization &&
|
|
282
|
+
currentMemoryUsage.memoryUsage > this.optimizedConfig.memoryThreshold &&
|
|
283
|
+
this.productQuantizer &&
|
|
284
|
+
!this.productQuantizer.getDimension()) {
|
|
285
|
+
// Initialize product quantizer with existing vectors
|
|
286
|
+
this.initializeProductQuantizer();
|
|
287
|
+
}
|
|
288
|
+
// If product quantization is active, quantize the vector
|
|
289
|
+
if (this.useProductQuantization &&
|
|
290
|
+
this.productQuantizer &&
|
|
291
|
+
this.productQuantizer.getDimension() > 0) {
|
|
292
|
+
// Quantize the vector
|
|
293
|
+
const codes = this.productQuantizer.quantize(vector);
|
|
294
|
+
// Store the quantized vector
|
|
295
|
+
this.quantizedVectors.set(id, codes);
|
|
296
|
+
// Reconstruct the vector for indexing
|
|
297
|
+
const reconstructedVector = this.productQuantizer.reconstruct(codes);
|
|
298
|
+
// Add the reconstructed vector to the index
|
|
299
|
+
return await super.addItem({ id, vector: reconstructedVector });
|
|
300
|
+
}
|
|
301
|
+
// If disk-based index is active and storage is available, store the vector
|
|
302
|
+
if (this.useDiskBasedIndex && this.storage) {
|
|
303
|
+
// Create a noun object
|
|
304
|
+
const noun = {
|
|
305
|
+
id,
|
|
306
|
+
vector,
|
|
307
|
+
connections: new Map(),
|
|
308
|
+
level: 0
|
|
309
|
+
};
|
|
310
|
+
// Store the noun
|
|
311
|
+
this.storage.saveNoun(noun).catch((error) => {
|
|
312
|
+
console.error(`Failed to save noun ${id} to storage:`, error);
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
// Add the vector to the in-memory index
|
|
316
|
+
return await super.addItem(item);
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Search for nearest neighbors
|
|
320
|
+
* Uses product quantization if enabled
|
|
321
|
+
*/
|
|
322
|
+
async search(queryVector, k = 10) {
|
|
323
|
+
// Check if query vector is defined
|
|
324
|
+
if (!queryVector) {
|
|
325
|
+
throw new Error('Query vector is undefined or null');
|
|
326
|
+
}
|
|
327
|
+
// If product quantization is active, quantize the query vector
|
|
328
|
+
if (this.useProductQuantization &&
|
|
329
|
+
this.productQuantizer &&
|
|
330
|
+
this.productQuantizer.getDimension() > 0) {
|
|
331
|
+
// Quantize the query vector
|
|
332
|
+
const codes = this.productQuantizer.quantize(queryVector);
|
|
333
|
+
// Reconstruct the query vector
|
|
334
|
+
const reconstructedVector = this.productQuantizer.reconstruct(codes);
|
|
335
|
+
// Search with the reconstructed vector
|
|
336
|
+
return await super.search(reconstructedVector, k);
|
|
337
|
+
}
|
|
338
|
+
// Otherwise, use the standard search
|
|
339
|
+
return await super.search(queryVector, k);
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Remove an item from the index
|
|
343
|
+
*/
|
|
344
|
+
removeItem(id) {
|
|
345
|
+
// If product quantization is active, remove the quantized vector
|
|
346
|
+
if (this.useProductQuantization) {
|
|
347
|
+
this.quantizedVectors.delete(id);
|
|
348
|
+
}
|
|
349
|
+
// If disk-based index is active and storage is available, remove the vector from storage
|
|
350
|
+
if (this.useDiskBasedIndex && this.storage) {
|
|
351
|
+
this.storage.deleteNoun(id).catch((error) => {
|
|
352
|
+
console.error(`Failed to delete noun ${id} from storage:`, error);
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
// Update memory usage estimate (async operation, but don't block removal)
|
|
356
|
+
this.getMemoryUsageAsync().then((currentMemoryUsage) => {
|
|
357
|
+
if (currentMemoryUsage.vectorCount > 0) {
|
|
358
|
+
const memoryPerVector = currentMemoryUsage.memoryUsage / currentMemoryUsage.vectorCount;
|
|
359
|
+
this.updateMemoryUsage(-memoryPerVector, -1);
|
|
360
|
+
}
|
|
361
|
+
}).catch((error) => {
|
|
362
|
+
console.error('Failed to update memory usage after removal:', error);
|
|
363
|
+
});
|
|
364
|
+
// Remove the item from the in-memory index
|
|
365
|
+
return super.removeItem(id);
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Clear the index
|
|
369
|
+
*/
|
|
370
|
+
async clear() {
|
|
371
|
+
// Clear product quantization data
|
|
372
|
+
if (this.useProductQuantization) {
|
|
373
|
+
this.quantizedVectors.clear();
|
|
374
|
+
this.productQuantizer = new ProductQuantizer(this.optimizedConfig.productQuantization.numSubvectors, this.optimizedConfig.productQuantization.numCentroids);
|
|
375
|
+
}
|
|
376
|
+
// Reset memory usage (thread-safe)
|
|
377
|
+
const currentMemoryUsage = await this.getMemoryUsageAsync();
|
|
378
|
+
await this.updateMemoryUsage(-currentMemoryUsage.memoryUsage, -currentMemoryUsage.vectorCount);
|
|
379
|
+
// Clear the in-memory index
|
|
380
|
+
super.clear();
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Initialize product quantizer with existing vectors
|
|
384
|
+
*/
|
|
385
|
+
initializeProductQuantizer() {
|
|
386
|
+
if (!this.productQuantizer) {
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
// Get all vectors from the index
|
|
390
|
+
const nouns = super.getNouns();
|
|
391
|
+
const vectors = [];
|
|
392
|
+
// Extract vectors
|
|
393
|
+
for (const [_, noun] of nouns) {
|
|
394
|
+
vectors.push(noun.vector);
|
|
395
|
+
}
|
|
396
|
+
// Train the product quantizer
|
|
397
|
+
if (vectors.length > 0) {
|
|
398
|
+
this.productQuantizer.train(vectors);
|
|
399
|
+
// Quantize all existing vectors
|
|
400
|
+
for (const [id, noun] of nouns) {
|
|
401
|
+
const codes = this.productQuantizer.quantize(noun.vector);
|
|
402
|
+
this.quantizedVectors.set(id, codes);
|
|
403
|
+
}
|
|
404
|
+
console.log(`Initialized product quantizer with ${vectors.length} vectors`);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Get the product quantizer
|
|
409
|
+
* @returns Product quantizer or null if not enabled
|
|
410
|
+
*/
|
|
411
|
+
getProductQuantizer() {
|
|
412
|
+
return this.productQuantizer;
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Get the optimized configuration
|
|
416
|
+
* @returns Optimized configuration
|
|
417
|
+
*/
|
|
418
|
+
getOptimizedConfig() {
|
|
419
|
+
return { ...this.optimizedConfig };
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Get the estimated memory usage
|
|
423
|
+
* @returns Estimated memory usage in bytes
|
|
424
|
+
*/
|
|
425
|
+
getMemoryUsage() {
|
|
426
|
+
return this.memoryUsage;
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Set the storage adapter
|
|
430
|
+
* @param storage Storage adapter
|
|
431
|
+
*/
|
|
432
|
+
setStorage(storage) {
|
|
433
|
+
this.storage = storage;
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Get the storage adapter
|
|
437
|
+
* @returns Storage adapter or null if not set
|
|
438
|
+
*/
|
|
439
|
+
getStorage() {
|
|
440
|
+
return this.storage;
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Set whether to use disk-based index
|
|
444
|
+
* @param useDiskBasedIndex Whether to use disk-based index
|
|
445
|
+
*/
|
|
446
|
+
setUseDiskBasedIndex(useDiskBasedIndex) {
|
|
447
|
+
this.useDiskBasedIndex = useDiskBasedIndex;
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Get whether disk-based index is used
|
|
451
|
+
* @returns Whether disk-based index is used
|
|
452
|
+
*/
|
|
453
|
+
getUseDiskBasedIndex() {
|
|
454
|
+
return this.useDiskBasedIndex;
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Set whether to use product quantization
|
|
458
|
+
* @param useProductQuantization Whether to use product quantization
|
|
459
|
+
*/
|
|
460
|
+
setUseProductQuantization(useProductQuantization) {
|
|
461
|
+
this.useProductQuantization = useProductQuantization;
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Get whether product quantization is used
|
|
465
|
+
* @returns Whether product quantization is used
|
|
466
|
+
*/
|
|
467
|
+
getUseProductQuantization() {
|
|
468
|
+
return this.useProductQuantization;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
//# sourceMappingURL=hnswIndexOptimized.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hnswIndexOptimized.js","sourceRoot":"","sources":["../../src/hnsw/hnswIndexOptimized.ts"],"names":[],"mappings":"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"}
|