@soulcraft/brainy 0.40.0 → 0.43.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 (152) hide show
  1. package/README.md +605 -194
  2. package/dist/augmentations/conduitAugmentations.js +1158 -0
  3. package/dist/augmentations/conduitAugmentations.js.map +1 -0
  4. package/dist/augmentations/memoryAugmentations.d.ts +2 -0
  5. package/dist/augmentations/memoryAugmentations.d.ts.map +1 -1
  6. package/dist/augmentations/memoryAugmentations.js +270 -0
  7. package/dist/augmentations/memoryAugmentations.js.map +1 -0
  8. package/dist/augmentations/serverSearchAugmentations.js +531 -0
  9. package/dist/augmentations/serverSearchAugmentations.js.map +1 -0
  10. package/dist/browserFramework.d.ts +15 -0
  11. package/dist/demo.d.ts +106 -0
  12. package/dist/examples/basicUsage.js +118 -0
  13. package/dist/examples/basicUsage.js.map +1 -0
  14. package/dist/hnsw/distributedSearch.js +452 -0
  15. package/dist/hnsw/distributedSearch.js.map +1 -0
  16. package/dist/hnsw/hnswIndex.js +602 -0
  17. package/dist/hnsw/hnswIndex.js.map +1 -0
  18. package/dist/hnsw/hnswIndexOptimized.js +471 -0
  19. package/dist/hnsw/hnswIndexOptimized.js.map +1 -0
  20. package/dist/hnsw/optimizedHNSWIndex.js +313 -0
  21. package/dist/hnsw/optimizedHNSWIndex.js.map +1 -0
  22. package/dist/hnsw/partitionedHNSWIndex.js +304 -0
  23. package/dist/hnsw/partitionedHNSWIndex.js.map +1 -0
  24. package/dist/hnsw/scaledHNSWSystem.js +559 -0
  25. package/dist/hnsw/scaledHNSWSystem.js.map +1 -0
  26. package/dist/index.d.ts +5 -3
  27. package/dist/index.js +81 -0
  28. package/dist/mcp/brainyMCPAdapter.js +142 -0
  29. package/dist/mcp/brainyMCPAdapter.js.map +1 -0
  30. package/dist/mcp/brainyMCPService.js +248 -0
  31. package/dist/mcp/brainyMCPService.js.map +1 -0
  32. package/dist/mcp/index.js +17 -0
  33. package/dist/mcp/index.js.map +1 -0
  34. package/dist/mcp/mcpAugmentationToolset.js +180 -0
  35. package/dist/mcp/mcpAugmentationToolset.js.map +1 -0
  36. package/dist/storage/adapters/baseStorageAdapter.js +349 -0
  37. package/dist/storage/adapters/baseStorageAdapter.js.map +1 -0
  38. package/dist/storage/adapters/batchS3Operations.js +287 -0
  39. package/dist/storage/adapters/batchS3Operations.js.map +1 -0
  40. package/dist/storage/adapters/fileSystemStorage.js +846 -0
  41. package/dist/storage/adapters/fileSystemStorage.js.map +1 -0
  42. package/dist/storage/adapters/memoryStorage.js +532 -0
  43. package/dist/storage/adapters/memoryStorage.js.map +1 -0
  44. package/dist/storage/adapters/opfsStorage.d.ts.map +1 -1
  45. package/dist/storage/adapters/opfsStorage.js +1118 -0
  46. package/dist/storage/adapters/opfsStorage.js.map +1 -0
  47. package/dist/storage/adapters/optimizedS3Search.d.ts +79 -0
  48. package/dist/storage/adapters/optimizedS3Search.d.ts.map +1 -0
  49. package/dist/storage/adapters/optimizedS3Search.js +248 -0
  50. package/dist/storage/adapters/optimizedS3Search.js.map +1 -0
  51. package/dist/storage/adapters/s3CompatibleStorage.d.ts +21 -0
  52. package/dist/storage/adapters/s3CompatibleStorage.d.ts.map +1 -1
  53. package/dist/storage/adapters/s3CompatibleStorage.js +2026 -0
  54. package/dist/storage/adapters/s3CompatibleStorage.js.map +1 -0
  55. package/dist/storage/baseStorage.d.ts +1 -0
  56. package/dist/storage/baseStorage.d.ts.map +1 -1
  57. package/dist/storage/baseStorage.js +603 -0
  58. package/dist/storage/baseStorage.js.map +1 -0
  59. package/dist/storage/cacheManager.js +1306 -0
  60. package/dist/storage/cacheManager.js.map +1 -0
  61. package/dist/storage/enhancedCacheManager.js +520 -0
  62. package/dist/storage/enhancedCacheManager.js.map +1 -0
  63. package/dist/storage/readOnlyOptimizations.js +425 -0
  64. package/dist/storage/readOnlyOptimizations.js.map +1 -0
  65. package/dist/storage/storageFactory.d.ts +0 -1
  66. package/dist/storage/storageFactory.d.ts.map +1 -1
  67. package/dist/storage/storageFactory.js +227 -0
  68. package/dist/storage/storageFactory.js.map +1 -0
  69. package/dist/types/augmentations.js +16 -0
  70. package/dist/types/augmentations.js.map +1 -0
  71. package/dist/types/brainyDataInterface.js +8 -0
  72. package/dist/types/brainyDataInterface.js.map +1 -0
  73. package/dist/types/distributedTypes.js +6 -0
  74. package/dist/types/distributedTypes.js.map +1 -0
  75. package/dist/types/fileSystemTypes.js +8 -0
  76. package/dist/types/fileSystemTypes.js.map +1 -0
  77. package/dist/types/graphTypes.js +247 -0
  78. package/dist/types/graphTypes.js.map +1 -0
  79. package/dist/types/mcpTypes.js +22 -0
  80. package/dist/types/mcpTypes.js.map +1 -0
  81. package/dist/types/paginationTypes.js +5 -0
  82. package/dist/types/paginationTypes.js.map +1 -0
  83. package/dist/types/pipelineTypes.js +7 -0
  84. package/dist/types/pipelineTypes.js.map +1 -0
  85. package/dist/types/tensorflowTypes.js +6 -0
  86. package/dist/types/tensorflowTypes.js.map +1 -0
  87. package/dist/unified.js +52 -128048
  88. package/dist/utils/autoConfiguration.js +341 -0
  89. package/dist/utils/autoConfiguration.js.map +1 -0
  90. package/dist/utils/cacheAutoConfig.js +261 -0
  91. package/dist/utils/cacheAutoConfig.js.map +1 -0
  92. package/dist/utils/crypto.js +45 -0
  93. package/dist/utils/crypto.js.map +1 -0
  94. package/dist/utils/distance.js +239 -0
  95. package/dist/utils/distance.js.map +1 -0
  96. package/dist/utils/embedding.d.ts.map +1 -1
  97. package/dist/utils/embedding.js +702 -0
  98. package/dist/utils/embedding.js.map +1 -0
  99. package/dist/utils/environment.js +75 -0
  100. package/dist/utils/environment.js.map +1 -0
  101. package/dist/utils/fieldNameTracking.js +90 -0
  102. package/dist/utils/fieldNameTracking.js.map +1 -0
  103. package/dist/utils/index.d.ts +1 -0
  104. package/dist/utils/index.d.ts.map +1 -1
  105. package/dist/utils/index.js +8 -0
  106. package/dist/utils/index.js.map +1 -0
  107. package/dist/utils/jsonProcessing.js +179 -0
  108. package/dist/utils/jsonProcessing.js.map +1 -0
  109. package/dist/utils/logger.d.ts +45 -92
  110. package/dist/utils/logger.d.ts.map +1 -1
  111. package/dist/utils/logger.js +129 -0
  112. package/dist/utils/logger.js.map +1 -0
  113. package/dist/utils/operationUtils.js +126 -0
  114. package/dist/utils/operationUtils.js.map +1 -0
  115. package/dist/utils/robustModelLoader.d.ts +14 -0
  116. package/dist/utils/robustModelLoader.d.ts.map +1 -1
  117. package/dist/utils/robustModelLoader.js +537 -0
  118. package/dist/utils/robustModelLoader.js.map +1 -0
  119. package/dist/utils/searchCache.js +248 -0
  120. package/dist/utils/searchCache.js.map +1 -0
  121. package/dist/utils/statistics.js +25 -0
  122. package/dist/utils/statistics.js.map +1 -0
  123. package/dist/utils/statisticsCollector.js +224 -0
  124. package/dist/utils/statisticsCollector.js.map +1 -0
  125. package/dist/utils/textEncoding.js +309 -0
  126. package/dist/utils/textEncoding.js.map +1 -0
  127. package/dist/utils/typeUtils.js +40 -0
  128. package/dist/utils/typeUtils.js.map +1 -0
  129. package/dist/utils/version.d.ts +15 -3
  130. package/dist/utils/version.d.ts.map +1 -1
  131. package/dist/utils/version.js +24 -0
  132. package/dist/utils/version.js.map +1 -0
  133. package/dist/utils/workerUtils.js +458 -0
  134. package/dist/utils/workerUtils.js.map +1 -0
  135. package/package.json +23 -15
  136. package/dist/brainy.js +0 -90220
  137. package/dist/brainy.min.js +0 -12511
  138. package/dist/patched-platform-node.d.ts +0 -17
  139. package/dist/statistics/statisticsManager.d.ts +0 -121
  140. package/dist/storage/fileSystemStorage.d.ts +0 -73
  141. package/dist/storage/fileSystemStorage.d.ts.map +0 -1
  142. package/dist/storage/opfsStorage.d.ts +0 -236
  143. package/dist/storage/opfsStorage.d.ts.map +0 -1
  144. package/dist/storage/s3CompatibleStorage.d.ts +0 -157
  145. package/dist/storage/s3CompatibleStorage.d.ts.map +0 -1
  146. package/dist/testing/prettyReporter.d.ts +0 -23
  147. package/dist/testing/prettySummaryReporter.d.ts +0 -22
  148. package/dist/unified.min.js +0 -16153
  149. package/dist/utils/environmentDetection.d.ts +0 -47
  150. package/dist/utils/environmentDetection.d.ts.map +0 -1
  151. package/dist/utils/tensorflowUtils.d.ts +0 -17
  152. 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":"AAAA;;;;GAIG;AASH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAsB1C,qDAAqD;AACrD,MAAM,wBAAwB,GAAwB;IACpD,CAAC,EAAE,EAAE;IACL,cAAc,EAAE,GAAG;IACnB,QAAQ,EAAE,EAAE;IACZ,EAAE,EAAE,EAAE;IACN,eAAe,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE,wBAAwB;IAC7D,mBAAmB,EAAE;QACnB,OAAO,EAAE,KAAK;QACd,aAAa,EAAE,EAAE;QACjB,YAAY,EAAE,GAAG;KAClB;IACD,iBAAiB,EAAE,KAAK;CACzB,CAAA;AAED;;;;GAIG;AACH,MAAM,gBAAgB;IAQpB,YAAY,gBAAwB,EAAE,EAAE,eAAuB,GAAG;QAL1D,cAAS,GAAe,EAAE,CAAA;QAC1B,kBAAa,GAAW,CAAC,CAAA;QACzB,gBAAW,GAAY,KAAK,CAAA;QAC5B,cAAS,GAAW,CAAC,CAAA;QAG3B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAClC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;IAClC,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,OAAiB;QAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;QACzE,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;QAClC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,CAAA;QAEnE,0CAA0C;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,wCAAwC;YACxC,MAAM,UAAU,GAAa,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBAClD,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,CAAA;gBACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;gBAChE,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YACjC,CAAC,CAAC,CAAA;YAEF,0DAA0D;YAC1D,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;QACxE,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;IACzB,CAAC;IAED;;;;OAIG;IACI,QAAQ,CAAC,MAAc;QAC5B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;QAC3E,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CACb,uCAAuC,IAAI,CAAC,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,CAC9E,CAAA;QACH,CAAC;QAED,MAAM,KAAK,GAAa,EAAE,CAAA;QAE1B,0BAA0B;QAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,CAAA;YACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;YAChE,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YAE1C,wBAAwB;YACxB,IAAI,OAAO,GAAG,MAAM,CAAC,SAAS,CAAA;YAC9B,IAAI,oBAAoB,GAAG,CAAC,CAAA;YAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;gBACrC,MAAM,IAAI,GAAG,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;gBAE/D,IAAI,IAAI,GAAG,OAAO,EAAE,CAAC;oBACnB,OAAO,GAAG,IAAI,CAAA;oBACd,oBAAoB,GAAG,CAAC,CAAA;gBAC1B,CAAC;YACH,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;QAClC,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;;;OAIG;IACI,WAAW,CAAC,KAAe;QAChC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;QAC3E,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACb,kCAAkC,IAAI,CAAC,aAAa,SAAS,KAAK,CAAC,MAAM,EAAE,CAC5E,CAAA;QACH,CAAC;QAED,MAAM,aAAa,GAAW,EAAE,CAAA;QAEhC,6BAA6B;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;YAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAA;YAEjD,kDAAkD;YAClD,KAAK,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;gBACjC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAC/B,CAAC;QACH,CAAC;QAED,uCAAuC;QACvC,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;IAC/C,CAAC;IAED;;;;;OAKG;IACK,wBAAwB,CAAC,CAAS,EAAE,CAAS;QACnD,IAAI,GAAG,GAAG,CAAC,CAAA;QACX,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;QAE3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YACxB,GAAG,IAAI,IAAI,GAAG,IAAI,CAAA;QACpB,CAAC;QAED,OAAO,GAAG,CAAA;IACZ,CAAC;IAED;;;;;OAKG;IACK,cAAc,CAAC,OAAiB,EAAE,CAAS;QACjD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,wEAAwE;YACxE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAA;QACrB,CAAC;QAED,MAAM,SAAS,GAAa,EAAE,CAAA;QAE9B,iCAAiC;QACjC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;QAC7D,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QAExC,6BAA6B;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,wDAAwD;YACxD,MAAM,SAAS,GAAa,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBACjD,IAAI,OAAO,GAAG,MAAM,CAAC,SAAS,CAAA;gBAE9B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBACjC,MAAM,IAAI,GAAG,IAAI,CAAC,wBAAwB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;oBAC5D,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;gBACnC,CAAC;gBAED,OAAO,OAAO,CAAA;YAChB,CAAC,CAAC,CAAA;YAEF,2BAA2B;YAC3B,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,CAAA;YAE9D,iEAAiE;YACjE,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAA;YAC/B,IAAI,SAAS,GAAG,CAAC,CAAA;YAEjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC1C,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAA;gBACjB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACX,SAAS,GAAG,CAAC,CAAA;oBACb,MAAK;gBACP,CAAC;YACH,CAAC;YAED,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QACzC,CAAC;QAED,OAAO,SAAS,CAAA;IAClB,CAAC;IAED;;;OAGG;IACI,YAAY;QACjB,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAED;;;OAGG;IACI,YAAY,CAAC,SAAqB;QACvC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC,MAAM,CAAA;QACrC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;QACvC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;IACzB,CAAC;IAED;;;OAGG;IACI,YAAY;QACjB,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAED;;;OAGG;IACI,YAAY,CAAC,SAAiB;QACnC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,CAAA;IAChE,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,kBAAmB,SAAQ,SAAS;IAa/C,YACE,SAAuC,EAAE,EACzC,gBAAkC,EAClC,UAAiC,IAAI;QAErC,kDAAkD;QAClD,KAAK,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;QAjBzB,qBAAgB,GAA4B,IAAI,CAAA;QAChD,YAAO,GAA0B,IAAI,CAAA;QACrC,sBAAiB,GAAY,KAAK,CAAA;QAClC,2BAAsB,GAAY,KAAK,CAAA;QACvC,qBAAgB,GAA0B,IAAI,GAAG,EAAE,CAAA;QACnD,gBAAW,GAAW,CAAC,CAAA;QACvB,gBAAW,GAAW,CAAC,CAAA;QAE/B,0CAA0C;QAClC,qBAAgB,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAA;QAUzD,uBAAuB;QACvB,IAAI,CAAC,eAAe,GAAG,EAAE,GAAG,wBAAwB,EAAE,GAAG,MAAM,EAAE,CAAA;QAEjE,sBAAsB;QACtB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QAEtB,0CAA0C;QAC1C,IAAI,IAAI,CAAC,eAAe,CAAC,mBAAmB,EAAE,OAAO,EAAE,CAAC;YACtD,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAA;YAClC,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,CAC1C,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,aAAa,EACtD,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,YAAY,CACtD,CAAA;QACH,CAAC;QAED,4BAA4B;QAC5B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,eAAe,CAAC,iBAAiB,IAAI,KAAK,CAAA;IAC1E,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,iBAAiB,CAAC,WAAmB,EAAE,gBAAwB;QAC3E,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YAC5D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,CAAA;YAC9D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,GAAG,gBAAgB,CAAC,CAAA;QACrE,CAAC,CAAC,CAAA;QACF,MAAM,IAAI,CAAC,gBAAgB,CAAA;IAC7B,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,mBAAmB;QAC/B,MAAM,IAAI,CAAC,gBAAgB,CAAA;QAC3B,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAA;IACH,CAAC;IAED;;;OAGG;IACa,KAAK,CAAC,OAAO,CAAC,IAAoB;QAChD,2BAA2B;QAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;QAC9C,CAAC;QAED,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;QAE3B,6BAA6B;QAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;QAChD,CAAC;QAED,wCAAwC;QACxC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA,CAAC,+BAA+B;QACtE,MAAM,iBAAiB,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,CAAA,CAAC,2BAA2B;QAC3G,MAAM,WAAW,GAAG,YAAY,GAAG,iBAAiB,CAAA;QAEpD,6CAA6C;QAC7C,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;QAE5C,oDAAoD;QACpD,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAA;QAC3D,IACE,IAAI,CAAC,sBAAsB;YAC3B,kBAAkB,CAAC,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,eAAgB;YACtE,IAAI,CAAC,gBAAgB;YACrB,CAAC,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,EACrC,CAAC;YACD,qDAAqD;YACrD,IAAI,CAAC,0BAA0B,EAAE,CAAA;QACnC,CAAC;QAED,yDAAyD;QACzD,IACE,IAAI,CAAC,sBAAsB;YAC3B,IAAI,CAAC,gBAAgB;YACrB,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,GAAG,CAAC,EACxC,CAAC;YACD,sBAAsB;YACtB,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;YAEpD,6BAA6B;YAC7B,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;YAEpC,sCAAsC;YACtC,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;YAEpE,4CAA4C;YAC5C,OAAO,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAA;QACjE,CAAC;QAED,2EAA2E;QAC3E,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3C,uBAAuB;YACvB,MAAM,IAAI,GAAa;gBACrB,EAAE;gBACF,MAAM;gBACN,WAAW,EAAE,IAAI,GAAG,EAAE;gBACtB,KAAK,EAAE,CAAC;aACT,CAAA;YAED,iBAAiB;YACjB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC1C,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;YAC/D,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,wCAAwC;QACxC,OAAO,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC,CAAC;IAED;;;OAGG;IACa,KAAK,CAAC,MAAM,CAC1B,WAAmB,EACnB,IAAY,EAAE;QAEd,mCAAmC;QACnC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;QACtD,CAAC;QAED,+DAA+D;QAC/D,IACE,IAAI,CAAC,sBAAsB;YAC3B,IAAI,CAAC,gBAAgB;YACrB,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,GAAG,CAAC,EACxC,CAAC;YACD,4BAA4B;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;YAEzD,+BAA+B;YAC/B,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;YAEpE,uCAAuC;YACvC,OAAO,MAAM,KAAK,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAA;QACnD,CAAC;QAED,qCAAqC;QACrC,OAAO,MAAM,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;IAC3C,CAAC;IAED;;OAEG;IACa,UAAU,CAAC,EAAU;QACnC,iEAAiE;QACjE,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAChC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAClC,CAAC;QAED,yFAAyF;QACzF,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC1C,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAA;YACnE,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,0EAA0E;QAC1E,IAAI,CAAC,mBAAmB,EAAE,CAAC,IAAI,CAAC,CAAC,kBAAkB,EAAE,EAAE;YACrD,IAAI,kBAAkB,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;gBACvC,MAAM,eAAe,GAAG,kBAAkB,CAAC,WAAW,GAAG,kBAAkB,CAAC,WAAW,CAAA;gBACvF,IAAI,CAAC,iBAAiB,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,CAAA;YAC9C,CAAC;QACH,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACjB,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC,CAAA;QACtE,CAAC,CAAC,CAAA;QAEF,2CAA2C;QAC3C,OAAO,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;IAC7B,CAAC;IAED;;OAEG;IACa,KAAK,CAAC,KAAK;QACzB,kCAAkC;QAClC,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAChC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAA;YAC7B,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,CAC1C,IAAI,CAAC,eAAe,CAAC,mBAAoB,CAAC,aAAa,EACvD,IAAI,CAAC,eAAe,CAAC,mBAAoB,CAAC,YAAY,CACvD,CAAA;QACH,CAAC;QAED,mCAAmC;QACnC,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAA;QAC3D,MAAM,IAAI,CAAC,iBAAiB,CAAC,CAAC,kBAAkB,CAAC,WAAW,EAAE,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAA;QAE9F,4BAA4B;QAC5B,KAAK,CAAC,KAAK,EAAE,CAAA;IACf,CAAC;IAED;;OAEG;IACK,0BAA0B;QAChC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,OAAM;QACR,CAAC;QAED,iCAAiC;QACjC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAA;QAC9B,MAAM,OAAO,GAAa,EAAE,CAAA;QAE5B,kBAAkB;QAClB,KAAK,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC3B,CAAC;QAED,8BAA8B;QAC9B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAEpC,gCAAgC;YAChC,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;gBAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;gBACzD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;YACtC,CAAC;YAED,OAAO,CAAC,GAAG,CACT,sCAAsC,OAAO,CAAC,MAAM,UAAU,CAC/D,CAAA;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACI,mBAAmB;QACxB,OAAO,IAAI,CAAC,gBAAgB,CAAA;IAC9B,CAAC;IAED;;;OAGG;IACI,kBAAkB;QACvB,OAAO,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;IACpC,CAAC;IAED;;;OAGG;IACI,cAAc;QACnB,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IAED;;;OAGG;IACI,UAAU,CAAC,OAAuB;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAED;;;OAGG;IACI,UAAU;QACf,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED;;;OAGG;IACI,oBAAoB,CAAC,iBAA0B;QACpD,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAA;IAC5C,CAAC;IAED;;;OAGG;IACI,oBAAoB;QACzB,OAAO,IAAI,CAAC,iBAAiB,CAAA;IAC/B,CAAC;IAED;;;OAGG;IACI,yBAAyB,CAAC,sBAA+B;QAC9D,IAAI,CAAC,sBAAsB,GAAG,sBAAsB,CAAA;IACtD,CAAC;IAED;;;OAGG;IACI,yBAAyB;QAC9B,OAAO,IAAI,CAAC,sBAAsB,CAAA;IACpC,CAAC;CACF"}