mirror of
https://github.com/ruvnet/RuView
synced 2026-07-19 16:53:18 +00:00
7c1351fd5d
* feat: dual-modal WASM browser pose estimation demo (ADR-058) Live webcam video + WiFi CSI fusion for real-time pose estimation. Two parallel CNN pipelines (ruvector-cnn-wasm) with attention-weighted fusion and dynamic confidence gating. Three modes: Dual, Video-only, CSI-only. Includes pre-built WASM package (~52KB) for browser deployment. - ADR-058: Dual-modal architecture design - ui/pose-fusion.html: Main demo page with dark theme UI - 7 JS modules: video-capture, csi-simulator, cnn-embedder, fusion-engine, pose-decoder, canvas-renderer, main orchestrator - Pre-built ruvector-cnn-wasm WASM package for browser - CSI heatmap, embedding space visualization, latency metrics - WebSocket support for live ESP32 CSI data - Navigation link added to main dashboard Co-Authored-By: claude-flow <ruv@ruv.net> * fix: motion-responsive skeleton + through-wall CSI tracking - Pose decoder now uses per-cell motion grid to track actual arm/head positions — raising arms moves the skeleton's arms, head follows lateral movement - Motion grid (10x8 cells) tracks intensity per body zone: head, left/right arm upper/mid, legs - Through-wall mode: when person exits frame, CSI maintains presence with slow decay (~10s) and skeleton drifts in exit direction - CSI simulator persists sensing after video loss, ghost pose renders with decreasing confidence - Reduced temporal smoothing (0.45) for faster response to movement Co-Authored-By: claude-flow <ruv@ruv.net> * fix: video fills available space + correct WASM path resolution - Remove fixed aspect-ratio and max-height from video panel so it fills the available viewport space without scrolling - Grid uses 1fr row for content area, overflow:hidden on main grid - Fix WASM path: resolve relative to JS module file using import.meta.url instead of hardcoded ./pkg/ which resolved incorrectly on gh-pages - Responsive: mobile still gets aspect-ratio constraint Co-Authored-By: claude-flow <ruv@ruv.net> * feat: live ESP32 CSI pipeline + auto-connect WebSocket - Add auto-connect to local sensing server WebSocket (ws://localhost:8765) - Demo shows "Live ESP32" when connected to real CSI data - Add build_firmware.ps1 for native Windows ESP-IDF builds (no Docker) - Add read_serial.ps1 for ESP32 serial monitor Pipeline: ESP32 → UDP:5005 → sensing-server → WS:8765 → browser demo Co-Authored-By: claude-flow <ruv@ruv.net> * docs: add ADR-059 live ESP32 CSI pipeline + update README with demo links - ADR-059: Documents end-to-end ESP32 → sensing server → browser pipeline - README: Add dual-modal pose fusion demo link, update ADR count to 49 - References issue #245 Co-Authored-By: claude-flow <ruv@ruv.net> * feat: RSSI visualization, RuVector attention WASM, cache-bust fixes - Add animated RSSI Signal Strength panel with sparkline history - Fix RuVector WasmMultiHeadAttention retptr calling convention - Wire up RuVector Multi-Head + Flash Attention in CNN embedder - Add ambient temporal drift to CSI simulator for visible heatmap animation - Fix embedding space projection (sparse projection replaces cancelling sum) - Add auto-scaling to embedding space renderer - Add cache busters (?v=4) to all ES module imports to prevent stale caches - Add diagnostic logging for module version verification - Add RSSI tracking with quality labels and color-coded dBm display - Includes ruvector-attention-wasm v2.0.5 browser ESM wrapper Co-Authored-By: claude-flow <ruv@ruv.net> * feat: 26-keypoint dexterous pose + full RuVector attention pipeline Pose Decoder (17 → 26 keypoints): - Add finger approximations: thumb, index, pinky per hand (6 new) - Add toe tips: left/right foot index (2 new) - Add neck keypoint (1 new) - Hand openness driven by arm motion intensity - Finger positions computed from wrist-elbow axis angles CNN Embedder (full RuVector WASM pipeline): - Stage 1: Multi-Head Attention (global spatial reasoning) - Stage 2: Hyperbolic Attention (hierarchical body-part tree) - Stage 3: MoE Attention (3 experts: upper/lower/extremities, top-2) - Blended 40/30/30 weighting → final embedding projection Canvas Renderer: - Magenta finger joints with distinct glow - Cyan toe tips - White neck keypoint - Thinner limb lines for hand/foot connections - Joint count shown in overlay label CSI Simulator: - Skip synthetic person state when live ESP32 connected - Only simulate CSI data in demo mode (was already correct) Embedding Space: - Fixed projection: sparse 8-dim projection replaces cancelling sum - Auto-scaling normalizes point spread to fill canvas Cache busters bumped to v=5 on all imports. Co-Authored-By: claude-flow <ruv@ruv.net> * fix: centroid-based pose tracking for responsive limb movement Rewrites pose decoder from intensity-based to position-based tracking: - Arms now track toward motion centroid in each body zone - Elbow/wrist positions computed along shoulder→centroid vector - Legs track toward lower-body zone centroids - Smoothing reduced from 0.45 to 0.25 for responsiveness - Zone centroids blend 30% old / 70% new each frame 6 body zones with overlapping coverage: - Head (top 20%, center cols) - Left/Right Arm (rows 10-60%, outer cols) - Torso (rows 15-55%, center cols) - Left/Right Leg (rows 50-100%, half cols each) Hand openness now driven by arm spread distance + raise amount. Cache busters v=6. Co-Authored-By: claude-flow <ruv@ruv.net> * fix: remove duplicate lAnkleX/rAnkleX declarations in pose-decoder Stale code block from old intensity-based tracking was left behind, re-declaring variables already defined by centroid-based tracking. Co-Authored-By: claude-flow <ruv@ruv.net> * feat(demo): wire all 6 RuVector WASM attention mechanisms into pose fusion - Add WasmLinearAttention and WasmLocalGlobalAttention to browser ESM wrapper - Add 6 WASM utility functions (batch_normalize, pairwise_distances, etc.) - Extend CnnEmbedder to 6-stage pipeline: Flash → MHA → Hyperbolic → Linear → MoE → L+G - Use log-energy softmax blending across all 6 stages - Wire WASM cosine_similarity and normalize into FusionEngine - Add RuVector pipeline stats panel to UI (energy, refinement, pose impact) - Compute embedding-to-joint mapping stats without modifying joint positions - Center camera prompt with flexbox layout - Add cache busters v=12 Co-Authored-By: claude-flow <ruv@ruv.net>
221 lines
5.5 KiB
Markdown
221 lines
5.5 KiB
Markdown
# ruvector-attention-wasm
|
|
|
|
WebAssembly bindings for the ruvector-attention package, providing high-performance attention mechanisms for browser and Node.js environments.
|
|
|
|
## Features
|
|
|
|
- **Multiple Attention Mechanisms**:
|
|
- Scaled Dot-Product Attention
|
|
- Multi-Head Attention
|
|
- Hyperbolic Attention (for hierarchical data)
|
|
- Linear Attention (Performer-style)
|
|
- Flash Attention (memory-efficient)
|
|
- Local-Global Attention
|
|
- Mixture of Experts (MoE) Attention
|
|
- **CGT Sheaf Attention** (coherence-gated via Prime-Radiant)
|
|
|
|
- **Training Utilities**:
|
|
- InfoNCE contrastive loss
|
|
- Adam optimizer
|
|
- AdamW optimizer (with decoupled weight decay)
|
|
- Learning rate scheduler (warmup + cosine decay)
|
|
|
|
- **TypeScript Support**: Full type definitions and modern API
|
|
|
|
## Installation
|
|
|
|
```bash
|
|
npm install ruvector-attention-wasm
|
|
```
|
|
|
|
## Usage
|
|
|
|
### TypeScript/JavaScript
|
|
|
|
```typescript
|
|
import { initialize, MultiHeadAttention, utils } from 'ruvector-attention-wasm';
|
|
|
|
// Initialize WASM module
|
|
await initialize();
|
|
|
|
// Create multi-head attention
|
|
const attention = new MultiHeadAttention({ dim: 64, numHeads: 8 });
|
|
|
|
// Prepare inputs
|
|
const query = new Float32Array(64);
|
|
const keys = [new Float32Array(64), new Float32Array(64)];
|
|
const values = [new Float32Array(64), new Float32Array(64)];
|
|
|
|
// Compute attention
|
|
const output = attention.compute(query, keys, values);
|
|
|
|
// Use utilities
|
|
const similarity = utils.cosineSimilarity(query, keys[0]);
|
|
```
|
|
|
|
### Advanced Examples
|
|
|
|
#### Hyperbolic Attention
|
|
|
|
```typescript
|
|
import { HyperbolicAttention } from 'ruvector-attention-wasm';
|
|
|
|
const hyperbolic = new HyperbolicAttention({
|
|
dim: 128,
|
|
curvature: 1.0
|
|
});
|
|
|
|
const output = hyperbolic.compute(query, keys, values);
|
|
```
|
|
|
|
#### MoE Attention with Expert Stats
|
|
|
|
```typescript
|
|
import { MoEAttention } from 'ruvector-attention-wasm';
|
|
|
|
const moe = new MoEAttention({
|
|
dim: 64,
|
|
numExperts: 4,
|
|
topK: 2
|
|
});
|
|
|
|
const output = moe.compute(query, keys, values);
|
|
|
|
// Get expert utilization
|
|
const stats = moe.getExpertStats();
|
|
console.log('Load balance:', stats.loadBalance);
|
|
```
|
|
|
|
#### Training with InfoNCE Loss
|
|
|
|
```typescript
|
|
import { InfoNCELoss, Adam } from 'ruvector-attention-wasm';
|
|
|
|
const loss = new InfoNCELoss(0.07);
|
|
const optimizer = new Adam(paramCount, {
|
|
learningRate: 0.001,
|
|
beta1: 0.9,
|
|
beta2: 0.999,
|
|
});
|
|
|
|
// Training loop
|
|
const lossValue = loss.compute(anchor, positive, negatives);
|
|
optimizer.step(params, gradients);
|
|
```
|
|
|
|
#### Learning Rate Scheduling
|
|
|
|
```typescript
|
|
import { LRScheduler, AdamW } from 'ruvector-attention-wasm';
|
|
|
|
const scheduler = new LRScheduler({
|
|
initialLR: 0.001,
|
|
warmupSteps: 1000,
|
|
totalSteps: 10000,
|
|
});
|
|
|
|
const optimizer = new AdamW(paramCount, {
|
|
learningRate: scheduler.getLR(),
|
|
weightDecay: 0.01,
|
|
});
|
|
|
|
// Training loop
|
|
for (let step = 0; step < 10000; step++) {
|
|
optimizer.learningRate = scheduler.getLR();
|
|
optimizer.step(params, gradients);
|
|
scheduler.step();
|
|
}
|
|
```
|
|
|
|
## Building from Source
|
|
|
|
### Prerequisites
|
|
|
|
- Rust 1.70+
|
|
- wasm-pack
|
|
|
|
### Build Commands
|
|
|
|
```bash
|
|
# Build for web (ES modules)
|
|
wasm-pack build --target web --out-dir pkg
|
|
|
|
# Build for Node.js
|
|
wasm-pack build --target nodejs --out-dir pkg-node
|
|
|
|
# Build for bundlers (webpack, vite, etc.)
|
|
wasm-pack build --target bundler --out-dir pkg-bundler
|
|
|
|
# Run tests
|
|
wasm-pack test --headless --firefox
|
|
```
|
|
|
|
## API Reference
|
|
|
|
### Attention Mechanisms
|
|
|
|
- `MultiHeadAttention` - Standard multi-head attention
|
|
- `HyperbolicAttention` - Attention in hyperbolic space
|
|
- `LinearAttention` - Linear complexity attention (Performer)
|
|
- `FlashAttention` - Memory-efficient attention
|
|
- `LocalGlobalAttention` - Combined local and global attention
|
|
- `MoEAttention` - Mixture of Experts attention
|
|
- `CGTSheafAttention` - Coherence-gated via Prime-Radiant energy
|
|
- `scaledDotAttention()` - Functional API for basic attention
|
|
|
|
### CGT Sheaf Attention (Prime-Radiant Integration)
|
|
|
|
The CGT (Coherence-Gated Transformer) Sheaf Attention mechanism uses Prime-Radiant's sheaf Laplacian energy to gate attention based on mathematical consistency:
|
|
|
|
```typescript
|
|
import { CGTSheafAttention } from 'ruvector-attention-wasm';
|
|
|
|
const cgtAttention = new CGTSheafAttention({
|
|
dim: 128,
|
|
numHeads: 8,
|
|
coherenceThreshold: 0.3, // Block if energy > threshold
|
|
});
|
|
|
|
// Attention is gated by coherence energy
|
|
const result = cgtAttention.compute(query, keys, values);
|
|
console.log('Coherence energy:', result.energy);
|
|
console.log('Is coherent:', result.isCoherent);
|
|
```
|
|
|
|
**Key features:**
|
|
- Energy-weighted attention: Lower coherence energy → higher attention
|
|
- Automatic hallucination detection via residual analysis
|
|
- GPU-accelerated with wgpu WGSL shaders (vec4 optimized)
|
|
- SIMD fallback (AVX-512/AVX2/NEON)
|
|
|
|
### Training
|
|
|
|
- `InfoNCELoss` - Contrastive loss function
|
|
- `Adam` - Adam optimizer
|
|
- `AdamW` - AdamW optimizer with weight decay
|
|
- `LRScheduler` - Learning rate scheduler
|
|
|
|
### Utilities
|
|
|
|
- `utils.cosineSimilarity()` - Cosine similarity between vectors
|
|
- `utils.l2Norm()` - L2 norm of a vector
|
|
- `utils.normalize()` - Normalize vector to unit length
|
|
- `utils.softmax()` - Apply softmax transformation
|
|
- `utils.attentionWeights()` - Compute attention weights from scores
|
|
- `utils.batchNormalize()` - Batch normalization
|
|
- `utils.randomOrthogonalMatrix()` - Generate random orthogonal matrix
|
|
- `utils.pairwiseDistances()` - Compute pairwise distances
|
|
|
|
## Performance
|
|
|
|
The WASM bindings provide near-native performance for attention computations:
|
|
|
|
- Optimized with `opt-level = "s"` and LTO
|
|
- SIMD acceleration where available
|
|
- Efficient memory management
|
|
- Zero-copy data transfer where possible
|
|
|
|
## License
|
|
|
|
MIT OR Apache-2.0
|