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.
- package/LICENSE +38 -0
- package/LICENSE-APACHE +190 -0
- package/LICENSE-MIT +21 -0
- package/README.md +953 -0
- package/bin/agentdb.js +485 -0
- package/bin/plugin-cli-wrapper.mjs +21 -0
- package/dist/cache/query-cache.d.ts +105 -0
- package/dist/cache/query-cache.d.ts.map +1 -0
- package/dist/cache/query-cache.js +224 -0
- package/dist/cache/query-cache.js.map +1 -0
- package/dist/cache/query-cache.mjs +219 -0
- package/dist/cli/cache/query-cache.d.ts +104 -0
- package/dist/cli/cache/query-cache.js +244 -0
- package/dist/cli/cli/db-commands.d.ts +48 -0
- package/dist/cli/cli/db-commands.js +613 -0
- package/dist/cli/commands.d.ts +7 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +113 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/commands.mjs +104 -0
- package/dist/cli/core/backend-interface.d.ts +70 -0
- package/dist/cli/core/backend-interface.js +15 -0
- package/dist/cli/core/native-backend.d.ts +140 -0
- package/dist/cli/core/native-backend.js +432 -0
- package/dist/cli/core/vector-db.d.ts +126 -0
- package/dist/cli/core/vector-db.js +338 -0
- package/dist/cli/core/wasm-backend.d.ts +95 -0
- package/dist/cli/core/wasm-backend.js +418 -0
- package/dist/cli/db-commands.d.ts +49 -0
- package/dist/cli/db-commands.d.ts.map +1 -0
- package/dist/cli/db-commands.js +533 -0
- package/dist/cli/db-commands.js.map +1 -0
- package/dist/cli/db-commands.mjs +522 -0
- package/dist/cli/generator.d.ts +11 -0
- package/dist/cli/generator.d.ts.map +1 -0
- package/dist/cli/generator.js +567 -0
- package/dist/cli/generator.js.map +1 -0
- package/dist/cli/generator.mjs +527 -0
- package/dist/cli/help.d.ts +18 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +676 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/help.mjs +667 -0
- package/dist/cli/index/hnsw.d.ts +164 -0
- package/dist/cli/index/hnsw.js +558 -0
- package/dist/cli/plugin-cli.d.ts +7 -0
- package/dist/cli/plugin-cli.d.ts.map +1 -0
- package/dist/cli/plugin-cli.js +295 -0
- package/dist/cli/plugin-cli.js.map +1 -0
- package/dist/cli/plugin-cli.mjs +289 -0
- package/dist/cli/quantization/product-quantization.d.ts +108 -0
- package/dist/cli/quantization/product-quantization.js +350 -0
- package/dist/cli/query/query-builder.d.ts +322 -0
- package/dist/cli/query/query-builder.js +600 -0
- package/dist/cli/templates.d.ts +14 -0
- package/dist/cli/templates.d.ts.map +1 -0
- package/dist/cli/templates.js +182 -0
- package/dist/cli/templates.js.map +1 -0
- package/dist/cli/templates.mjs +176 -0
- package/dist/cli/types/index.d.ts +116 -0
- package/dist/cli/types/index.js +5 -0
- package/dist/cli/types.d.ts +91 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +6 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli/types.mjs +4 -0
- package/dist/cli/wizard/index.d.ts +6 -0
- package/dist/cli/wizard/index.d.ts.map +1 -0
- package/dist/cli/wizard/index.js +138 -0
- package/dist/cli/wizard/index.js.map +1 -0
- package/dist/cli/wizard/index.mjs +131 -0
- package/dist/cli/wizard/prompts.d.ts +11 -0
- package/dist/cli/wizard/prompts.d.ts.map +1 -0
- package/dist/cli/wizard/prompts.js +482 -0
- package/dist/cli/wizard/prompts.js.map +1 -0
- package/dist/cli/wizard/prompts.mjs +470 -0
- package/dist/cli/wizard/validator.d.ts +13 -0
- package/dist/cli/wizard/validator.d.ts.map +1 -0
- package/dist/cli/wizard/validator.js +234 -0
- package/dist/cli/wizard/validator.js.map +1 -0
- package/dist/cli/wizard/validator.mjs +224 -0
- package/dist/core/backend-interface.d.ts +71 -0
- package/dist/core/backend-interface.d.ts.map +1 -0
- package/dist/core/backend-interface.js +16 -0
- package/dist/core/backend-interface.js.map +1 -0
- package/dist/core/backend-interface.mjs +12 -0
- package/dist/core/native-backend.d.ts +141 -0
- package/dist/core/native-backend.d.ts.map +1 -0
- package/dist/core/native-backend.js +457 -0
- package/dist/core/native-backend.js.map +1 -0
- package/dist/core/native-backend.mjs +449 -0
- package/dist/core/vector-db.d.ts +127 -0
- package/dist/core/vector-db.d.ts.map +1 -0
- package/dist/core/vector-db.js +266 -0
- package/dist/core/vector-db.js.map +1 -0
- package/dist/core/vector-db.mjs +261 -0
- package/dist/core/wasm-backend.d.ts +96 -0
- package/dist/core/wasm-backend.d.ts.map +1 -0
- package/dist/core/wasm-backend.js +393 -0
- package/dist/core/wasm-backend.js.map +1 -0
- package/dist/core/wasm-backend.mjs +385 -0
- package/dist/index/hnsw-optimized.d.ts +75 -0
- package/dist/index/hnsw-optimized.d.ts.map +1 -0
- package/dist/index/hnsw-optimized.js +412 -0
- package/dist/index/hnsw-optimized.js.map +1 -0
- package/dist/index/hnsw-optimized.mjs +407 -0
- package/dist/index/hnsw.d.ts +165 -0
- package/dist/index/hnsw.d.ts.map +1 -0
- package/dist/index/hnsw.js +521 -0
- package/dist/index/hnsw.js.map +1 -0
- package/dist/index/hnsw.mjs +516 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +63 -0
- package/dist/mcp-server.d.ts +27 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +789 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/mcp-server.mjs +784 -0
- package/dist/plugins/base-plugin.d.ts +114 -0
- package/dist/plugins/base-plugin.d.ts.map +1 -0
- package/dist/plugins/base-plugin.js +313 -0
- package/dist/plugins/base-plugin.js.map +1 -0
- package/dist/plugins/base-plugin.mjs +275 -0
- package/dist/plugins/implementations/active-learning.d.ts +135 -0
- package/dist/plugins/implementations/active-learning.d.ts.map +1 -0
- package/dist/plugins/implementations/active-learning.js +372 -0
- package/dist/plugins/implementations/active-learning.js.map +1 -0
- package/dist/plugins/implementations/active-learning.mjs +367 -0
- package/dist/plugins/implementations/actor-critic.d.ts +64 -0
- package/dist/plugins/implementations/actor-critic.d.ts.map +1 -0
- package/dist/plugins/implementations/actor-critic.js +363 -0
- package/dist/plugins/implementations/actor-critic.js.map +1 -0
- package/dist/plugins/implementations/actor-critic.mjs +358 -0
- package/dist/plugins/implementations/adversarial-training.d.ts +133 -0
- package/dist/plugins/implementations/adversarial-training.d.ts.map +1 -0
- package/dist/plugins/implementations/adversarial-training.js +409 -0
- package/dist/plugins/implementations/adversarial-training.js.map +1 -0
- package/dist/plugins/implementations/adversarial-training.mjs +404 -0
- package/dist/plugins/implementations/curriculum-learning.d.ts +132 -0
- package/dist/plugins/implementations/curriculum-learning.d.ts.map +1 -0
- package/dist/plugins/implementations/curriculum-learning.js +354 -0
- package/dist/plugins/implementations/curriculum-learning.js.map +1 -0
- package/dist/plugins/implementations/curriculum-learning.mjs +349 -0
- package/dist/plugins/implementations/decision-transformer.d.ts +77 -0
- package/dist/plugins/implementations/decision-transformer.d.ts.map +1 -0
- package/dist/plugins/implementations/decision-transformer.js +422 -0
- package/dist/plugins/implementations/decision-transformer.js.map +1 -0
- package/dist/plugins/implementations/decision-transformer.mjs +417 -0
- package/dist/plugins/implementations/federated-learning.d.ts +126 -0
- package/dist/plugins/implementations/federated-learning.d.ts.map +1 -0
- package/dist/plugins/implementations/federated-learning.js +436 -0
- package/dist/plugins/implementations/federated-learning.js.map +1 -0
- package/dist/plugins/implementations/federated-learning.mjs +431 -0
- package/dist/plugins/implementations/index.d.ts +30 -0
- package/dist/plugins/implementations/index.d.ts.map +1 -0
- package/dist/plugins/implementations/index.js +45 -0
- package/dist/plugins/implementations/index.js.map +1 -0
- package/dist/plugins/implementations/index.mjs +31 -0
- package/dist/plugins/implementations/multi-task-learning.d.ts +115 -0
- package/dist/plugins/implementations/multi-task-learning.d.ts.map +1 -0
- package/dist/plugins/implementations/multi-task-learning.js +369 -0
- package/dist/plugins/implementations/multi-task-learning.js.map +1 -0
- package/dist/plugins/implementations/multi-task-learning.mjs +364 -0
- package/dist/plugins/implementations/neural-architecture-search.d.ts +148 -0
- package/dist/plugins/implementations/neural-architecture-search.d.ts.map +1 -0
- package/dist/plugins/implementations/neural-architecture-search.js +379 -0
- package/dist/plugins/implementations/neural-architecture-search.js.map +1 -0
- package/dist/plugins/implementations/neural-architecture-search.mjs +374 -0
- package/dist/plugins/implementations/q-learning.d.ts +98 -0
- package/dist/plugins/implementations/q-learning.d.ts.map +1 -0
- package/dist/plugins/implementations/q-learning.js +435 -0
- package/dist/plugins/implementations/q-learning.js.map +1 -0
- package/dist/plugins/implementations/q-learning.mjs +430 -0
- package/dist/plugins/implementations/sarsa.d.ts +103 -0
- package/dist/plugins/implementations/sarsa.d.ts.map +1 -0
- package/dist/plugins/implementations/sarsa.js +347 -0
- package/dist/plugins/implementations/sarsa.js.map +1 -0
- package/dist/plugins/implementations/sarsa.mjs +342 -0
- package/dist/plugins/index.d.ts +107 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +179 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/index.mjs +168 -0
- package/dist/plugins/interface.d.ts +439 -0
- package/dist/plugins/interface.d.ts.map +1 -0
- package/dist/plugins/interface.js +12 -0
- package/dist/plugins/interface.js.map +1 -0
- package/dist/plugins/interface.mjs +10 -0
- package/dist/plugins/learning-plugin.interface.d.ts +257 -0
- package/dist/plugins/learning-plugin.interface.d.ts.map +1 -0
- package/dist/plugins/learning-plugin.interface.js +7 -0
- package/dist/plugins/learning-plugin.interface.js.map +1 -0
- package/dist/plugins/learning-plugin.interface.mjs +5 -0
- package/dist/plugins/plugin-exports.d.ts +71 -0
- package/dist/plugins/plugin-exports.d.ts.map +1 -0
- package/dist/plugins/plugin-exports.js +78 -0
- package/dist/plugins/plugin-exports.js.map +1 -0
- package/dist/plugins/plugin-exports.mjs +69 -0
- package/dist/plugins/registry.d.ts +206 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +365 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/plugins/registry.mjs +356 -0
- package/dist/plugins/validator.d.ts +63 -0
- package/dist/plugins/validator.d.ts.map +1 -0
- package/dist/plugins/validator.js +464 -0
- package/dist/plugins/validator.js.map +1 -0
- package/dist/plugins/validator.mjs +458 -0
- package/dist/quantization/binary-quantization.d.ts +104 -0
- package/dist/quantization/binary-quantization.d.ts.map +1 -0
- package/dist/quantization/binary-quantization.js +246 -0
- package/dist/quantization/binary-quantization.js.map +1 -0
- package/dist/quantization/binary-quantization.mjs +240 -0
- package/dist/quantization/optimized-pq.d.ts +138 -0
- package/dist/quantization/optimized-pq.d.ts.map +1 -0
- package/dist/quantization/optimized-pq.js +320 -0
- package/dist/quantization/optimized-pq.js.map +1 -0
- package/dist/quantization/optimized-pq.mjs +313 -0
- package/dist/quantization/product-quantization.d.ts +109 -0
- package/dist/quantization/product-quantization.d.ts.map +1 -0
- package/dist/quantization/product-quantization.js +287 -0
- package/dist/quantization/product-quantization.js.map +1 -0
- package/dist/quantization/product-quantization.mjs +282 -0
- package/dist/quantization/scalar-quantization.d.ts +100 -0
- package/dist/quantization/scalar-quantization.d.ts.map +1 -0
- package/dist/quantization/scalar-quantization.js +324 -0
- package/dist/quantization/scalar-quantization.js.map +1 -0
- package/dist/quantization/scalar-quantization.mjs +319 -0
- package/dist/query/index.d.ts +6 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +9 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/index.mjs +4 -0
- package/dist/query/query-builder.d.ts +323 -0
- package/dist/query/query-builder.d.ts.map +1 -0
- package/dist/query/query-builder.js +524 -0
- package/dist/query/query-builder.js.map +1 -0
- package/dist/query/query-builder.mjs +519 -0
- package/dist/reasoning/context-synthesizer.d.ts +57 -0
- package/dist/reasoning/context-synthesizer.d.ts.map +1 -0
- package/dist/reasoning/context-synthesizer.js +224 -0
- package/dist/reasoning/context-synthesizer.js.map +1 -0
- package/dist/reasoning/context-synthesizer.mjs +219 -0
- package/dist/reasoning/experience-curator.d.ts +66 -0
- package/dist/reasoning/experience-curator.d.ts.map +1 -0
- package/dist/reasoning/experience-curator.js +288 -0
- package/dist/reasoning/experience-curator.js.map +1 -0
- package/dist/reasoning/experience-curator.mjs +283 -0
- package/dist/reasoning/memory-optimizer.d.ts +69 -0
- package/dist/reasoning/memory-optimizer.d.ts.map +1 -0
- package/dist/reasoning/memory-optimizer.js +331 -0
- package/dist/reasoning/memory-optimizer.js.map +1 -0
- package/dist/reasoning/memory-optimizer.mjs +326 -0
- package/dist/reasoning/pattern-matcher.d.ts +59 -0
- package/dist/reasoning/pattern-matcher.d.ts.map +1 -0
- package/dist/reasoning/pattern-matcher.js +229 -0
- package/dist/reasoning/pattern-matcher.js.map +1 -0
- package/dist/reasoning/pattern-matcher.mjs +224 -0
- package/dist/reasoningbank/adapter/agentdb-adapter.d.ts +118 -0
- package/dist/reasoningbank/adapter/agentdb-adapter.d.ts.map +1 -0
- package/dist/reasoningbank/adapter/agentdb-adapter.js +477 -0
- package/dist/reasoningbank/adapter/agentdb-adapter.js.map +1 -0
- package/dist/reasoningbank/adapter/types.d.ts +113 -0
- package/dist/reasoningbank/adapter/types.d.ts.map +1 -0
- package/dist/reasoningbank/adapter/types.js +9 -0
- package/dist/reasoningbank/adapter/types.js.map +1 -0
- package/dist/reasoningbank/cli/commands.d.ts +16 -0
- package/dist/reasoningbank/cli/commands.d.ts.map +1 -0
- package/dist/reasoningbank/cli/commands.js +272 -0
- package/dist/reasoningbank/cli/commands.js.map +1 -0
- package/dist/reasoningbank/mcp/agentdb-tools.d.ts +319 -0
- package/dist/reasoningbank/mcp/agentdb-tools.d.ts.map +1 -0
- package/dist/reasoningbank/mcp/agentdb-tools.js +301 -0
- package/dist/reasoningbank/mcp/agentdb-tools.js.map +1 -0
- package/dist/reasoningbank/migration/migrate.d.ts +25 -0
- package/dist/reasoningbank/migration/migrate.d.ts.map +1 -0
- package/dist/reasoningbank/migration/migrate.js +178 -0
- package/dist/reasoningbank/migration/migrate.js.map +1 -0
- package/dist/reasoningbank/reasoning/context-synthesizer.d.ts +37 -0
- package/dist/reasoningbank/reasoning/context-synthesizer.d.ts.map +1 -0
- package/dist/reasoningbank/reasoning/context-synthesizer.js +114 -0
- package/dist/reasoningbank/reasoning/context-synthesizer.js.map +1 -0
- package/dist/reasoningbank/reasoning/experience-curator.d.ts +39 -0
- package/dist/reasoningbank/reasoning/experience-curator.d.ts.map +1 -0
- package/dist/reasoningbank/reasoning/experience-curator.js +98 -0
- package/dist/reasoningbank/reasoning/experience-curator.js.map +1 -0
- package/dist/reasoningbank/reasoning/memory-optimizer.d.ts +44 -0
- package/dist/reasoningbank/reasoning/memory-optimizer.d.ts.map +1 -0
- package/dist/reasoningbank/reasoning/memory-optimizer.js +184 -0
- package/dist/reasoningbank/reasoning/memory-optimizer.js.map +1 -0
- package/dist/reasoningbank/reasoning/pattern-matcher.d.ts +40 -0
- package/dist/reasoningbank/reasoning/pattern-matcher.d.ts.map +1 -0
- package/dist/reasoningbank/reasoning/pattern-matcher.js +87 -0
- package/dist/reasoningbank/reasoning/pattern-matcher.js.map +1 -0
- package/dist/reasoningbank/sync/quic-sync.d.ts +77 -0
- package/dist/reasoningbank/sync/quic-sync.d.ts.map +1 -0
- package/dist/reasoningbank/sync/quic-sync.js +165 -0
- package/dist/reasoningbank/sync/quic-sync.js.map +1 -0
- package/dist/sync/conflict.d.ts +78 -0
- package/dist/sync/conflict.d.ts.map +1 -0
- package/dist/sync/conflict.js +202 -0
- package/dist/sync/conflict.js.map +1 -0
- package/dist/sync/conflict.mjs +196 -0
- package/dist/sync/coordinator.d.ts +111 -0
- package/dist/sync/coordinator.d.ts.map +1 -0
- package/dist/sync/coordinator.js +256 -0
- package/dist/sync/coordinator.js.map +1 -0
- package/dist/sync/coordinator.mjs +250 -0
- package/dist/sync/delta.d.ts +81 -0
- package/dist/sync/delta.d.ts.map +1 -0
- package/dist/sync/delta.js +245 -0
- package/dist/sync/delta.js.map +1 -0
- package/dist/sync/delta.mjs +238 -0
- package/dist/sync/index.d.ts +11 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +22 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/index.mjs +9 -0
- package/dist/sync/quic-sync.d.ts +81 -0
- package/dist/sync/quic-sync.d.ts.map +1 -0
- package/dist/sync/quic-sync.js +329 -0
- package/dist/sync/quic-sync.js.map +1 -0
- package/dist/sync/quic-sync.mjs +323 -0
- package/dist/sync/types.d.ts +168 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +8 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/sync/types.mjs +6 -0
- package/dist/types/index.d.ts +117 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/index.mjs +4 -0
- package/dist/wasm-loader.d.ts +32 -0
- package/dist/wasm-loader.d.ts.map +1 -0
- package/dist/wasm-loader.js +75 -0
- package/dist/wasm-loader.js.map +1 -0
- package/dist/wasm-loader.mjs +64 -0
- package/examples/adaptive-learning.ts +284 -0
- package/examples/browser/README.md +732 -0
- package/examples/browser/adaptive-recommendations/index.html +427 -0
- package/examples/browser/collaborative-filtering/index.html +310 -0
- package/examples/browser/continual-learning/index.html +736 -0
- package/examples/browser/experience-replay/index.html +616 -0
- package/examples/browser/index.html +369 -0
- package/examples/browser/meta-learning/index.html +789 -0
- package/examples/browser/neuro-symbolic/index.html +692 -0
- package/examples/browser/pattern-learning/index.html +620 -0
- package/examples/browser/quantum-inspired/index.html +728 -0
- package/examples/browser/rag/index.html +624 -0
- package/examples/browser/swarm-intelligence/index.html +811 -0
- package/examples/browser-basic.html +170 -0
- package/examples/hnsw-example.ts +148 -0
- package/examples/node-basic.js +70 -0
- package/examples/quic-sync-example.ts +310 -0
- package/examples/quick-start.js +68 -0
- package/examples/wasm-example.ts +222 -0
- 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"}
|