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,282 @@
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 class ProductQuantizer {
20
+ constructor(config) {
21
+ this.codebooks = [];
22
+ this.trained = false;
23
+ // Statistics
24
+ this.stats = {
25
+ encodeCount: 0,
26
+ decodeCount: 0,
27
+ totalEncodeTime: 0,
28
+ totalDecodeTime: 0
29
+ };
30
+ this.config = {
31
+ dimensions: config.dimensions,
32
+ subvectors: config.subvectors,
33
+ bits: config.bits,
34
+ kmeansIterations: config.kmeansIterations ?? 20,
35
+ enableStats: config.enableStats ?? true
36
+ };
37
+ if (config.dimensions % config.subvectors !== 0) {
38
+ throw new Error(`Dimensions (${config.dimensions}) must be divisible by subvectors (${config.subvectors})`);
39
+ }
40
+ this.subvectorDim = config.dimensions / config.subvectors;
41
+ }
42
+ /**
43
+ * Train codebooks using k-means clustering on training vectors
44
+ */
45
+ async train(trainingVectors) {
46
+ if (trainingVectors.length === 0) {
47
+ throw new Error('Training vectors cannot be empty');
48
+ }
49
+ const numCentroids = Math.pow(2, this.config.bits);
50
+ this.codebooks = [];
51
+ // Train one codebook per subvector
52
+ for (let m = 0; m < this.config.subvectors; m++) {
53
+ const subvectors = this.extractSubvectors(trainingVectors, m);
54
+ const centroids = this.trainKMeans(subvectors, numCentroids);
55
+ this.codebooks.push({ centroids });
56
+ }
57
+ this.trained = true;
58
+ }
59
+ /**
60
+ * Extract subvectors for a specific segment
61
+ */
62
+ extractSubvectors(vectors, segmentIndex) {
63
+ const start = segmentIndex * this.subvectorDim;
64
+ const end = start + this.subvectorDim;
65
+ return vectors.map(v => v.slice(start, end));
66
+ }
67
+ /**
68
+ * Train k-means clustering to create centroids
69
+ */
70
+ trainKMeans(vectors, k) {
71
+ const n = vectors.length;
72
+ const d = vectors[0].length;
73
+ // Initialize centroids randomly
74
+ const centroids = [];
75
+ const indices = new Set();
76
+ while (centroids.length < Math.min(k, n)) {
77
+ const idx = Math.floor(Math.random() * n);
78
+ if (!indices.has(idx)) {
79
+ centroids.push([...vectors[idx]]);
80
+ indices.add(idx);
81
+ }
82
+ }
83
+ // K-means iterations
84
+ for (let iter = 0; iter < this.config.kmeansIterations; iter++) {
85
+ // Assignment step
86
+ const assignments = new Array(n).fill(0);
87
+ for (let i = 0; i < n; i++) {
88
+ let minDist = Infinity;
89
+ let bestCluster = 0;
90
+ for (let c = 0; c < centroids.length; c++) {
91
+ const dist = this.euclideanDistance(vectors[i], centroids[c]);
92
+ if (dist < minDist) {
93
+ minDist = dist;
94
+ bestCluster = c;
95
+ }
96
+ }
97
+ assignments[i] = bestCluster;
98
+ }
99
+ // Update step
100
+ const clusterSums = Array(centroids.length)
101
+ .fill(0)
102
+ .map(() => Array(d).fill(0));
103
+ const clusterCounts = Array(centroids.length).fill(0);
104
+ for (let i = 0; i < n; i++) {
105
+ const cluster = assignments[i];
106
+ clusterCounts[cluster]++;
107
+ for (let j = 0; j < d; j++) {
108
+ clusterSums[cluster][j] += vectors[i][j];
109
+ }
110
+ }
111
+ // Update centroids
112
+ for (let c = 0; c < centroids.length; c++) {
113
+ if (clusterCounts[c] > 0) {
114
+ for (let j = 0; j < d; j++) {
115
+ centroids[c][j] = clusterSums[c][j] / clusterCounts[c];
116
+ }
117
+ }
118
+ }
119
+ }
120
+ // Fill remaining centroids if k > n
121
+ while (centroids.length < k) {
122
+ centroids.push(Array(d).fill(0));
123
+ }
124
+ return centroids;
125
+ }
126
+ /**
127
+ * Encode vector into quantized codes
128
+ */
129
+ encode(vector) {
130
+ if (!this.trained) {
131
+ throw new Error('Quantizer must be trained before encoding');
132
+ }
133
+ if (vector.length !== this.config.dimensions) {
134
+ throw new Error(`Vector dimension (${vector.length}) does not match config (${this.config.dimensions})`);
135
+ }
136
+ const startTime = performance.now();
137
+ const codes = new Uint8Array(this.config.subvectors);
138
+ for (let m = 0; m < this.config.subvectors; m++) {
139
+ const start = m * this.subvectorDim;
140
+ const end = start + this.subvectorDim;
141
+ const subvector = vector.slice(start, end);
142
+ // Find nearest centroid
143
+ let minDist = Infinity;
144
+ let bestCode = 0;
145
+ for (let c = 0; c < this.codebooks[m].centroids.length; c++) {
146
+ const dist = this.euclideanDistance(subvector, this.codebooks[m].centroids[c]);
147
+ if (dist < minDist) {
148
+ minDist = dist;
149
+ bestCode = c;
150
+ }
151
+ }
152
+ codes[m] = bestCode;
153
+ }
154
+ if (this.config.enableStats) {
155
+ this.stats.encodeCount++;
156
+ this.stats.totalEncodeTime += performance.now() - startTime;
157
+ }
158
+ return codes;
159
+ }
160
+ /**
161
+ * Decode quantized codes back to approximate vector
162
+ */
163
+ decode(codes) {
164
+ if (!this.trained) {
165
+ throw new Error('Quantizer must be trained before decoding');
166
+ }
167
+ if (codes.length !== this.config.subvectors) {
168
+ throw new Error(`Code length (${codes.length}) does not match subvectors (${this.config.subvectors})`);
169
+ }
170
+ const startTime = performance.now();
171
+ const vector = [];
172
+ for (let m = 0; m < this.config.subvectors; m++) {
173
+ const code = codes[m];
174
+ const centroid = this.codebooks[m].centroids[code];
175
+ vector.push(...centroid);
176
+ }
177
+ if (this.config.enableStats) {
178
+ this.stats.decodeCount++;
179
+ this.stats.totalDecodeTime += performance.now() - startTime;
180
+ }
181
+ return vector;
182
+ }
183
+ /**
184
+ * Compute asymmetric distance for faster search
185
+ * Compare query vector directly with quantized database vectors
186
+ */
187
+ asymmetricDistance(query, codes) {
188
+ if (!this.trained) {
189
+ throw new Error('Quantizer must be trained before computing distances');
190
+ }
191
+ let distance = 0;
192
+ for (let m = 0; m < this.config.subvectors; m++) {
193
+ const start = m * this.subvectorDim;
194
+ const end = start + this.subvectorDim;
195
+ const querySubvector = query.slice(start, end);
196
+ const code = codes[m];
197
+ const centroid = this.codebooks[m].centroids[code];
198
+ distance += this.euclideanDistanceSquared(querySubvector, centroid);
199
+ }
200
+ return Math.sqrt(distance);
201
+ }
202
+ /**
203
+ * Euclidean distance between two vectors
204
+ */
205
+ euclideanDistance(a, b) {
206
+ return Math.sqrt(this.euclideanDistanceSquared(a, b));
207
+ }
208
+ /**
209
+ * Squared Euclidean distance (faster, no sqrt)
210
+ */
211
+ euclideanDistanceSquared(a, b) {
212
+ let sum = 0;
213
+ for (let i = 0; i < a.length; i++) {
214
+ const diff = a[i] - b[i];
215
+ sum += diff * diff;
216
+ }
217
+ return sum;
218
+ }
219
+ /**
220
+ * Get compression statistics
221
+ */
222
+ getStats() {
223
+ const originalSize = this.config.dimensions * 4; // 4 bytes per float32
224
+ const compressedSize = this.config.subvectors; // 1 byte per subvector
225
+ return {
226
+ originalSize,
227
+ compressedSize,
228
+ compressionRatio: originalSize / compressedSize,
229
+ encodeCount: this.stats.encodeCount,
230
+ decodeCount: this.stats.decodeCount,
231
+ avgEncodeTime: this.stats.encodeCount > 0
232
+ ? this.stats.totalEncodeTime / this.stats.encodeCount
233
+ : 0,
234
+ avgDecodeTime: this.stats.decodeCount > 0
235
+ ? this.stats.totalDecodeTime / this.stats.decodeCount
236
+ : 0
237
+ };
238
+ }
239
+ /**
240
+ * Reset statistics
241
+ */
242
+ resetStats() {
243
+ this.stats = {
244
+ encodeCount: 0,
245
+ decodeCount: 0,
246
+ totalEncodeTime: 0,
247
+ totalDecodeTime: 0
248
+ };
249
+ }
250
+ /**
251
+ * Check if quantizer is trained
252
+ */
253
+ isTrained() {
254
+ return this.trained;
255
+ }
256
+ /**
257
+ * Export codebooks for persistence
258
+ */
259
+ exportCodebooks() {
260
+ return this.codebooks.map(cb => ({
261
+ centroids: cb.centroids.map(c => [...c])
262
+ }));
263
+ }
264
+ /**
265
+ * Import codebooks from persistence
266
+ */
267
+ importCodebooks(codebooks) {
268
+ if (codebooks.length !== this.config.subvectors) {
269
+ throw new Error(`Codebook count (${codebooks.length}) does not match subvectors (${this.config.subvectors})`);
270
+ }
271
+ this.codebooks = codebooks.map(cb => ({
272
+ centroids: cb.centroids.map(c => [...c])
273
+ }));
274
+ this.trained = true;
275
+ }
276
+ /**
277
+ * Get configuration
278
+ */
279
+ getConfig() {
280
+ return { ...this.config };
281
+ }
282
+ }
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Scalar Quantization - Simple yet powerful vector compression
3
+ *
4
+ * Achieves 85-95% accuracy with 4-16x compression by quantizing each dimension independently.
5
+ * Unlike Product Quantization, works excellently with ANY data distribution including random data.
6
+ *
7
+ * Key advantages:
8
+ * 1. Simple per-dimension min/max scaling
9
+ * 2. No clustering required (faster training)
10
+ * 3. Better accuracy on random/diverse data
11
+ * 4. Fast encode/decode (< 1ms per vector)
12
+ * 5. Guaranteed compression ratio
13
+ *
14
+ * Supported bit depths:
15
+ * - 4-bit: 16 levels per dimension, 8x compression
16
+ * - 8-bit: 256 levels per dimension, 4x compression
17
+ * - 16-bit: 65536 levels per dimension, 2x compression
18
+ */
19
+ export interface ScalarQuantizerConfig {
20
+ dimensions: number;
21
+ bits: 4 | 8 | 16;
22
+ normalize?: boolean;
23
+ }
24
+ export interface AccuracyMetrics {
25
+ avgError: number;
26
+ maxError: number;
27
+ minError: number;
28
+ rmse: number;
29
+ accuracy: number;
30
+ recall10: number;
31
+ }
32
+ export interface ScalarQuantizationStats {
33
+ dimensions: number;
34
+ bits: 4 | 8 | 16;
35
+ levels: number;
36
+ compressionRatio: number;
37
+ bytesPerVector: number;
38
+ trained: boolean;
39
+ minValues: number[];
40
+ maxValues: number[];
41
+ ranges: number[];
42
+ }
43
+ /**
44
+ * Scalar Quantizer - Per-dimension quantization for guaranteed accuracy
45
+ *
46
+ * Works by tracking min/max for each dimension independently, then
47
+ * mapping values to discrete levels (16, 256, or 65536 levels).
48
+ */
49
+ export declare class ScalarQuantizer {
50
+ private dimensions;
51
+ private bits;
52
+ private normalize;
53
+ private levels;
54
+ private minValues;
55
+ private maxValues;
56
+ private ranges;
57
+ private trained;
58
+ constructor(config: ScalarQuantizerConfig);
59
+ /**
60
+ * Train the quantizer by finding min/max for each dimension
61
+ */
62
+ train(vectors: number[][]): Promise<void>;
63
+ /**
64
+ * Encode a vector to quantized codes
65
+ */
66
+ encode(vector: number[]): Uint8Array | Uint16Array;
67
+ /**
68
+ * Decode quantized codes back to a vector
69
+ */
70
+ decode(codes: Uint8Array | Uint16Array): number[];
71
+ /**
72
+ * Calculate asymmetric distance between query vector and quantized codes
73
+ * This is more accurate than symmetric distance for search
74
+ */
75
+ asymmetricDistance(query: number[], codes: Uint8Array | Uint16Array): number;
76
+ /**
77
+ * Evaluate accuracy on test vectors
78
+ */
79
+ evaluateAccuracy(testVectors: number[][]): AccuracyMetrics;
80
+ /**
81
+ * Get quantizer statistics
82
+ */
83
+ getStats(): ScalarQuantizationStats;
84
+ /**
85
+ * Check if quantizer is trained
86
+ */
87
+ isTrained(): boolean;
88
+ private encode4Bit;
89
+ private decode4Bit;
90
+ private encode8Bit;
91
+ private decode8Bit;
92
+ private encode16Bit;
93
+ private decode16Bit;
94
+ private normalizeVector;
95
+ private euclideanDistance;
96
+ private calculateRecall10;
97
+ private getCompressionRatio;
98
+ private getBytesPerVector;
99
+ }
100
+ //# sourceMappingURL=scalar-quantization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scalar-quantization.d.ts","sourceRoot":"","sources":["../../src/quantization/scalar-quantization.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;GAKG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAW;IAC5B,OAAO,CAAC,SAAS,CAAW;IAC5B,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,OAAO,CAAkB;gBAErB,MAAM,EAAE,qBAAqB;IAUzC;;OAEG;IACG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAuC/C;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,GAAG,WAAW;IAsBlD;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,GAAG,MAAM,EAAE;IAejD;;;OAGG;IACH,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,UAAU,GAAG,WAAW,GAAG,MAAM;IAK5E;;OAEG;IACH,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,GAAG,eAAe;IAiD1D;;OAEG;IACH,QAAQ,IAAI,uBAAuB;IAcnC;;OAEG;IACH,SAAS,IAAI,OAAO;IAMpB,OAAO,CAAC,UAAU;IAsBlB,OAAO,CAAC,UAAU;IAkBlB,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,iBAAiB;IAuCzB,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,iBAAiB;CAS1B"}