@soulcraft/brainy 0.41.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 (144) 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 +3 -2
  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.js +248 -0
  48. package/dist/storage/adapters/optimizedS3Search.js.map +1 -0
  49. package/dist/storage/adapters/s3CompatibleStorage.js +2026 -0
  50. package/dist/storage/adapters/s3CompatibleStorage.js.map +1 -0
  51. package/dist/storage/baseStorage.js +603 -0
  52. package/dist/storage/baseStorage.js.map +1 -0
  53. package/dist/storage/cacheManager.js +1306 -0
  54. package/dist/storage/cacheManager.js.map +1 -0
  55. package/dist/storage/enhancedCacheManager.js +520 -0
  56. package/dist/storage/enhancedCacheManager.js.map +1 -0
  57. package/dist/storage/readOnlyOptimizations.js +425 -0
  58. package/dist/storage/readOnlyOptimizations.js.map +1 -0
  59. package/dist/storage/storageFactory.d.ts +0 -1
  60. package/dist/storage/storageFactory.d.ts.map +1 -1
  61. package/dist/storage/storageFactory.js +227 -0
  62. package/dist/storage/storageFactory.js.map +1 -0
  63. package/dist/types/augmentations.js +16 -0
  64. package/dist/types/augmentations.js.map +1 -0
  65. package/dist/types/brainyDataInterface.js +8 -0
  66. package/dist/types/brainyDataInterface.js.map +1 -0
  67. package/dist/types/distributedTypes.js +6 -0
  68. package/dist/types/distributedTypes.js.map +1 -0
  69. package/dist/types/fileSystemTypes.js +8 -0
  70. package/dist/types/fileSystemTypes.js.map +1 -0
  71. package/dist/types/graphTypes.js +247 -0
  72. package/dist/types/graphTypes.js.map +1 -0
  73. package/dist/types/mcpTypes.js +22 -0
  74. package/dist/types/mcpTypes.js.map +1 -0
  75. package/dist/types/paginationTypes.js +5 -0
  76. package/dist/types/paginationTypes.js.map +1 -0
  77. package/dist/types/pipelineTypes.js +7 -0
  78. package/dist/types/pipelineTypes.js.map +1 -0
  79. package/dist/types/tensorflowTypes.js +6 -0
  80. package/dist/types/tensorflowTypes.js.map +1 -0
  81. package/dist/unified.js +52 -128251
  82. package/dist/utils/autoConfiguration.js +341 -0
  83. package/dist/utils/autoConfiguration.js.map +1 -0
  84. package/dist/utils/cacheAutoConfig.js +261 -0
  85. package/dist/utils/cacheAutoConfig.js.map +1 -0
  86. package/dist/utils/crypto.js +45 -0
  87. package/dist/utils/crypto.js.map +1 -0
  88. package/dist/utils/distance.js +239 -0
  89. package/dist/utils/distance.js.map +1 -0
  90. package/dist/utils/embedding.d.ts.map +1 -1
  91. package/dist/utils/embedding.js +702 -0
  92. package/dist/utils/embedding.js.map +1 -0
  93. package/dist/utils/environment.js +75 -0
  94. package/dist/utils/environment.js.map +1 -0
  95. package/dist/utils/fieldNameTracking.js +90 -0
  96. package/dist/utils/fieldNameTracking.js.map +1 -0
  97. package/dist/utils/index.d.ts +1 -0
  98. package/dist/utils/index.d.ts.map +1 -1
  99. package/dist/utils/index.js +8 -0
  100. package/dist/utils/index.js.map +1 -0
  101. package/dist/utils/jsonProcessing.js +179 -0
  102. package/dist/utils/jsonProcessing.js.map +1 -0
  103. package/dist/utils/logger.js +129 -0
  104. package/dist/utils/logger.js.map +1 -0
  105. package/dist/utils/operationUtils.js +126 -0
  106. package/dist/utils/operationUtils.js.map +1 -0
  107. package/dist/utils/robustModelLoader.d.ts +14 -0
  108. package/dist/utils/robustModelLoader.d.ts.map +1 -1
  109. package/dist/utils/robustModelLoader.js +537 -0
  110. package/dist/utils/robustModelLoader.js.map +1 -0
  111. package/dist/utils/searchCache.js +248 -0
  112. package/dist/utils/searchCache.js.map +1 -0
  113. package/dist/utils/statistics.js +25 -0
  114. package/dist/utils/statistics.js.map +1 -0
  115. package/dist/utils/statisticsCollector.js +224 -0
  116. package/dist/utils/statisticsCollector.js.map +1 -0
  117. package/dist/utils/textEncoding.js +309 -0
  118. package/dist/utils/textEncoding.js.map +1 -0
  119. package/dist/utils/typeUtils.js +40 -0
  120. package/dist/utils/typeUtils.js.map +1 -0
  121. package/dist/utils/version.d.ts +15 -3
  122. package/dist/utils/version.d.ts.map +1 -1
  123. package/dist/utils/version.js +24 -0
  124. package/dist/utils/version.js.map +1 -0
  125. package/dist/utils/workerUtils.js +458 -0
  126. package/dist/utils/workerUtils.js.map +1 -0
  127. package/package.json +23 -18
  128. package/dist/brainy.js +0 -90220
  129. package/dist/brainy.min.js +0 -12511
  130. package/dist/patched-platform-node.d.ts +0 -17
  131. package/dist/statistics/statisticsManager.d.ts +0 -121
  132. package/dist/storage/fileSystemStorage.d.ts +0 -73
  133. package/dist/storage/fileSystemStorage.d.ts.map +0 -1
  134. package/dist/storage/opfsStorage.d.ts +0 -236
  135. package/dist/storage/opfsStorage.d.ts.map +0 -1
  136. package/dist/storage/s3CompatibleStorage.d.ts +0 -157
  137. package/dist/storage/s3CompatibleStorage.d.ts.map +0 -1
  138. package/dist/testing/prettyReporter.d.ts +0 -23
  139. package/dist/testing/prettySummaryReporter.d.ts +0 -22
  140. package/dist/unified.min.js +0 -16153
  141. package/dist/utils/environmentDetection.d.ts +0 -47
  142. package/dist/utils/environmentDetection.d.ts.map +0 -1
  143. package/dist/utils/tensorflowUtils.d.ts +0 -17
  144. package/dist/utils/tensorflowUtils.d.ts.map +0 -1
