{
  "schema": "shardnet-experiment-run/v1",
  "experiment_id": "sn-lab-002",
  "run_id": "sn-lab-002-selftest-20260926T204927Z",
  "timestamp_utc": "2026-09-26T20:49:27.643Z",
  "environment": {
    "type": "implementation self-test",
    "runtime": "Node.js v24.3.0",
    "v8": "13.6.233.10-node.18",
    "platform": "win32",
    "arch": "x64",
    "accelerator": null
  },
  "problem": {
    "family": "Hilbert matrices H_ij = 1/(i+j+1)",
    "sizes": [
      4,
      5,
      6,
      7,
      8,
      9,
      10,
      11,
      12
    ],
    "known_solution": "x_i = 1",
    "rhs": "b = H * 1"
  },
  "methods": [
    {
      "name": "Float64 LU",
      "pivoting": "partial",
      "role": "reference"
    },
    {
      "name": "Float32 LU",
      "pivoting": "partial",
      "role": "low-precision baseline",
      "arithmetic": "Math.fround emulation"
    },
    {
      "name": "mixed iterative refinement",
      "factorization": "Float32 LU",
      "residual": "Float64",
      "correction": "Float32 triangular solves",
      "outer_steps_max": 10
    }
  ],
  "results": [
    {
      "n": 4,
      "fp64_error": 3.86e-13,
      "float32_error": 0.0000729,
      "mixed_error": 1.91e-13
    },
    {
      "n": 5,
      "fp64_error": 3.49e-13,
      "float32_error": 0.00437,
      "mixed_error": 2.52e-12
    },
    {
      "n": 6,
      "fp64_error": 3.11e-10,
      "float32_error": 0.055,
      "mixed_error": 8.8e-9
    },
    {
      "n": 7,
      "fp64_error": 1.42e-8,
      "float32_error": 0.0399,
      "mixed_error": 0.00169
    },
    {
      "n": 8,
      "fp64_error": 2.15e-7,
      "float32_error": 0.751,
      "mixed_error": 0.145
    },
    {
      "n": 9,
      "fp64_error": 0.00000999,
      "float32_error": 1.97,
      "mixed_error": 9.18
    },
    {
      "n": 10,
      "fp64_error": 0.000163,
      "float32_error": 4.3,
      "mixed_error": 3.24
    },
    {
      "n": 11,
      "fp64_error": 0.00461,
      "float32_error": 16.2,
      "mixed_error": 1630
    },
    {
      "n": 12,
      "fp64_error": 0.166,
      "float32_error": 32.7,
      "mixed_error": 23
    }
  ],
  "interpretation": "Iterative refinement recovers near-reference accuracy for the better-conditioned members, then fails as the Float32 factorization becomes an inadequate correction operator. The failure is retained as part of the experiment.",
  "limitations": [
    "This is a deterministic implementation self-test, not a GPU benchmark.",
    "Hilbert matrices are a deliberately pathological conditioning stress test, not a representative application distribution.",
    "Float32 behavior is emulated with JavaScript Math.fround."
  ]
}