ruvector/crates/ruvector-sparsifier-wasm
ruvnet 96d8fdc172 chore(workspace): cargo fmt — mechanical whitespace fix across 427 files
Pre-existing rustfmt drift across the workspace was blocking CI's
`Rustfmt` check on PR #373 + PR #377. Running plain `cargo fmt`
reformats 427 files; no semantic changes, no logic changes, no
behavior changes — just what rustfmt already wanted.

None of the touched files are in ruvector-rabitq, ruvector-rulake,
or the new mirror-rulake workflow — those were already fmt-clean
per the per-crate checks on commits 5a4b0d782, 5f32fd450, f5003bc7b.
Drift is in cognitum-gate-kernel, mcp-brain, nervous-system,
prime-radiant, ruqu-core, ruvector-attention, ruvector-mincut,
ruvix/* and sub-crates, plus several examples.

Verified post-fmt:
  cargo check -p ruvector-rabitq -p ruvector-rulake            → clean
  cargo clippy -p ... -p ... --all-targets -- -D warnings      → clean
  cargo test   -p ... -p ... --release                         → 82/82 pass

Intentionally does NOT touch clippy drift — many more warnings
(missing docs, precision-loss casts, too-many-args, unsafe-safety-
docs) spread across unrelated crates, each category a cross-cutting
design decision that deserves its own review.

With this commit Rustfmt CI goes green on PR #373 and PR #377.
Clippy will still fail — that's honest pre-existing state for a
separate dedicated PR.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-04-24 10:44:02 -04:00
..
src chore(workspace): cargo fmt — mechanical whitespace fix across 427 files 2026-04-24 10:44:02 -04:00
Cargo.toml feat: add ruvector-sparsifier — dynamic spectral graph sparsification 2026-03-20 10:37:39 -04:00
README.md feat: add ruvector-sparsifier — dynamic spectral graph sparsification 2026-03-20 10:37:39 -04:00

RuVector Sparsifier WASM

License GitHub

WebAssembly bindings for dynamic spectral graph sparsification.

Enables browser-side and edge-deployed spectral sparsification with the same guarantees as the native Rust crate.


Quick Start

import init, { WasmSparsifier, default_config } from 'ruvector-sparsifier-wasm';

await init();

// Build from edges: [[u, v, weight], ...]
const spar = WasmSparsifier.buildFromEdges(
  '[[0,1,1.0],[1,2,1.0],[2,3,1.0],[3,0,1.0],[0,2,0.5]]',
  default_config()
);

// Dynamic updates
spar.insertEdge(1, 3, 2.0);
spar.deleteEdge(0, 2);

// Audit quality
const audit = JSON.parse(spar.audit());
console.log('Passed:', audit.passed, 'Max error:', audit.max_error);

// Stats
console.log('Compression:', spar.compressionRatio(), 'x');
console.log('Full edges:', spar.numEdges());
console.log('Sparse edges:', spar.sparsifierNumEdges());

API

WasmSparsifier

Method Description
new(config_json) Create empty sparsifier with config
buildFromEdges(edges_json, config_json) Build from edge list
insertEdge(u, v, weight) Insert edge
deleteEdge(u, v) Delete edge
updateEmbedding(node, old_json, new_json) Handle point move
audit() Run spectral audit (JSON)
sparsifierEdges() Get sparsifier edges (JSON)
stats() Get statistics (JSON)
compressionRatio() Compression ratio
rebuildLocal(nodes_json) Rebuild around nodes
rebuildFull() Full reconstruction

WasmSparseGraph

Method Description
new(n) Create graph with n vertices
addEdge(u, v, weight) Add edge
removeEdge(u, v) Remove edge
degree(u) Vertex degree
numEdges() Edge count
toJson() Serialize to JSON

Helpers

Function Description
init() Initialize WASM module
version() Crate version
default_config() Default config JSON

Build

wasm-pack build crates/ruvector-sparsifier-wasm --target web

Memory

For a 10K-vertex graph: ~1.6 MB WASM linear memory (26 pages).

License

MIT