@@ -0,0 +1,602 @@
1
+ /**
2
+ * HNSW (Hierarchical Navigable Small World) Index implementation
3
+ * Based on the paper: "Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs"
4
+ */
5
+ import { euclideanDistance, calculateDistancesBatch } from '../utils/index.js';
6
+ // Default HNSW parameters
7
+ const DEFAULT_CONFIG = {
8
+ M: 16, // Max number of connections per noun
9
+ efConstruction: 200, // Size of a dynamic candidate list during construction
10
+ efSearch: 50, // Size of a dynamic candidate list during search
11
+ ml: 16 // Max level
12
+ };
13
+ export class HNSWIndex {
14
+ constructor(config = {}, distanceFunction = euclideanDistance, options = {}) {
15
+ this.nouns = new Map();
16
+ this.entryPointId = null;
17
+ this.maxLevel = 0;
18
+ this.dimension = null;
19
+ this.useParallelization = true; // Whether to use parallelization for performance-critical operations
20
+ this.config = { ...DEFAULT_CONFIG, ...config };
21
+ this.distanceFunction = distanceFunction;
22
+ this.useParallelization =
23
+ options.useParallelization !== undefined
24
+ ? options.useParallelization
25
+ : true;
26
+ }
27
+ /**
28
+ * Set whether to use parallelization for performance-critical operations
29
+ */
30
+ setUseParallelization(useParallelization) {
31
+ this.useParallelization = useParallelization;
32
+ }
33
+ /**
34
+ * Get whether parallelization is enabled
35
+ */
36
+ getUseParallelization() {
37
+ return this.useParallelization;
38
+ }
39
+ /**
40
+ * Calculate distances between a query vector and multiple vectors in parallel
41
+ * This is used to optimize performance for search operations
42
+ * Uses GPU acceleration when available for optimal performance
43
+ *
44
+ * @param queryVector The query vector
45
+ * @param vectors Array of vectors to compare against
46
+ * @returns Array of distances
47
+ */
48
+ async calculateDistancesInParallel(queryVector, vectors) {
49
+ // If parallelization is disabled or there are very few vectors, use sequential processing
50
+ if (!this.useParallelization || vectors.length < 10) {
51
+ return vectors.map((item) => ({
52
+ id: item.id,
53
+ distance: this.distanceFunction(queryVector, item.vector)
54
+ }));
55
+ }
56
+ try {
57
+ // Extract just the vectors from the input array
58
+ const vectorsOnly = vectors.map((item) => item.vector);
59
+ // Use GPU-accelerated distance calculation when possible
60
+ const distances = await calculateDistancesBatch(queryVector, vectorsOnly, this.distanceFunction);
61
+ // Map the distances back to their IDs
62
+ return vectors.map((item, index) => ({
63
+ id: item.id,
64
+ distance: distances[index]
65
+ }));
66
+ }
67
+ catch (error) {
68
+ console.error('Error in GPU-accelerated distance calculation, falling back to sequential processing:', error);
69
+ // Fall back to sequential processing if GPU acceleration fails
70
+ return vectors.map((item) => ({
71
+ id: item.id,
72
+ distance: this.distanceFunction(queryVector, item.vector)
73
+ }));
74
+ }
75
+ }
76
+ /**
77
+ * Add a vector to the index
78
+ */
79
+ async addItem(item) {
80
+ // Check if item is defined
81
+ if (!item) {
82
+ throw new Error('Item is undefined or null');
83
+ }
84
+ const { id, vector } = item;
85
+ // Check if vector is defined
86
+ if (!vector) {
87
+ throw new Error('Vector is undefined or null');
88
+ }
89
+ // Set dimension on first insert
90
+ if (this.dimension === null) {
91
+ this.dimension = vector.length;
92
+ }
93
+ else if (vector.length !== this.dimension) {
94
+ throw new Error(`Vector dimension mismatch: expected ${this.dimension}, got ${vector.length}`);
95
+ }
96
+ // Generate random level for this noun
97
+ const nounLevel = this.getRandomLevel();
98
+ // Create new noun
99
+ const noun = {
100
+ id,
101
+ vector,
102
+ connections: new Map(),
103
+ level: nounLevel
104
+ };
105
+ // Initialize empty connection sets for each level
106
+ for (let level = 0; level <= nounLevel; level++) {
107
+ noun.connections.set(level, new Set());
108
+ }
109
+ // If this is the first noun, make it the entry point
110
+ if (this.nouns.size === 0) {
111
+ this.entryPointId = id;
112
+ this.maxLevel = nounLevel;
113
+ this.nouns.set(id, noun);
114
+ return id;
115
+ }
116
+ // Find entry point
117
+ if (!this.entryPointId) {
118
+ console.error('Entry point ID is null');
119
+ // If there's no entry point, this is the first noun, so we should have returned earlier
120
+ // This is a safety check
121
+ this.entryPointId = id;
122
+ this.maxLevel = nounLevel;
123
+ this.nouns.set(id, noun);
124
+ return id;
125
+ }
126
+ const entryPoint = this.nouns.get(this.entryPointId);
127
+ if (!entryPoint) {
128
+ console.error(`Entry point with ID ${this.entryPointId} not found`);
129
+ // If the entry point doesn't exist, treat this as the first noun
130
+ this.entryPointId = id;
131
+ this.maxLevel = nounLevel;
132
+ this.nouns.set(id, noun);
133
+ return id;
134
+ }
135
+ let currObj = entryPoint;
136
+ let currDist = this.distanceFunction(vector, entryPoint.vector);
137
+ // Traverse the graph from top to bottom to find the closest noun
138
+ for (let level = this.maxLevel; level > nounLevel; level--) {
139
+ let changed = true;
140
+ while (changed) {
141
+ changed = false;
142
+ // Check all neighbors at current level
143
+ const connections = currObj.connections.get(level) || new Set();
144
+ for (const neighborId of connections) {
145
+ const neighbor = this.nouns.get(neighborId);
146
+ if (!neighbor) {
147
+ // Skip neighbors that don't exist (expected during rapid additions/deletions)
148
+ continue;
149
+ }
150
+ const distToNeighbor = this.distanceFunction(vector, neighbor.vector);
151
+ if (distToNeighbor < currDist) {
152
+ currDist = distToNeighbor;
153
+ currObj = neighbor;
154
+ changed = true;
155
+ }
156
+ }
157
+ }
158
+ }
159
+ // For each level from nounLevel down to 0
160
+ for (let level = Math.min(nounLevel, this.maxLevel); level >= 0; level--) {
161
+ // Find ef nearest elements using greedy search
162
+ const nearestNouns = await this.searchLayer(vector, currObj, this.config.efConstruction, level);
163
+ // Select M nearest neighbors
164
+ const neighbors = this.selectNeighbors(vector, nearestNouns, this.config.M);
165
+ // Add bidirectional connections
166
+ for (const [neighborId, _] of neighbors) {
167
+ const neighbor = this.nouns.get(neighborId);
168
+ if (!neighbor) {
169
+ // Skip neighbors that don't exist (expected during rapid additions/deletions)
170
+ continue;
171
+ }
172
+ noun.connections.get(level).add(neighborId);
173
+ // Add reverse connection
174
+ if (!neighbor.connections.has(level)) {
175
+ neighbor.connections.set(level, new Set());
176
+ }
177
+ neighbor.connections.get(level).add(id);
178
+ // Ensure neighbor doesn't have too many connections
179
+ if (neighbor.connections.get(level).size > this.config.M) {
180
+ this.pruneConnections(neighbor, level);
181
+ }
182
+ }
183
+ // Update entry point for the next level
184
+ if (nearestNouns.size > 0) {
185
+ const [nearestId, nearestDist] = [...nearestNouns][0];
186
+ if (nearestDist < currDist) {
187
+ currDist = nearestDist;
188
+ const nearestNoun = this.nouns.get(nearestId);
189
+ if (!nearestNoun) {
190
+ console.error(`Nearest noun with ID ${nearestId} not found in addItem`);
191
+ // Keep the current object as is
192
+ }
193
+ else {
194
+ currObj = nearestNoun;
195
+ }
196
+ }
197
+ }
198
+ }
199
+ // Update max level and entry point if needed
200
+ if (nounLevel > this.maxLevel) {
201
+ this.maxLevel = nounLevel;
202
+ this.entryPointId = id;
203
+ }
204
+ // Add noun to the index
205
+ this.nouns.set(id, noun);
206
+ return id;
207
+ }
208
+ /**
209
+ * Search for nearest neighbors
210
+ */
211
+ async search(queryVector, k = 10) {
212
+ if (this.nouns.size === 0) {
213
+ return [];
214
+ }
215
+ // Check if query vector is defined
216
+ if (!queryVector) {
217
+ throw new Error('Query vector is undefined or null');
218
+ }
219
+ if (this.dimension !== null && queryVector.length !== this.dimension) {
220
+ throw new Error(`Query vector dimension mismatch: expected ${this.dimension}, got ${queryVector.length}`);
221
+ }
222
+ // Start from the entry point
223
+ if (!this.entryPointId) {
224
+ console.error('Entry point ID is null');
225
+ return [];
226
+ }
227
+ const entryPoint = this.nouns.get(this.entryPointId);
228
+ if (!entryPoint) {
229
+ console.error(`Entry point with ID ${this.entryPointId} not found`);
230
+ return [];
231
+ }
232
+ let currObj = entryPoint;
233
+ let currDist = this.distanceFunction(queryVector, currObj.vector);
234
+ // Traverse the graph from top to bottom to find the closest noun
235
+ for (let level = this.maxLevel; level > 0; level--) {
236
+ let changed = true;
237
+ while (changed) {
238
+ changed = false;
239
+ // Check all neighbors at current level
240
+ const connections = currObj.connections.get(level) || new Set();
241
+ // If we have enough connections, use parallel distance calculation
242
+ if (this.useParallelization && connections.size >= 10) {
243
+ // Prepare vectors for parallel calculation
244
+ const vectors = [];
245
+ for (const neighborId of connections) {
246
+ const neighbor = this.nouns.get(neighborId);
247
+ if (!neighbor)
248
+ continue;
249
+ vectors.push({ id: neighborId, vector: neighbor.vector });
250
+ }
251
+ // Calculate distances in parallel
252
+ const distances = await this.calculateDistancesInParallel(queryVector, vectors);
253
+ // Find the closest neighbor
254
+ for (const { id, distance } of distances) {
255
+ if (distance < currDist) {
256
+ currDist = distance;
257
+ const neighbor = this.nouns.get(id);
258
+ if (neighbor) {
259
+ currObj = neighbor;
260
+ changed = true;
261
+ }
262
+ }
263
+ }
264
+ }
265
+ else {
266
+ // Use sequential processing for small number of connections
267
+ for (const neighborId of connections) {
268
+ const neighbor = this.nouns.get(neighborId);
269
+ if (!neighbor) {
270
+ // Skip neighbors that don't exist (expected during rapid additions/deletions)
271
+ continue;
272
+ }
273
+ const distToNeighbor = this.distanceFunction(queryVector, neighbor.vector);
274
+ if (distToNeighbor < currDist) {
275
+ currDist = distToNeighbor;
276
+ currObj = neighbor;
277
+ changed = true;
278
+ }
279
+ }
280
+ }
281
+ }
282
+ }
283
+ // Search at level 0 with ef = k
284
+ const nearestNouns = await this.searchLayer(queryVector, currObj, Math.max(this.config.efSearch, k), 0);
285
+ // Convert to array and sort by distance
286
+ return [...nearestNouns].slice(0, k);
287
+ }
288
+ /**
289
+ * Remove an item from the index
290
+ */
291
+ removeItem(id) {
292
+ if (!this.nouns.has(id)) {
293
+ return false;
294
+ }
295
+ const noun = this.nouns.get(id);
296
+ // Remove connections to this noun from all neighbors
297
+ for (const [level, connections] of noun.connections.entries()) {
298
+ for (const neighborId of connections) {
299
+ const neighbor = this.nouns.get(neighborId);
300
+ if (!neighbor) {
301
+ // Skip neighbors that don't exist (expected during rapid additions/deletions)
302
+ continue;
303
+ }
304
+ if (neighbor.connections.has(level)) {
305
+ neighbor.connections.get(level).delete(id);
306
+ // Prune connections after removing this noun to ensure consistency
307
+ this.pruneConnections(neighbor, level);
308
+ }
309
+ }
310
+ }
311
+ // Also check all other nouns for references to this noun and remove them
312
+ for (const [nounId, otherNoun] of this.nouns.entries()) {
313
+ if (nounId === id)
314
+ continue; // Skip the noun being removed
315
+ for (const [level, connections] of otherNoun.connections.entries()) {
316
+ if (connections.has(id)) {
317
+ connections.delete(id);
318
+ // Prune connections after removing this reference
319
+ this.pruneConnections(otherNoun, level);
320
+ }
321
+ }
322
+ }
323
+ // Remove the noun
324
+ this.nouns.delete(id);
325
+ // If we removed the entry point, find a new one
326
+ if (this.entryPointId === id) {
327
+ if (this.nouns.size === 0) {
328
+ this.entryPointId = null;
329
+ this.maxLevel = 0;
330
+ }
331
+ else {
332
+ // Find the noun with the highest level
333
+ let maxLevel = 0;
334
+ let newEntryPointId = null;
335
+ for (const [nounId, noun] of this.nouns.entries()) {
336
+ if (noun.connections.size === 0)
337
+ continue; // Skip nouns with no connections
338
+ const nounLevel = Math.max(...noun.connections.keys());
339
+ if (nounLevel >= maxLevel) {
340
+ maxLevel = nounLevel;
341
+ newEntryPointId = nounId;
342
+ }
343
+ }
344
+ this.entryPointId = newEntryPointId;
345
+ this.maxLevel = maxLevel;
346
+ }
347
+ }
348
+ return true;
349
+ }
350
+ /**
351
+ * Get all nouns in the index
352
+ * @deprecated Use getNounsPaginated() instead for better scalability
353
+ */
354
+ getNouns() {
355
+ return new Map(this.nouns);
356
+ }
357
+ /**
358
+ * Get nouns with pagination
359
+ * @param options Pagination options
360
+ * @returns Object containing paginated nouns and pagination info
361
+ */
362
+ getNounsPaginated(options = {}) {
363
+ const offset = options.offset || 0;
364
+ const limit = options.limit || 100;
365
+ const filter = options.filter || (() => true);
366
+ // Get all noun entries
367
+ const entries = [...this.nouns.entries()];
368
+ // Apply filter if provided
369
+ const filteredEntries = entries.filter(([_, noun]) => filter(noun));
370
+ // Get total count after filtering
371
+ const totalCount = filteredEntries.length;
372
+ // Apply pagination
373
+ const paginatedEntries = filteredEntries.slice(offset, offset + limit);
374
+ // Check if there are more items
375
+ const hasMore = offset + limit < totalCount;
376
+ // Create a new map with the paginated entries
377
+ const items = new Map(paginatedEntries);
378
+ return {
379
+ items,
380
+ totalCount,
381
+ hasMore
382
+ };
383
+ }
384
+ /**
385
+ * Clear the index
386
+ */
387
+ clear() {
388
+ this.nouns.clear();
389
+ this.entryPointId = null;
390
+ this.maxLevel = 0;
391
+ }
392
+ /**
393
+ * Get the size of the index
394
+ */
395
+ size() {
396
+ return this.nouns.size;
397
+ }
398
+ /**
399
+ * Get the distance function used by the index
400
+ */
401
+ getDistanceFunction() {
402
+ return this.distanceFunction;
403
+ }
404
+ /**
405
+ * Get the entry point ID
406
+ */
407
+ getEntryPointId() {
408
+ return this.entryPointId;
409
+ }
410
+ /**
411
+ * Get the maximum level
412
+ */
413
+ getMaxLevel() {
414
+ return this.maxLevel;
415
+ }
416
+ /**
417
+ * Get the dimension
418
+ */
419
+ getDimension() {
420
+ return this.dimension;
421
+ }
422
+ /**
423
+ * Get the configuration
424
+ */
425
+ getConfig() {
426
+ return { ...this.config };
427
+ }
428
+ /**
429
+ * Get index health metrics
430
+ */
431
+ getIndexHealth() {
432
+ let totalConnections = 0;
433
+ const layerCounts = new Array(this.maxLevel + 1).fill(0);
434
+ // Count connections and layer distribution
435
+ this.nouns.forEach(noun => {
436
+ // Count connections at each layer
437
+ for (let level = 0; level <= noun.level; level++) {
438
+ totalConnections += noun.connections.get(level)?.size || 0;
439
+ layerCounts[level]++;
440
+ }
441
+ });
442
+ const totalNodes = this.nouns.size;
443
+ const averageConnections = totalNodes > 0 ? totalConnections / totalNodes : 0;
444
+ return {
445
+ averageConnections,
446
+ layerDistribution: layerCounts,
447
+ maxLayer: this.maxLevel,
448
+ totalNodes
449
+ };
450
+ }
451
+ /**
452
+ * Search within a specific layer
453
+ * Returns a map of noun IDs to distances, sorted by distance
454
+ */
455
+ async searchLayer(queryVector, entryPoint, ef, level) {
456
+ // Set of visited nouns
457
+ const visited = new Set([entryPoint.id]);
458
+ // Priority queue of candidates (closest first)
459
+ const candidates = new Map();
460
+ candidates.set(entryPoint.id, this.distanceFunction(queryVector, entryPoint.vector));
461
+ // Priority queue of nearest neighbors found so far (closest first)
462
+ const nearest = new Map();
463
+ nearest.set(entryPoint.id, this.distanceFunction(queryVector, entryPoint.vector));
464
+ // While there are candidates to explore
465
+ while (candidates.size > 0) {
466
+ // Get closest candidate
467
+ const [closestId, closestDist] = [...candidates][0];
468
+ candidates.delete(closestId);
469
+ // If this candidate is farther than the farthest in our result set, we're done
470
+ const farthestInNearest = [...nearest][nearest.size - 1];
471
+ if (nearest.size >= ef && closestDist > farthestInNearest[1]) {
472
+ break;
473
+ }
474
+ // Explore neighbors of the closest candidate
475
+ const noun = this.nouns.get(closestId);
476
+ if (!noun) {
477
+ console.error(`Noun with ID ${closestId} not found in searchLayer`);
478
+ continue;
479
+ }
480
+ const connections = noun.connections.get(level) || new Set();
481
+ // If we have enough connections and parallelization is enabled, use parallel distance calculation
482
+ if (this.useParallelization && connections.size >= 10) {
483
+ // Collect unvisited neighbors
484
+ const unvisitedNeighbors = [];
485
+ for (const neighborId of connections) {
486
+ if (!visited.has(neighborId)) {
487
+ visited.add(neighborId);
488
+ const neighbor = this.nouns.get(neighborId);
489
+ if (!neighbor)
490
+ continue;
491
+ unvisitedNeighbors.push({ id: neighborId, vector: neighbor.vector });
492
+ }
493
+ }
494
+ if (unvisitedNeighbors.length > 0) {
495
+ // Calculate distances in parallel
496
+ const distances = await this.calculateDistancesInParallel(queryVector, unvisitedNeighbors);
497
+ // Process the results
498
+ for (const { id, distance } of distances) {
499
+ // If we haven't found ef nearest neighbors yet, or this neighbor is closer than the farthest one we've found
500
+ if (nearest.size < ef || distance < farthestInNearest[1]) {
501
+ candidates.set(id, distance);
502
+ nearest.set(id, distance);
503
+ // If we have more than ef neighbors, remove the farthest one
504
+ if (nearest.size > ef) {
505
+ const sortedNearest = [...nearest].sort((a, b) => a[1] - b[1]);
506
+ nearest.clear();
507
+ for (let i = 0; i < ef; i++) {
508
+ nearest.set(sortedNearest[i][0], sortedNearest[i][1]);
509
+ }
510
+ }
511
+ }
512
+ }
513
+ }
514
+ }
515
+ else {
516
+ // Use sequential processing for small number of connections
517
+ for (const neighborId of connections) {
518
+ if (!visited.has(neighborId)) {
519
+ visited.add(neighborId);
520
+ const neighbor = this.nouns.get(neighborId);
521
+ if (!neighbor) {
522
+ // Skip neighbors that don't exist (expected during rapid additions/deletions)
523
+ continue;
524
+ }
525
+ const distToNeighbor = this.distanceFunction(queryVector, neighbor.vector);
526
+ // If we haven't found ef nearest neighbors yet, or this neighbor is closer than the farthest one we've found
527
+ if (nearest.size < ef || distToNeighbor < farthestInNearest[1]) {
528
+ candidates.set(neighborId, distToNeighbor);
529
+ nearest.set(neighborId, distToNeighbor);
530
+ // If we have more than ef neighbors, remove the farthest one
531
+ if (nearest.size > ef) {
532
+ const sortedNearest = [...nearest].sort((a, b) => a[1] - b[1]);
533
+ nearest.clear();
534
+ for (let i = 0; i < ef; i++) {
535
+ nearest.set(sortedNearest[i][0], sortedNearest[i][1]);
536
+ }
537
+ }
538
+ }
539
+ }
540
+ }
541
+ }
542
+ }
543
+ // Sort nearest by distance
544
+ return new Map([...nearest].sort((a, b) => a[1] - b[1]));
545
+ }
546
+ /**
547
+ * Select M nearest neighbors from the candidate set
548
+ */
549
+ selectNeighbors(queryVector, candidates, M) {
550
+ if (candidates.size <= M) {
551
+ return candidates;
552
+ }
553
+ // Simple heuristic: just take the M closest
554
+ const sortedCandidates = [...candidates].sort((a, b) => a[1] - b[1]);
555
+ const result = new Map();
556
+ for (let i = 0; i < Math.min(M, sortedCandidates.length); i++) {
557
+ result.set(sortedCandidates[i][0], sortedCandidates[i][1]);
558
+ }
559
+ return result;
560
+ }
561
+ /**
562
+ * Ensure a noun doesn't have too many connections at a given level
563
+ */
564
+ pruneConnections(noun, level) {
565
+ const connections = noun.connections.get(level);
566
+ if (connections.size <= this.config.M) {
567
+ return;
568
+ }
569
+ // Calculate distances to all neighbors
570
+ const distances = new Map();
571
+ const validNeighborIds = new Set();
572
+ for (const neighborId of connections) {
573
+ const neighbor = this.nouns.get(neighborId);
574
+ if (!neighbor) {
575
+ // Skip neighbors that don't exist (expected during rapid additions/deletions)
576
+ continue;
577
+ }
578
+ // Only add valid neighbors to the distances map
579
+ distances.set(neighborId, this.distanceFunction(noun.vector, neighbor.vector));
580
+ validNeighborIds.add(neighborId);
581
+ }
582
+ // Only proceed if we have valid neighbors
583
+ if (distances.size === 0) {
584
+ // If no valid neighbors, clear connections at this level
585
+ noun.connections.set(level, new Set());
586
+ return;
587
+ }
588
+ // Select M closest neighbors from valid ones
589
+ const selectedNeighbors = this.selectNeighbors(noun.vector, distances, this.config.M);
590
+ // Update connections with only valid neighbors
591
+ noun.connections.set(level, new Set(selectedNeighbors.keys()));
592
+ }
593
+ /**
594
+ * Generate a random level for a new noun
595
+ * Uses the same distribution as in the original HNSW paper
596
+ */
597
+ getRandomLevel() {
598
+ const r = Math.random();
599
+ return Math.floor(-Math.log(r) * (1.0 / Math.log(this.config.M)));
600
+ }
601
+ }
602
+ //# sourceMappingURL=hnswIndex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hnswIndex.js","sourceRoot":"","sources":["../../src/hnsw/hnswIndex.ts"],"names":[],"mappings":"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"}