SciRS2-WASM: Scientific Computing in WebAssembly
High-performance scientific computing for JavaScript and TypeScript environments, powered by Rust compiled to WebAssembly. Part of the SciRS2 ecosystem.
Overview
scirs2-wasm brings the full power of SciRS2's scientific computing capabilities to the browser and Node.js through WebAssembly. It exposes a wasm-bindgen-based interface with TypeScript type definitions, SIMD-accelerated operations (where supported by the runtime), and utilities for linear algebra, signal processing, statistics, machine learning, and streaming data processing.
Features
- Pure Rust: 100% safe Rust code compiled to
wasm32-unknown-unknown - wasm-bindgen Interface: Direct JS/TS interop without glue code overhead
- TypeScript Definitions: Full type definitions in
ts-src/scirs2.tsfor strong IDE support - SIMD Acceleration: Optional
wasm32-simd128acceleration for vectorized operations - WasmMatrix Type: First-class 2D matrix type for linear algebra in JS/TS
- Async Operations: Non-blocking computations with JavaScript Promises
- WebWorker Support: Offload heavy computations to worker threads
- Streaming Processing: Process large datasets incrementally without exhausting memory
- Signal Processing: FFT, filtering, spectrogram generation
- Linear Algebra: Matrix operations, SVD, eigenvalue decomposition
- Statistics: Descriptive statistics, distributions, hypothesis tests, regression
- ML Utilities: Forward pass helpers, activation functions, loss computation
- Advanced Stats: Time series primitives, regression diagnostics
- Memory Efficient: Optimized allocations for browser memory constraints
- Zero JS Dependencies: No external JavaScript runtime dependencies required
Installation
NPM
Yarn
PNPM
Quick Start
Browser (ES Modules)
import init * as scirs2 from 'scirs2-wasm';
;
TypeScript
import init, * as scirs2 from 'scirs2-wasm';
async function main(): Promise<void> {
await init();
// WasmMatrix for 2D linear algebra
const mat: scirs2.WasmMatrix = scirs2.WasmMatrix.from_rows([
[1.0, 2.0, 3.0],
[4.0, 5.0, 6.0],
[7.0, 8.0, 9.0],
]);
const svd = scirs2.svd(mat);
console.log('Singular values:', svd.s.to_array());
// Check SIMD availability
console.log('SIMD support:', scirs2.has_simd_support());
}
main();
Node.js
const scirs2 = require;
;
API Reference
Array Creation
const arr = ;
const typed = ;
const matrix = scirs2.;
const zeros = scirs2.;
const ones = scirs2.;
const linspace = scirs2.;
const arange = scirs2.;
Linear Algebra (WasmMatrix)
const A = scirs2.;
const B = scirs2.;
const C = scirs2.; // Matrix multiply
const inv = scirs2.; // Inverse
const det = scirs2.; // Determinant
const trace = scirs2.; // Trace
const svd_res = scirs2.; // SVD: {U, s, Vt}
const eig_res = scirs2.; // Eigenvalues/vectors
const norm = scirs2.; // Frobenius norm
const rank = scirs2.; // Rank
const x = scirs2.; // Ax = b
const transpose = ;
Signal Processing
const signal = ;
// FFT
const spectrum = scirs2.;
const power = scirs2.;
const spectrogram = scirs2.;
// Filtering
const filtered_lp = scirs2.;
const filtered_bp = scirs2.;
const filtered_hp = scirs2.;
// Convolution
const kernel = ;
const convolved = scirs2.;
Statistics
const data = ;
// Descriptive
const mean = scirs2.;
const std = scirs2.;
const variance = scirs2.;
const median = scirs2.;
const p25 = scirs2.;
const p75 = scirs2.;
const skew = scirs2.;
const kurt = scirs2.;
// Correlation
const x = ;
const y = ;
const corr = scirs2.;
// Advanced: regression diagnostics
const reg_result = scirs2.;
console.log;
ML Utilities
// Activation functions
const relu = scirs2.;
const sigmoid = scirs2.;
const softmax = scirs2.;
const tanh = scirs2.;
// Loss functions
const mse_loss = scirs2.;
const ce_loss = scirs2.;
// Normalization
const normalized = scirs2.;
const batch_normed = scirs2.;
Streaming Data Processing
// Process large datasets in chunks
const processor = ;
const final_result = processor.;
WebWorker Support
// In main thread
const worker = ;
worker.;
worker console.log;
Building from Source
Prerequisites
- Rust 1.75+ with
wasm32-unknown-unknowntarget wasm-pack0.12+- Node.js 18+
Build Steps
# Install Rust WASM target
# Install wasm-pack
|
# Build for bundlers (webpack, rollup, Vite)
# Build for web (plain ES modules, no bundler needed)
# Build for Node.js (CommonJS)
# Build with SIMD acceleration
# Optimize binary with wasm-opt
Testing
# Run tests in headless Firefox
# Run tests in headless Chrome
# Run tests in Node.js
# Run Rust unit tests (non-WASM)
Performance
SciRS2-WASM delivers near-native performance for scientific workloads:
| Operation | Performance vs Native | Notes |
|---|---|---|
| Array arithmetic | 80-95% | Scalar fallback without SIMD |
| Matrix multiply | Up to 90% | With wasm32-simd128 |
| Statistical functions | 85-95% | Parallel not available in WASM |
| FFT | 75-90% | Depends on transform size |
| Random number generation | 70-85% | WASM RNG overhead |
SIMD Acceleration
Build with --features simd for wasm32-simd128 vectorization:
RUSTFLAGS="-C target-feature=+simd128"
SIMD is supported in Chrome 91+, Firefox 89+, Safari 16.4+, Edge 91+, and Node.js 20+.
Browser Compatibility
| Browser | Baseline | With SIMD |
|---|---|---|
| Chrome | 91+ | 91+ |
| Firefox | 89+ | 89+ |
| Safari | 16.4+ | Limited |
| Edge | 91+ | 91+ |
| Node.js | 18+ | 20+ |
TypeScript Type Definitions
Full TypeScript definitions are provided in ts-src/scirs2.ts. The WasmMatrix and WasmArray types are strongly typed for ergonomic IDE support:
import type { WasmMatrix, WasmArray, SvdResult, EigResult } from 'scirs2-wasm';
function process(m: WasmMatrix): SvdResult {
return scirs2.svd(m);
}
Memory Management
WASM uses a linear memory model. Best practices:
- Reuse arrays when possible to reduce allocation overhead
- Process in chunks for datasets larger than a few hundred MB
- Monitor memory with browser DevTools Performance panel
- Dispose large temporaries explicitly when done
Module Architecture
scirs2-wasm/
├── src/
│ ├── lib.rs - WASM entry point, init, version
│ ├── array.rs - WasmArray type and array operations
│ ├── linalg.rs - WasmMatrix, decompositions, solvers
│ ├── stats.rs - Descriptive stats, distributions, tests
│ ├── fft.rs - FFT, spectrogram, periodogram
│ ├── signal.rs - Filters, convolution, denoising
│ ├── optimize.rs - Optimization algorithms
│ ├── integrate.rs - Numerical integration
│ ├── interpolate.rs - Interpolation methods
│ ├── random.rs - RNG and distributions
│ ├── utils.rs - Performance timer, capabilities
│ └── error.rs - WASM-friendly error types
├── ts-src/
│ └── scirs2.ts - TypeScript definitions
└── Cargo.toml
Related Projects
- SciRS2 - Core Rust library
- scirs2-python - Python/PyO3 bindings
- wasm-bindgen - WASM-JS interop framework
License
Licensed under the Apache License 2.0. See LICENSE for details.
Authors
COOLJAPAN OU (Team KitaSan)