turboquant-wasm 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 TurboQuant
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,88 @@
1
+ # TurboQuant WASM
2
+
3
+ WASM + relaxed SIMD build of [botirk38/turboquant](https://github.com/botirk38/turboquant) for browsers and Node.js.
4
+
5
+ Based on the paper "TurboQuant: Online Vector Quantization with Near-optimal Distortion Rate".
6
+
7
+ ## What this adds
8
+
9
+ - **npm package** with embedded WASM — `npm install turboquant-wasm`
10
+ - **Relaxed SIMD** — `@mulAdd` FMA maps to `f32x4.relaxed_madd`
11
+ - **SIMD-vectorized** QJL sign packing/unpacking and scaling
12
+ - **TypeScript API** — `TurboQuant.init()` / `encode()` / `decode()` / `dot()`
13
+ - **Golden-value tests** — byte-identical output with the reference Zig implementation
14
+
15
+ ## Browser Requirements
16
+
17
+ The WASM binary uses relaxed SIMD instructions:
18
+
19
+ | Runtime | Minimum Version |
20
+ |---------|----------------|
21
+ | Chrome | 114+ |
22
+ | Firefox | 128+ |
23
+ | Safari | 18+ |
24
+ | Node.js | 20+ |
25
+
26
+ ## Quick Start
27
+
28
+ ```ts
29
+ import { TurboQuant } from "turboquant-wasm";
30
+
31
+ const tq = await TurboQuant.init({ dim: 1024, seed: 42 });
32
+
33
+ // Compress a vector (~3 bits/dim, ~6x compression)
34
+ const compressed = tq.encode(myFloat32Array);
35
+
36
+ // Decode back
37
+ const decoded = tq.decode(compressed);
38
+
39
+ // Fast dot product without decoding
40
+ const score = tq.dot(queryVector, compressed);
41
+
42
+ tq.destroy();
43
+ ```
44
+
45
+ ## API
46
+
47
+ ```ts
48
+ class TurboQuant {
49
+ static async init(config: { dim: number; seed: number }): Promise<TurboQuant>;
50
+ encode(vector: Float32Array): Uint8Array;
51
+ decode(compressed: Uint8Array): Float32Array;
52
+ dot(query: Float32Array, compressed: Uint8Array): number;
53
+ destroy(): void;
54
+ }
55
+ ```
56
+
57
+ ## Building
58
+
59
+ ```bash
60
+ # Run tests
61
+ zig test -target aarch64-macos src/turboquant.zig
62
+
63
+ # Full npm build (zig -> wasm-opt -> base64 embed -> bun + tsc)
64
+ bun run build
65
+
66
+ # Build WASM only
67
+ bun run build:zig
68
+ ```
69
+
70
+ Requires Zig 0.15.2 and Bun.
71
+
72
+ ## Quality
73
+
74
+ Encoding preserves inner products — verified by golden-value tests and distortion bounds:
75
+
76
+ - **MSE** decreases with dimension (unit vectors)
77
+ - **Bits/dim** is ~4.5 (payload only, excluding 22-byte header)
78
+ - **Dot product preservation** — mean absolute error < 1.0 for unit vectors at dim=128
79
+ - **Bit-identical** output with [botirk38/turboquant](https://github.com/botirk38/turboquant) for same input + seed
80
+
81
+ ## Credits
82
+
83
+ - [botirk38/turboquant](https://github.com/botirk38/turboquant) — original Zig implementation
84
+ - Google's TurboQuant paper — algorithm design
85
+
86
+ ## License
87
+
88
+ MIT
@@ -0,0 +1,66 @@
1
+ /**
2
+ * TurboQuant — WASM SIMD vector compression (3 bits/dim)
3
+ *
4
+ * Architecture:
5
+ * JS Float32Array -> [Zig WASM + relaxed SIMD] -> compressed bytes
6
+ *
7
+ * The Zig engine (turboquant.wasm) compresses vectors using polar + QJL
8
+ * quantization with Gaussian QR rotation, all SIMD-accelerated.
9
+ *
10
+ * Browser requirements:
11
+ * - WASM SIMD128: Chrome 91+, Firefox 89+, Safari 16.4+
12
+ * - WASM Relaxed SIMD: Chrome 114+, Firefox 128+, Safari 18+
13
+ *
14
+ * Usage:
15
+ * import { TurboQuant } from "turboquant";
16
+ * const tq = await TurboQuant.init({ dim: 1024, seed: 42 });
17
+ * const compressed = tq.encode(myFloat32Array);
18
+ * const score = tq.dot(queryVector, compressed);
19
+ * tq.destroy();
20
+ */
21
+ export interface TurboQuantConfig {
22
+ /** Vector dimension (must be a power of 2). */
23
+ dim: number;
24
+ /** Deterministic seed for rotation matrix. */
25
+ seed: number;
26
+ /** Optional external WASM source (Response, Promise<Response>, or ArrayBuffer). */
27
+ wasm?: Response | Promise<Response> | BufferSource;
28
+ }
29
+ export declare class TurboQuant {
30
+ #private;
31
+ readonly dim: number;
32
+ private constructor();
33
+ /**
34
+ * Create a TurboQuant engine.
35
+ *
36
+ * ```ts
37
+ * const tq = await TurboQuant.init({ dim: 1024, seed: 42 });
38
+ * ```
39
+ */
40
+ static init(config: TurboQuantConfig): Promise<TurboQuant>;
41
+ /**
42
+ * Compress a float32 vector (~3 bits/dim).
43
+ * @param vector - Float32Array of length `dim`
44
+ * @returns Compressed bytes
45
+ */
46
+ encode(vector: Float32Array): Uint8Array;
47
+ /**
48
+ * Decompress back to a float32 vector.
49
+ * @param compressed - Bytes from `encode()`
50
+ * @returns Reconstructed Float32Array
51
+ */
52
+ decode(compressed: Uint8Array): Float32Array;
53
+ /**
54
+ * Estimate dot product between a query and compressed vector.
55
+ * Faster than decode + manual dot — operates directly on compressed bytes.
56
+ *
57
+ * @param query - Float32Array of length `dim`
58
+ * @param compressed - Bytes from `encode()`
59
+ * @returns Estimated inner product
60
+ */
61
+ dot(query: Float32Array, compressed: Uint8Array): number;
62
+ /** Release engine resources. Call when done. */
63
+ destroy(): void;
64
+ }
65
+ export default TurboQuant;
66
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/js/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAkGH,MAAM,WAAW,gBAAgB;IAC/B,+CAA+C;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,mFAAmF;IACnF,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAC;CACpD;AAED,qBAAa,UAAU;;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAIrB,OAAO;IAMP;;;;;;OAMG;WACU,IAAI,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IAWhE;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,UAAU;IAqBxC;;;;OAIG;IACH,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,YAAY;IAkB5C;;;;;;;OAOG;IACH,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,GAAG,MAAM;IAsBxD,gDAAgD;IAChD,OAAO,IAAI,IAAI;CAGhB;AAED,eAAe,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ var R="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AiABQRBqJABBACACIAAbCxMAIAEEQCABIAAgAUEAIAEQBgsLNwECfyMAQRBrIgEkACABQQRqQcCBgAggABACIAEvAQwhACABKAIEIQIgAUEQaiQAQQAgAiAAGwsNAEHAgYAIIAAgARABC1cBAn9CAUEgIABBAWtnayIBrYanIQAgAUH//wNxQQJ0QYiZgAhqIgIoAgAiAQRAIAIgAEEQdCABakEEaygCADYCACABDwsgAEAAIgBBEHRBACAAQX9HGwsDAAALxAICA34CfwJAAkAgACAAYg0AIAC9IgJC////////////AINCgICAgICAgPj/AFoNACACQoCAgICAgICAgH+DIQNBCyACQgGGIgR5p2sgBEI1iKcgBEKAgICAgICAEFQbIQUgAUEATgRAQf4PIAVrIAFIBEBEAAAAAAAA8H8gAKYPCyABIAVqIgZBAEwEQCACIAGthiADhL8PCyAFQQBMBEAgAkEBIAVrrYZC/////////weDIAatQjSGhCADhL8PCyABrUI0hiACfL8PC0EAIAFrIQYgAUEAIAVrSg0BQUwgBWsgAUoEQCADvw8LIAJC/////////weDIAVBAEqtQjSGhCAGQQEgASAFamsiASABIAZKG0EBa0E/ca0iA4hCAXxCAYggAnogA1GtQn+Fg78gAKYhAAsgAA8LIAIgBq1CNIZ9vwtPAQF8IAAgAKIiAESBXgz9///fv6JEAAAAAAAA8D+gIAAgAKIiAURCOgXhU1WlP6KgIAAgAaIgAERpUO7gQpP5PqJEJx4P6IfAVr+goqC2C0sBAnwgACAAIACiIgGiIgIgASABoqIgAUSnRjuMh83GPqJEdOfK4vkAKr+goiAAIAIgAUSy+26JEBGBP6JEd6zLVFVVxb+goqCgtgsOACAAuyABu6IgArugtgsLyRcDAEGAgIAIC1ABAAAAAgAAAAMAAAAEAAAAAACAvy69uzMHnR+/HCZIv4rcYz7glHm/5qVmPwEm3r7kpWY/CCbePnPcYz7hlHk/Cp0fvxomSD8AAIC/Lr27swBB8ICACAsBBABBgoGACAveFoC/B50fv4rcYz7mpWY/5KVmP3PcYz4KnR+/AACAvy69uzMcJki/4JR5vwEm3r4IJt4+4ZR5PxomSD8uvbuzAAAAAAAAAAEDAAAABAAAAAQAAAAGAAAAg/miAERObgD8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";function k(I){if(typeof Buffer<"u"){let C=Buffer.from(I,"base64");return new Uint8Array(C.buffer,C.byteOffset,C.byteLength)}let A=atob(I),Q=new Uint8Array(A.length);for(let C=0;C<A.length;C++)Q[C]=A.charCodeAt(C);return Q}var E=null,D=null;async function S(){if(E)return E;if(D)return D;return D=(async()=>{let I=k(R),A=await WebAssembly.compile(I);return E=(await WebAssembly.instantiate(A,{})).exports,E})(),D}async function F(I){let A;if(I instanceof Response||I instanceof Promise)A=(await WebAssembly.instantiateStreaming(I,{})).instance;else A=(await WebAssembly.instantiate(I,{})).instance;return E=A.exports,E}function G(I,A){let Q=I.tq_alloc(A.byteLength);if(!Q)throw Error("TurboQuant: WASM alloc failed");return new Float32Array(I.memory.buffer,Q,A.length).set(A),Q}function h(I,A){let Q=I.tq_alloc(A.length);if(!Q)throw Error("TurboQuant: WASM alloc failed");return new Uint8Array(I.memory.buffer,Q,A.length).set(A),Q}function M(I){let A=I.tq_alloc(4);if(!A)throw Error("TurboQuant: WASM alloc failed");return A}function U(I,A){return new Uint32Array(I.memory.buffer,A,1)[0]}class i{dim;#A;#I;constructor(I,A,Q){this.#I=I,this.#A=A,this.dim=Q}static async init(I){let A=I.wasm?await F(I.wasm):await S(),Q=A.tq_engine_create(I.dim,I.seed);if(Q<0)throw Error(`TurboQuant: failed to create engine (dim=${I.dim}, seed=${I.seed})`);return new i(A,Q,I.dim)}encode(I){if(I.length!==this.dim)throw Error(`TurboQuant: expected ${this.dim} dims, got ${I.length}`);let A=this.#I,Q=G(A,I),C=M(A),g=A.tq_encode(this.#A,Q,this.dim,C),B=U(A,C);if(A.tq_free(Q,I.byteLength),A.tq_free(C,4),!g)throw Error("TurboQuant: encode failed");let w=new Uint8Array(A.memory.buffer,g,B).slice();return A.tq_free(g,B),w}decode(I){let A=this.#I,Q=h(A,I),C=M(A),g=A.tq_decode(this.#A,Q,I.length,C),B=U(A,C);if(A.tq_free(Q,I.length),A.tq_free(C,4),!g)throw Error("TurboQuant: decode failed");let w=new Float32Array(A.memory.buffer,g,B).slice();return A.tq_free_f32(g,B),w}dot(I,A){if(I.length!==this.dim)throw Error(`TurboQuant: expected ${this.dim} dims, got ${I.length}`);let Q=this.#I,C=G(Q,I),g=h(Q,A),B=Q.tq_dot(this.#A,C,this.dim,g,A.length);return Q.tq_free(C,I.byteLength),Q.tq_free(g,A.length),B}destroy(){this.#I.tq_engine_destroy(this.#A)}}var L=i;export{L as default,i as TurboQuant};
2
+
3
+ //# debugId=81E0699A263776DE64756E2164756E21
@@ -0,0 +1,11 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/js/turboquant-wasm.generated.ts", "../src/js/index.ts"],
4
+ "sourcesContent": [
5
+ "// AUTO-GENERATED by scripts/embed-wasm.mjs — do not edit\nexport const wasmBase64 = \"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AiABQRBqJABBACACIAAbCxMAIAEEQCABIAAgAUEAIAEQBgsLNwECfyMAQRBrIgEkACABQQRqQcCBgAggABACIAEvAQwhACABKAIEIQIgAUEQaiQAQQAgAiAAGwsNAEHAgYAIIAAgARABC1cBAn9CAUEgIABBAWtnayIBrYanIQAgAUH//wNxQQJ0QYiZgAhqIgIoAgAiAQRAIAIgAEEQdCABakEEaygCADYCACABDwsgAEAAIgBBEHRBACAAQX9HGwsDAAALxAICA34CfwJAAkAgACAAYg0AIAC9IgJC////////////AINCgICAgICAgPj/AFoNACACQoCAgICAgICAgH+DIQNBCyACQgGGIgR5p2sgBEI1iKcgBEKAgICAgICAEFQbIQUgAUEATgRAQf4PIAVrIAFIBEBEAAAAAAAA8H8gAKYPCyABIAVqIgZBAEwEQCACIAGthiADhL8PCyAFQQBMBEAgAkEBIAVrrYZC/////////weDIAatQjSGhCADhL8PCyABrUI0hiACfL8PC0EAIAFrIQYgAUEAIAVrSg0BQUwgBWsgAUoEQCADvw8LIAJC/////////weDIAVBAEqtQjSGhCAGQQEgASAFamsiASABIAZKG0EBa0E/ca0iA4hCAXxCAYggAnogA1GtQn+Fg78gAKYhAAsgAA8LIAIgBq1CNIZ9vwtPAQF8IAAgAKIiAESBXgz9///fv6JEAAAAAAAA8D+gIAAgAKIiAURCOgXhU1WlP6KgIAAgAaIgAERpUO7gQpP5PqJEJx4P6IfAVr+goqC2C0sBAnwgACAAIACiIgGiIgIgASABoqIgAUSnRjuMh83GPqJEdOfK4vkAKr+goiAAIAIgAUSy+26JEBGBP6JEd6zLVFVVxb+goqCgtgsOACAAuyABu6IgArugtgsLyRcDAEGAgIAIC1ABAAAAAgAAAAMAAAAEAAAAAACAvy69uzMHnR+/HCZIv4rcYz7glHm/5qVmPwEm3r7kpWY/CCbePnPcYz7hlHk/Cp0fvxomSD8AAIC/Lr27swBB8ICACAsBBABBgoGACAveFoC/B50fv4rcYz7mpWY/5KVmP3PcYz4KnR+/AACAvy69uzMcJki/4JR5vwEm3r4IJt4+4ZR5PxomSD8uvbuzAAAAAAAAAAEDAAAABAAAAAQAAAAGAAAAg/miAERObgD8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\";\n",
6
+ "/**\n * TurboQuant — WASM SIMD vector compression (3 bits/dim)\n *\n * Architecture:\n * JS Float32Array -> [Zig WASM + relaxed SIMD] -> compressed bytes\n *\n * The Zig engine (turboquant.wasm) compresses vectors using polar + QJL\n * quantization with Gaussian QR rotation, all SIMD-accelerated.\n *\n * Browser requirements:\n * - WASM SIMD128: Chrome 91+, Firefox 89+, Safari 16.4+\n * - WASM Relaxed SIMD: Chrome 114+, Firefox 128+, Safari 18+\n *\n * Usage:\n * import { TurboQuant } from \"turboquant\";\n * const tq = await TurboQuant.init({ dim: 1024, seed: 42 });\n * const compressed = tq.encode(myFloat32Array);\n * const score = tq.dot(queryVector, compressed);\n * tq.destroy();\n */\n\nimport { wasmBase64 } from \"./turboquant-wasm.generated.js\";\n\nfunction decodeBase64(b64: string): Uint8Array {\n if (typeof Buffer !== \"undefined\") {\n const buf = Buffer.from(b64, \"base64\");\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);\n }\n const bin = atob(b64);\n const bytes = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);\n return bytes;\n}\n\n// --- WASM export types ---\n\ninterface TurboQuantExports {\n memory: WebAssembly.Memory;\n tq_engine_create(dim: number, seed: number): number;\n tq_engine_destroy(handle: number): void;\n tq_encode(handle: number, inputPtr: number, dim: number, outLenPtr: number): number;\n tq_decode(handle: number, compPtr: number, compLen: number, outLenPtr: number): number;\n tq_dot(handle: number, queryPtr: number, dim: number, compPtr: number, compLen: number): number;\n tq_alloc(len: number): number;\n tq_free(ptr: number, len: number): void;\n tq_alloc_f32(count: number): number;\n tq_free_f32(ptr: number, count: number): void;\n}\n\n// --- Singleton WASM instance ---\n\nlet wasmInstance: TurboQuantExports | null = null;\nlet wasmReady: Promise<TurboQuantExports> | null = null;\n\nasync function getWasm(): Promise<TurboQuantExports> {\n if (wasmInstance) return wasmInstance;\n if (wasmReady) return wasmReady;\n\n wasmReady = (async () => {\n const bytes = decodeBase64(wasmBase64);\n const module = await WebAssembly.compile(bytes as BufferSource);\n const instance = await WebAssembly.instantiate(module, {});\n wasmInstance = instance.exports as unknown as TurboQuantExports;\n return wasmInstance;\n })();\n\n return wasmReady;\n}\n\n/**\n * Load from an external WASM source instead of the embedded binary.\n * Useful for streaming instantiation in browsers:\n * TurboQuant.init({ dim: 1024, seed: 42, wasm: fetch(\"/turboquant.wasm\") })\n */\nasync function getWasmFrom(\n source: Response | Promise<Response> | BufferSource,\n): Promise<TurboQuantExports> {\n let instance: WebAssembly.Instance;\n if (source instanceof Response || source instanceof Promise) {\n const r = await WebAssembly.instantiateStreaming(source, {});\n instance = r.instance;\n } else {\n const r = await WebAssembly.instantiate(source, {});\n instance = (r as unknown as WebAssembly.WebAssemblyInstantiatedSource).instance;\n }\n wasmInstance = instance.exports as unknown as TurboQuantExports;\n return wasmInstance;\n}\n\n// --- Helpers ---\n\nfunction wasmWriteF32(ex: TurboQuantExports, data: Float32Array): number {\n const ptr = ex.tq_alloc(data.byteLength);\n if (!ptr) throw new Error(\"TurboQuant: WASM alloc failed\");\n new Float32Array(ex.memory.buffer, ptr, data.length).set(data);\n return ptr;\n}\n\nfunction wasmWriteU8(ex: TurboQuantExports, data: Uint8Array): number {\n const ptr = ex.tq_alloc(data.length);\n if (!ptr) throw new Error(\"TurboQuant: WASM alloc failed\");\n new Uint8Array(ex.memory.buffer, ptr, data.length).set(data);\n return ptr;\n}\n\nfunction wasmAllocU32(ex: TurboQuantExports): number {\n const ptr = ex.tq_alloc(4);\n if (!ptr) throw new Error(\"TurboQuant: WASM alloc failed\");\n return ptr;\n}\n\nfunction wasmReadU32(ex: TurboQuantExports, ptr: number): number {\n return new Uint32Array(ex.memory.buffer, ptr, 1)[0];\n}\n\n// --- Public API ---\n\nexport interface TurboQuantConfig {\n /** Vector dimension (must be a power of 2). */\n dim: number;\n /** Deterministic seed for rotation matrix. */\n seed: number;\n /** Optional external WASM source (Response, Promise<Response>, or ArrayBuffer). */\n wasm?: Response | Promise<Response> | BufferSource;\n}\n\nexport class TurboQuant {\n readonly dim: number;\n #handle: number;\n #ex: TurboQuantExports;\n\n private constructor(ex: TurboQuantExports, handle: number, dim: number) {\n this.#ex = ex;\n this.#handle = handle;\n this.dim = dim;\n }\n\n /**\n * Create a TurboQuant engine.\n *\n * ```ts\n * const tq = await TurboQuant.init({ dim: 1024, seed: 42 });\n * ```\n */\n static async init(config: TurboQuantConfig): Promise<TurboQuant> {\n const ex = config.wasm ? await getWasmFrom(config.wasm) : await getWasm();\n const handle = ex.tq_engine_create(config.dim, config.seed);\n if (handle < 0) {\n throw new Error(\n `TurboQuant: failed to create engine (dim=${config.dim}, seed=${config.seed})`,\n );\n }\n return new TurboQuant(ex, handle, config.dim);\n }\n\n /**\n * Compress a float32 vector (~3 bits/dim).\n * @param vector - Float32Array of length `dim`\n * @returns Compressed bytes\n */\n encode(vector: Float32Array): Uint8Array {\n if (vector.length !== this.dim) {\n throw new Error(`TurboQuant: expected ${this.dim} dims, got ${vector.length}`);\n }\n const ex = this.#ex;\n const inputPtr = wasmWriteF32(ex, vector);\n const outLenPtr = wasmAllocU32(ex);\n\n const resultPtr = ex.tq_encode(this.#handle, inputPtr, this.dim, outLenPtr);\n const outLen = wasmReadU32(ex, outLenPtr);\n\n ex.tq_free(inputPtr, vector.byteLength);\n ex.tq_free(outLenPtr, 4);\n\n if (!resultPtr) throw new Error(\"TurboQuant: encode failed\");\n\n const result = new Uint8Array(ex.memory.buffer, resultPtr, outLen).slice();\n ex.tq_free(resultPtr, outLen);\n return result;\n }\n\n /**\n * Decompress back to a float32 vector.\n * @param compressed - Bytes from `encode()`\n * @returns Reconstructed Float32Array\n */\n decode(compressed: Uint8Array): Float32Array {\n const ex = this.#ex;\n const compPtr = wasmWriteU8(ex, compressed);\n const outLenPtr = wasmAllocU32(ex);\n\n const resultPtr = ex.tq_decode(this.#handle, compPtr, compressed.length, outLenPtr);\n const outLen = wasmReadU32(ex, outLenPtr);\n\n ex.tq_free(compPtr, compressed.length);\n ex.tq_free(outLenPtr, 4);\n\n if (!resultPtr) throw new Error(\"TurboQuant: decode failed\");\n\n const result = new Float32Array(ex.memory.buffer, resultPtr, outLen).slice();\n ex.tq_free_f32(resultPtr, outLen);\n return result;\n }\n\n /**\n * Estimate dot product between a query and compressed vector.\n * Faster than decode + manual dot — operates directly on compressed bytes.\n *\n * @param query - Float32Array of length `dim`\n * @param compressed - Bytes from `encode()`\n * @returns Estimated inner product\n */\n dot(query: Float32Array, compressed: Uint8Array): number {\n if (query.length !== this.dim) {\n throw new Error(`TurboQuant: expected ${this.dim} dims, got ${query.length}`);\n }\n const ex = this.#ex;\n const qPtr = wasmWriteF32(ex, query);\n const compPtr = wasmWriteU8(ex, compressed);\n\n const score = ex.tq_dot(\n this.#handle,\n qPtr,\n this.dim,\n compPtr,\n compressed.length,\n );\n\n ex.tq_free(qPtr, query.byteLength);\n ex.tq_free(compPtr, compressed.length);\n\n return score;\n }\n\n /** Release engine resources. Call when done. */\n destroy(): void {\n this.#ex.tq_engine_destroy(this.#handle);\n }\n}\n\nexport default TurboQuant;\n"
7
+ ],
8
+ "mappings": "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",
9
+ "debugId": "81E0699A263776DE64756E2164756E21",
10
+ "names": []
11
+ }
@@ -0,0 +1,2 @@
1
+ export declare const wasmBase64 = "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AiABQRBqJABBACACIAAbCxMAIAEEQCABIAAgAUEAIAEQBgsLNwECfyMAQRBrIgEkACABQQRqQcCBgAggABACIAEvAQwhACABKAIEIQIgAUEQaiQAQQAgAiAAGwsNAEHAgYAIIAAgARABC1cBAn9CAUEgIABBAWtnayIBrYanIQAgAUH//wNxQQJ0QYiZgAhqIgIoAgAiAQRAIAIgAEEQdCABakEEaygCADYCACABDwsgAEAAIgBBEHRBACAAQX9HGwsDAAALxAICA34CfwJAAkAgACAAYg0AIAC9IgJC////////////AINCgICAgICAgPj/AFoNACACQoCAgICAgICAgH+DIQNBCyACQgGGIgR5p2sgBEI1iKcgBEKAgICAgICAEFQbIQUgAUEATgRAQf4PIAVrIAFIBEBEAAAAAAAA8H8gAKYPCyABIAVqIgZBAEwEQCACIAGthiADhL8PCyAFQQBMBEAgAkEBIAVrrYZC/////////weDIAatQjSGhCADhL8PCyABrUI0hiACfL8PC0EAIAFrIQYgAUEAIAVrSg0BQUwgBWsgAUoEQCADvw8LIAJC/////////weDIAVBAEqtQjSGhCAGQQEgASAFamsiASABIAZKG0EBa0E/ca0iA4hCAXxCAYggAnogA1GtQn+Fg78gAKYhAAsgAA8LIAIgBq1CNIZ9vwtPAQF8IAAgAKIiAESBXgz9///fv6JEAAAAAAAA8D+gIAAgAKIiAURCOgXhU1WlP6KgIAAgAaIgAERpUO7gQpP5PqJEJx4P6IfAVr+goqC2C0sBAnwgACAAIACiIgGiIgIgASABoqIgAUSnRjuMh83GPqJEdOfK4vkAKr+goiAAIAIgAUSy+26JEBGBP6JEd6zLVFVVxb+goqCgtgsOACAAuyABu6IgArugtgsLyRcDAEGAgIAIC1ABAAAAAgAAAAMAAAAEAAAAAACAvy69uzMHnR+/HCZIv4rcYz7glHm/5qVmPwEm3r7kpWY/CCbePnPcYz7hlHk/Cp0fvxomSD8AAIC/Lr27swBB8ICACAsBBABBgoGACAveFoC/B50fv4rcYz7mpWY/5KVmP3PcYz4KnR+/AACAvy69uzMcJki/4JR5vwEm3r4IJt4+4ZR5PxomSD8uvbuzAAAAAAAAAAEDAAAABAAAAAQAAAAGAAAAg/miAERObgD8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";
2
+ //# sourceMappingURL=turboquant-wasm.generated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turboquant-wasm.generated.d.ts","sourceRoot":"","sources":["../src/js/turboquant-wasm.generated.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,UAAU,ivjBAAivjB,CAAC"}
Binary file
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "turboquant-wasm",
3
+ "version": "0.1.0",
4
+ "description": "TurboQuant WASM SIMD vector compression — 3 bits/dim with fast dot product. Requires relaxed SIMD (Chrome 114+, Firefox 128+, Safari 18+, Node 20+)",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "module": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "./turboquant.wasm": "./dist/turboquant.wasm"
16
+ },
17
+ "files": [
18
+ "dist/",
19
+ "LICENSE"
20
+ ],
21
+ "engines": {
22
+ "node": ">=20"
23
+ },
24
+ "scripts": {
25
+ "build:zig": "mkdir -p dist && zig build-exe -target wasm32-wasi -mcpu=generic+simd128+relaxed_simd -O ReleaseSmall src/wasm_exports.zig --name turboquant -fno-entry -rdynamic && mv turboquant.wasm dist/",
26
+ "build:opt": "wasm-opt -Oz --strip-producers --strip-target-features dist/turboquant.wasm -o dist/turboquant.wasm --enable-simd --enable-bulk-memory --enable-nontrapping-float-to-int --enable-sign-ext --enable-mutable-globals --enable-relaxed-simd",
27
+ "build:embed": "node scripts/embed-wasm.mjs",
28
+ "build:types": "bun x tsc --emitDeclarationOnly",
29
+ "build:js": "bun build src/js/index.ts --outdir dist --target node --format esm --minify --sourcemap=external && bun run build:types",
30
+ "build": "bun run build:zig && bun run build:opt && bun run build:embed && bun run build:js",
31
+ "test:zig": "zig test -target aarch64-macos src/turboquant.zig",
32
+ "prepublishOnly": "bun run build"
33
+ },
34
+ "keywords": [
35
+ "vector",
36
+ "compression",
37
+ "quantization",
38
+ "wasm",
39
+ "simd",
40
+ "relaxed-simd",
41
+ "embedding",
42
+ "dot-product",
43
+ "nearest-neighbor"
44
+ ],
45
+ "repository": {
46
+ "type": "git",
47
+ "url": "git+https://github.com/teamchong/turboquant-wasm.git"
48
+ },
49
+ "homepage": "https://github.com/teamchong/turboquant-wasm#readme",
50
+ "author": "Steven Chong",
51
+ "license": "MIT",
52
+ "devDependencies": {
53
+ "@types/node": "^22.0.0",
54
+ "typescript": "^5.7.0"
55
+ }
56
+ }