Learned Cloth Optimizer · zero-shot test on tetrahedra

The cloth-trained optimizer on a tet cuboid

The network was trained on cloth only. Here it solves a volumetric beam without retraining and without any change to the network or its inputs.

Data as of 2026-11-12 23:42 UTC1,225 vertices · 5,184 tets · 150 steps of 1/300 s

Findings

  1. It works without retraining. The baseline model is stable in all 8 cases and at every iteration count: no NaN, no blow-up. On soft and medium material (10 to 100 kPa) it converges about as fast as on cloth: 8 % of the step energy is missing after 5 iterations and 0.4 % after 10, against 8 % and 0.3 % on the cloth control.
  2. It gets slower with stiffness. At 1 MPa it needs 30 iterations for the accuracy it has at 10 iterations on cloth. At 10 MPa it stalls: 40 % of the step energy is still missing after 30 iterations. Near-incompressible material is also slow (ν = 0.49: 20 % missing after 10 iterations).
  3. Against VBD at equal iteration count: VBD is far better on very soft material (10 kPa). From 100 kPa upward LeCO is ahead, and the distance grows with stiffness: at 1 MPa LeCO misses 6 % of the step energy after 10 iterations, plain VBD 66 %. Undamped block Jacobi diverges at 5 iterations in most cases.
  4. The context-window-5 model transfers best. It is 3 to 100 times closer to the minimum than the baseline at the same iteration count, at 5 message-passing rounds per iteration.
  5. The per-node normalization model does not transfer. It explodes in every case within 2 to 19 time steps. It was the best cloth model at 5 iterations, so it is less robust outside the training data.

Animations

Each panel uses the same number of iterations per time step. The dashed box is the converged Newton solution at the same time. Playback is 10 times slower than real time.

Cantilever, E = 100 kPa. The beam swings down by more than its own length. LeCO at 10 iterations follows the reference within 5 mm.
Cantilever, E = 1 MPa. Ten times stiffer. LeCO lags the reference; VBD and block Jacobi lag more at the same iteration count.
Both ends held, one end turns by 90° in 0.5 s, E = 100 kPa.

Energy gap per time step

Share of the energy decrease of one time step that is still missing after the given number of iterations: (Ek − E*) / (E0 − E*), geometric mean over the run. E* is the Newton minimum of that step. 0 % is converged. Each method runs its own trajectory.

CaseE·h / (m/Δt²)LeCO baselineLeCO, context window 5VBDBlock Jacobi, damping 0.5
5 it10 it30 it5 it10 it30 it5 it10 it30 it5 it10 it30 it
Cloth sheet (control)the energy it was trained on–8.0 %0.3 %6e-7not run
Cantilever, E = 10 kPaν 0.3 · beam moves up to 1020 mm0.41.4 %7e-69e-107e-43e-67e-118e-68e-119e-144.9 %0.3 %6e-8
Cantilever, E = 100 kPaν 0.3 · beam moves up to 677 mm3.98.4 %0.4 %4e-81.3 %3e-53e-1015 %2.2 %2e-560 %37 %5.4 %
Cantilever, E = 1 MPaν 0.3 · beam moves up to 111 mm39.426 %5.8 %8e-43.6 %2.1 %9e-781 %66 %29 %95 %90 %73 %
Cantilever, E = 10 MPaν 0.3 · beam moves up to 10 mm393.879 %71 %40 %54 %28 %2.4 %97 %95 %87 %99 %99 %96 %
Cantilever, E = 100 kPaν 0.45 · beam moves up to 600 mm3.96.6 %1.4 %3e-67.2 %0.3 %1e-743 %19 %1.0 %80 %63 %28 %
Cantilever, E = 100 kPaν 0.49 · beam moves up to 501 mm3.944 %19 %1.1 %23 %6.2 %4e-481 %66 %31 %95 %91 %73 %
Twist 90°, E = 100 kPaν 0.3 · beam moves up to 0 mm3.910 %0.3 %2e-81.7 %2e-53e-1016 %2.6 %2e-561 %39 %6.1 %
Twist 90°, E = 1 MPaν 0.3 · beam moves up to 0 mm39.424 %3.3 %1e-44.9 %0.2 %1e-777 %61 %18 %91 %86 %67 %

Distance to the reference trajectory

Mean vertex distance to the converged Newton trajectory, in mm, averaged over the 150 steps. The beam is 480 mm long.

CaseE·h / (m/Δt²)LeCO baselineLeCO, context window 5VBDBlock Jacobi, damping 0.5
5 it10 it30 it5 it10 it30 it5 it10 it30 it5 it10 it30 it
Cantilever, E = 10 kPaν 0.3 · beam moves up to 1020 mm0.411.61.0<0.10.5<0.1<0.10.3<0.1<0.141.28.9<0.1
Cantilever, E = 100 kPaν 0.3 · beam moves up to 677 mm3.923.84.7<0.12.00.1<0.146.215.70.4116.183.826.2
Cantilever, E = 1 MPaν 0.3 · beam moves up to 111 mm39.414.05.60.60.93.1<0.121.522.915.318.119.022.7
Cantilever, E = 10 MPaν 0.3 · beam moves up to 10 mm393.84.42.51.31.31.00.41.41.71.61.81.41.6
Cantilever, E = 100 kPaν 0.45 · beam moves up to 600 mm3.98.35.90.15.21.6<0.175.042.68.2122.3103.755.4
Cantilever, E = 100 kPaν 0.49 · beam moves up to 501 mm3.955.324.65.211.46.50.3105.088.248.5121.2114.996.1
Twist 90°, E = 100 kPaν 0.3 · beam moves up to 0 mm3.93.90.5<0.10.8<0.1<0.16.72.80.17.68.34.4
Twist 90°, E = 1 MPaν 0.3 · beam moves up to 0 mm39.40.30.1<0.10.1<0.1<0.10.80.60.31.91.20.7

Setup

Problem

Cuboid 0.48 × 0.12 × 0.12 m, 24 × 6 × 6 cells of 6 tets, density 1000 kg/m³, gravity, time step 1/300 s (the training time step). Energy: inertia + gravity + stable Neo-Hookean. No contact, no DAT. Cantilever: one end face is fixed. Twist: both end faces are held and one turns.

Network

Input per vertex: gradient, previous gradient, last update. Graph: the tet edges (11.5 neighbours per vertex; cloth has about 6). The loop is the one of SolverLearned.step; the step scale carries over between time steps. Float32 network, float64 energy.

Baselines

Newton: projected Newton with line search, converged (reference). VBD: coloured Gauss-Seidel with 3 × 3 vertex blocks, 8 colours, no acceleration. Block Jacobi: the same blocks for all vertices at once. These are my own plain implementations for this test.