@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,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Basic usage example for the Soulcraft Brainy database
|
|
3
|
+
*/
|
|
4
|
+
import { BrainyData } from '../brainyData.js';
|
|
5
|
+
// Example data - word embeddings
|
|
6
|
+
const wordEmbeddings = {
|
|
7
|
+
cat: [0.2, 0.3, 0.4, 0.1],
|
|
8
|
+
dog: [0.3, 0.2, 0.4, 0.2],
|
|
9
|
+
fish: [0.1, 0.1, 0.8, 0.2],
|
|
10
|
+
bird: [0.1, 0.4, 0.2, 0.5],
|
|
11
|
+
tiger: [0.3, 0.4, 0.3, 0.1],
|
|
12
|
+
lion: [0.4, 0.3, 0.2, 0.1],
|
|
13
|
+
shark: [0.2, 0.1, 0.7, 0.3],
|
|
14
|
+
eagle: [0.2, 0.5, 0.1, 0.4]
|
|
15
|
+
};
|
|
16
|
+
// Example metadata
|
|
17
|
+
const metadata = {
|
|
18
|
+
cat: { type: 'mammal', domesticated: true },
|
|
19
|
+
dog: { type: 'mammal', domesticated: true },
|
|
20
|
+
fish: { type: 'fish', domesticated: false },
|
|
21
|
+
bird: { type: 'bird', domesticated: false },
|
|
22
|
+
tiger: { type: 'mammal', domesticated: false },
|
|
23
|
+
lion: { type: 'mammal', domesticated: false },
|
|
24
|
+
shark: { type: 'fish', domesticated: false },
|
|
25
|
+
eagle: { type: 'bird', domesticated: false }
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Run the example
|
|
29
|
+
*/
|
|
30
|
+
async function runExample() {
|
|
31
|
+
console.log('Initializing vector database...');
|
|
32
|
+
// Create a new vector database
|
|
33
|
+
const db = new BrainyData();
|
|
34
|
+
await db.init();
|
|
35
|
+
console.log('Adding vectors to the database...');
|
|
36
|
+
// Add vectors to the database
|
|
37
|
+
const ids = {};
|
|
38
|
+
for (const [word, vector] of Object.entries(wordEmbeddings)) {
|
|
39
|
+
ids[word] = await db.add(vector, metadata[word]);
|
|
40
|
+
console.log(`Added "${word}" with ID: ${ids[word]}`);
|
|
41
|
+
}
|
|
42
|
+
console.log('\nDatabase size:', db.size());
|
|
43
|
+
// Search for similar vectors
|
|
44
|
+
console.log('\nSearching for vectors similar to "cat"...');
|
|
45
|
+
const catResults = await db.search(wordEmbeddings['cat'], 3);
|
|
46
|
+
console.log('Results:');
|
|
47
|
+
for (const result of catResults) {
|
|
48
|
+
const word = Object.entries(ids).find(([_, id]) => id === result.id)?.[0] || 'unknown';
|
|
49
|
+
console.log(`- ${word} (score: ${result.score.toFixed(4)}, metadata:`, result.metadata, ')');
|
|
50
|
+
}
|
|
51
|
+
// Search for similar vectors
|
|
52
|
+
console.log('\nSearching for vectors similar to "fish"...');
|
|
53
|
+
const fishResults = await db.search(wordEmbeddings['fish'], 3);
|
|
54
|
+
console.log('Results:');
|
|
55
|
+
for (const result of fishResults) {
|
|
56
|
+
const word = Object.entries(ids).find(([_, id]) => id === result.id)?.[0] || 'unknown';
|
|
57
|
+
console.log(`- ${word} (score: ${result.score.toFixed(4)}, metadata:`, result.metadata, ')');
|
|
58
|
+
}
|
|
59
|
+
// Update metadata
|
|
60
|
+
console.log('\nUpdating metadata for "bird"...');
|
|
61
|
+
await db.updateMetadata(ids['bird'], {
|
|
62
|
+
...metadata['bird'],
|
|
63
|
+
notes: 'Can fly'
|
|
64
|
+
});
|
|
65
|
+
// Get the updated document
|
|
66
|
+
const birdDoc = await db.get(ids['bird']);
|
|
67
|
+
console.log('Updated bird document:', birdDoc);
|
|
68
|
+
// Delete a vector
|
|
69
|
+
console.log('\nDeleting "shark"...');
|
|
70
|
+
await db.delete(ids['shark']);
|
|
71
|
+
console.log('Database size after deletion:', db.size());
|
|
72
|
+
// Search again to verify shark is gone
|
|
73
|
+
console.log('\nSearching for vectors similar to "fish" after deletion...');
|
|
74
|
+
const fishResultsAfterDeletion = await db.search(wordEmbeddings['fish'], 3);
|
|
75
|
+
console.log('Results:');
|
|
76
|
+
for (const result of fishResultsAfterDeletion) {
|
|
77
|
+
const word = Object.entries(ids).find(([_, id]) => id === result.id)?.[0] || 'unknown';
|
|
78
|
+
console.log(`- ${word} (score: ${result.score.toFixed(4)}, metadata:`, result.metadata, ')');
|
|
79
|
+
}
|
|
80
|
+
console.log('\nExample completed successfully!');
|
|
81
|
+
}
|
|
82
|
+
// Check if we're in a browser or Node.js environment
|
|
83
|
+
if (typeof window !== 'undefined') {
|
|
84
|
+
// Browser environment
|
|
85
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
86
|
+
const button = document.createElement('button');
|
|
87
|
+
button.textContent = 'Run BrainyData Example';
|
|
88
|
+
button.addEventListener('click', async () => {
|
|
89
|
+
const output = document.createElement('pre');
|
|
90
|
+
document.body.appendChild(output);
|
|
91
|
+
// Redirect console.log to the output element
|
|
92
|
+
const originalLog = console.log;
|
|
93
|
+
console.log = (...args) => {
|
|
94
|
+
originalLog(...args);
|
|
95
|
+
output.textContent +=
|
|
96
|
+
args
|
|
97
|
+
.map((arg) => typeof arg === 'object' ? JSON.stringify(arg, null, 2) : arg)
|
|
98
|
+
.join(' ') + '\n';
|
|
99
|
+
};
|
|
100
|
+
try {
|
|
101
|
+
await runExample();
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
console.error('Error running example:', error);
|
|
105
|
+
}
|
|
106
|
+
// Restore console.log
|
|
107
|
+
console.log = originalLog;
|
|
108
|
+
});
|
|
109
|
+
document.body.appendChild(button);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
// Node.js environment
|
|
114
|
+
runExample().catch((error) => {
|
|
115
|
+
console.error('Error running example:', error);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=basicUsage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"basicUsage.js","sourceRoot":"","sources":["../../src/examples/basicUsage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Distributed Search System for Large-Scale HNSW Indices
|
|
3
|
+
* Implements parallel search across multiple partitions and instances
|
|
4
|
+
*/
|
|
5
|
+
import { executeInThread } from '../utils/workerUtils.js';
|
|
6
|
+
// Search coordination strategies
|
|
7
|
+
export var SearchStrategy;
|
|
8
|
+
(function (SearchStrategy) {
|
|
9
|
+
SearchStrategy["BROADCAST"] = "broadcast";
|
|
10
|
+
SearchStrategy["SELECTIVE"] = "selective";
|
|
11
|
+
SearchStrategy["ADAPTIVE"] = "adaptive";
|
|
12
|
+
SearchStrategy["HIERARCHICAL"] = "hierarchical"; // Multi-level search
|
|
13
|
+
})(SearchStrategy || (SearchStrategy = {}));
|
|
14
|
+
/**
|
|
15
|
+
* Distributed search coordinator for large-scale vector search
|
|
16
|
+
*/
|
|
17
|
+
export class DistributedSearchSystem {
|
|
18
|
+
constructor(config = {}) {
|
|
19
|
+
this.searchWorkers = new Map();
|
|
20
|
+
this.searchQueue = [];
|
|
21
|
+
this.activeSearches = new Map();
|
|
22
|
+
this.partitionStats = new Map();
|
|
23
|
+
// Performance monitoring
|
|
24
|
+
this.searchStats = {
|
|
25
|
+
totalSearches: 0,
|
|
26
|
+
averageLatency: 0,
|
|
27
|
+
parallelEfficiency: 0,
|
|
28
|
+
cacheHitRate: 0,
|
|
29
|
+
partitionUtilization: new Map()
|
|
30
|
+
};
|
|
31
|
+
this.config = {
|
|
32
|
+
maxConcurrentSearches: 10,
|
|
33
|
+
searchTimeout: 30000, // 30 seconds
|
|
34
|
+
resultMergeStrategy: 'hybrid',
|
|
35
|
+
adaptivePartitionSelection: true,
|
|
36
|
+
redundantSearches: 0,
|
|
37
|
+
loadBalancing: true,
|
|
38
|
+
...config
|
|
39
|
+
};
|
|
40
|
+
this.initializeWorkerPool();
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Execute distributed search across multiple partitions
|
|
44
|
+
*/
|
|
45
|
+
async distributedSearch(partitionedIndex, queryVector, k, strategy = SearchStrategy.ADAPTIVE) {
|
|
46
|
+
const searchId = this.generateSearchId();
|
|
47
|
+
const startTime = Date.now();
|
|
48
|
+
try {
|
|
49
|
+
// Select partitions to search based on strategy
|
|
50
|
+
const partitionsToSearch = await this.selectPartitions(partitionedIndex, queryVector, strategy);
|
|
51
|
+
// Create search tasks
|
|
52
|
+
const searchTasks = this.createSearchTasks(partitionsToSearch, queryVector, k, searchId);
|
|
53
|
+
// Execute searches in parallel
|
|
54
|
+
const searchResults = await this.executeParallelSearches(partitionedIndex, searchTasks);
|
|
55
|
+
// Merge results from all partitions
|
|
56
|
+
const mergedResults = this.mergeSearchResults(searchResults, k);
|
|
57
|
+
// Update statistics
|
|
58
|
+
this.updateSearchStats(searchId, startTime, searchResults);
|
|
59
|
+
return mergedResults;
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
console.error(`Distributed search ${searchId} failed:`, error);
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Select partitions to search based on strategy
|
|
68
|
+
*/
|
|
69
|
+
async selectPartitions(partitionedIndex, queryVector, strategy) {
|
|
70
|
+
const stats = partitionedIndex.getPartitionStats();
|
|
71
|
+
const allPartitionIds = stats.partitionDetails.map(p => p.id);
|
|
72
|
+
switch (strategy) {
|
|
73
|
+
case SearchStrategy.BROADCAST:
|
|
74
|
+
return allPartitionIds;
|
|
75
|
+
case SearchStrategy.SELECTIVE:
|
|
76
|
+
return this.selectTopPartitions(allPartitionIds, 3);
|
|
77
|
+
case SearchStrategy.ADAPTIVE:
|
|
78
|
+
return await this.adaptivePartitionSelection(allPartitionIds, queryVector);
|
|
79
|
+
case SearchStrategy.HIERARCHICAL:
|
|
80
|
+
return this.hierarchicalPartitionSelection(allPartitionIds);
|
|
81
|
+
default:
|
|
82
|
+
return allPartitionIds;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Adaptive partition selection based on historical performance
|
|
87
|
+
*/
|
|
88
|
+
async adaptivePartitionSelection(partitionIds, queryVector) {
|
|
89
|
+
const candidates = [];
|
|
90
|
+
for (const partitionId of partitionIds) {
|
|
91
|
+
const stats = this.partitionStats.get(partitionId);
|
|
92
|
+
let score = 1.0;
|
|
93
|
+
if (stats) {
|
|
94
|
+
// Score based on performance metrics
|
|
95
|
+
const speedScore = 1000 / Math.max(stats.averageSearchTime, 1);
|
|
96
|
+
const loadScore = Math.max(0, 1 - stats.load);
|
|
97
|
+
const qualityScore = stats.quality;
|
|
98
|
+
const recencyScore = Math.max(0, 1 - (Date.now() - stats.lastUsed) / 3600000);
|
|
99
|
+
score = speedScore * 0.3 + loadScore * 0.25 + qualityScore * 0.3 + recencyScore * 0.15;
|
|
100
|
+
}
|
|
101
|
+
candidates.push({ id: partitionId, score });
|
|
102
|
+
}
|
|
103
|
+
// Sort by score and select top partitions
|
|
104
|
+
candidates.sort((a, b) => b.score - a.score);
|
|
105
|
+
const selectedCount = Math.min(Math.ceil(partitionIds.length * 0.6), 8);
|
|
106
|
+
return candidates.slice(0, selectedCount).map(c => c.id);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Select top-performing partitions
|
|
110
|
+
*/
|
|
111
|
+
selectTopPartitions(partitionIds, count) {
|
|
112
|
+
const withStats = partitionIds.map(id => ({
|
|
113
|
+
id,
|
|
114
|
+
stats: this.partitionStats.get(id)
|
|
115
|
+
}));
|
|
116
|
+
// Sort by average search time (faster is better)
|
|
117
|
+
withStats.sort((a, b) => {
|
|
118
|
+
const timeA = a.stats?.averageSearchTime || 1000;
|
|
119
|
+
const timeB = b.stats?.averageSearchTime || 1000;
|
|
120
|
+
return timeA - timeB;
|
|
121
|
+
});
|
|
122
|
+
return withStats.slice(0, count).map(p => p.id);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Hierarchical partition selection for very large datasets
|
|
126
|
+
*/
|
|
127
|
+
hierarchicalPartitionSelection(partitionIds) {
|
|
128
|
+
// First level: select representative partitions
|
|
129
|
+
const firstLevel = partitionIds.filter((_, index) => index % 3 === 0);
|
|
130
|
+
// Could implement a two-phase search here:
|
|
131
|
+
// 1. Quick search on representative partitions
|
|
132
|
+
// 2. Detailed search on promising partitions
|
|
133
|
+
return firstLevel;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Create search tasks for parallel execution
|
|
137
|
+
*/
|
|
138
|
+
createSearchTasks(partitionIds, queryVector, k, searchId) {
|
|
139
|
+
const tasks = [];
|
|
140
|
+
for (let i = 0; i < partitionIds.length; i++) {
|
|
141
|
+
const partitionId = partitionIds[i];
|
|
142
|
+
const stats = this.partitionStats.get(partitionId);
|
|
143
|
+
// Calculate priority based on partition performance
|
|
144
|
+
const priority = stats ? (1000 - stats.averageSearchTime) : 500;
|
|
145
|
+
tasks.push({
|
|
146
|
+
partitionId,
|
|
147
|
+
queryVector: [...queryVector], // Clone vector
|
|
148
|
+
k: Math.max(k * 2, 20), // Search for more results per partition
|
|
149
|
+
searchId,
|
|
150
|
+
priority
|
|
151
|
+
});
|
|
152
|
+
// Add redundant searches if configured
|
|
153
|
+
if (this.config.redundantSearches > 0 && i < this.config.redundantSearches) {
|
|
154
|
+
tasks.push({
|
|
155
|
+
partitionId,
|
|
156
|
+
queryVector: [...queryVector],
|
|
157
|
+
k: Math.max(k * 2, 20),
|
|
158
|
+
searchId: `${searchId}_redundant_${i}`,
|
|
159
|
+
priority: priority - 100 // Lower priority for redundant searches
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Sort tasks by priority
|
|
164
|
+
tasks.sort((a, b) => b.priority - a.priority);
|
|
165
|
+
return tasks;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Execute searches in parallel across selected partitions
|
|
169
|
+
*/
|
|
170
|
+
async executeParallelSearches(partitionedIndex, searchTasks) {
|
|
171
|
+
const results = [];
|
|
172
|
+
const semaphore = new Semaphore(this.config.maxConcurrentSearches);
|
|
173
|
+
// Execute tasks with controlled concurrency
|
|
174
|
+
const taskPromises = searchTasks.map(async (task) => {
|
|
175
|
+
await semaphore.acquire();
|
|
176
|
+
try {
|
|
177
|
+
const startTime = Date.now();
|
|
178
|
+
// Execute search with timeout
|
|
179
|
+
const searchPromise = this.executePartitionSearch(partitionedIndex, task);
|
|
180
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
181
|
+
setTimeout(() => reject(new Error('Search timeout')), this.config.searchTimeout);
|
|
182
|
+
});
|
|
183
|
+
const result = await Promise.race([searchPromise, timeoutPromise]);
|
|
184
|
+
result.searchTime = Date.now() - startTime;
|
|
185
|
+
return result;
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
return {
|
|
189
|
+
partitionId: task.partitionId,
|
|
190
|
+
results: [],
|
|
191
|
+
searchTime: this.config.searchTimeout,
|
|
192
|
+
nodesVisited: 0,
|
|
193
|
+
error: error
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
finally {
|
|
197
|
+
semaphore.release();
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
// Wait for all searches to complete
|
|
201
|
+
const taskResults = await Promise.allSettled(taskPromises);
|
|
202
|
+
for (const result of taskResults) {
|
|
203
|
+
if (result.status === 'fulfilled') {
|
|
204
|
+
results.push(result.value);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return results;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Execute search on a single partition
|
|
211
|
+
*/
|
|
212
|
+
async executePartitionSearch(partitionedIndex, task) {
|
|
213
|
+
try {
|
|
214
|
+
// Use thread pool for compute-intensive operations
|
|
215
|
+
if (this.shouldUseWorkerThread(task)) {
|
|
216
|
+
return await this.executeInWorkerThread(partitionedIndex, task);
|
|
217
|
+
}
|
|
218
|
+
// Execute search directly
|
|
219
|
+
const results = await partitionedIndex.search(task.queryVector, task.k, { partitionIds: [task.partitionId] });
|
|
220
|
+
return {
|
|
221
|
+
partitionId: task.partitionId,
|
|
222
|
+
results,
|
|
223
|
+
searchTime: 0, // Will be set by caller
|
|
224
|
+
nodesVisited: results.length // Approximation
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
throw new Error(`Partition search failed: ${error}`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Determine if search should use worker thread
|
|
233
|
+
*/
|
|
234
|
+
shouldUseWorkerThread(task) {
|
|
235
|
+
// Use worker threads for high-dimensional vectors or large k
|
|
236
|
+
return task.queryVector.length > 512 || task.k > 100;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Execute search in worker thread
|
|
240
|
+
*/
|
|
241
|
+
async executeInWorkerThread(partitionedIndex, task) {
|
|
242
|
+
const worker = this.getAvailableWorker();
|
|
243
|
+
if (!worker) {
|
|
244
|
+
// No available workers, execute synchronously
|
|
245
|
+
return this.executePartitionSearch(partitionedIndex, task);
|
|
246
|
+
}
|
|
247
|
+
try {
|
|
248
|
+
worker.busy = true;
|
|
249
|
+
const startTime = Date.now();
|
|
250
|
+
// Execute in thread (simplified - would need proper worker setup)
|
|
251
|
+
const searchFunction = `
|
|
252
|
+
return partitionedIndex.search(
|
|
253
|
+
task.queryVector,
|
|
254
|
+
task.k,
|
|
255
|
+
{ partitionIds: [task.partitionId] }
|
|
256
|
+
)
|
|
257
|
+
`;
|
|
258
|
+
const results = await executeInThread(searchFunction, {
|
|
259
|
+
queryVector: task.queryVector,
|
|
260
|
+
k: task.k,
|
|
261
|
+
partitionId: task.partitionId
|
|
262
|
+
});
|
|
263
|
+
const searchTime = Date.now() - startTime;
|
|
264
|
+
worker.averageTaskTime = (worker.averageTaskTime + searchTime) / 2;
|
|
265
|
+
worker.tasksCompleted++;
|
|
266
|
+
return {
|
|
267
|
+
partitionId: task.partitionId,
|
|
268
|
+
results: results || [],
|
|
269
|
+
searchTime,
|
|
270
|
+
nodesVisited: results ? results.length : 0
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
finally {
|
|
274
|
+
worker.busy = false;
|
|
275
|
+
worker.lastTaskTime = Date.now();
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Get available worker from pool
|
|
280
|
+
*/
|
|
281
|
+
getAvailableWorker() {
|
|
282
|
+
for (const worker of this.searchWorkers.values()) {
|
|
283
|
+
if (!worker.busy) {
|
|
284
|
+
return worker;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return null;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Merge search results from multiple partitions
|
|
291
|
+
*/
|
|
292
|
+
mergeSearchResults(partitionResults, k) {
|
|
293
|
+
const allResults = [];
|
|
294
|
+
const seenIds = new Set();
|
|
295
|
+
// Collect all unique results
|
|
296
|
+
for (const partitionResult of partitionResults) {
|
|
297
|
+
if (partitionResult.error) {
|
|
298
|
+
console.warn(`Partition ${partitionResult.partitionId} failed:`, partitionResult.error);
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
for (const [id, distance] of partitionResult.results) {
|
|
302
|
+
if (!seenIds.has(id)) {
|
|
303
|
+
allResults.push([id, distance]);
|
|
304
|
+
seenIds.add(id);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
// Sort and return top k results
|
|
309
|
+
switch (this.config.resultMergeStrategy) {
|
|
310
|
+
case 'distance':
|
|
311
|
+
allResults.sort((a, b) => a[1] - b[1]);
|
|
312
|
+
break;
|
|
313
|
+
case 'score':
|
|
314
|
+
// Convert distance to score (1 / (1 + distance))
|
|
315
|
+
allResults.sort((a, b) => {
|
|
316
|
+
const scoreA = 1 / (1 + a[1]);
|
|
317
|
+
const scoreB = 1 / (1 + b[1]);
|
|
318
|
+
return scoreB - scoreA;
|
|
319
|
+
});
|
|
320
|
+
break;
|
|
321
|
+
case 'hybrid':
|
|
322
|
+
// Weighted combination of distance and partition quality
|
|
323
|
+
allResults.sort((a, b) => {
|
|
324
|
+
const qualityWeightA = this.getPartitionQuality(a[0]);
|
|
325
|
+
const qualityWeightB = this.getPartitionQuality(b[0]);
|
|
326
|
+
const adjustedDistanceA = a[1] / (qualityWeightA + 0.1);
|
|
327
|
+
const adjustedDistanceB = b[1] / (qualityWeightB + 0.1);
|
|
328
|
+
return adjustedDistanceA - adjustedDistanceB;
|
|
329
|
+
});
|
|
330
|
+
break;
|
|
331
|
+
}
|
|
332
|
+
return allResults.slice(0, k);
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Get partition quality score
|
|
336
|
+
*/
|
|
337
|
+
getPartitionQuality(nodeId) {
|
|
338
|
+
// This would require knowing which partition a node came from
|
|
339
|
+
// For now, return a default quality score
|
|
340
|
+
return 1.0;
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Update search statistics
|
|
344
|
+
*/
|
|
345
|
+
updateSearchStats(searchId, startTime, results) {
|
|
346
|
+
const totalTime = Date.now() - startTime;
|
|
347
|
+
const successfulSearches = results.filter(r => !r.error);
|
|
348
|
+
// Update global stats
|
|
349
|
+
this.searchStats.totalSearches++;
|
|
350
|
+
this.searchStats.averageLatency =
|
|
351
|
+
(this.searchStats.averageLatency + totalTime) / 2;
|
|
352
|
+
// Calculate parallel efficiency
|
|
353
|
+
const totalPartitionTime = results.reduce((sum, r) => sum + r.searchTime, 0);
|
|
354
|
+
this.searchStats.parallelEfficiency =
|
|
355
|
+
totalPartitionTime > 0 ? totalTime / totalPartitionTime : 0;
|
|
356
|
+
// Update partition statistics
|
|
357
|
+
for (const result of successfulSearches) {
|
|
358
|
+
let stats = this.partitionStats.get(result.partitionId);
|
|
359
|
+
if (!stats) {
|
|
360
|
+
stats = {
|
|
361
|
+
averageSearchTime: result.searchTime,
|
|
362
|
+
load: 0,
|
|
363
|
+
quality: 1.0,
|
|
364
|
+
lastUsed: Date.now()
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
stats.averageSearchTime = (stats.averageSearchTime + result.searchTime) / 2;
|
|
369
|
+
stats.lastUsed = Date.now();
|
|
370
|
+
}
|
|
371
|
+
this.partitionStats.set(result.partitionId, stats);
|
|
372
|
+
this.searchStats.partitionUtilization.set(result.partitionId, (this.searchStats.partitionUtilization.get(result.partitionId) || 0) + 1);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Initialize worker thread pool
|
|
377
|
+
*/
|
|
378
|
+
initializeWorkerPool() {
|
|
379
|
+
const workerCount = Math.min(navigator.hardwareConcurrency || 4, 8);
|
|
380
|
+
for (let i = 0; i < workerCount; i++) {
|
|
381
|
+
const worker = {
|
|
382
|
+
id: `worker_${i}`,
|
|
383
|
+
busy: false,
|
|
384
|
+
tasksCompleted: 0,
|
|
385
|
+
averageTaskTime: 0,
|
|
386
|
+
lastTaskTime: 0
|
|
387
|
+
};
|
|
388
|
+
this.searchWorkers.set(worker.id, worker);
|
|
389
|
+
}
|
|
390
|
+
console.log(`Initialized worker pool with ${workerCount} workers`);
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Generate unique search ID
|
|
394
|
+
*/
|
|
395
|
+
generateSearchId() {
|
|
396
|
+
return `search_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Get search performance statistics
|
|
400
|
+
*/
|
|
401
|
+
getSearchStats() {
|
|
402
|
+
return {
|
|
403
|
+
...this.searchStats,
|
|
404
|
+
workerStats: Array.from(this.searchWorkers.values()),
|
|
405
|
+
partitionStats: Array.from(this.partitionStats.entries()).map(([id, stats]) => ({
|
|
406
|
+
id,
|
|
407
|
+
stats
|
|
408
|
+
}))
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Cleanup resources
|
|
413
|
+
*/
|
|
414
|
+
cleanup() {
|
|
415
|
+
// Clear active searches
|
|
416
|
+
this.activeSearches.clear();
|
|
417
|
+
// Reset worker states
|
|
418
|
+
for (const worker of this.searchWorkers.values()) {
|
|
419
|
+
worker.busy = false;
|
|
420
|
+
}
|
|
421
|
+
// Clear statistics
|
|
422
|
+
this.partitionStats.clear();
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Simple semaphore for concurrency control
|
|
427
|
+
*/
|
|
428
|
+
class Semaphore {
|
|
429
|
+
constructor(permits) {
|
|
430
|
+
this.waiting = [];
|
|
431
|
+
this.permits = permits;
|
|
432
|
+
}
|
|
433
|
+
async acquire() {
|
|
434
|
+
if (this.permits > 0) {
|
|
435
|
+
this.permits--;
|
|
436
|
+
return Promise.resolve();
|
|
437
|
+
}
|
|
438
|
+
return new Promise((resolve) => {
|
|
439
|
+
this.waiting.push(resolve);
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
release() {
|
|
443
|
+
if (this.waiting.length > 0) {
|
|
444
|
+
const resolve = this.waiting.shift();
|
|
445
|
+
resolve();
|
|
446
|
+
}
|
|
447
|
+
else {
|
|
448
|
+
this.permits++;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
//# sourceMappingURL=distributedSearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distributedSearch.js","sourceRoot":"","sources":["../../src/hnsw/distributedSearch.ts"],"names":[],"mappings":"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"}
|