@danielsimonjr/memoryjs 1.0.0 → 1.1.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 +385 -113
- package/README.md.backup-1768084780988 +266 -0
- package/dist/index.cjs +17364 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +12371 -0
- package/dist/index.d.ts +12367 -11
- package/dist/index.js +17102 -19
- package/dist/index.js.map +1 -1
- package/dist/workers/levenshteinWorker.cjs +102 -0
- package/dist/workers/levenshteinWorker.cjs.map +1 -0
- package/dist/workers/levenshteinWorker.js +57 -91
- package/dist/workers/levenshteinWorker.js.map +1 -1
- package/package.json +12 -6
- package/dist/core/EntityManager.d.ts +0 -268
- package/dist/core/EntityManager.d.ts.map +0 -1
- package/dist/core/EntityManager.js +0 -512
- package/dist/core/EntityManager.js.map +0 -1
- package/dist/core/GraphEventEmitter.d.ts +0 -202
- package/dist/core/GraphEventEmitter.d.ts.map +0 -1
- package/dist/core/GraphEventEmitter.js +0 -347
- package/dist/core/GraphEventEmitter.js.map +0 -1
- package/dist/core/GraphStorage.d.ts +0 -395
- package/dist/core/GraphStorage.d.ts.map +0 -1
- package/dist/core/GraphStorage.js +0 -786
- package/dist/core/GraphStorage.js.map +0 -1
- package/dist/core/GraphTraversal.d.ts +0 -141
- package/dist/core/GraphTraversal.d.ts.map +0 -1
- package/dist/core/GraphTraversal.js +0 -574
- package/dist/core/GraphTraversal.js.map +0 -1
- package/dist/core/HierarchyManager.d.ts +0 -111
- package/dist/core/HierarchyManager.d.ts.map +0 -1
- package/dist/core/HierarchyManager.js +0 -225
- package/dist/core/HierarchyManager.js.map +0 -1
- package/dist/core/ManagerContext.d.ts +0 -76
- package/dist/core/ManagerContext.d.ts.map +0 -1
- package/dist/core/ManagerContext.js +0 -129
- package/dist/core/ManagerContext.js.map +0 -1
- package/dist/core/ObservationManager.d.ts +0 -85
- package/dist/core/ObservationManager.d.ts.map +0 -1
- package/dist/core/ObservationManager.js +0 -124
- package/dist/core/ObservationManager.js.map +0 -1
- package/dist/core/RelationManager.d.ts +0 -131
- package/dist/core/RelationManager.d.ts.map +0 -1
- package/dist/core/RelationManager.js +0 -212
- package/dist/core/RelationManager.js.map +0 -1
- package/dist/core/SQLiteStorage.d.ts +0 -354
- package/dist/core/SQLiteStorage.d.ts.map +0 -1
- package/dist/core/SQLiteStorage.js +0 -919
- package/dist/core/SQLiteStorage.js.map +0 -1
- package/dist/core/StorageFactory.d.ts +0 -45
- package/dist/core/StorageFactory.d.ts.map +0 -1
- package/dist/core/StorageFactory.js +0 -65
- package/dist/core/StorageFactory.js.map +0 -1
- package/dist/core/TransactionManager.d.ts +0 -464
- package/dist/core/TransactionManager.d.ts.map +0 -1
- package/dist/core/TransactionManager.js +0 -869
- package/dist/core/TransactionManager.js.map +0 -1
- package/dist/core/index.d.ts +0 -17
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -20
- package/dist/core/index.js.map +0 -1
- package/dist/features/AnalyticsManager.d.ts +0 -44
- package/dist/features/AnalyticsManager.d.ts.map +0 -1
- package/dist/features/AnalyticsManager.js +0 -224
- package/dist/features/AnalyticsManager.js.map +0 -1
- package/dist/features/ArchiveManager.d.ts +0 -133
- package/dist/features/ArchiveManager.d.ts.map +0 -1
- package/dist/features/ArchiveManager.js +0 -282
- package/dist/features/ArchiveManager.js.map +0 -1
- package/dist/features/CompressionManager.d.ts +0 -119
- package/dist/features/CompressionManager.d.ts.map +0 -1
- package/dist/features/CompressionManager.js +0 -470
- package/dist/features/CompressionManager.js.map +0 -1
- package/dist/features/IOManager.d.ts +0 -225
- package/dist/features/IOManager.d.ts.map +0 -1
- package/dist/features/IOManager.js +0 -1093
- package/dist/features/IOManager.js.map +0 -1
- package/dist/features/KeywordExtractor.d.ts +0 -61
- package/dist/features/KeywordExtractor.d.ts.map +0 -1
- package/dist/features/KeywordExtractor.js +0 -127
- package/dist/features/KeywordExtractor.js.map +0 -1
- package/dist/features/ObservationNormalizer.d.ts +0 -90
- package/dist/features/ObservationNormalizer.d.ts.map +0 -1
- package/dist/features/ObservationNormalizer.js +0 -194
- package/dist/features/ObservationNormalizer.js.map +0 -1
- package/dist/features/StreamingExporter.d.ts +0 -128
- package/dist/features/StreamingExporter.d.ts.map +0 -1
- package/dist/features/StreamingExporter.js +0 -212
- package/dist/features/StreamingExporter.js.map +0 -1
- package/dist/features/TagManager.d.ts +0 -147
- package/dist/features/TagManager.d.ts.map +0 -1
- package/dist/features/TagManager.js +0 -211
- package/dist/features/TagManager.js.map +0 -1
- package/dist/features/index.d.ts +0 -14
- package/dist/features/index.d.ts.map +0 -1
- package/dist/features/index.js +0 -15
- package/dist/features/index.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/search/BM25Search.d.ts +0 -148
- package/dist/search/BM25Search.d.ts.map +0 -1
- package/dist/search/BM25Search.js +0 -340
- package/dist/search/BM25Search.js.map +0 -1
- package/dist/search/BasicSearch.d.ts +0 -51
- package/dist/search/BasicSearch.d.ts.map +0 -1
- package/dist/search/BasicSearch.js +0 -138
- package/dist/search/BasicSearch.js.map +0 -1
- package/dist/search/BooleanSearch.d.ts +0 -98
- package/dist/search/BooleanSearch.d.ts.map +0 -1
- package/dist/search/BooleanSearch.js +0 -431
- package/dist/search/BooleanSearch.js.map +0 -1
- package/dist/search/EarlyTerminationManager.d.ts +0 -140
- package/dist/search/EarlyTerminationManager.d.ts.map +0 -1
- package/dist/search/EarlyTerminationManager.js +0 -280
- package/dist/search/EarlyTerminationManager.js.map +0 -1
- package/dist/search/EmbeddingCache.d.ts +0 -175
- package/dist/search/EmbeddingCache.d.ts.map +0 -1
- package/dist/search/EmbeddingCache.js +0 -247
- package/dist/search/EmbeddingCache.js.map +0 -1
- package/dist/search/EmbeddingService.d.ts +0 -277
- package/dist/search/EmbeddingService.d.ts.map +0 -1
- package/dist/search/EmbeddingService.js +0 -531
- package/dist/search/EmbeddingService.js.map +0 -1
- package/dist/search/FuzzySearch.d.ts +0 -118
- package/dist/search/FuzzySearch.d.ts.map +0 -1
- package/dist/search/FuzzySearch.js +0 -313
- package/dist/search/FuzzySearch.js.map +0 -1
- package/dist/search/HybridScorer.d.ts +0 -181
- package/dist/search/HybridScorer.d.ts.map +0 -1
- package/dist/search/HybridScorer.js +0 -258
- package/dist/search/HybridScorer.js.map +0 -1
- package/dist/search/HybridSearchManager.d.ts +0 -80
- package/dist/search/HybridSearchManager.d.ts.map +0 -1
- package/dist/search/HybridSearchManager.js +0 -188
- package/dist/search/HybridSearchManager.js.map +0 -1
- package/dist/search/IncrementalIndexer.d.ts +0 -201
- package/dist/search/IncrementalIndexer.d.ts.map +0 -1
- package/dist/search/IncrementalIndexer.js +0 -343
- package/dist/search/IncrementalIndexer.js.map +0 -1
- package/dist/search/OptimizedInvertedIndex.d.ts +0 -163
- package/dist/search/OptimizedInvertedIndex.d.ts.map +0 -1
- package/dist/search/OptimizedInvertedIndex.js +0 -359
- package/dist/search/OptimizedInvertedIndex.js.map +0 -1
- package/dist/search/ParallelSearchExecutor.d.ts +0 -172
- package/dist/search/ParallelSearchExecutor.d.ts.map +0 -1
- package/dist/search/ParallelSearchExecutor.js +0 -310
- package/dist/search/ParallelSearchExecutor.js.map +0 -1
- package/dist/search/QuantizedVectorStore.d.ts +0 -171
- package/dist/search/QuantizedVectorStore.d.ts.map +0 -1
- package/dist/search/QuantizedVectorStore.js +0 -308
- package/dist/search/QuantizedVectorStore.js.map +0 -1
- package/dist/search/QueryAnalyzer.d.ts +0 -76
- package/dist/search/QueryAnalyzer.d.ts.map +0 -1
- package/dist/search/QueryAnalyzer.js +0 -228
- package/dist/search/QueryAnalyzer.js.map +0 -1
- package/dist/search/QueryCostEstimator.d.ts +0 -244
- package/dist/search/QueryCostEstimator.d.ts.map +0 -1
- package/dist/search/QueryCostEstimator.js +0 -653
- package/dist/search/QueryCostEstimator.js.map +0 -1
- package/dist/search/QueryPlanCache.d.ts +0 -220
- package/dist/search/QueryPlanCache.d.ts.map +0 -1
- package/dist/search/QueryPlanCache.js +0 -380
- package/dist/search/QueryPlanCache.js.map +0 -1
- package/dist/search/QueryPlanner.d.ts +0 -58
- package/dist/search/QueryPlanner.d.ts.map +0 -1
- package/dist/search/QueryPlanner.js +0 -138
- package/dist/search/QueryPlanner.js.map +0 -1
- package/dist/search/RankedSearch.d.ts +0 -71
- package/dist/search/RankedSearch.d.ts.map +0 -1
- package/dist/search/RankedSearch.js +0 -239
- package/dist/search/RankedSearch.js.map +0 -1
- package/dist/search/ReflectionManager.d.ts +0 -120
- package/dist/search/ReflectionManager.d.ts.map +0 -1
- package/dist/search/ReflectionManager.js +0 -232
- package/dist/search/ReflectionManager.js.map +0 -1
- package/dist/search/SavedSearchManager.d.ts +0 -79
- package/dist/search/SavedSearchManager.d.ts.map +0 -1
- package/dist/search/SavedSearchManager.js +0 -147
- package/dist/search/SavedSearchManager.js.map +0 -1
- package/dist/search/SearchFilterChain.d.ts +0 -120
- package/dist/search/SearchFilterChain.d.ts.map +0 -1
- package/dist/search/SearchFilterChain.js +0 -186
- package/dist/search/SearchFilterChain.js.map +0 -1
- package/dist/search/SearchManager.d.ts +0 -326
- package/dist/search/SearchManager.d.ts.map +0 -1
- package/dist/search/SearchManager.js +0 -454
- package/dist/search/SearchManager.js.map +0 -1
- package/dist/search/SearchSuggestions.d.ts +0 -27
- package/dist/search/SearchSuggestions.d.ts.map +0 -1
- package/dist/search/SearchSuggestions.js +0 -58
- package/dist/search/SearchSuggestions.js.map +0 -1
- package/dist/search/SemanticSearch.d.ts +0 -149
- package/dist/search/SemanticSearch.d.ts.map +0 -1
- package/dist/search/SemanticSearch.js +0 -324
- package/dist/search/SemanticSearch.js.map +0 -1
- package/dist/search/SymbolicSearch.d.ts +0 -61
- package/dist/search/SymbolicSearch.d.ts.map +0 -1
- package/dist/search/SymbolicSearch.js +0 -164
- package/dist/search/SymbolicSearch.js.map +0 -1
- package/dist/search/TFIDFEventSync.d.ts +0 -85
- package/dist/search/TFIDFEventSync.d.ts.map +0 -1
- package/dist/search/TFIDFEventSync.js +0 -134
- package/dist/search/TFIDFEventSync.js.map +0 -1
- package/dist/search/TFIDFIndexManager.d.ts +0 -151
- package/dist/search/TFIDFIndexManager.d.ts.map +0 -1
- package/dist/search/TFIDFIndexManager.js +0 -433
- package/dist/search/TFIDFIndexManager.js.map +0 -1
- package/dist/search/VectorStore.d.ts +0 -235
- package/dist/search/VectorStore.d.ts.map +0 -1
- package/dist/search/VectorStore.js +0 -312
- package/dist/search/VectorStore.js.map +0 -1
- package/dist/search/index.d.ts +0 -35
- package/dist/search/index.d.ts.map +0 -1
- package/dist/search/index.js +0 -53
- package/dist/search/index.js.map +0 -1
- package/dist/types/index.d.ts +0 -13
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -13
- package/dist/types/index.js.map +0 -1
- package/dist/types/types.d.ts +0 -1811
- package/dist/types/types.d.ts.map +0 -1
- package/dist/types/types.js +0 -10
- package/dist/types/types.js.map +0 -1
- package/dist/utils/BatchProcessor.d.ts +0 -271
- package/dist/utils/BatchProcessor.d.ts.map +0 -1
- package/dist/utils/BatchProcessor.js +0 -377
- package/dist/utils/BatchProcessor.js.map +0 -1
- package/dist/utils/MemoryMonitor.d.ts +0 -176
- package/dist/utils/MemoryMonitor.d.ts.map +0 -1
- package/dist/utils/MemoryMonitor.js +0 -306
- package/dist/utils/MemoryMonitor.js.map +0 -1
- package/dist/utils/WorkerPoolManager.d.ts +0 -233
- package/dist/utils/WorkerPoolManager.d.ts.map +0 -1
- package/dist/utils/WorkerPoolManager.js +0 -421
- package/dist/utils/WorkerPoolManager.js.map +0 -1
- package/dist/utils/compressedCache.d.ts +0 -221
- package/dist/utils/compressedCache.d.ts.map +0 -1
- package/dist/utils/compressedCache.js +0 -349
- package/dist/utils/compressedCache.js.map +0 -1
- package/dist/utils/compressionUtil.d.ts +0 -214
- package/dist/utils/compressionUtil.d.ts.map +0 -1
- package/dist/utils/compressionUtil.js +0 -248
- package/dist/utils/compressionUtil.js.map +0 -1
- package/dist/utils/constants.d.ts +0 -245
- package/dist/utils/constants.d.ts.map +0 -1
- package/dist/utils/constants.js +0 -253
- package/dist/utils/constants.js.map +0 -1
- package/dist/utils/entityUtils.d.ts +0 -379
- package/dist/utils/entityUtils.d.ts.map +0 -1
- package/dist/utils/entityUtils.js +0 -649
- package/dist/utils/entityUtils.js.map +0 -1
- package/dist/utils/errors.d.ts +0 -95
- package/dist/utils/errors.d.ts.map +0 -1
- package/dist/utils/errors.js +0 -146
- package/dist/utils/errors.js.map +0 -1
- package/dist/utils/formatters.d.ts +0 -145
- package/dist/utils/formatters.d.ts.map +0 -1
- package/dist/utils/formatters.js +0 -133
- package/dist/utils/formatters.js.map +0 -1
- package/dist/utils/index.d.ts +0 -26
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -88
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/indexes.d.ts +0 -270
- package/dist/utils/indexes.d.ts.map +0 -1
- package/dist/utils/indexes.js +0 -527
- package/dist/utils/indexes.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -31
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -41
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/operationUtils.d.ts +0 -124
- package/dist/utils/operationUtils.d.ts.map +0 -1
- package/dist/utils/operationUtils.js +0 -176
- package/dist/utils/operationUtils.js.map +0 -1
- package/dist/utils/parallelUtils.d.ts +0 -76
- package/dist/utils/parallelUtils.d.ts.map +0 -1
- package/dist/utils/parallelUtils.js +0 -192
- package/dist/utils/parallelUtils.js.map +0 -1
- package/dist/utils/schemas.d.ts +0 -556
- package/dist/utils/schemas.d.ts.map +0 -1
- package/dist/utils/schemas.js +0 -485
- package/dist/utils/schemas.js.map +0 -1
- package/dist/utils/searchAlgorithms.d.ts +0 -99
- package/dist/utils/searchAlgorithms.d.ts.map +0 -1
- package/dist/utils/searchAlgorithms.js +0 -168
- package/dist/utils/searchAlgorithms.js.map +0 -1
- package/dist/utils/searchCache.d.ts +0 -108
- package/dist/utils/searchCache.d.ts.map +0 -1
- package/dist/utils/searchCache.js +0 -210
- package/dist/utils/searchCache.js.map +0 -1
- package/dist/utils/taskScheduler.d.ts +0 -294
- package/dist/utils/taskScheduler.d.ts.map +0 -1
- package/dist/utils/taskScheduler.js +0 -487
- package/dist/utils/taskScheduler.js.map +0 -1
- package/dist/workers/index.d.ts +0 -12
- package/dist/workers/index.d.ts.map +0 -1
- package/dist/workers/index.js +0 -10
- package/dist/workers/index.js.map +0 -1
- package/dist/workers/levenshteinWorker.d.ts +0 -60
- package/dist/workers/levenshteinWorker.d.ts.map +0 -1
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Optimized Inverted Index
|
|
3
|
-
*
|
|
4
|
-
* Memory-efficient inverted index using integer IDs and Uint32Array
|
|
5
|
-
* for fast multi-term intersection queries.
|
|
6
|
-
*
|
|
7
|
-
* Phase 12 Sprint 3: Search Algorithm Optimization
|
|
8
|
-
*
|
|
9
|
-
* @module search/OptimizedInvertedIndex
|
|
10
|
-
*/
|
|
11
|
-
/**
|
|
12
|
-
* Statistics about memory usage.
|
|
13
|
-
*/
|
|
14
|
-
export interface IndexMemoryUsage {
|
|
15
|
-
/** Total bytes used by posting lists */
|
|
16
|
-
postingListBytes: number;
|
|
17
|
-
/** Total bytes used by ID map */
|
|
18
|
-
idMapBytes: number;
|
|
19
|
-
/** Total bytes used by term index */
|
|
20
|
-
termIndexBytes: number;
|
|
21
|
-
/** Total estimated memory usage in bytes */
|
|
22
|
-
totalBytes: number;
|
|
23
|
-
/** Number of unique terms */
|
|
24
|
-
termCount: number;
|
|
25
|
-
/** Number of documents indexed */
|
|
26
|
-
documentCount: number;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Result from a posting list lookup.
|
|
30
|
-
*/
|
|
31
|
-
export interface PostingListResult {
|
|
32
|
-
/** Term that was looked up */
|
|
33
|
-
term: string;
|
|
34
|
-
/** Document IDs containing the term (sorted) */
|
|
35
|
-
docIds: Uint32Array;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Optimized Inverted Index using integer document IDs.
|
|
39
|
-
*
|
|
40
|
-
* Memory Optimizations:
|
|
41
|
-
* 1. Uses integer IDs instead of string entity names
|
|
42
|
-
* 2. Stores posting lists as Uint32Array (4 bytes per ID vs ~20+ bytes per string)
|
|
43
|
-
* 3. Maintains sorted posting lists for efficient intersection
|
|
44
|
-
*
|
|
45
|
-
* Performance Optimizations:
|
|
46
|
-
* 1. Sorted array intersection is O(n+m) where n,m are posting list lengths
|
|
47
|
-
* 2. Early termination when one list is exhausted
|
|
48
|
-
* 3. Binary search available for unbalanced list sizes
|
|
49
|
-
*
|
|
50
|
-
* @example
|
|
51
|
-
* ```typescript
|
|
52
|
-
* const index = new OptimizedInvertedIndex();
|
|
53
|
-
* index.addDocument('entity1', ['machine', 'learning', 'ai']);
|
|
54
|
-
* index.addDocument('entity2', ['deep', 'learning', 'neural']);
|
|
55
|
-
*
|
|
56
|
-
* // Find documents containing both 'machine' AND 'learning'
|
|
57
|
-
* const results = index.intersect(['machine', 'learning']);
|
|
58
|
-
* console.log(results); // ['entity1']
|
|
59
|
-
* ```
|
|
60
|
-
*/
|
|
61
|
-
export declare class OptimizedInvertedIndex {
|
|
62
|
-
/** Map from entity name to integer ID */
|
|
63
|
-
private entityToId;
|
|
64
|
-
/** Map from integer ID to entity name */
|
|
65
|
-
private idToEntity;
|
|
66
|
-
/** Next available ID */
|
|
67
|
-
private nextId;
|
|
68
|
-
/** Inverted index: term -> sorted array of document IDs */
|
|
69
|
-
private postingLists;
|
|
70
|
-
/** Temporary posting lists (before finalization) */
|
|
71
|
-
private tempPostingLists;
|
|
72
|
-
/** Whether the index is finalized (posting lists converted to Uint32Array) */
|
|
73
|
-
private finalized;
|
|
74
|
-
/**
|
|
75
|
-
* Add a document to the index.
|
|
76
|
-
*
|
|
77
|
-
* @param entityName - Unique document identifier
|
|
78
|
-
* @param terms - Array of terms in the document (should be lowercase)
|
|
79
|
-
*/
|
|
80
|
-
addDocument(entityName: string, terms: string[]): void;
|
|
81
|
-
/**
|
|
82
|
-
* Remove a document from the index.
|
|
83
|
-
*
|
|
84
|
-
* @param entityName - Document to remove
|
|
85
|
-
* @returns True if document was found and removed
|
|
86
|
-
*/
|
|
87
|
-
removeDocument(entityName: string): boolean;
|
|
88
|
-
/**
|
|
89
|
-
* Finalize the index by converting posting lists to Uint32Array.
|
|
90
|
-
*
|
|
91
|
-
* This should be called after bulk indexing for optimal memory usage.
|
|
92
|
-
* The index can still be updated after finalization, but it will
|
|
93
|
-
* temporarily use more memory during updates.
|
|
94
|
-
*/
|
|
95
|
-
finalize(): void;
|
|
96
|
-
/**
|
|
97
|
-
* Convert finalized index back to mutable format.
|
|
98
|
-
*/
|
|
99
|
-
private unfinalize;
|
|
100
|
-
/**
|
|
101
|
-
* Get posting list for a term.
|
|
102
|
-
*
|
|
103
|
-
* @param term - Term to look up
|
|
104
|
-
* @returns Posting list result or null if term not found
|
|
105
|
-
*/
|
|
106
|
-
getPostingList(term: string): PostingListResult | null;
|
|
107
|
-
/**
|
|
108
|
-
* Perform intersection of posting lists for multiple terms.
|
|
109
|
-
*
|
|
110
|
-
* Returns entity names that contain ALL specified terms.
|
|
111
|
-
*
|
|
112
|
-
* @param terms - Array of terms to intersect
|
|
113
|
-
* @returns Array of entity names containing all terms
|
|
114
|
-
*/
|
|
115
|
-
intersect(terms: string[]): string[];
|
|
116
|
-
/**
|
|
117
|
-
* Perform union of posting lists for multiple terms.
|
|
118
|
-
*
|
|
119
|
-
* Returns entity names that contain ANY of the specified terms.
|
|
120
|
-
*
|
|
121
|
-
* @param terms - Array of terms to union
|
|
122
|
-
* @returns Array of entity names containing any term
|
|
123
|
-
*/
|
|
124
|
-
union(terms: string[]): string[];
|
|
125
|
-
/**
|
|
126
|
-
* Get entities containing a single term.
|
|
127
|
-
*
|
|
128
|
-
* @param term - Term to search for
|
|
129
|
-
* @returns Array of entity names containing the term
|
|
130
|
-
*/
|
|
131
|
-
search(term: string): string[];
|
|
132
|
-
/**
|
|
133
|
-
* Intersect two sorted Uint32Arrays.
|
|
134
|
-
*
|
|
135
|
-
* Uses merge-style intersection which is O(n+m).
|
|
136
|
-
*/
|
|
137
|
-
private intersectTwo;
|
|
138
|
-
/**
|
|
139
|
-
* Get memory usage statistics.
|
|
140
|
-
*/
|
|
141
|
-
getMemoryUsage(): IndexMemoryUsage;
|
|
142
|
-
/**
|
|
143
|
-
* Clear the entire index.
|
|
144
|
-
*/
|
|
145
|
-
clear(): void;
|
|
146
|
-
/**
|
|
147
|
-
* Get the number of documents in the index.
|
|
148
|
-
*/
|
|
149
|
-
get documentCount(): number;
|
|
150
|
-
/**
|
|
151
|
-
* Get the number of unique terms in the index.
|
|
152
|
-
*/
|
|
153
|
-
get termCount(): number;
|
|
154
|
-
/**
|
|
155
|
-
* Check if an entity is indexed.
|
|
156
|
-
*/
|
|
157
|
-
hasDocument(entityName: string): boolean;
|
|
158
|
-
/**
|
|
159
|
-
* Check if a term exists in the index.
|
|
160
|
-
*/
|
|
161
|
-
hasTerm(term: string): boolean;
|
|
162
|
-
}
|
|
163
|
-
//# sourceMappingURL=OptimizedInvertedIndex.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OptimizedInvertedIndex.d.ts","sourceRoot":"","sources":["../../src/search/OptimizedInvertedIndex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,gBAAgB,EAAE,MAAM,CAAC;IACzB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,4CAA4C;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,MAAM,EAAE,WAAW,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,sBAAsB;IACjC,yCAAyC;IACzC,OAAO,CAAC,UAAU,CAAkC;IAEpD,yCAAyC;IACzC,OAAO,CAAC,UAAU,CAAkC;IAEpD,wBAAwB;IACxB,OAAO,CAAC,MAAM,CAAa;IAE3B,2DAA2D;IAC3D,OAAO,CAAC,YAAY,CAAuC;IAE3D,oDAAoD;IACpD,OAAO,CAAC,gBAAgB,CAAoC;IAE5D,8EAA8E;IAC9E,OAAO,CAAC,SAAS,CAAkB;IAEnC;;;;;OAKG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAiCtD;;;;;OAKG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IA6B3C;;;;;;OAMG;IACH,QAAQ,IAAI,IAAI;IAiBhB;;OAEG;IACH,OAAO,CAAC,UAAU;IAalB;;;;;OAKG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IActD;;;;;;;OAOG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAqCpC;;;;;;;OAOG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAyBhC;;;;;OAKG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAY9B;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAoBpB;;OAEG;IACH,cAAc,IAAI,gBAAgB;IAwClC;;OAEG;IACH,KAAK,IAAI,IAAI;IASb;;OAEG;IACH,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,MAAM,CAItB;IAED;;OAEG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAIxC;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAK/B"}
|
|
@@ -1,359 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Optimized Inverted Index
|
|
3
|
-
*
|
|
4
|
-
* Memory-efficient inverted index using integer IDs and Uint32Array
|
|
5
|
-
* for fast multi-term intersection queries.
|
|
6
|
-
*
|
|
7
|
-
* Phase 12 Sprint 3: Search Algorithm Optimization
|
|
8
|
-
*
|
|
9
|
-
* @module search/OptimizedInvertedIndex
|
|
10
|
-
*/
|
|
11
|
-
/**
|
|
12
|
-
* Optimized Inverted Index using integer document IDs.
|
|
13
|
-
*
|
|
14
|
-
* Memory Optimizations:
|
|
15
|
-
* 1. Uses integer IDs instead of string entity names
|
|
16
|
-
* 2. Stores posting lists as Uint32Array (4 bytes per ID vs ~20+ bytes per string)
|
|
17
|
-
* 3. Maintains sorted posting lists for efficient intersection
|
|
18
|
-
*
|
|
19
|
-
* Performance Optimizations:
|
|
20
|
-
* 1. Sorted array intersection is O(n+m) where n,m are posting list lengths
|
|
21
|
-
* 2. Early termination when one list is exhausted
|
|
22
|
-
* 3. Binary search available for unbalanced list sizes
|
|
23
|
-
*
|
|
24
|
-
* @example
|
|
25
|
-
* ```typescript
|
|
26
|
-
* const index = new OptimizedInvertedIndex();
|
|
27
|
-
* index.addDocument('entity1', ['machine', 'learning', 'ai']);
|
|
28
|
-
* index.addDocument('entity2', ['deep', 'learning', 'neural']);
|
|
29
|
-
*
|
|
30
|
-
* // Find documents containing both 'machine' AND 'learning'
|
|
31
|
-
* const results = index.intersect(['machine', 'learning']);
|
|
32
|
-
* console.log(results); // ['entity1']
|
|
33
|
-
* ```
|
|
34
|
-
*/
|
|
35
|
-
export class OptimizedInvertedIndex {
|
|
36
|
-
/** Map from entity name to integer ID */
|
|
37
|
-
entityToId = new Map();
|
|
38
|
-
/** Map from integer ID to entity name */
|
|
39
|
-
idToEntity = new Map();
|
|
40
|
-
/** Next available ID */
|
|
41
|
-
nextId = 0;
|
|
42
|
-
/** Inverted index: term -> sorted array of document IDs */
|
|
43
|
-
postingLists = new Map();
|
|
44
|
-
/** Temporary posting lists (before finalization) */
|
|
45
|
-
tempPostingLists = new Map();
|
|
46
|
-
/** Whether the index is finalized (posting lists converted to Uint32Array) */
|
|
47
|
-
finalized = false;
|
|
48
|
-
/**
|
|
49
|
-
* Add a document to the index.
|
|
50
|
-
*
|
|
51
|
-
* @param entityName - Unique document identifier
|
|
52
|
-
* @param terms - Array of terms in the document (should be lowercase)
|
|
53
|
-
*/
|
|
54
|
-
addDocument(entityName, terms) {
|
|
55
|
-
// Unfinalize if already finalized (allows incremental updates)
|
|
56
|
-
if (this.finalized) {
|
|
57
|
-
this.unfinalize();
|
|
58
|
-
}
|
|
59
|
-
// Get or assign document ID
|
|
60
|
-
let docId = this.entityToId.get(entityName);
|
|
61
|
-
if (docId === undefined) {
|
|
62
|
-
docId = this.nextId++;
|
|
63
|
-
this.entityToId.set(entityName, docId);
|
|
64
|
-
this.idToEntity.set(docId, entityName);
|
|
65
|
-
}
|
|
66
|
-
// Add unique terms to posting lists
|
|
67
|
-
const seenTerms = new Set();
|
|
68
|
-
for (const term of terms) {
|
|
69
|
-
if (seenTerms.has(term))
|
|
70
|
-
continue;
|
|
71
|
-
seenTerms.add(term);
|
|
72
|
-
let postingList = this.tempPostingLists.get(term);
|
|
73
|
-
if (!postingList) {
|
|
74
|
-
postingList = [];
|
|
75
|
-
this.tempPostingLists.set(term, postingList);
|
|
76
|
-
}
|
|
77
|
-
// Only add if not already present (maintains sorted order if added in order)
|
|
78
|
-
if (postingList.length === 0 || postingList[postingList.length - 1] !== docId) {
|
|
79
|
-
postingList.push(docId);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Remove a document from the index.
|
|
85
|
-
*
|
|
86
|
-
* @param entityName - Document to remove
|
|
87
|
-
* @returns True if document was found and removed
|
|
88
|
-
*/
|
|
89
|
-
removeDocument(entityName) {
|
|
90
|
-
const docId = this.entityToId.get(entityName);
|
|
91
|
-
if (docId === undefined) {
|
|
92
|
-
return false;
|
|
93
|
-
}
|
|
94
|
-
// Unfinalize if needed
|
|
95
|
-
if (this.finalized) {
|
|
96
|
-
this.unfinalize();
|
|
97
|
-
}
|
|
98
|
-
// Remove from all posting lists
|
|
99
|
-
for (const [term, postingList] of this.tempPostingLists) {
|
|
100
|
-
const idx = postingList.indexOf(docId);
|
|
101
|
-
if (idx !== -1) {
|
|
102
|
-
postingList.splice(idx, 1);
|
|
103
|
-
if (postingList.length === 0) {
|
|
104
|
-
this.tempPostingLists.delete(term);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
// Remove ID mappings
|
|
109
|
-
this.entityToId.delete(entityName);
|
|
110
|
-
this.idToEntity.delete(docId);
|
|
111
|
-
return true;
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Finalize the index by converting posting lists to Uint32Array.
|
|
115
|
-
*
|
|
116
|
-
* This should be called after bulk indexing for optimal memory usage.
|
|
117
|
-
* The index can still be updated after finalization, but it will
|
|
118
|
-
* temporarily use more memory during updates.
|
|
119
|
-
*/
|
|
120
|
-
finalize() {
|
|
121
|
-
if (this.finalized)
|
|
122
|
-
return;
|
|
123
|
-
// Convert temp posting lists to Uint32Array and sort
|
|
124
|
-
this.postingLists.clear();
|
|
125
|
-
for (const [term, list] of this.tempPostingLists) {
|
|
126
|
-
// Sort and convert to Uint32Array
|
|
127
|
-
list.sort((a, b) => a - b);
|
|
128
|
-
const arr = new Uint32Array(list);
|
|
129
|
-
this.postingLists.set(term, arr);
|
|
130
|
-
}
|
|
131
|
-
// Clear temp posting lists to save memory
|
|
132
|
-
this.tempPostingLists.clear();
|
|
133
|
-
this.finalized = true;
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Convert finalized index back to mutable format.
|
|
137
|
-
*/
|
|
138
|
-
unfinalize() {
|
|
139
|
-
if (!this.finalized)
|
|
140
|
-
return;
|
|
141
|
-
// Convert Uint32Array back to regular arrays
|
|
142
|
-
this.tempPostingLists.clear();
|
|
143
|
-
for (const [term, arr] of this.postingLists) {
|
|
144
|
-
this.tempPostingLists.set(term, Array.from(arr));
|
|
145
|
-
}
|
|
146
|
-
this.postingLists.clear();
|
|
147
|
-
this.finalized = false;
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Get posting list for a term.
|
|
151
|
-
*
|
|
152
|
-
* @param term - Term to look up
|
|
153
|
-
* @returns Posting list result or null if term not found
|
|
154
|
-
*/
|
|
155
|
-
getPostingList(term) {
|
|
156
|
-
if (this.finalized) {
|
|
157
|
-
const arr = this.postingLists.get(term);
|
|
158
|
-
if (!arr)
|
|
159
|
-
return null;
|
|
160
|
-
return { term, docIds: arr };
|
|
161
|
-
}
|
|
162
|
-
else {
|
|
163
|
-
const list = this.tempPostingLists.get(term);
|
|
164
|
-
if (!list)
|
|
165
|
-
return null;
|
|
166
|
-
// Sort and return as Uint32Array
|
|
167
|
-
const sorted = list.slice().sort((a, b) => a - b);
|
|
168
|
-
return { term, docIds: new Uint32Array(sorted) };
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
/**
|
|
172
|
-
* Perform intersection of posting lists for multiple terms.
|
|
173
|
-
*
|
|
174
|
-
* Returns entity names that contain ALL specified terms.
|
|
175
|
-
*
|
|
176
|
-
* @param terms - Array of terms to intersect
|
|
177
|
-
* @returns Array of entity names containing all terms
|
|
178
|
-
*/
|
|
179
|
-
intersect(terms) {
|
|
180
|
-
if (terms.length === 0) {
|
|
181
|
-
return [];
|
|
182
|
-
}
|
|
183
|
-
// Ensure finalized for optimal performance
|
|
184
|
-
if (!this.finalized) {
|
|
185
|
-
this.finalize();
|
|
186
|
-
}
|
|
187
|
-
// Get posting lists for all terms
|
|
188
|
-
const postingLists = [];
|
|
189
|
-
for (const term of terms) {
|
|
190
|
-
const list = this.postingLists.get(term);
|
|
191
|
-
if (!list || list.length === 0) {
|
|
192
|
-
// If any term has no posting list, intersection is empty
|
|
193
|
-
return [];
|
|
194
|
-
}
|
|
195
|
-
postingLists.push(list);
|
|
196
|
-
}
|
|
197
|
-
// Sort by length (smallest first for early termination)
|
|
198
|
-
postingLists.sort((a, b) => a.length - b.length);
|
|
199
|
-
// Perform multi-way sorted intersection
|
|
200
|
-
let result = postingLists[0];
|
|
201
|
-
for (let i = 1; i < postingLists.length; i++) {
|
|
202
|
-
result = this.intersectTwo(result, postingLists[i]);
|
|
203
|
-
if (result.length === 0) {
|
|
204
|
-
return [];
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
// Convert IDs back to entity names
|
|
208
|
-
return Array.from(result).map(id => this.idToEntity.get(id));
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* Perform union of posting lists for multiple terms.
|
|
212
|
-
*
|
|
213
|
-
* Returns entity names that contain ANY of the specified terms.
|
|
214
|
-
*
|
|
215
|
-
* @param terms - Array of terms to union
|
|
216
|
-
* @returns Array of entity names containing any term
|
|
217
|
-
*/
|
|
218
|
-
union(terms) {
|
|
219
|
-
if (terms.length === 0) {
|
|
220
|
-
return [];
|
|
221
|
-
}
|
|
222
|
-
// Ensure finalized for optimal performance
|
|
223
|
-
if (!this.finalized) {
|
|
224
|
-
this.finalize();
|
|
225
|
-
}
|
|
226
|
-
// Collect all unique document IDs
|
|
227
|
-
const allIds = new Set();
|
|
228
|
-
for (const term of terms) {
|
|
229
|
-
const list = this.postingLists.get(term);
|
|
230
|
-
if (list) {
|
|
231
|
-
for (const id of list) {
|
|
232
|
-
allIds.add(id);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
// Convert IDs back to entity names
|
|
237
|
-
return Array.from(allIds).map(id => this.idToEntity.get(id));
|
|
238
|
-
}
|
|
239
|
-
/**
|
|
240
|
-
* Get entities containing a single term.
|
|
241
|
-
*
|
|
242
|
-
* @param term - Term to search for
|
|
243
|
-
* @returns Array of entity names containing the term
|
|
244
|
-
*/
|
|
245
|
-
search(term) {
|
|
246
|
-
if (!this.finalized) {
|
|
247
|
-
const list = this.tempPostingLists.get(term);
|
|
248
|
-
if (!list)
|
|
249
|
-
return [];
|
|
250
|
-
return list.map(id => this.idToEntity.get(id));
|
|
251
|
-
}
|
|
252
|
-
const list = this.postingLists.get(term);
|
|
253
|
-
if (!list)
|
|
254
|
-
return [];
|
|
255
|
-
return Array.from(list).map(id => this.idToEntity.get(id));
|
|
256
|
-
}
|
|
257
|
-
/**
|
|
258
|
-
* Intersect two sorted Uint32Arrays.
|
|
259
|
-
*
|
|
260
|
-
* Uses merge-style intersection which is O(n+m).
|
|
261
|
-
*/
|
|
262
|
-
intersectTwo(a, b) {
|
|
263
|
-
const result = [];
|
|
264
|
-
let i = 0;
|
|
265
|
-
let j = 0;
|
|
266
|
-
while (i < a.length && j < b.length) {
|
|
267
|
-
if (a[i] === b[j]) {
|
|
268
|
-
result.push(a[i]);
|
|
269
|
-
i++;
|
|
270
|
-
j++;
|
|
271
|
-
}
|
|
272
|
-
else if (a[i] < b[j]) {
|
|
273
|
-
i++;
|
|
274
|
-
}
|
|
275
|
-
else {
|
|
276
|
-
j++;
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
return new Uint32Array(result);
|
|
280
|
-
}
|
|
281
|
-
/**
|
|
282
|
-
* Get memory usage statistics.
|
|
283
|
-
*/
|
|
284
|
-
getMemoryUsage() {
|
|
285
|
-
let postingListBytes = 0;
|
|
286
|
-
let termCount = 0;
|
|
287
|
-
if (this.finalized) {
|
|
288
|
-
for (const arr of this.postingLists.values()) {
|
|
289
|
-
// Uint32Array uses 4 bytes per element
|
|
290
|
-
postingListBytes += arr.byteLength;
|
|
291
|
-
termCount++;
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
else {
|
|
295
|
-
for (const list of this.tempPostingLists.values()) {
|
|
296
|
-
// Regular array uses 8 bytes per element (64-bit numbers in V8)
|
|
297
|
-
// Plus array overhead
|
|
298
|
-
postingListBytes += list.length * 8 + 32; // Approximate overhead
|
|
299
|
-
termCount++;
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
// Estimate ID map overhead
|
|
303
|
-
// Map has ~100 bytes overhead + ~50 bytes per entry for string keys
|
|
304
|
-
const idMapBytes = 100 +
|
|
305
|
-
this.entityToId.size * 50 +
|
|
306
|
-
this.idToEntity.size * 8; // number key is ~8 bytes
|
|
307
|
-
// Estimate term index overhead
|
|
308
|
-
// ~50 bytes per term entry (key + pointer)
|
|
309
|
-
const termIndexBytes = termCount * 50;
|
|
310
|
-
return {
|
|
311
|
-
postingListBytes,
|
|
312
|
-
idMapBytes,
|
|
313
|
-
termIndexBytes,
|
|
314
|
-
totalBytes: postingListBytes + idMapBytes + termIndexBytes,
|
|
315
|
-
termCount,
|
|
316
|
-
documentCount: this.entityToId.size,
|
|
317
|
-
};
|
|
318
|
-
}
|
|
319
|
-
/**
|
|
320
|
-
* Clear the entire index.
|
|
321
|
-
*/
|
|
322
|
-
clear() {
|
|
323
|
-
this.entityToId.clear();
|
|
324
|
-
this.idToEntity.clear();
|
|
325
|
-
this.postingLists.clear();
|
|
326
|
-
this.tempPostingLists.clear();
|
|
327
|
-
this.nextId = 0;
|
|
328
|
-
this.finalized = false;
|
|
329
|
-
}
|
|
330
|
-
/**
|
|
331
|
-
* Get the number of documents in the index.
|
|
332
|
-
*/
|
|
333
|
-
get documentCount() {
|
|
334
|
-
return this.entityToId.size;
|
|
335
|
-
}
|
|
336
|
-
/**
|
|
337
|
-
* Get the number of unique terms in the index.
|
|
338
|
-
*/
|
|
339
|
-
get termCount() {
|
|
340
|
-
return this.finalized
|
|
341
|
-
? this.postingLists.size
|
|
342
|
-
: this.tempPostingLists.size;
|
|
343
|
-
}
|
|
344
|
-
/**
|
|
345
|
-
* Check if an entity is indexed.
|
|
346
|
-
*/
|
|
347
|
-
hasDocument(entityName) {
|
|
348
|
-
return this.entityToId.has(entityName);
|
|
349
|
-
}
|
|
350
|
-
/**
|
|
351
|
-
* Check if a term exists in the index.
|
|
352
|
-
*/
|
|
353
|
-
hasTerm(term) {
|
|
354
|
-
return this.finalized
|
|
355
|
-
? this.postingLists.has(term)
|
|
356
|
-
: this.tempPostingLists.has(term);
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
//# sourceMappingURL=OptimizedInvertedIndex.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OptimizedInvertedIndex.js","sourceRoot":"","sources":["../../src/search/OptimizedInvertedIndex.ts"],"names":[],"mappings":"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"}
|