Snapshot published 2026-10-13 01:29 UTC; the campaign is still running, so numbers and videos of later snapshots differ. Campaign directory generated/liro_stage1_20261011, first run started 2026-10-11 20:04 UTC, code aa1e901e0, seed 73, 2273402 parameters in the base network. All ten arms train on this machine (ankac-dgxc-4gpu); the OSMO wave ordered on 2026-10-11 has not started because the dispatcher stopped reporting at 20:15 UTC that day.
Every arm is the base configuration with one change. The selection metric is the mean final residual of the full-horizon validation (4 held-out worlds, 8 queries per step, the horizon of the growth stage); lower is better and the trainer keeps the checkpoint of the best eligible epoch. "rho after 8" is the cheap validation's pose error ratio against the float64 reference after 8 queries on one step (1 = the predictor pose, mean over 8 worlds). Momentum drift is relative to the gravity impulse over the rollout. Resets count training worlds that tripped a guard and were replaced; the figure in brackets splits them by guard. Wall-clock is the sum of the epoch times; three or four trainers shared one GPU.
| arm | ablation | change against base | status | epochs | best metric | best epoch (K x H) | last metric | rho after 8 (last) | momentum drift (last) | survivors (last) | resets (by guard) | hours | bench |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| base | design | joint edges, per-body token frame, formula translation, energy-only loss | completed | 36 / 36 | 0.03979 | 36 (8 x 128) | 0.03979 | 0.586 | 4.38e-05 | 4 / 4 | 2258 (anchor_gap 2251, non_finite 7) | 3.56 | not yet |
| learned_tr | 6 | translation: learned read-out query per articulation instead of the formula | completed | 36 / 36 | 0.09338 | 26 (8 x 128) | 0.1174 | 0.77 | 0.0737 | 4 / 4 | 2899 (anchor_gap 2887, non_finite 12) | 3.39 | not yet |
| no_tr | 6 | translation: no rigid shift after a query | completed | 36 / 36 | 0.0587 | 33 (8 x 128) | 0.06747 | 0.651 | 0.358 | 4 / 4 | 2670 (anchor_gap 2656, non_finite 14) | 3.35 | not yet |
| art_frame | 7 | token frame: one shared articulation frame instead of per-body frames | running | 21 / 36 | 0.1477 | 19 (8 x 128) | 0.2088 | 2.02 | 4.18e-05 | 4 / 4 | 1454 (anchor_gap 1446, non_finite 8) | 2.72 | not yet |
| all_pair | 8 | edges on every pair of bodies instead of joints only | running | 21 / 36 | 0.1851 | 20 (8 x 128) | 0.2062 | 2.08 | 2.44e-05 | 4 / 4 | 1665 (anchor_gap 1655, non_finite 10) | 2.74 | not yet |
| gn_input | 3 | the body's local 6x6 Gauss-Newton step as an input feature | running | 20 / 36 | 0.1163 | 20 (8 x 128) | 0.1163 | 0.867 | 7.39e-05 | 4 / 4 | 1387 (anchor_gap 1372, non_finite 15) | 2.53 | not yet |
| gn_anchor | 4 | output anchored to the local Gauss-Newton step, scale starts at 0.5 | running | 20 / 36 | 0.169 | 18 (8 x 128) | 0.2604 | 1.8 | 4.34e-05 | 4 / 4 | 1710 (anchor_gap 1696, non_finite 14) | 2.69 | not yet |
| teacher | 5 | teacher loss from 8 damped Gauss-Seidel sweeps, every second update | running | 18 / 36 | 0.1536 | 15 (8 x 128) | 0.3627 | 2.02 | 3.31e-05 | 4 / 4 | 1244 (anchor_gap 1237, non_finite 7) | 2.39 | not yet |
| ik_fk | 2 | reduced route: inverse then forward kinematics projection, no parameters | running | 23 / 36 | 0.03018 | 21 (8 x 128) | 0.106 | 1.12 | 0.953 | 4 / 4 | 0 (none) | 3.01 | not yet |
| reduced_learned | 1 | reduced route: learned head gives hinge increments, then forward kinematics | running | 22 / 36 | 0.02798 | 22 (8 x 128) | 0.02798 | 0.741 | 0.326 | 4 / 4 | 0 (none) | 2.56 | not yet |
Dashed lines are runs still training. The grey bands and the labels above each panel are the growth stages of the regime (the largest iteration count K and horizon H a training job can have); the validation horizon grows with the stage, so a metric is comparable with another only inside one band.
Held-out sets, best checkpoint of each arm: tier A is the error ratio against the float64 reference after K queries, the SolverVBD rows are the same ratio after n iterations of the Newton solver (compliant ALM and legacy variants; n = 512 shows the formulation floor), tier B is the rollout survival and energy. The benchmark runs on GPU 1 with no training on it, one arm after another.
No benchmark has finished yet. The queue on GPU 1 writes <run>/bench/summary.md per arm; this page picks them up when it is rebuilt.
Left: the network with K queries per physical step. Middle: SolverVBD (compliant ALM) at the same number of iterations. Right: SolverVBD at many iterations, the converged reference. All three start from the same state and see the same prescribed base motion. One video frame per physical step, so the playback is slow motion.
From the rollouts of section 4: the largest joint anchor gap of the world after every physical step, measured with the same joint geometry for every solver (the distance between the two anchor points of a joint, in units of the reference length L_ref; the trainer fails a world above 3 L_ref). An anchored chain under load has a physical gap, the stretch of its soft joints, so the question is whether the network reproduces the gap of the converged solver, not whether it reaches zero.
| arm | world | joints | mean gap, network (L_ref) | mean gap, SolverVBD same iterations | mean gap, SolverVBD reference | network / reference | network rollout |
|---|---|---|---|---|---|---|---|
| base | fast_dt [0] | 10 | 0.0458 | n/a | n/a | n/a | all 600 steps |
| base | four_bar [1] | 4 | 0.00142 | 1.98e-05 | 1.95e-05 | 72.6 | all 600 steps |
| base | long_chains [0] | 16 | 0.984 | n/a | n/a | n/a | step 7 |
| base | long_chains [3] | 12 | 0.00815 | n/a | n/a | n/a | all 600 steps |
| base | stiff [3] | 7 | 0.00363 | n/a | n/a | n/a | all 600 steps |
| base | trees [0] | 6 | 0.00742 | n/a | n/a | n/a | all 600 steps |
| base | trees [2] | 7 | 0.688 | n/a | n/a | n/a | all 600 steps |
| base | uniform_K [1] | 11 | 0.0273 | 0.0281 | 0.0278 | 0.982 | all 600 steps |
| base | uniform_K [12] | 12 | 0.0333 | 0.0536 | 0.0339 | 0.983 | all 600 steps |
| base | uniform_K [15] | 9 | 0.022 | 0.0218 | 0.0218 | 1.01 | all 600 steps |
| base | uniform_K [3] | 7 | 2.69e-04 | 8.32e-05 | 3.52e-05 | 7.65 | all 600 steps |
| base | uniform_K [4] | 3 | 0.0176 | 0.0178 | 0.0177 | 0.996 | all 600 steps |
| base | uniform_K [8] | 8 | 0.00124 | 1.77e-04 | 8.03e-05 | 15.4 | all 600 steps |
| base | fast_dt [0] twin | 10 | 0.00886 | 0.00903 | 0.00907 | 0.977 | all 600 steps |
| base | long_chains [0] twin | 16 | 0.615 | 0.634 | 0.616 | 0.998 | all 600 steps |
| base | long_chains [3] twin | 12 | 0.0403 | 0.0774 | 0.0563 | 0.717 | all 600 steps |
| base | stiff [3] twin | 7 | 0.00307 | 5.68e-05 | 2.06e-05 | 149 | all 600 steps |
| base | trees [0] twin | 6 | 5.32e-04 | 4.25e-04 | 4.25e-04 | 1.25 | all 600 steps |
| base | trees [2] twin | 7 | 0.673 | 0.407 | 0.407 | 1.65 | all 600 steps |
| learned_tr | trees [0] | 6 | 0.0823 | n/a | n/a | n/a | all 600 steps |
| learned_tr | uniform_K [1] | 11 | 0.0266 | 0.0281 | 0.0278 | 0.955 | all 600 steps |
| learned_tr | uniform_K [8] | 8 | 8.21e-04 | 1.77e-04 | 8.03e-05 | 10.2 | all 600 steps |
| no_tr | trees [0] | 6 | 0.00251 | n/a | n/a | n/a | all 600 steps |
| no_tr | uniform_K [1] | 11 | 0.0268 | 0.0281 | 0.0278 | 0.964 | all 600 steps |
| no_tr | uniform_K [8] | 8 | 9.40e-04 | 1.77e-04 | 8.03e-05 | 11.7 | all 600 steps |
The same ten configurations and seed ran on the OSMO cluster, one L40 each (dispatcher inbox entry 26, campaign liro1, code aa1e901e0). They are a second sample of every arm: the same code and data, a different GPU and a different order of floating-point sums, so the curves differ from the local runs where training is sensitive. Reports are pulled from the branches osmo/liro/liro1/<arm>_s73.
| arm | ablation | status | epochs | best metric | best epoch (K x H) | last metric | survivors (last) | hours | local copy: best metric |
|---|---|---|---|---|---|---|---|---|---|
| base | design | completed | 36 / 36 | 0.03394 | 36 (8 x 128) | 0.03394 | 4 / 4 | 2.04 | 0.03979 (36 epochs) |
| learned_tr | 6 | completed | 36 / 36 | 0.1058 | 28 (8 x 128) | 0.1546 | 4 / 4 | 1.92 | 0.09338 (36 epochs) |
| no_tr | 6 | completed | 36 / 36 | 0.06764 | 31 (8 x 128) | 0.0767 | 4 / 4 | 1.85 | 0.0587 (36 epochs) |
| art_frame | 7 | completed | 36 / 36 | 0.01457 | 36 (8 x 128) | 0.01457 | 4 / 4 | 2.01 | 0.1477 (21 epochs) |
| all_pair | 8 | completed | 36 / 36 | 0.03684 | 35 (8 x 128) | 0.03804 | 4 / 4 | 2.13 | 0.1851 (21 epochs) |
| gn_input | 3 | running | 33 / 36 | 0.02662 | 29 (8 x 128) | 0.08187 | 4 / 4 | 1.96 | 0.1163 (20 epochs) |
| gn_anchor | 4 | running | 33 / 36 | 0.05523 | 32 (8 x 128) | 0.05825 | 4 / 4 | 1.98 | 0.169 (20 epochs) |
| teacher | 5 | running | 24 / 36 | 0.09969 | 22 (8 x 128) | 0.1517 | 4 / 4 | 2.00 | 0.1536 (18 epochs) |
| ik_fk | 2 | running | 31 / 36 | 0.01198 | 31 (8 x 128) | 0.01198 | 4 / 4 | 1.99 | 0.03018 (23 epochs) |
| reduced_learned | 1 | running | 29 / 36 | 0.01994 | 28 (8 x 128) | 0.0287 | 4 / 4 | 1.99 | 0.02798 (22 epochs) |
<run>/report.json (per-epoch records) and <run>/bench/summary.md. Rebuild this page with python -m experiments.liro.results_page.