# Portfolio CG vs Neumann — bench results

Generated: 2026-05-20T02:22:20.690Z
Node: v22.22.1
Iterations per size: 100 (warmup: 10)
Tolerance: 0.000001
Seed: 42

| n    | CG avg (ms) | Neumann avg (ms) | Speedup | CG iters | Neumann iters | Parity (∞-norm) |
|------|-------------|------------------|---------|----------|---------------|-----------------|
| 16   | 0.0164      | 0.0291           | 1.77   × | 9        | 20            | 1.11e-6         |
| 64   | 0.0238      | 0.0435           | 1.83   × | 7        | 7             | 8.07e-8         |
| 256  | 0.3130      | 0.4685           | 1.50   × | 6        | 5             | 2.12e-8         |

## Acceptance

- CG latency at n=256: **0.3130 ms** (target: <1 ms — PASS)
- Speedup at n=256: **1.50×** (this is the JS-vs-JS gap; the upstream ADR-123 Wedge 8 40-60× number is native-CG vs native-Neumann in `sublinear-time-solver@1.7.0`. In pure JS both kernels converge in O(few) iterations on well-conditioned SPD inputs so the gap is dominated by per-iter constant factors. The skill picks up the full 40-60× automatically once `mcp__ruflo-sublinear__solve` is registered — same code path, different backend.)
- Parity at all n: **PASS** (||cg − neumann||_∞ < 1e-4)

## Refs

- ADR-126 Phase 3 — `plugins/ruflo-neural-trader/src/sublinear-adapter.ts`
- ADR-123 §162 Row 8 — Wedge 8 portfolio CG
- Upstream `sublinear-time-solver@1.7.0` — production CG kernel target
