@danielsimonjr/memoryjs 1.0.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 (295) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +266 -0
  3. package/dist/core/EntityManager.d.ts +268 -0
  4. package/dist/core/EntityManager.d.ts.map +1 -0
  5. package/dist/core/EntityManager.js +512 -0
  6. package/dist/core/EntityManager.js.map +1 -0
  7. package/dist/core/GraphEventEmitter.d.ts +202 -0
  8. package/dist/core/GraphEventEmitter.d.ts.map +1 -0
  9. package/dist/core/GraphEventEmitter.js +347 -0
  10. package/dist/core/GraphEventEmitter.js.map +1 -0
  11. package/dist/core/GraphStorage.d.ts +395 -0
  12. package/dist/core/GraphStorage.d.ts.map +1 -0
  13. package/dist/core/GraphStorage.js +786 -0
  14. package/dist/core/GraphStorage.js.map +1 -0
  15. package/dist/core/GraphTraversal.d.ts +141 -0
  16. package/dist/core/GraphTraversal.d.ts.map +1 -0
  17. package/dist/core/GraphTraversal.js +574 -0
  18. package/dist/core/GraphTraversal.js.map +1 -0
  19. package/dist/core/HierarchyManager.d.ts +111 -0
  20. package/dist/core/HierarchyManager.d.ts.map +1 -0
  21. package/dist/core/HierarchyManager.js +225 -0
  22. package/dist/core/HierarchyManager.js.map +1 -0
  23. package/dist/core/ManagerContext.d.ts +76 -0
  24. package/dist/core/ManagerContext.d.ts.map +1 -0
  25. package/dist/core/ManagerContext.js +129 -0
  26. package/dist/core/ManagerContext.js.map +1 -0
  27. package/dist/core/ObservationManager.d.ts +85 -0
  28. package/dist/core/ObservationManager.d.ts.map +1 -0
  29. package/dist/core/ObservationManager.js +124 -0
  30. package/dist/core/ObservationManager.js.map +1 -0
  31. package/dist/core/RelationManager.d.ts +131 -0
  32. package/dist/core/RelationManager.d.ts.map +1 -0
  33. package/dist/core/RelationManager.js +212 -0
  34. package/dist/core/RelationManager.js.map +1 -0
  35. package/dist/core/SQLiteStorage.d.ts +354 -0
  36. package/dist/core/SQLiteStorage.d.ts.map +1 -0
  37. package/dist/core/SQLiteStorage.js +919 -0
  38. package/dist/core/SQLiteStorage.js.map +1 -0
  39. package/dist/core/StorageFactory.d.ts +45 -0
  40. package/dist/core/StorageFactory.d.ts.map +1 -0
  41. package/dist/core/StorageFactory.js +65 -0
  42. package/dist/core/StorageFactory.js.map +1 -0
  43. package/dist/core/TransactionManager.d.ts +464 -0
  44. package/dist/core/TransactionManager.d.ts.map +1 -0
  45. package/dist/core/TransactionManager.js +869 -0
  46. package/dist/core/TransactionManager.js.map +1 -0
  47. package/dist/core/index.d.ts +17 -0
  48. package/dist/core/index.d.ts.map +1 -0
  49. package/dist/core/index.js +20 -0
  50. package/dist/core/index.js.map +1 -0
  51. package/dist/features/AnalyticsManager.d.ts +44 -0
  52. package/dist/features/AnalyticsManager.d.ts.map +1 -0
  53. package/dist/features/AnalyticsManager.js +224 -0
  54. package/dist/features/AnalyticsManager.js.map +1 -0
  55. package/dist/features/ArchiveManager.d.ts +133 -0
  56. package/dist/features/ArchiveManager.d.ts.map +1 -0
  57. package/dist/features/ArchiveManager.js +282 -0
  58. package/dist/features/ArchiveManager.js.map +1 -0
  59. package/dist/features/CompressionManager.d.ts +119 -0
  60. package/dist/features/CompressionManager.d.ts.map +1 -0
  61. package/dist/features/CompressionManager.js +470 -0
  62. package/dist/features/CompressionManager.js.map +1 -0
  63. package/dist/features/IOManager.d.ts +225 -0
  64. package/dist/features/IOManager.d.ts.map +1 -0
  65. package/dist/features/IOManager.js +1093 -0
  66. package/dist/features/IOManager.js.map +1 -0
  67. package/dist/features/KeywordExtractor.d.ts +61 -0
  68. package/dist/features/KeywordExtractor.d.ts.map +1 -0
  69. package/dist/features/KeywordExtractor.js +127 -0
  70. package/dist/features/KeywordExtractor.js.map +1 -0
  71. package/dist/features/ObservationNormalizer.d.ts +90 -0
  72. package/dist/features/ObservationNormalizer.d.ts.map +1 -0
  73. package/dist/features/ObservationNormalizer.js +194 -0
  74. package/dist/features/ObservationNormalizer.js.map +1 -0
  75. package/dist/features/StreamingExporter.d.ts +128 -0
  76. package/dist/features/StreamingExporter.d.ts.map +1 -0
  77. package/dist/features/StreamingExporter.js +212 -0
  78. package/dist/features/StreamingExporter.js.map +1 -0
  79. package/dist/features/TagManager.d.ts +147 -0
  80. package/dist/features/TagManager.d.ts.map +1 -0
  81. package/dist/features/TagManager.js +211 -0
  82. package/dist/features/TagManager.js.map +1 -0
  83. package/dist/features/index.d.ts +14 -0
  84. package/dist/features/index.d.ts.map +1 -0
  85. package/dist/features/index.js +15 -0
  86. package/dist/features/index.js.map +1 -0
  87. package/dist/index.d.ts +15 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +20 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/search/BM25Search.d.ts +148 -0
  92. package/dist/search/BM25Search.d.ts.map +1 -0
  93. package/dist/search/BM25Search.js +340 -0
  94. package/dist/search/BM25Search.js.map +1 -0
  95. package/dist/search/BasicSearch.d.ts +51 -0
  96. package/dist/search/BasicSearch.d.ts.map +1 -0
  97. package/dist/search/BasicSearch.js +138 -0
  98. package/dist/search/BasicSearch.js.map +1 -0
  99. package/dist/search/BooleanSearch.d.ts +98 -0
  100. package/dist/search/BooleanSearch.d.ts.map +1 -0
  101. package/dist/search/BooleanSearch.js +431 -0
  102. package/dist/search/BooleanSearch.js.map +1 -0
  103. package/dist/search/EarlyTerminationManager.d.ts +140 -0
  104. package/dist/search/EarlyTerminationManager.d.ts.map +1 -0
  105. package/dist/search/EarlyTerminationManager.js +280 -0
  106. package/dist/search/EarlyTerminationManager.js.map +1 -0
  107. package/dist/search/EmbeddingCache.d.ts +175 -0
  108. package/dist/search/EmbeddingCache.d.ts.map +1 -0
  109. package/dist/search/EmbeddingCache.js +247 -0
  110. package/dist/search/EmbeddingCache.js.map +1 -0
  111. package/dist/search/EmbeddingService.d.ts +277 -0
  112. package/dist/search/EmbeddingService.d.ts.map +1 -0
  113. package/dist/search/EmbeddingService.js +531 -0
  114. package/dist/search/EmbeddingService.js.map +1 -0
  115. package/dist/search/FuzzySearch.d.ts +118 -0
  116. package/dist/search/FuzzySearch.d.ts.map +1 -0
  117. package/dist/search/FuzzySearch.js +313 -0
  118. package/dist/search/FuzzySearch.js.map +1 -0
  119. package/dist/search/HybridScorer.d.ts +181 -0
  120. package/dist/search/HybridScorer.d.ts.map +1 -0
  121. package/dist/search/HybridScorer.js +258 -0
  122. package/dist/search/HybridScorer.js.map +1 -0
  123. package/dist/search/HybridSearchManager.d.ts +80 -0
  124. package/dist/search/HybridSearchManager.d.ts.map +1 -0
  125. package/dist/search/HybridSearchManager.js +188 -0
  126. package/dist/search/HybridSearchManager.js.map +1 -0
  127. package/dist/search/IncrementalIndexer.d.ts +201 -0
  128. package/dist/search/IncrementalIndexer.d.ts.map +1 -0
  129. package/dist/search/IncrementalIndexer.js +343 -0
  130. package/dist/search/IncrementalIndexer.js.map +1 -0
  131. package/dist/search/OptimizedInvertedIndex.d.ts +163 -0
  132. package/dist/search/OptimizedInvertedIndex.d.ts.map +1 -0
  133. package/dist/search/OptimizedInvertedIndex.js +359 -0
  134. package/dist/search/OptimizedInvertedIndex.js.map +1 -0
  135. package/dist/search/ParallelSearchExecutor.d.ts +172 -0
  136. package/dist/search/ParallelSearchExecutor.d.ts.map +1 -0
  137. package/dist/search/ParallelSearchExecutor.js +310 -0
  138. package/dist/search/ParallelSearchExecutor.js.map +1 -0
  139. package/dist/search/QuantizedVectorStore.d.ts +171 -0
  140. package/dist/search/QuantizedVectorStore.d.ts.map +1 -0
  141. package/dist/search/QuantizedVectorStore.js +308 -0
  142. package/dist/search/QuantizedVectorStore.js.map +1 -0
  143. package/dist/search/QueryAnalyzer.d.ts +76 -0
  144. package/dist/search/QueryAnalyzer.d.ts.map +1 -0
  145. package/dist/search/QueryAnalyzer.js +228 -0
  146. package/dist/search/QueryAnalyzer.js.map +1 -0
  147. package/dist/search/QueryCostEstimator.d.ts +244 -0
  148. package/dist/search/QueryCostEstimator.d.ts.map +1 -0
  149. package/dist/search/QueryCostEstimator.js +653 -0
  150. package/dist/search/QueryCostEstimator.js.map +1 -0
  151. package/dist/search/QueryPlanCache.d.ts +220 -0
  152. package/dist/search/QueryPlanCache.d.ts.map +1 -0
  153. package/dist/search/QueryPlanCache.js +380 -0
  154. package/dist/search/QueryPlanCache.js.map +1 -0
  155. package/dist/search/QueryPlanner.d.ts +58 -0
  156. package/dist/search/QueryPlanner.d.ts.map +1 -0
  157. package/dist/search/QueryPlanner.js +138 -0
  158. package/dist/search/QueryPlanner.js.map +1 -0
  159. package/dist/search/RankedSearch.d.ts +71 -0
  160. package/dist/search/RankedSearch.d.ts.map +1 -0
  161. package/dist/search/RankedSearch.js +239 -0
  162. package/dist/search/RankedSearch.js.map +1 -0
  163. package/dist/search/ReflectionManager.d.ts +120 -0
  164. package/dist/search/ReflectionManager.d.ts.map +1 -0
  165. package/dist/search/ReflectionManager.js +232 -0
  166. package/dist/search/ReflectionManager.js.map +1 -0
  167. package/dist/search/SavedSearchManager.d.ts +79 -0
  168. package/dist/search/SavedSearchManager.d.ts.map +1 -0
  169. package/dist/search/SavedSearchManager.js +147 -0
  170. package/dist/search/SavedSearchManager.js.map +1 -0
  171. package/dist/search/SearchFilterChain.d.ts +120 -0
  172. package/dist/search/SearchFilterChain.d.ts.map +1 -0
  173. package/dist/search/SearchFilterChain.js +186 -0
  174. package/dist/search/SearchFilterChain.js.map +1 -0
  175. package/dist/search/SearchManager.d.ts +326 -0
  176. package/dist/search/SearchManager.d.ts.map +1 -0
  177. package/dist/search/SearchManager.js +454 -0
  178. package/dist/search/SearchManager.js.map +1 -0
  179. package/dist/search/SearchSuggestions.d.ts +27 -0
  180. package/dist/search/SearchSuggestions.d.ts.map +1 -0
  181. package/dist/search/SearchSuggestions.js +58 -0
  182. package/dist/search/SearchSuggestions.js.map +1 -0
  183. package/dist/search/SemanticSearch.d.ts +149 -0
  184. package/dist/search/SemanticSearch.d.ts.map +1 -0
  185. package/dist/search/SemanticSearch.js +324 -0
  186. package/dist/search/SemanticSearch.js.map +1 -0
  187. package/dist/search/SymbolicSearch.d.ts +61 -0
  188. package/dist/search/SymbolicSearch.d.ts.map +1 -0
  189. package/dist/search/SymbolicSearch.js +164 -0
  190. package/dist/search/SymbolicSearch.js.map +1 -0
  191. package/dist/search/TFIDFEventSync.d.ts +85 -0
  192. package/dist/search/TFIDFEventSync.d.ts.map +1 -0
  193. package/dist/search/TFIDFEventSync.js +134 -0
  194. package/dist/search/TFIDFEventSync.js.map +1 -0
  195. package/dist/search/TFIDFIndexManager.d.ts +151 -0
  196. package/dist/search/TFIDFIndexManager.d.ts.map +1 -0
  197. package/dist/search/TFIDFIndexManager.js +433 -0
  198. package/dist/search/TFIDFIndexManager.js.map +1 -0
  199. package/dist/search/VectorStore.d.ts +235 -0
  200. package/dist/search/VectorStore.d.ts.map +1 -0
  201. package/dist/search/VectorStore.js +312 -0
  202. package/dist/search/VectorStore.js.map +1 -0
  203. package/dist/search/index.d.ts +35 -0
  204. package/dist/search/index.d.ts.map +1 -0
  205. package/dist/search/index.js +53 -0
  206. package/dist/search/index.js.map +1 -0
  207. package/dist/types/index.d.ts +13 -0
  208. package/dist/types/index.d.ts.map +1 -0
  209. package/dist/types/index.js +13 -0
  210. package/dist/types/index.js.map +1 -0
  211. package/dist/types/types.d.ts +1811 -0
  212. package/dist/types/types.d.ts.map +1 -0
  213. package/dist/types/types.js +10 -0
  214. package/dist/types/types.js.map +1 -0
  215. package/dist/utils/BatchProcessor.d.ts +271 -0
  216. package/dist/utils/BatchProcessor.d.ts.map +1 -0
  217. package/dist/utils/BatchProcessor.js +377 -0
  218. package/dist/utils/BatchProcessor.js.map +1 -0
  219. package/dist/utils/MemoryMonitor.d.ts +176 -0
  220. package/dist/utils/MemoryMonitor.d.ts.map +1 -0
  221. package/dist/utils/MemoryMonitor.js +306 -0
  222. package/dist/utils/MemoryMonitor.js.map +1 -0
  223. package/dist/utils/WorkerPoolManager.d.ts +233 -0
  224. package/dist/utils/WorkerPoolManager.d.ts.map +1 -0
  225. package/dist/utils/WorkerPoolManager.js +421 -0
  226. package/dist/utils/WorkerPoolManager.js.map +1 -0
  227. package/dist/utils/compressedCache.d.ts +221 -0
  228. package/dist/utils/compressedCache.d.ts.map +1 -0
  229. package/dist/utils/compressedCache.js +349 -0
  230. package/dist/utils/compressedCache.js.map +1 -0
  231. package/dist/utils/compressionUtil.d.ts +214 -0
  232. package/dist/utils/compressionUtil.d.ts.map +1 -0
  233. package/dist/utils/compressionUtil.js +248 -0
  234. package/dist/utils/compressionUtil.js.map +1 -0
  235. package/dist/utils/constants.d.ts +245 -0
  236. package/dist/utils/constants.d.ts.map +1 -0
  237. package/dist/utils/constants.js +253 -0
  238. package/dist/utils/constants.js.map +1 -0
  239. package/dist/utils/entityUtils.d.ts +379 -0
  240. package/dist/utils/entityUtils.d.ts.map +1 -0
  241. package/dist/utils/entityUtils.js +649 -0
  242. package/dist/utils/entityUtils.js.map +1 -0
  243. package/dist/utils/errors.d.ts +95 -0
  244. package/dist/utils/errors.d.ts.map +1 -0
  245. package/dist/utils/errors.js +146 -0
  246. package/dist/utils/errors.js.map +1 -0
  247. package/dist/utils/formatters.d.ts +145 -0
  248. package/dist/utils/formatters.d.ts.map +1 -0
  249. package/dist/utils/formatters.js +133 -0
  250. package/dist/utils/formatters.js.map +1 -0
  251. package/dist/utils/index.d.ts +26 -0
  252. package/dist/utils/index.d.ts.map +1 -0
  253. package/dist/utils/index.js +88 -0
  254. package/dist/utils/index.js.map +1 -0
  255. package/dist/utils/indexes.d.ts +270 -0
  256. package/dist/utils/indexes.d.ts.map +1 -0
  257. package/dist/utils/indexes.js +527 -0
  258. package/dist/utils/indexes.js.map +1 -0
  259. package/dist/utils/logger.d.ts +31 -0
  260. package/dist/utils/logger.d.ts.map +1 -0
  261. package/dist/utils/logger.js +41 -0
  262. package/dist/utils/logger.js.map +1 -0
  263. package/dist/utils/operationUtils.d.ts +124 -0
  264. package/dist/utils/operationUtils.d.ts.map +1 -0
  265. package/dist/utils/operationUtils.js +176 -0
  266. package/dist/utils/operationUtils.js.map +1 -0
  267. package/dist/utils/parallelUtils.d.ts +76 -0
  268. package/dist/utils/parallelUtils.d.ts.map +1 -0
  269. package/dist/utils/parallelUtils.js +192 -0
  270. package/dist/utils/parallelUtils.js.map +1 -0
  271. package/dist/utils/schemas.d.ts +556 -0
  272. package/dist/utils/schemas.d.ts.map +1 -0
  273. package/dist/utils/schemas.js +485 -0
  274. package/dist/utils/schemas.js.map +1 -0
  275. package/dist/utils/searchAlgorithms.d.ts +99 -0
  276. package/dist/utils/searchAlgorithms.d.ts.map +1 -0
  277. package/dist/utils/searchAlgorithms.js +168 -0
  278. package/dist/utils/searchAlgorithms.js.map +1 -0
  279. package/dist/utils/searchCache.d.ts +108 -0
  280. package/dist/utils/searchCache.d.ts.map +1 -0
  281. package/dist/utils/searchCache.js +210 -0
  282. package/dist/utils/searchCache.js.map +1 -0
  283. package/dist/utils/taskScheduler.d.ts +294 -0
  284. package/dist/utils/taskScheduler.d.ts.map +1 -0
  285. package/dist/utils/taskScheduler.js +487 -0
  286. package/dist/utils/taskScheduler.js.map +1 -0
  287. package/dist/workers/index.d.ts +12 -0
  288. package/dist/workers/index.d.ts.map +1 -0
  289. package/dist/workers/index.js +10 -0
  290. package/dist/workers/index.js.map +1 -0
  291. package/dist/workers/levenshteinWorker.d.ts +60 -0
  292. package/dist/workers/levenshteinWorker.d.ts.map +1 -0
  293. package/dist/workers/levenshteinWorker.js +99 -0
  294. package/dist/workers/levenshteinWorker.js.map +1 -0
  295. package/package.json +69 -0
@@ -0,0 +1,163 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,359 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OptimizedInvertedIndex.js","sourceRoot":"","sources":["../../src/search/OptimizedInvertedIndex.ts"],"names":[],"mappings":"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"}