diff --git a/npm/packages/rudag/pkg-node/package.json b/npm/packages/rudag/pkg-node/package.json new file mode 100644 index 00000000..10e55877 --- /dev/null +++ b/npm/packages/rudag/pkg-node/package.json @@ -0,0 +1,16 @@ +{ + "name": "ruvector-dag-wasm", + "collaborators": [ + "RuVector Contributors" + ], + "description": "Minimal WASM DAG library for browser and embedded systems", + "version": "0.1.0", + "license": "MIT OR Apache-2.0", + "files": [ + "ruvector_dag_wasm_bg.wasm", + "ruvector_dag_wasm.js", + "ruvector_dag_wasm.d.ts" + ], + "main": "ruvector_dag_wasm.js", + "types": "ruvector_dag_wasm.d.ts" +} \ No newline at end of file diff --git a/npm/packages/rudag/pkg-node/ruvector_dag_wasm.d.ts b/npm/packages/rudag/pkg-node/ruvector_dag_wasm.d.ts new file mode 100644 index 00000000..51ccaf6c --- /dev/null +++ b/npm/packages/rudag/pkg-node/ruvector_dag_wasm.d.ts @@ -0,0 +1,60 @@ +/* tslint:disable */ +/* eslint-disable */ + +export class WasmDag { + free(): void; + [Symbol.dispose](): void; + /** + * Get number of edges + */ + edge_count(): number; + /** + * Deserialize from bytes + */ + static from_bytes(data: Uint8Array): WasmDag; + /** + * Get number of nodes + */ + node_count(): number; + /** + * Find critical path (longest path by cost) + * Returns JSON: {"path": [node_ids], "cost": total} + */ + critical_path(): any; + /** + * Create new empty DAG + */ + constructor(); + /** + * Serialize to JSON + */ + to_json(): string; + /** + * Add edge from -> to + * Returns false if creates cycle (simple check) + */ + add_edge(from: number, to: number): boolean; + /** + * Add a node with operator type and cost + * Returns node ID + */ + add_node(op: number, cost: number): number; + /** + * Serialize to bytes (bincode format) + */ + to_bytes(): Uint8Array; + /** + * Compute attention scores for nodes + * mechanism: 0=topological, 1=critical_path, 2=uniform + */ + attention(mechanism: number): Float32Array; + /** + * Deserialize from JSON + */ + static from_json(json: string): WasmDag; + /** + * Topological sort using Kahn's algorithm + * Returns node IDs in topological order + */ + topo_sort(): Uint32Array; +} diff --git a/npm/packages/rudag/pkg-node/ruvector_dag_wasm.js b/npm/packages/rudag/pkg-node/ruvector_dag_wasm.js new file mode 100644 index 00000000..e7521397 --- /dev/null +++ b/npm/packages/rudag/pkg-node/ruvector_dag_wasm.js @@ -0,0 +1,367 @@ + +let imports = {}; +imports['__wbindgen_placeholder__'] = module.exports; + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function getArrayF32FromWasm0(ptr, len) { + ptr = ptr >>> 0; + return getFloat32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len); +} + +function getArrayU32FromWasm0(ptr, len) { + ptr = ptr >>> 0; + return getUint32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len); +} + +function getArrayU8FromWasm0(ptr, len) { + ptr = ptr >>> 0; + return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len); +} + +let cachedDataViewMemory0 = null; +function getDataViewMemory0() { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) { + cachedDataViewMemory0 = new DataView(wasm.memory.buffer); + } + return cachedDataViewMemory0; +} + +let cachedFloat32ArrayMemory0 = null; +function getFloat32ArrayMemory0() { + if (cachedFloat32ArrayMemory0 === null || cachedFloat32ArrayMemory0.byteLength === 0) { + cachedFloat32ArrayMemory0 = new Float32Array(wasm.memory.buffer); + } + return cachedFloat32ArrayMemory0; +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return decodeText(ptr, len); +} + +let cachedUint32ArrayMemory0 = null; +function getUint32ArrayMemory0() { + if (cachedUint32ArrayMemory0 === null || cachedUint32ArrayMemory0.byteLength === 0) { + cachedUint32ArrayMemory0 = new Uint32Array(wasm.memory.buffer); + } + return cachedUint32ArrayMemory0; +} + +let cachedUint8ArrayMemory0 = null; +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +function getObject(idx) { return heap[idx]; } + +let heap = new Array(128).fill(undefined); +heap.push(undefined, null, true, false); + +let heap_next = heap.length; + +function passArray8ToWasm0(arg, malloc) { + const ptr = malloc(arg.length * 1, 1) >>> 0; + getUint8ArrayMemory0().set(arg, ptr / 1); + WASM_VECTOR_LEN = arg.length; + return ptr; +} + +function passStringToWasm0(arg, malloc, realloc) { + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = cachedTextEncoder.encodeInto(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); +cachedTextDecoder.decode(); +function decodeText(ptr, len) { + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} + +const cachedTextEncoder = new TextEncoder(); + +if (!('encodeInto' in cachedTextEncoder)) { + cachedTextEncoder.encodeInto = function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; + } +} + +let WASM_VECTOR_LEN = 0; + +const WasmDagFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_wasmdag_free(ptr >>> 0, 1)); + +/** + * Minimal DAG structure for WASM + * Self-contained with no external dependencies beyond wasm-bindgen + */ +class WasmDag { + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(WasmDag.prototype); + obj.__wbg_ptr = ptr; + WasmDagFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + WasmDagFinalization.unregister(this); + return ptr; + } + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_wasmdag_free(ptr, 0); + } + /** + * Get number of edges + * @returns {number} + */ + edge_count() { + const ret = wasm.wasmdag_edge_count(this.__wbg_ptr); + return ret >>> 0; + } + /** + * Deserialize from bytes + * @param {Uint8Array} data + * @returns {WasmDag} + */ + static from_bytes(data) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + const ptr0 = passArray8ToWasm0(data, wasm.__wbindgen_export); + const len0 = WASM_VECTOR_LEN; + wasm.wasmdag_from_bytes(retptr, ptr0, len0); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + return WasmDag.__wrap(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Get number of nodes + * @returns {number} + */ + node_count() { + const ret = wasm.wasmdag_node_count(this.__wbg_ptr); + return ret >>> 0; + } + /** + * Find critical path (longest path by cost) + * Returns JSON: {"path": [node_ids], "cost": total} + * @returns {any} + */ + critical_path() { + const ret = wasm.wasmdag_critical_path(this.__wbg_ptr); + return takeObject(ret); + } + /** + * Create new empty DAG + */ + constructor() { + const ret = wasm.wasmdag_new(); + this.__wbg_ptr = ret >>> 0; + WasmDagFinalization.register(this, this.__wbg_ptr, this); + return this; + } + /** + * Serialize to JSON + * @returns {string} + */ + to_json() { + let deferred1_0; + let deferred1_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.wasmdag_to_json(retptr, this.__wbg_ptr); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + deferred1_0 = r0; + deferred1_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_export2(deferred1_0, deferred1_1, 1); + } + } + /** + * Add edge from -> to + * Returns false if creates cycle (simple check) + * @param {number} from + * @param {number} to + * @returns {boolean} + */ + add_edge(from, to) { + const ret = wasm.wasmdag_add_edge(this.__wbg_ptr, from, to); + return ret !== 0; + } + /** + * Add a node with operator type and cost + * Returns node ID + * @param {number} op + * @param {number} cost + * @returns {number} + */ + add_node(op, cost) { + const ret = wasm.wasmdag_add_node(this.__wbg_ptr, op, cost); + return ret >>> 0; + } + /** + * Serialize to bytes (bincode format) + * @returns {Uint8Array} + */ + to_bytes() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.wasmdag_to_bytes(retptr, this.__wbg_ptr); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_export2(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Compute attention scores for nodes + * mechanism: 0=topological, 1=critical_path, 2=uniform + * @param {number} mechanism + * @returns {Float32Array} + */ + attention(mechanism) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.wasmdag_attention(retptr, this.__wbg_ptr, mechanism); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var v1 = getArrayF32FromWasm0(r0, r1).slice(); + wasm.__wbindgen_export2(r0, r1 * 4, 4); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Deserialize from JSON + * @param {string} json + * @returns {WasmDag} + */ + static from_json(json) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + const ptr0 = passStringToWasm0(json, wasm.__wbindgen_export, wasm.__wbindgen_export3); + const len0 = WASM_VECTOR_LEN; + wasm.wasmdag_from_json(retptr, ptr0, len0); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + return WasmDag.__wrap(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Topological sort using Kahn's algorithm + * Returns node IDs in topological order + * @returns {Uint32Array} + */ + topo_sort() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.wasmdag_topo_sort(retptr, this.__wbg_ptr); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var v1 = getArrayU32FromWasm0(r0, r1).slice(); + wasm.__wbindgen_export2(r0, r1 * 4, 4); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } +} +if (Symbol.dispose) WasmDag.prototype[Symbol.dispose] = WasmDag.prototype.free; +exports.WasmDag = WasmDag; + +exports.__wbg___wbindgen_throw_dd24417ed36fc46e = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); +}; + +exports.__wbindgen_cast_2241b6af4c4b2941 = function(arg0, arg1) { + // Cast intrinsic for `Ref(String) -> Externref`. + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); +}; + +const wasmPath = `${__dirname}/ruvector_dag_wasm_bg.wasm`; +const wasmBytes = require('fs').readFileSync(wasmPath); +const wasmModule = new WebAssembly.Module(wasmBytes); +const wasm = exports.__wasm = new WebAssembly.Instance(wasmModule, imports).exports; diff --git a/npm/packages/rudag/pkg-node/ruvector_dag_wasm_bg.wasm b/npm/packages/rudag/pkg-node/ruvector_dag_wasm_bg.wasm new file mode 100644 index 00000000..7aef6cf3 Binary files /dev/null and b/npm/packages/rudag/pkg-node/ruvector_dag_wasm_bg.wasm differ diff --git a/npm/packages/rudag/pkg-node/ruvector_dag_wasm_bg.wasm.d.ts b/npm/packages/rudag/pkg-node/ruvector_dag_wasm_bg.wasm.d.ts new file mode 100644 index 00000000..a4b06e89 --- /dev/null +++ b/npm/packages/rudag/pkg-node/ruvector_dag_wasm_bg.wasm.d.ts @@ -0,0 +1,20 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export const __wbg_wasmdag_free: (a: number, b: number) => void; +export const wasmdag_add_edge: (a: number, b: number, c: number) => number; +export const wasmdag_add_node: (a: number, b: number, c: number) => number; +export const wasmdag_attention: (a: number, b: number, c: number) => void; +export const wasmdag_critical_path: (a: number) => number; +export const wasmdag_edge_count: (a: number) => number; +export const wasmdag_from_bytes: (a: number, b: number, c: number) => void; +export const wasmdag_from_json: (a: number, b: number, c: number) => void; +export const wasmdag_new: () => number; +export const wasmdag_node_count: (a: number) => number; +export const wasmdag_to_bytes: (a: number, b: number) => void; +export const wasmdag_to_json: (a: number, b: number) => void; +export const wasmdag_topo_sort: (a: number, b: number) => void; +export const __wbindgen_add_to_stack_pointer: (a: number) => number; +export const __wbindgen_export: (a: number, b: number) => number; +export const __wbindgen_export2: (a: number, b: number, c: number) => void; +export const __wbindgen_export3: (a: number, b: number, c: number, d: number) => number; diff --git a/npm/packages/rudag/pkg/package.json b/npm/packages/rudag/pkg/package.json new file mode 100644 index 00000000..51bbf724 --- /dev/null +++ b/npm/packages/rudag/pkg/package.json @@ -0,0 +1,22 @@ +{ + "name": "ruvector-dag-wasm", + "type": "module", + "collaborators": [ + "RuVector Contributors" + ], + "description": "Minimal WASM DAG library for browser and embedded systems", + "version": "0.1.0", + "license": "MIT OR Apache-2.0", + "files": [ + "ruvector_dag_wasm_bg.wasm", + "ruvector_dag_wasm.js", + "ruvector_dag_wasm_bg.js", + "ruvector_dag_wasm.d.ts" + ], + "main": "ruvector_dag_wasm.js", + "types": "ruvector_dag_wasm.d.ts", + "sideEffects": [ + "./ruvector_dag_wasm.js", + "./snippets/*" + ] +} \ No newline at end of file diff --git a/npm/packages/rudag/pkg/ruvector_dag_wasm.d.ts b/npm/packages/rudag/pkg/ruvector_dag_wasm.d.ts new file mode 100644 index 00000000..51ccaf6c --- /dev/null +++ b/npm/packages/rudag/pkg/ruvector_dag_wasm.d.ts @@ -0,0 +1,60 @@ +/* tslint:disable */ +/* eslint-disable */ + +export class WasmDag { + free(): void; + [Symbol.dispose](): void; + /** + * Get number of edges + */ + edge_count(): number; + /** + * Deserialize from bytes + */ + static from_bytes(data: Uint8Array): WasmDag; + /** + * Get number of nodes + */ + node_count(): number; + /** + * Find critical path (longest path by cost) + * Returns JSON: {"path": [node_ids], "cost": total} + */ + critical_path(): any; + /** + * Create new empty DAG + */ + constructor(); + /** + * Serialize to JSON + */ + to_json(): string; + /** + * Add edge from -> to + * Returns false if creates cycle (simple check) + */ + add_edge(from: number, to: number): boolean; + /** + * Add a node with operator type and cost + * Returns node ID + */ + add_node(op: number, cost: number): number; + /** + * Serialize to bytes (bincode format) + */ + to_bytes(): Uint8Array; + /** + * Compute attention scores for nodes + * mechanism: 0=topological, 1=critical_path, 2=uniform + */ + attention(mechanism: number): Float32Array; + /** + * Deserialize from JSON + */ + static from_json(json: string): WasmDag; + /** + * Topological sort using Kahn's algorithm + * Returns node IDs in topological order + */ + topo_sort(): Uint32Array; +} diff --git a/npm/packages/rudag/pkg/ruvector_dag_wasm.js b/npm/packages/rudag/pkg/ruvector_dag_wasm.js new file mode 100644 index 00000000..64ea79ed --- /dev/null +++ b/npm/packages/rudag/pkg/ruvector_dag_wasm.js @@ -0,0 +1,4 @@ +import * as wasm from "./ruvector_dag_wasm_bg.wasm"; +export * from "./ruvector_dag_wasm_bg.js"; +import { __wbg_set_wasm } from "./ruvector_dag_wasm_bg.js"; +__wbg_set_wasm(wasm); \ No newline at end of file diff --git a/npm/packages/rudag/pkg/ruvector_dag_wasm_bg.js b/npm/packages/rudag/pkg/ruvector_dag_wasm_bg.js new file mode 100644 index 00000000..11b0b85f --- /dev/null +++ b/npm/packages/rudag/pkg/ruvector_dag_wasm_bg.js @@ -0,0 +1,370 @@ +let wasm; +export function __wbg_set_wasm(val) { + wasm = val; +} + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function getArrayF32FromWasm0(ptr, len) { + ptr = ptr >>> 0; + return getFloat32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len); +} + +function getArrayU32FromWasm0(ptr, len) { + ptr = ptr >>> 0; + return getUint32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len); +} + +function getArrayU8FromWasm0(ptr, len) { + ptr = ptr >>> 0; + return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len); +} + +let cachedDataViewMemory0 = null; +function getDataViewMemory0() { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) { + cachedDataViewMemory0 = new DataView(wasm.memory.buffer); + } + return cachedDataViewMemory0; +} + +let cachedFloat32ArrayMemory0 = null; +function getFloat32ArrayMemory0() { + if (cachedFloat32ArrayMemory0 === null || cachedFloat32ArrayMemory0.byteLength === 0) { + cachedFloat32ArrayMemory0 = new Float32Array(wasm.memory.buffer); + } + return cachedFloat32ArrayMemory0; +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return decodeText(ptr, len); +} + +let cachedUint32ArrayMemory0 = null; +function getUint32ArrayMemory0() { + if (cachedUint32ArrayMemory0 === null || cachedUint32ArrayMemory0.byteLength === 0) { + cachedUint32ArrayMemory0 = new Uint32Array(wasm.memory.buffer); + } + return cachedUint32ArrayMemory0; +} + +let cachedUint8ArrayMemory0 = null; +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +function getObject(idx) { return heap[idx]; } + +let heap = new Array(128).fill(undefined); +heap.push(undefined, null, true, false); + +let heap_next = heap.length; + +function passArray8ToWasm0(arg, malloc) { + const ptr = malloc(arg.length * 1, 1) >>> 0; + getUint8ArrayMemory0().set(arg, ptr / 1); + WASM_VECTOR_LEN = arg.length; + return ptr; +} + +function passStringToWasm0(arg, malloc, realloc) { + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = cachedTextEncoder.encodeInto(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); +cachedTextDecoder.decode(); +const MAX_SAFARI_DECODE_BYTES = 2146435072; +let numBytesDecoded = 0; +function decodeText(ptr, len) { + numBytesDecoded += len; + if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) { + cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); + cachedTextDecoder.decode(); + numBytesDecoded = len; + } + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} + +const cachedTextEncoder = new TextEncoder(); + +if (!('encodeInto' in cachedTextEncoder)) { + cachedTextEncoder.encodeInto = function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; + } +} + +let WASM_VECTOR_LEN = 0; + +const WasmDagFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_wasmdag_free(ptr >>> 0, 1)); + +/** + * Minimal DAG structure for WASM + * Self-contained with no external dependencies beyond wasm-bindgen + */ +export class WasmDag { + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(WasmDag.prototype); + obj.__wbg_ptr = ptr; + WasmDagFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + WasmDagFinalization.unregister(this); + return ptr; + } + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_wasmdag_free(ptr, 0); + } + /** + * Get number of edges + * @returns {number} + */ + edge_count() { + const ret = wasm.wasmdag_edge_count(this.__wbg_ptr); + return ret >>> 0; + } + /** + * Deserialize from bytes + * @param {Uint8Array} data + * @returns {WasmDag} + */ + static from_bytes(data) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + const ptr0 = passArray8ToWasm0(data, wasm.__wbindgen_export); + const len0 = WASM_VECTOR_LEN; + wasm.wasmdag_from_bytes(retptr, ptr0, len0); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + return WasmDag.__wrap(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Get number of nodes + * @returns {number} + */ + node_count() { + const ret = wasm.wasmdag_node_count(this.__wbg_ptr); + return ret >>> 0; + } + /** + * Find critical path (longest path by cost) + * Returns JSON: {"path": [node_ids], "cost": total} + * @returns {any} + */ + critical_path() { + const ret = wasm.wasmdag_critical_path(this.__wbg_ptr); + return takeObject(ret); + } + /** + * Create new empty DAG + */ + constructor() { + const ret = wasm.wasmdag_new(); + this.__wbg_ptr = ret >>> 0; + WasmDagFinalization.register(this, this.__wbg_ptr, this); + return this; + } + /** + * Serialize to JSON + * @returns {string} + */ + to_json() { + let deferred1_0; + let deferred1_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.wasmdag_to_json(retptr, this.__wbg_ptr); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + deferred1_0 = r0; + deferred1_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_export2(deferred1_0, deferred1_1, 1); + } + } + /** + * Add edge from -> to + * Returns false if creates cycle (simple check) + * @param {number} from + * @param {number} to + * @returns {boolean} + */ + add_edge(from, to) { + const ret = wasm.wasmdag_add_edge(this.__wbg_ptr, from, to); + return ret !== 0; + } + /** + * Add a node with operator type and cost + * Returns node ID + * @param {number} op + * @param {number} cost + * @returns {number} + */ + add_node(op, cost) { + const ret = wasm.wasmdag_add_node(this.__wbg_ptr, op, cost); + return ret >>> 0; + } + /** + * Serialize to bytes (bincode format) + * @returns {Uint8Array} + */ + to_bytes() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.wasmdag_to_bytes(retptr, this.__wbg_ptr); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_export2(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Compute attention scores for nodes + * mechanism: 0=topological, 1=critical_path, 2=uniform + * @param {number} mechanism + * @returns {Float32Array} + */ + attention(mechanism) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.wasmdag_attention(retptr, this.__wbg_ptr, mechanism); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var v1 = getArrayF32FromWasm0(r0, r1).slice(); + wasm.__wbindgen_export2(r0, r1 * 4, 4); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Deserialize from JSON + * @param {string} json + * @returns {WasmDag} + */ + static from_json(json) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + const ptr0 = passStringToWasm0(json, wasm.__wbindgen_export, wasm.__wbindgen_export3); + const len0 = WASM_VECTOR_LEN; + wasm.wasmdag_from_json(retptr, ptr0, len0); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + return WasmDag.__wrap(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Topological sort using Kahn's algorithm + * Returns node IDs in topological order + * @returns {Uint32Array} + */ + topo_sort() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.wasmdag_topo_sort(retptr, this.__wbg_ptr); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var v1 = getArrayU32FromWasm0(r0, r1).slice(); + wasm.__wbindgen_export2(r0, r1 * 4, 4); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } +} +if (Symbol.dispose) WasmDag.prototype[Symbol.dispose] = WasmDag.prototype.free; + +export function __wbg___wbindgen_throw_dd24417ed36fc46e(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); +}; + +export function __wbindgen_cast_2241b6af4c4b2941(arg0, arg1) { + // Cast intrinsic for `Ref(String) -> Externref`. + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); +}; diff --git a/npm/packages/rudag/pkg/ruvector_dag_wasm_bg.wasm b/npm/packages/rudag/pkg/ruvector_dag_wasm_bg.wasm new file mode 100644 index 00000000..4cb6aeb4 Binary files /dev/null and b/npm/packages/rudag/pkg/ruvector_dag_wasm_bg.wasm differ diff --git a/npm/packages/rudag/pkg/ruvector_dag_wasm_bg.wasm.d.ts b/npm/packages/rudag/pkg/ruvector_dag_wasm_bg.wasm.d.ts new file mode 100644 index 00000000..a4b06e89 --- /dev/null +++ b/npm/packages/rudag/pkg/ruvector_dag_wasm_bg.wasm.d.ts @@ -0,0 +1,20 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export const __wbg_wasmdag_free: (a: number, b: number) => void; +export const wasmdag_add_edge: (a: number, b: number, c: number) => number; +export const wasmdag_add_node: (a: number, b: number, c: number) => number; +export const wasmdag_attention: (a: number, b: number, c: number) => void; +export const wasmdag_critical_path: (a: number) => number; +export const wasmdag_edge_count: (a: number) => number; +export const wasmdag_from_bytes: (a: number, b: number, c: number) => void; +export const wasmdag_from_json: (a: number, b: number, c: number) => void; +export const wasmdag_new: () => number; +export const wasmdag_node_count: (a: number) => number; +export const wasmdag_to_bytes: (a: number, b: number) => void; +export const wasmdag_to_json: (a: number, b: number) => void; +export const wasmdag_topo_sort: (a: number, b: number) => void; +export const __wbindgen_add_to_stack_pointer: (a: number) => number; +export const __wbindgen_export: (a: number, b: number) => number; +export const __wbindgen_export2: (a: number, b: number, c: number) => void; +export const __wbindgen_export3: (a: number, b: number, c: number, d: number) => number;