agentdb 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 (361) hide show
  1. package/LICENSE +38 -0
  2. package/LICENSE-APACHE +190 -0
  3. package/LICENSE-MIT +21 -0
  4. package/README.md +953 -0
  5. package/bin/agentdb.js +485 -0
  6. package/bin/plugin-cli-wrapper.mjs +21 -0
  7. package/dist/cache/query-cache.d.ts +105 -0
  8. package/dist/cache/query-cache.d.ts.map +1 -0
  9. package/dist/cache/query-cache.js +224 -0
  10. package/dist/cache/query-cache.js.map +1 -0
  11. package/dist/cache/query-cache.mjs +219 -0
  12. package/dist/cli/cache/query-cache.d.ts +104 -0
  13. package/dist/cli/cache/query-cache.js +244 -0
  14. package/dist/cli/cli/db-commands.d.ts +48 -0
  15. package/dist/cli/cli/db-commands.js +613 -0
  16. package/dist/cli/commands.d.ts +7 -0
  17. package/dist/cli/commands.d.ts.map +1 -0
  18. package/dist/cli/commands.js +113 -0
  19. package/dist/cli/commands.js.map +1 -0
  20. package/dist/cli/commands.mjs +104 -0
  21. package/dist/cli/core/backend-interface.d.ts +70 -0
  22. package/dist/cli/core/backend-interface.js +15 -0
  23. package/dist/cli/core/native-backend.d.ts +140 -0
  24. package/dist/cli/core/native-backend.js +432 -0
  25. package/dist/cli/core/vector-db.d.ts +126 -0
  26. package/dist/cli/core/vector-db.js +338 -0
  27. package/dist/cli/core/wasm-backend.d.ts +95 -0
  28. package/dist/cli/core/wasm-backend.js +418 -0
  29. package/dist/cli/db-commands.d.ts +49 -0
  30. package/dist/cli/db-commands.d.ts.map +1 -0
  31. package/dist/cli/db-commands.js +533 -0
  32. package/dist/cli/db-commands.js.map +1 -0
  33. package/dist/cli/db-commands.mjs +522 -0
  34. package/dist/cli/generator.d.ts +11 -0
  35. package/dist/cli/generator.d.ts.map +1 -0
  36. package/dist/cli/generator.js +567 -0
  37. package/dist/cli/generator.js.map +1 -0
  38. package/dist/cli/generator.mjs +527 -0
  39. package/dist/cli/help.d.ts +18 -0
  40. package/dist/cli/help.d.ts.map +1 -0
  41. package/dist/cli/help.js +676 -0
  42. package/dist/cli/help.js.map +1 -0
  43. package/dist/cli/help.mjs +667 -0
  44. package/dist/cli/index/hnsw.d.ts +164 -0
  45. package/dist/cli/index/hnsw.js +558 -0
  46. package/dist/cli/plugin-cli.d.ts +7 -0
  47. package/dist/cli/plugin-cli.d.ts.map +1 -0
  48. package/dist/cli/plugin-cli.js +295 -0
  49. package/dist/cli/plugin-cli.js.map +1 -0
  50. package/dist/cli/plugin-cli.mjs +289 -0
  51. package/dist/cli/quantization/product-quantization.d.ts +108 -0
  52. package/dist/cli/quantization/product-quantization.js +350 -0
  53. package/dist/cli/query/query-builder.d.ts +322 -0
  54. package/dist/cli/query/query-builder.js +600 -0
  55. package/dist/cli/templates.d.ts +14 -0
  56. package/dist/cli/templates.d.ts.map +1 -0
  57. package/dist/cli/templates.js +182 -0
  58. package/dist/cli/templates.js.map +1 -0
  59. package/dist/cli/templates.mjs +176 -0
  60. package/dist/cli/types/index.d.ts +116 -0
  61. package/dist/cli/types/index.js +5 -0
  62. package/dist/cli/types.d.ts +91 -0
  63. package/dist/cli/types.d.ts.map +1 -0
  64. package/dist/cli/types.js +6 -0
  65. package/dist/cli/types.js.map +1 -0
  66. package/dist/cli/types.mjs +4 -0
  67. package/dist/cli/wizard/index.d.ts +6 -0
  68. package/dist/cli/wizard/index.d.ts.map +1 -0
  69. package/dist/cli/wizard/index.js +138 -0
  70. package/dist/cli/wizard/index.js.map +1 -0
  71. package/dist/cli/wizard/index.mjs +131 -0
  72. package/dist/cli/wizard/prompts.d.ts +11 -0
  73. package/dist/cli/wizard/prompts.d.ts.map +1 -0
  74. package/dist/cli/wizard/prompts.js +482 -0
  75. package/dist/cli/wizard/prompts.js.map +1 -0
  76. package/dist/cli/wizard/prompts.mjs +470 -0
  77. package/dist/cli/wizard/validator.d.ts +13 -0
  78. package/dist/cli/wizard/validator.d.ts.map +1 -0
  79. package/dist/cli/wizard/validator.js +234 -0
  80. package/dist/cli/wizard/validator.js.map +1 -0
  81. package/dist/cli/wizard/validator.mjs +224 -0
  82. package/dist/core/backend-interface.d.ts +71 -0
  83. package/dist/core/backend-interface.d.ts.map +1 -0
  84. package/dist/core/backend-interface.js +16 -0
  85. package/dist/core/backend-interface.js.map +1 -0
  86. package/dist/core/backend-interface.mjs +12 -0
  87. package/dist/core/native-backend.d.ts +141 -0
  88. package/dist/core/native-backend.d.ts.map +1 -0
  89. package/dist/core/native-backend.js +457 -0
  90. package/dist/core/native-backend.js.map +1 -0
  91. package/dist/core/native-backend.mjs +449 -0
  92. package/dist/core/vector-db.d.ts +127 -0
  93. package/dist/core/vector-db.d.ts.map +1 -0
  94. package/dist/core/vector-db.js +266 -0
  95. package/dist/core/vector-db.js.map +1 -0
  96. package/dist/core/vector-db.mjs +261 -0
  97. package/dist/core/wasm-backend.d.ts +96 -0
  98. package/dist/core/wasm-backend.d.ts.map +1 -0
  99. package/dist/core/wasm-backend.js +393 -0
  100. package/dist/core/wasm-backend.js.map +1 -0
  101. package/dist/core/wasm-backend.mjs +385 -0
  102. package/dist/index/hnsw-optimized.d.ts +75 -0
  103. package/dist/index/hnsw-optimized.d.ts.map +1 -0
  104. package/dist/index/hnsw-optimized.js +412 -0
  105. package/dist/index/hnsw-optimized.js.map +1 -0
  106. package/dist/index/hnsw-optimized.mjs +407 -0
  107. package/dist/index/hnsw.d.ts +165 -0
  108. package/dist/index/hnsw.d.ts.map +1 -0
  109. package/dist/index/hnsw.js +521 -0
  110. package/dist/index/hnsw.js.map +1 -0
  111. package/dist/index/hnsw.mjs +516 -0
  112. package/dist/index.d.ts +57 -0
  113. package/dist/index.d.ts.map +1 -0
  114. package/dist/index.js +82 -0
  115. package/dist/index.js.map +1 -0
  116. package/dist/index.mjs +63 -0
  117. package/dist/mcp-server.d.ts +27 -0
  118. package/dist/mcp-server.d.ts.map +1 -0
  119. package/dist/mcp-server.js +789 -0
  120. package/dist/mcp-server.js.map +1 -0
  121. package/dist/mcp-server.mjs +784 -0
  122. package/dist/plugins/base-plugin.d.ts +114 -0
  123. package/dist/plugins/base-plugin.d.ts.map +1 -0
  124. package/dist/plugins/base-plugin.js +313 -0
  125. package/dist/plugins/base-plugin.js.map +1 -0
  126. package/dist/plugins/base-plugin.mjs +275 -0
  127. package/dist/plugins/implementations/active-learning.d.ts +135 -0
  128. package/dist/plugins/implementations/active-learning.d.ts.map +1 -0
  129. package/dist/plugins/implementations/active-learning.js +372 -0
  130. package/dist/plugins/implementations/active-learning.js.map +1 -0
  131. package/dist/plugins/implementations/active-learning.mjs +367 -0
  132. package/dist/plugins/implementations/actor-critic.d.ts +64 -0
  133. package/dist/plugins/implementations/actor-critic.d.ts.map +1 -0
  134. package/dist/plugins/implementations/actor-critic.js +363 -0
  135. package/dist/plugins/implementations/actor-critic.js.map +1 -0
  136. package/dist/plugins/implementations/actor-critic.mjs +358 -0
  137. package/dist/plugins/implementations/adversarial-training.d.ts +133 -0
  138. package/dist/plugins/implementations/adversarial-training.d.ts.map +1 -0
  139. package/dist/plugins/implementations/adversarial-training.js +409 -0
  140. package/dist/plugins/implementations/adversarial-training.js.map +1 -0
  141. package/dist/plugins/implementations/adversarial-training.mjs +404 -0
  142. package/dist/plugins/implementations/curriculum-learning.d.ts +132 -0
  143. package/dist/plugins/implementations/curriculum-learning.d.ts.map +1 -0
  144. package/dist/plugins/implementations/curriculum-learning.js +354 -0
  145. package/dist/plugins/implementations/curriculum-learning.js.map +1 -0
  146. package/dist/plugins/implementations/curriculum-learning.mjs +349 -0
  147. package/dist/plugins/implementations/decision-transformer.d.ts +77 -0
  148. package/dist/plugins/implementations/decision-transformer.d.ts.map +1 -0
  149. package/dist/plugins/implementations/decision-transformer.js +422 -0
  150. package/dist/plugins/implementations/decision-transformer.js.map +1 -0
  151. package/dist/plugins/implementations/decision-transformer.mjs +417 -0
  152. package/dist/plugins/implementations/federated-learning.d.ts +126 -0
  153. package/dist/plugins/implementations/federated-learning.d.ts.map +1 -0
  154. package/dist/plugins/implementations/federated-learning.js +436 -0
  155. package/dist/plugins/implementations/federated-learning.js.map +1 -0
  156. package/dist/plugins/implementations/federated-learning.mjs +431 -0
  157. package/dist/plugins/implementations/index.d.ts +30 -0
  158. package/dist/plugins/implementations/index.d.ts.map +1 -0
  159. package/dist/plugins/implementations/index.js +45 -0
  160. package/dist/plugins/implementations/index.js.map +1 -0
  161. package/dist/plugins/implementations/index.mjs +31 -0
  162. package/dist/plugins/implementations/multi-task-learning.d.ts +115 -0
  163. package/dist/plugins/implementations/multi-task-learning.d.ts.map +1 -0
  164. package/dist/plugins/implementations/multi-task-learning.js +369 -0
  165. package/dist/plugins/implementations/multi-task-learning.js.map +1 -0
  166. package/dist/plugins/implementations/multi-task-learning.mjs +364 -0
  167. package/dist/plugins/implementations/neural-architecture-search.d.ts +148 -0
  168. package/dist/plugins/implementations/neural-architecture-search.d.ts.map +1 -0
  169. package/dist/plugins/implementations/neural-architecture-search.js +379 -0
  170. package/dist/plugins/implementations/neural-architecture-search.js.map +1 -0
  171. package/dist/plugins/implementations/neural-architecture-search.mjs +374 -0
  172. package/dist/plugins/implementations/q-learning.d.ts +98 -0
  173. package/dist/plugins/implementations/q-learning.d.ts.map +1 -0
  174. package/dist/plugins/implementations/q-learning.js +435 -0
  175. package/dist/plugins/implementations/q-learning.js.map +1 -0
  176. package/dist/plugins/implementations/q-learning.mjs +430 -0
  177. package/dist/plugins/implementations/sarsa.d.ts +103 -0
  178. package/dist/plugins/implementations/sarsa.d.ts.map +1 -0
  179. package/dist/plugins/implementations/sarsa.js +347 -0
  180. package/dist/plugins/implementations/sarsa.js.map +1 -0
  181. package/dist/plugins/implementations/sarsa.mjs +342 -0
  182. package/dist/plugins/index.d.ts +107 -0
  183. package/dist/plugins/index.d.ts.map +1 -0
  184. package/dist/plugins/index.js +179 -0
  185. package/dist/plugins/index.js.map +1 -0
  186. package/dist/plugins/index.mjs +168 -0
  187. package/dist/plugins/interface.d.ts +439 -0
  188. package/dist/plugins/interface.d.ts.map +1 -0
  189. package/dist/plugins/interface.js +12 -0
  190. package/dist/plugins/interface.js.map +1 -0
  191. package/dist/plugins/interface.mjs +10 -0
  192. package/dist/plugins/learning-plugin.interface.d.ts +257 -0
  193. package/dist/plugins/learning-plugin.interface.d.ts.map +1 -0
  194. package/dist/plugins/learning-plugin.interface.js +7 -0
  195. package/dist/plugins/learning-plugin.interface.js.map +1 -0
  196. package/dist/plugins/learning-plugin.interface.mjs +5 -0
  197. package/dist/plugins/plugin-exports.d.ts +71 -0
  198. package/dist/plugins/plugin-exports.d.ts.map +1 -0
  199. package/dist/plugins/plugin-exports.js +78 -0
  200. package/dist/plugins/plugin-exports.js.map +1 -0
  201. package/dist/plugins/plugin-exports.mjs +69 -0
  202. package/dist/plugins/registry.d.ts +206 -0
  203. package/dist/plugins/registry.d.ts.map +1 -0
  204. package/dist/plugins/registry.js +365 -0
  205. package/dist/plugins/registry.js.map +1 -0
  206. package/dist/plugins/registry.mjs +356 -0
  207. package/dist/plugins/validator.d.ts +63 -0
  208. package/dist/plugins/validator.d.ts.map +1 -0
  209. package/dist/plugins/validator.js +464 -0
  210. package/dist/plugins/validator.js.map +1 -0
  211. package/dist/plugins/validator.mjs +458 -0
  212. package/dist/quantization/binary-quantization.d.ts +104 -0
  213. package/dist/quantization/binary-quantization.d.ts.map +1 -0
  214. package/dist/quantization/binary-quantization.js +246 -0
  215. package/dist/quantization/binary-quantization.js.map +1 -0
  216. package/dist/quantization/binary-quantization.mjs +240 -0
  217. package/dist/quantization/optimized-pq.d.ts +138 -0
  218. package/dist/quantization/optimized-pq.d.ts.map +1 -0
  219. package/dist/quantization/optimized-pq.js +320 -0
  220. package/dist/quantization/optimized-pq.js.map +1 -0
  221. package/dist/quantization/optimized-pq.mjs +313 -0
  222. package/dist/quantization/product-quantization.d.ts +109 -0
  223. package/dist/quantization/product-quantization.d.ts.map +1 -0
  224. package/dist/quantization/product-quantization.js +287 -0
  225. package/dist/quantization/product-quantization.js.map +1 -0
  226. package/dist/quantization/product-quantization.mjs +282 -0
  227. package/dist/quantization/scalar-quantization.d.ts +100 -0
  228. package/dist/quantization/scalar-quantization.d.ts.map +1 -0
  229. package/dist/quantization/scalar-quantization.js +324 -0
  230. package/dist/quantization/scalar-quantization.js.map +1 -0
  231. package/dist/quantization/scalar-quantization.mjs +319 -0
  232. package/dist/query/index.d.ts +6 -0
  233. package/dist/query/index.d.ts.map +1 -0
  234. package/dist/query/index.js +9 -0
  235. package/dist/query/index.js.map +1 -0
  236. package/dist/query/index.mjs +4 -0
  237. package/dist/query/query-builder.d.ts +323 -0
  238. package/dist/query/query-builder.d.ts.map +1 -0
  239. package/dist/query/query-builder.js +524 -0
  240. package/dist/query/query-builder.js.map +1 -0
  241. package/dist/query/query-builder.mjs +519 -0
  242. package/dist/reasoning/context-synthesizer.d.ts +57 -0
  243. package/dist/reasoning/context-synthesizer.d.ts.map +1 -0
  244. package/dist/reasoning/context-synthesizer.js +224 -0
  245. package/dist/reasoning/context-synthesizer.js.map +1 -0
  246. package/dist/reasoning/context-synthesizer.mjs +219 -0
  247. package/dist/reasoning/experience-curator.d.ts +66 -0
  248. package/dist/reasoning/experience-curator.d.ts.map +1 -0
  249. package/dist/reasoning/experience-curator.js +288 -0
  250. package/dist/reasoning/experience-curator.js.map +1 -0
  251. package/dist/reasoning/experience-curator.mjs +283 -0
  252. package/dist/reasoning/memory-optimizer.d.ts +69 -0
  253. package/dist/reasoning/memory-optimizer.d.ts.map +1 -0
  254. package/dist/reasoning/memory-optimizer.js +331 -0
  255. package/dist/reasoning/memory-optimizer.js.map +1 -0
  256. package/dist/reasoning/memory-optimizer.mjs +326 -0
  257. package/dist/reasoning/pattern-matcher.d.ts +59 -0
  258. package/dist/reasoning/pattern-matcher.d.ts.map +1 -0
  259. package/dist/reasoning/pattern-matcher.js +229 -0
  260. package/dist/reasoning/pattern-matcher.js.map +1 -0
  261. package/dist/reasoning/pattern-matcher.mjs +224 -0
  262. package/dist/reasoningbank/adapter/agentdb-adapter.d.ts +118 -0
  263. package/dist/reasoningbank/adapter/agentdb-adapter.d.ts.map +1 -0
  264. package/dist/reasoningbank/adapter/agentdb-adapter.js +477 -0
  265. package/dist/reasoningbank/adapter/agentdb-adapter.js.map +1 -0
  266. package/dist/reasoningbank/adapter/types.d.ts +113 -0
  267. package/dist/reasoningbank/adapter/types.d.ts.map +1 -0
  268. package/dist/reasoningbank/adapter/types.js +9 -0
  269. package/dist/reasoningbank/adapter/types.js.map +1 -0
  270. package/dist/reasoningbank/cli/commands.d.ts +16 -0
  271. package/dist/reasoningbank/cli/commands.d.ts.map +1 -0
  272. package/dist/reasoningbank/cli/commands.js +272 -0
  273. package/dist/reasoningbank/cli/commands.js.map +1 -0
  274. package/dist/reasoningbank/mcp/agentdb-tools.d.ts +319 -0
  275. package/dist/reasoningbank/mcp/agentdb-tools.d.ts.map +1 -0
  276. package/dist/reasoningbank/mcp/agentdb-tools.js +301 -0
  277. package/dist/reasoningbank/mcp/agentdb-tools.js.map +1 -0
  278. package/dist/reasoningbank/migration/migrate.d.ts +25 -0
  279. package/dist/reasoningbank/migration/migrate.d.ts.map +1 -0
  280. package/dist/reasoningbank/migration/migrate.js +178 -0
  281. package/dist/reasoningbank/migration/migrate.js.map +1 -0
  282. package/dist/reasoningbank/reasoning/context-synthesizer.d.ts +37 -0
  283. package/dist/reasoningbank/reasoning/context-synthesizer.d.ts.map +1 -0
  284. package/dist/reasoningbank/reasoning/context-synthesizer.js +114 -0
  285. package/dist/reasoningbank/reasoning/context-synthesizer.js.map +1 -0
  286. package/dist/reasoningbank/reasoning/experience-curator.d.ts +39 -0
  287. package/dist/reasoningbank/reasoning/experience-curator.d.ts.map +1 -0
  288. package/dist/reasoningbank/reasoning/experience-curator.js +98 -0
  289. package/dist/reasoningbank/reasoning/experience-curator.js.map +1 -0
  290. package/dist/reasoningbank/reasoning/memory-optimizer.d.ts +44 -0
  291. package/dist/reasoningbank/reasoning/memory-optimizer.d.ts.map +1 -0
  292. package/dist/reasoningbank/reasoning/memory-optimizer.js +184 -0
  293. package/dist/reasoningbank/reasoning/memory-optimizer.js.map +1 -0
  294. package/dist/reasoningbank/reasoning/pattern-matcher.d.ts +40 -0
  295. package/dist/reasoningbank/reasoning/pattern-matcher.d.ts.map +1 -0
  296. package/dist/reasoningbank/reasoning/pattern-matcher.js +87 -0
  297. package/dist/reasoningbank/reasoning/pattern-matcher.js.map +1 -0
  298. package/dist/reasoningbank/sync/quic-sync.d.ts +77 -0
  299. package/dist/reasoningbank/sync/quic-sync.d.ts.map +1 -0
  300. package/dist/reasoningbank/sync/quic-sync.js +165 -0
  301. package/dist/reasoningbank/sync/quic-sync.js.map +1 -0
  302. package/dist/sync/conflict.d.ts +78 -0
  303. package/dist/sync/conflict.d.ts.map +1 -0
  304. package/dist/sync/conflict.js +202 -0
  305. package/dist/sync/conflict.js.map +1 -0
  306. package/dist/sync/conflict.mjs +196 -0
  307. package/dist/sync/coordinator.d.ts +111 -0
  308. package/dist/sync/coordinator.d.ts.map +1 -0
  309. package/dist/sync/coordinator.js +256 -0
  310. package/dist/sync/coordinator.js.map +1 -0
  311. package/dist/sync/coordinator.mjs +250 -0
  312. package/dist/sync/delta.d.ts +81 -0
  313. package/dist/sync/delta.d.ts.map +1 -0
  314. package/dist/sync/delta.js +245 -0
  315. package/dist/sync/delta.js.map +1 -0
  316. package/dist/sync/delta.mjs +238 -0
  317. package/dist/sync/index.d.ts +11 -0
  318. package/dist/sync/index.d.ts.map +1 -0
  319. package/dist/sync/index.js +22 -0
  320. package/dist/sync/index.js.map +1 -0
  321. package/dist/sync/index.mjs +9 -0
  322. package/dist/sync/quic-sync.d.ts +81 -0
  323. package/dist/sync/quic-sync.d.ts.map +1 -0
  324. package/dist/sync/quic-sync.js +329 -0
  325. package/dist/sync/quic-sync.js.map +1 -0
  326. package/dist/sync/quic-sync.mjs +323 -0
  327. package/dist/sync/types.d.ts +168 -0
  328. package/dist/sync/types.d.ts.map +1 -0
  329. package/dist/sync/types.js +8 -0
  330. package/dist/sync/types.js.map +1 -0
  331. package/dist/sync/types.mjs +6 -0
  332. package/dist/types/index.d.ts +117 -0
  333. package/dist/types/index.d.ts.map +1 -0
  334. package/dist/types/index.js +6 -0
  335. package/dist/types/index.js.map +1 -0
  336. package/dist/types/index.mjs +4 -0
  337. package/dist/wasm-loader.d.ts +32 -0
  338. package/dist/wasm-loader.d.ts.map +1 -0
  339. package/dist/wasm-loader.js +75 -0
  340. package/dist/wasm-loader.js.map +1 -0
  341. package/dist/wasm-loader.mjs +64 -0
  342. package/examples/adaptive-learning.ts +284 -0
  343. package/examples/browser/README.md +732 -0
  344. package/examples/browser/adaptive-recommendations/index.html +427 -0
  345. package/examples/browser/collaborative-filtering/index.html +310 -0
  346. package/examples/browser/continual-learning/index.html +736 -0
  347. package/examples/browser/experience-replay/index.html +616 -0
  348. package/examples/browser/index.html +369 -0
  349. package/examples/browser/meta-learning/index.html +789 -0
  350. package/examples/browser/neuro-symbolic/index.html +692 -0
  351. package/examples/browser/pattern-learning/index.html +620 -0
  352. package/examples/browser/quantum-inspired/index.html +728 -0
  353. package/examples/browser/rag/index.html +624 -0
  354. package/examples/browser/swarm-intelligence/index.html +811 -0
  355. package/examples/browser-basic.html +170 -0
  356. package/examples/hnsw-example.ts +148 -0
  357. package/examples/node-basic.js +70 -0
  358. package/examples/quic-sync-example.ts +310 -0
  359. package/examples/quick-start.js +68 -0
  360. package/examples/wasm-example.ts +222 -0
  361. package/package.json +118 -0
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Product Quantization (PQ) for 4-32x vector compression
3
+ *
4
+ * Reduces storage requirements while maintaining 95%+ search accuracy.
5
+ * Splits vectors into subvectors and quantizes each independently.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * const pq = new ProductQuantizer({ dimensions: 768, subvectors: 8, bits: 8 });
10
+ * await pq.train(trainingVectors); // Train codebooks
11
+ *
12
+ * // Compress vectors (768 floats → 8 bytes = 96x reduction)
13
+ * const codes = pq.encode(vector);
14
+ *
15
+ * // Decompress for similarity search
16
+ * const approximation = pq.decode(codes);
17
+ * ```
18
+ */
19
+ export interface ProductQuantizerConfig {
20
+ /** Vector dimensions (e.g., 768 for many embeddings) */
21
+ dimensions: number;
22
+ /** Number of subvectors (typically 4-16) */
23
+ subvectors: number;
24
+ /** Bits per subvector (typically 8 = 256 centroids) */
25
+ bits: number;
26
+ /** K-means iterations for training (default: 20) */
27
+ kmeansIterations?: number;
28
+ /** Enable compression statistics (default: true) */
29
+ enableStats?: boolean;
30
+ }
31
+ export interface CompressionStats {
32
+ originalSize: number;
33
+ compressedSize: number;
34
+ compressionRatio: number;
35
+ encodeCount: number;
36
+ decodeCount: number;
37
+ avgEncodeTime: number;
38
+ avgDecodeTime: number;
39
+ }
40
+ interface Codebook {
41
+ centroids: number[][];
42
+ }
43
+ export declare class ProductQuantizer {
44
+ private config;
45
+ private codebooks;
46
+ private subvectorDim;
47
+ private trained;
48
+ private stats;
49
+ constructor(config: ProductQuantizerConfig);
50
+ /**
51
+ * Train codebooks using k-means clustering on training vectors
52
+ */
53
+ train(trainingVectors: number[][]): Promise<void>;
54
+ /**
55
+ * Extract subvectors for a specific segment
56
+ */
57
+ private extractSubvectors;
58
+ /**
59
+ * Train k-means clustering to create centroids
60
+ */
61
+ private trainKMeans;
62
+ /**
63
+ * Encode vector into quantized codes
64
+ */
65
+ encode(vector: number[]): Uint8Array;
66
+ /**
67
+ * Decode quantized codes back to approximate vector
68
+ */
69
+ decode(codes: Uint8Array): number[];
70
+ /**
71
+ * Compute asymmetric distance for faster search
72
+ * Compare query vector directly with quantized database vectors
73
+ */
74
+ asymmetricDistance(query: number[], codes: Uint8Array): number;
75
+ /**
76
+ * Euclidean distance between two vectors
77
+ */
78
+ private euclideanDistance;
79
+ /**
80
+ * Squared Euclidean distance (faster, no sqrt)
81
+ */
82
+ private euclideanDistanceSquared;
83
+ /**
84
+ * Get compression statistics
85
+ */
86
+ getStats(): CompressionStats;
87
+ /**
88
+ * Reset statistics
89
+ */
90
+ resetStats(): void;
91
+ /**
92
+ * Check if quantizer is trained
93
+ */
94
+ isTrained(): boolean;
95
+ /**
96
+ * Export codebooks for persistence
97
+ */
98
+ exportCodebooks(): Codebook[];
99
+ /**
100
+ * Import codebooks from persistence
101
+ */
102
+ importCodebooks(codebooks: Codebook[]): void;
103
+ /**
104
+ * Get configuration
105
+ */
106
+ getConfig(): Required<ProductQuantizerConfig>;
107
+ }
108
+ export {};
@@ -0,0 +1,350 @@
1
+ "use strict";
2
+ /**
3
+ * Product Quantization (PQ) for 4-32x vector compression
4
+ *
5
+ * Reduces storage requirements while maintaining 95%+ search accuracy.
6
+ * Splits vectors into subvectors and quantizes each independently.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * const pq = new ProductQuantizer({ dimensions: 768, subvectors: 8, bits: 8 });
11
+ * await pq.train(trainingVectors); // Train codebooks
12
+ *
13
+ * // Compress vectors (768 floats → 8 bytes = 96x reduction)
14
+ * const codes = pq.encode(vector);
15
+ *
16
+ * // Decompress for similarity search
17
+ * const approximation = pq.decode(codes);
18
+ * ```
19
+ */
20
+ var __assign = (this && this.__assign) || function () {
21
+ __assign = Object.assign || function(t) {
22
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
23
+ s = arguments[i];
24
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
25
+ t[p] = s[p];
26
+ }
27
+ return t;
28
+ };
29
+ return __assign.apply(this, arguments);
30
+ };
31
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
32
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
33
+ return new (P || (P = Promise))(function (resolve, reject) {
34
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
35
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
36
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
37
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
38
+ });
39
+ };
40
+ var __generator = (this && this.__generator) || function (thisArg, body) {
41
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
42
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
43
+ function verb(n) { return function (v) { return step([n, v]); }; }
44
+ function step(op) {
45
+ if (f) throw new TypeError("Generator is already executing.");
46
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
47
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
48
+ if (y = 0, t) op = [op[0] & 2, t.value];
49
+ switch (op[0]) {
50
+ case 0: case 1: t = op; break;
51
+ case 4: _.label++; return { value: op[1], done: false };
52
+ case 5: _.label++; y = op[1]; op = [0]; continue;
53
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
54
+ default:
55
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
56
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
57
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
58
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
59
+ if (t[2]) _.ops.pop();
60
+ _.trys.pop(); continue;
61
+ }
62
+ op = body.call(thisArg, _);
63
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
64
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
65
+ }
66
+ };
67
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
68
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
69
+ if (ar || !(i in from)) {
70
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
71
+ ar[i] = from[i];
72
+ }
73
+ }
74
+ return to.concat(ar || Array.prototype.slice.call(from));
75
+ };
76
+ Object.defineProperty(exports, "__esModule", { value: true });
77
+ exports.ProductQuantizer = void 0;
78
+ var ProductQuantizer = /** @class */ (function () {
79
+ function ProductQuantizer(config) {
80
+ var _a, _b;
81
+ this.codebooks = [];
82
+ this.trained = false;
83
+ // Statistics
84
+ this.stats = {
85
+ encodeCount: 0,
86
+ decodeCount: 0,
87
+ totalEncodeTime: 0,
88
+ totalDecodeTime: 0
89
+ };
90
+ this.config = {
91
+ dimensions: config.dimensions,
92
+ subvectors: config.subvectors,
93
+ bits: config.bits,
94
+ kmeansIterations: (_a = config.kmeansIterations) !== null && _a !== void 0 ? _a : 20,
95
+ enableStats: (_b = config.enableStats) !== null && _b !== void 0 ? _b : true
96
+ };
97
+ if (config.dimensions % config.subvectors !== 0) {
98
+ throw new Error("Dimensions (".concat(config.dimensions, ") must be divisible by subvectors (").concat(config.subvectors, ")"));
99
+ }
100
+ this.subvectorDim = config.dimensions / config.subvectors;
101
+ }
102
+ /**
103
+ * Train codebooks using k-means clustering on training vectors
104
+ */
105
+ ProductQuantizer.prototype.train = function (trainingVectors) {
106
+ return __awaiter(this, void 0, void 0, function () {
107
+ var numCentroids, m, subvectors, centroids;
108
+ return __generator(this, function (_a) {
109
+ if (trainingVectors.length === 0) {
110
+ throw new Error('Training vectors cannot be empty');
111
+ }
112
+ numCentroids = Math.pow(2, this.config.bits);
113
+ this.codebooks = [];
114
+ // Train one codebook per subvector
115
+ for (m = 0; m < this.config.subvectors; m++) {
116
+ subvectors = this.extractSubvectors(trainingVectors, m);
117
+ centroids = this.trainKMeans(subvectors, numCentroids);
118
+ this.codebooks.push({ centroids: centroids });
119
+ }
120
+ this.trained = true;
121
+ return [2 /*return*/];
122
+ });
123
+ });
124
+ };
125
+ /**
126
+ * Extract subvectors for a specific segment
127
+ */
128
+ ProductQuantizer.prototype.extractSubvectors = function (vectors, segmentIndex) {
129
+ var start = segmentIndex * this.subvectorDim;
130
+ var end = start + this.subvectorDim;
131
+ return vectors.map(function (v) { return v.slice(start, end); });
132
+ };
133
+ /**
134
+ * Train k-means clustering to create centroids
135
+ */
136
+ ProductQuantizer.prototype.trainKMeans = function (vectors, k) {
137
+ var n = vectors.length;
138
+ var d = vectors[0].length;
139
+ // Initialize centroids randomly
140
+ var centroids = [];
141
+ var indices = new Set();
142
+ while (centroids.length < Math.min(k, n)) {
143
+ var idx = Math.floor(Math.random() * n);
144
+ if (!indices.has(idx)) {
145
+ centroids.push(__spreadArray([], vectors[idx], true));
146
+ indices.add(idx);
147
+ }
148
+ }
149
+ // K-means iterations
150
+ for (var iter = 0; iter < this.config.kmeansIterations; iter++) {
151
+ // Assignment step
152
+ var assignments = new Array(n).fill(0);
153
+ for (var i = 0; i < n; i++) {
154
+ var minDist = Infinity;
155
+ var bestCluster = 0;
156
+ for (var c = 0; c < centroids.length; c++) {
157
+ var dist = this.euclideanDistance(vectors[i], centroids[c]);
158
+ if (dist < minDist) {
159
+ minDist = dist;
160
+ bestCluster = c;
161
+ }
162
+ }
163
+ assignments[i] = bestCluster;
164
+ }
165
+ // Update step
166
+ var clusterSums = Array(centroids.length)
167
+ .fill(0)
168
+ .map(function () { return Array(d).fill(0); });
169
+ var clusterCounts = Array(centroids.length).fill(0);
170
+ for (var i = 0; i < n; i++) {
171
+ var cluster = assignments[i];
172
+ clusterCounts[cluster]++;
173
+ for (var j = 0; j < d; j++) {
174
+ clusterSums[cluster][j] += vectors[i][j];
175
+ }
176
+ }
177
+ // Update centroids
178
+ for (var c = 0; c < centroids.length; c++) {
179
+ if (clusterCounts[c] > 0) {
180
+ for (var j = 0; j < d; j++) {
181
+ centroids[c][j] = clusterSums[c][j] / clusterCounts[c];
182
+ }
183
+ }
184
+ }
185
+ }
186
+ // Fill remaining centroids if k > n
187
+ while (centroids.length < k) {
188
+ centroids.push(Array(d).fill(0));
189
+ }
190
+ return centroids;
191
+ };
192
+ /**
193
+ * Encode vector into quantized codes
194
+ */
195
+ ProductQuantizer.prototype.encode = function (vector) {
196
+ if (!this.trained) {
197
+ throw new Error('Quantizer must be trained before encoding');
198
+ }
199
+ if (vector.length !== this.config.dimensions) {
200
+ throw new Error("Vector dimension (".concat(vector.length, ") does not match config (").concat(this.config.dimensions, ")"));
201
+ }
202
+ var startTime = performance.now();
203
+ var codes = new Uint8Array(this.config.subvectors);
204
+ for (var m = 0; m < this.config.subvectors; m++) {
205
+ var start = m * this.subvectorDim;
206
+ var end = start + this.subvectorDim;
207
+ var subvector = vector.slice(start, end);
208
+ // Find nearest centroid
209
+ var minDist = Infinity;
210
+ var bestCode = 0;
211
+ for (var c = 0; c < this.codebooks[m].centroids.length; c++) {
212
+ var dist = this.euclideanDistance(subvector, this.codebooks[m].centroids[c]);
213
+ if (dist < minDist) {
214
+ minDist = dist;
215
+ bestCode = c;
216
+ }
217
+ }
218
+ codes[m] = bestCode;
219
+ }
220
+ if (this.config.enableStats) {
221
+ this.stats.encodeCount++;
222
+ this.stats.totalEncodeTime += performance.now() - startTime;
223
+ }
224
+ return codes;
225
+ };
226
+ /**
227
+ * Decode quantized codes back to approximate vector
228
+ */
229
+ ProductQuantizer.prototype.decode = function (codes) {
230
+ if (!this.trained) {
231
+ throw new Error('Quantizer must be trained before decoding');
232
+ }
233
+ if (codes.length !== this.config.subvectors) {
234
+ throw new Error("Code length (".concat(codes.length, ") does not match subvectors (").concat(this.config.subvectors, ")"));
235
+ }
236
+ var startTime = performance.now();
237
+ var vector = [];
238
+ for (var m = 0; m < this.config.subvectors; m++) {
239
+ var code = codes[m];
240
+ var centroid = this.codebooks[m].centroids[code];
241
+ vector.push.apply(vector, centroid);
242
+ }
243
+ if (this.config.enableStats) {
244
+ this.stats.decodeCount++;
245
+ this.stats.totalDecodeTime += performance.now() - startTime;
246
+ }
247
+ return vector;
248
+ };
249
+ /**
250
+ * Compute asymmetric distance for faster search
251
+ * Compare query vector directly with quantized database vectors
252
+ */
253
+ ProductQuantizer.prototype.asymmetricDistance = function (query, codes) {
254
+ if (!this.trained) {
255
+ throw new Error('Quantizer must be trained before computing distances');
256
+ }
257
+ var distance = 0;
258
+ for (var m = 0; m < this.config.subvectors; m++) {
259
+ var start = m * this.subvectorDim;
260
+ var end = start + this.subvectorDim;
261
+ var querySubvector = query.slice(start, end);
262
+ var code = codes[m];
263
+ var centroid = this.codebooks[m].centroids[code];
264
+ distance += this.euclideanDistanceSquared(querySubvector, centroid);
265
+ }
266
+ return Math.sqrt(distance);
267
+ };
268
+ /**
269
+ * Euclidean distance between two vectors
270
+ */
271
+ ProductQuantizer.prototype.euclideanDistance = function (a, b) {
272
+ return Math.sqrt(this.euclideanDistanceSquared(a, b));
273
+ };
274
+ /**
275
+ * Squared Euclidean distance (faster, no sqrt)
276
+ */
277
+ ProductQuantizer.prototype.euclideanDistanceSquared = function (a, b) {
278
+ var sum = 0;
279
+ for (var i = 0; i < a.length; i++) {
280
+ var diff = a[i] - b[i];
281
+ sum += diff * diff;
282
+ }
283
+ return sum;
284
+ };
285
+ /**
286
+ * Get compression statistics
287
+ */
288
+ ProductQuantizer.prototype.getStats = function () {
289
+ var originalSize = this.config.dimensions * 4; // 4 bytes per float32
290
+ var compressedSize = this.config.subvectors; // 1 byte per subvector
291
+ return {
292
+ originalSize: originalSize,
293
+ compressedSize: compressedSize,
294
+ compressionRatio: originalSize / compressedSize,
295
+ encodeCount: this.stats.encodeCount,
296
+ decodeCount: this.stats.decodeCount,
297
+ avgEncodeTime: this.stats.encodeCount > 0
298
+ ? this.stats.totalEncodeTime / this.stats.encodeCount
299
+ : 0,
300
+ avgDecodeTime: this.stats.decodeCount > 0
301
+ ? this.stats.totalDecodeTime / this.stats.decodeCount
302
+ : 0
303
+ };
304
+ };
305
+ /**
306
+ * Reset statistics
307
+ */
308
+ ProductQuantizer.prototype.resetStats = function () {
309
+ this.stats = {
310
+ encodeCount: 0,
311
+ decodeCount: 0,
312
+ totalEncodeTime: 0,
313
+ totalDecodeTime: 0
314
+ };
315
+ };
316
+ /**
317
+ * Check if quantizer is trained
318
+ */
319
+ ProductQuantizer.prototype.isTrained = function () {
320
+ return this.trained;
321
+ };
322
+ /**
323
+ * Export codebooks for persistence
324
+ */
325
+ ProductQuantizer.prototype.exportCodebooks = function () {
326
+ return this.codebooks.map(function (cb) { return ({
327
+ centroids: cb.centroids.map(function (c) { return __spreadArray([], c, true); })
328
+ }); });
329
+ };
330
+ /**
331
+ * Import codebooks from persistence
332
+ */
333
+ ProductQuantizer.prototype.importCodebooks = function (codebooks) {
334
+ if (codebooks.length !== this.config.subvectors) {
335
+ throw new Error("Codebook count (".concat(codebooks.length, ") does not match subvectors (").concat(this.config.subvectors, ")"));
336
+ }
337
+ this.codebooks = codebooks.map(function (cb) { return ({
338
+ centroids: cb.centroids.map(function (c) { return __spreadArray([], c, true); })
339
+ }); });
340
+ this.trained = true;
341
+ };
342
+ /**
343
+ * Get configuration
344
+ */
345
+ ProductQuantizer.prototype.getConfig = function () {
346
+ return __assign({}, this.config);
347
+ };
348
+ return ProductQuantizer;
349
+ }());
350
+ exports.ProductQuantizer = ProductQuantizer;