Learned Cloth Optimizer · ablations of November 2026

LeCO ablation results

Every model is trained for 500,000 steps with the same data and then runs the same test scene. This page shows which changes still give a usable solver at inference, and which do not.

Data as of 2026-11-12 23:42 UTC Trainings finished 30 of 31 Inference runs finished 199 of 199

Findings

  1. A per-vertex step scale does not work at inference. Every model with a per-node scale breaks within the first 60 to 180 of 4,040 steps. This holds at 5, 10 and 30 iterations, with DAT and without DAT, with per-node gradient normalization, with the gradient magnitude input, and with a ring context of 1 to 32 rings. The truncated scale does not rescue them: the positions stay finite, but more than 5 % of the edges are badly stretched after 60 to 180 steps.
  2. Per-node gradient normalization with a global scale works. It finishes every setting. At 5 iterations it is at least as good as the baseline (end distance 21 to 26 mm against 32 to 49 mm, depth 1.6 to 2.9 mm against 1.8 to 10.3 mm). At 10 and 30 iterations the two are equal. Two runs per model are not enough to call it better, and on the criteria of the paper (gradient norm and residual ratio per step) it is level with the baseline.
  3. The gradient magnitude input does not help. With global normalization it makes the 5-iteration result clearly worse (109 to 116 mm from the reference at 25 % of the sequence). At 10 iterations it equals the baseline. With per-node normalization the result is about the same as the baseline.
  4. Width 96 or more is safe. Below 96 the 5-iteration solver is not reliable. Widths 96, 128, 192 and 256 give the same quality. Width 64 keeps good edge numbers but loses a garment at 5 iterations. Width 32 breaks, width 24 gives NaN, width 16 ends far off. At 10 iterations every width finishes. No width above 96 is better than 96.
  5. The other ablations confirm the main design. Each removed input makes the result worse or unstable. The per-iteration scale and the model without scale finish, but with lower accuracy. A context window of 3 equals the baseline within the run-to-run spread.
  6. A context window of 5 gives the closest 5-iteration result. Its end distance is 20 to 21 mm, against 32 to 49 mm for the baseline and 21 to 26 mm for per-node normalization. It costs 5 message-passing rounds per iteration, so it is not a free gain.
  7. The fixed-state test of the code base separates two things. Almost every model can solve a single time step in 30 iterations, also the per-node scale models. Their failure appears only in rollouts. From a cold start the per-node normalization with the magnitude input is the fastest model (6 % of the energy decrease missing after 5 iterations, baseline 31 %).
  8. On the criteria of the paper no ablation beats the baseline at 5 iterations. Objective, gradient norm and residual ratio per time step are level for all stable models. At 10 iterations the larger context windows are about 30 % lower; at 30 iterations all are equal.

Still open: the model without iteration (in training).

How to read the tables

Test

Scene dlayers_00396 (layered dress on a moving body), 4,040 solver steps. DAT is on with dynamic collision detection. “5 it · 15 mm” means 5 network iterations per step and a 15 mm collision query radius. Every model runs on the same PyTorch network path. Each line in a cell is one run.

Numbers

edge
Largest edge stretch in the run (length / rest length). The baseline reaches about 2 to 6.
depth
Deepest body penetration in the run, in mm.
dist.
Median vertex distance to the reference, in mm, at 25 % of the sequence / at the end. The reference is the released checkpoint at 30 iterations.

Outcome

OK
Finished, close to the reference (below 50 mm at 25 % and below 150 mm at the end).
far off
Finished, but far from the reference. lost means more than 1 m: a garment left the body.
NaN
Positions became NaN at this step.
broken
Stopped at this step: more than 5 % of the edges were badly stretched.
time limit
No result: the run was too slow on a GPU shared with trainings. It is shown only if no rerun gave a result.

Criteria of the paper

The three criteria of the paper, recorded at every time step of the rollout on dlayers_00396 (4,040 steps, DAT on, 15 mm): the objective G after K iterations, the gradient norm ‖∇XG‖2 over the free vertices, and the gradient norm after K iterations divided by the gradient norm at the start of the step. The recorder is the one of the code base (experiments/ablation_statistics/run.py), changed only to accept a sewn scene. Both gradients use the final contact set of the step. Each metric has its mean and its median over the steps. A run counts as failed when any value becomes non-finite, as in the summary script of the code base. Green is 30 % or more below the baseline, red is 50 % or more above; G has no colour.

K = 5 iterations per time step

ModelG‖∇XG‖2‖∇XG(K)‖2 / ‖∇XG(0)‖2
meanmedianmeanmedianmeanmedian
Baseline (width 96)width_965.0484.9345.600.960.1790.123
Normalization × scale
Per-node normalizationnorm_node_scale_global5.0344.9375.021.190.1740.127
Per-node scalescale_per_node_scalefailed non-finite at step 50 of 4,040
Both per nodenorm_node_scale_nodefailed non-finite at step 107 of 4,040
Baseline + magnitudenetwork_inputs_w_gradient_magnitude4.2904.17410.173.770.1180.063
Per-node normalization + magnitudemag_norm_node_scale_global5.3725.00017.931.020.2010.133
Per-node scale + magnitudemag_norm_global_scale_nodefailed non-finite at step 48 of 4,040
Both per node + magnitudemag_norm_node_scale_nodefailed non-finite at step 100 of 4,040
Per-node scale with ring context
1-ring contextscale_per_node_ring1failed non-finite at step 100 of 4,040
2-ring contextscale_per_node_ring2failed non-finite at step 151 of 4,040
4-ring contextscale_per_node_ring4failed non-finite at step 118 of 4,040
8-ring contextscale_per_node_ring8failed non-finite at step 158 of 4,040
16-ring contextscale_per_node_ring16failed non-finite at step 203 of 4,040
32-ring contextscale_per_node_ring32failed non-finite at step 418 of 4,040
Width
Width 16width_16failed non-finite at step 3,370 of 4,040
Width 24width_24failed non-finite at step 421 of 4,040
Width 32width_32failed non-finite at step 419 of 4,040
Width 64width_644.7474.31014.738.810.1670.125
Width 128width_1285.0334.8895.901.140.2030.145
Width 192width_1925.0144.8685.681.150.1800.127
Width 256width_2565.1845.3586.411.060.1940.127
Step scale
Per-iteration scalescale_per_iteration_scale5.2524.93320.695.640.2460.146
No scalescale_wo_scale5.1915.26811.963.920.1890.098
Inputs
No current gradientnetwork_inputs_wo_current_gradients9.6027.77210079.880.7160.721
No previous gradientnetwork_inputs_wo_previous_gradients5.3664.74725.5914.100.3260.234
No gradientsnetwork_inputs_wo_gradients349622542497551.0001.000
No last updatenetwork_inputs_wo_displacements5.6425.29826.4613.620.3660.359
Last update / RMSnetwork_inputs_RMS_displacementsfailed non-finite at step 252 of 4,040
Context window
Depth 3context_window_context_window_35.0254.9204.821.000.2130.162
Depth 5context_window_context_windows_55.0324.9304.380.860.2040.159

K = 10 iterations per time step

ModelG‖∇XG‖2‖∇XG(K)‖2 / ‖∇XG(0)‖2
meanmedianmeanmedianmeanmedian
Baseline (width 96)width_965.0214.9171.170.190.0600.037
Normalization × scale
Per-node normalizationnorm_node_scale_global5.0344.9251.290.160.0490.034
Per-node scalescale_per_node_scalefailed non-finite at step 29 of 4,040
Both per nodenorm_node_scale_nodefailed non-finite at step 65 of 4,040
Baseline + magnitudenetwork_inputs_w_gradient_magnitude5.0224.9131.710.250.0750.048
Per-node normalization + magnitudemag_norm_node_scale_global5.0294.9281.100.210.0590.039
Per-node scale + magnitudemag_norm_global_scale_nodefailed non-finite at step 32 of 4,040
Both per node + magnitudemag_norm_node_scale_nodefailed non-finite at step 39 of 4,040
Per-node scale with ring context
1-ring contextscale_per_node_ring1failed non-finite at step 53 of 4,040
2-ring contextscale_per_node_ring2failed non-finite at step 78 of 4,040
4-ring contextscale_per_node_ring4failed non-finite at step 68 of 4,040
8-ring contextscale_per_node_ring8failed non-finite at step 80 of 4,040
16-ring contextscale_per_node_ring16failed non-finite at step 115 of 4,040
32-ring contextscale_per_node_ring32failed non-finite at step 242 of 4,040
Width
Width 16width_164.7974.8484.500.470.0840.051
Width 24width_245.0275.0346.750.440.1250.071
Width 32width_325.0184.8733.910.290.1100.052
Width 64width_645.0114.9132.200.270.0810.044
Width 128width_1285.0284.9271.690.190.0570.036
Width 192width_1925.0224.9161.370.200.0510.034
Width 256width_2565.0184.9121.500.180.0560.034
Step scale
Per-iteration scalescale_per_iteration_scale4.9284.9367.862.610.2460.082
No scalescale_wo_scale5.0534.9415.480.740.1280.052
Inputs
No current gradientnetwork_inputs_wo_current_gradientsfailed non-finite at step 58 of 4,040
No previous gradientnetwork_inputs_wo_previous_gradients5.0104.9835.200.590.1280.056
No gradientsnetwork_inputs_wo_gradients350423742988111.0001.000
No last updatenetwork_inputs_wo_displacements5.1605.1987.681.720.1810.132
Last update / RMSnetwork_inputs_RMS_displacementsfailed non-finite at step 273 of 4,040
Context window
Depth 3context_window_context_window_35.0184.9150.840.140.0380.024
Depth 5context_window_context_windows_55.0174.9150.540.130.0340.021

K = 30 iterations per time step

ModelG‖∇XG‖2‖∇XG(K)‖2 / ‖∇XG(0)‖2
meanmedianmeanmedianmeanmedian
Baseline (width 96)width_965.0224.9180.520.010.0070.002
Normalization × scale
Per-node normalizationnorm_node_scale_global5.0224.9180.290.020.0060.003
Per-node scalescale_per_node_scalefailed non-finite at step 10 of 4,040
Both per nodenorm_node_scale_nodefailed non-finite at step 41 of 4,040
Baseline + magnitudenetwork_inputs_w_gradient_magnitude5.0244.9180.840.010.0080.003
Per-node normalization + magnitudemag_norm_node_scale_global5.0264.9190.150.020.0060.003
Per-node scale + magnitudemag_norm_global_scale_nodefailed non-finite at step 14 of 4,040
Both per node + magnitudemag_norm_node_scale_nodefailed non-finite at step 29 of 4,040
Per-node scale with ring context
1-ring contextscale_per_node_ring1failed non-finite at step 17 of 4,040
2-ring contextscale_per_node_ring2failed non-finite at step 26 of 4,040
4-ring contextscale_per_node_ring4failed non-finite at step 21 of 4,040
8-ring contextscale_per_node_ring8failed non-finite at step 33 of 4,040
16-ring contextscale_per_node_ring16failed non-finite at step 51 of 4,040
32-ring contextscale_per_node_ring32failed non-finite at step 82 of 4,040
Width
Width 16width_165.0044.9131.360.040.0210.006
Width 24width_245.0224.9170.560.020.0120.004
Width 32width_325.0244.9170.310.020.0100.004
Width 64width_645.0224.9170.760.020.0080.003
Width 128width_1285.0244.9190.650.010.0070.002
Width 192width_1925.0224.9180.160.010.0040.002
Width 256width_2565.0234.9190.440.010.0050.001
Step scale
Per-iteration scalescale_per_iteration_scale5.0445.0326.091.010.2410.031
No scalescale_wo_scale5.0014.8161.560.380.0890.045
Inputs
No current gradientnetwork_inputs_wo_current_gradientsfailed non-finite at step 702 of 4,040
No previous gradientnetwork_inputs_wo_previous_gradients4.9194.7770.840.030.0340.005
No gradientsnetwork_inputs_wo_gradients350423742988111.0001.000
No last updatenetwork_inputs_wo_displacements5.0235.0162.190.170.0680.021
Last update / RMSnetwork_inputs_RMS_displacementsfailed non-finite at step 856 of 4,040
Context window
Depth 3context_window_context_window_35.0214.9180.380.010.0050.002
Depth 5context_window_context_windows_55.0224.9180.160.010.0040.001

Reading

  • At 5 iterations no stable model is clearly below the baseline in gradient norm or in the residual ratio. Per-node normalization is level with it (median ratio 0.127 against 0.123), and so are widths 128 to 256 and both context windows. The magnitude input has a lower ratio but a 4 times larger gradient norm: its run drifted away, so its start gradients are larger and its ratio is not comparable.
  • At 10 iterations the context windows 3 and 5 are about 30 % lower in median gradient norm and ratio. The other stable models stay level with the baseline.
  • At 30 iterations all stable models with the full inputs are equal: median gradient norm about 0.01 to 0.02, median ratio 0.001 to 0.004.
  • Failed by the strict rule: every per-node scale model at every K, the last update divided by its RMS, the model without the current gradient at 10 and 30 iterations, and widths 16, 24 and 32 at 5 iterations.
  • The mean gradient norm is several times the median in every row. A few steps with large gradients dominate the mean, so the median is the steadier number.
  • G is comparable only while the trajectories stay together. A garment that slides down lowers G: width 64 and the magnitude input at 5 iterations have the lowest G and are the runs that ended far from the reference.

Fixed-state test

The direct test of the code base (experiments/checkpoints/checkpoint_progress.py). Every model solves the same 300 saved states, each one time step, with fresh optimizer history. The states come from two motions of the repository's test split, simulated by the baseline at 60 iterations. Numbers are in percent; lower is better. “5 it”, “10 it”, “30 it”: share of the energy decrease that is still missing, median over the states. 100 % of the decrease is what the baseline reaches after 60 iterations on the same state. A value above 100 means the energy went up. “resid.”: gradient norm after 10 iterations relative to the start. “failed”: share of states with a non-finite result. Green is clearly better than the baseline, red is clearly worse. Two limits. The optimizer starts cold in every state (step scale 1e-4, no history), so the 5-iteration column mostly shows how fast a model finds its step size; in a rollout the history carries over. The trainings used all motions (split: all), so this is a like-for-like loss on fixed states, not a held-out test.

ModelWithout DAT (as in training)With DAT
5 it10 it30 itresid. 10 itfailed5 it10 it30 itresid. 10 itfailed
Baseline (width 96)width_9631.16.00.063.2014.03.80.024.80
Normalization × scale
Per-node normalizationnorm_node_scale_global65.910.30.162.0028.87.00.023.20
Per-node scalescale_per_node_scale>9992300.497.9044037.90.131.80
Both per nodenorm_node_scale_node51044.40.174.6013413.40.024.70
Baseline + magnitudenetwork_inputs_w_gradient_magnitude11.82.70.159.508.82.60.027.70
Per-node normalization + magnitudemag_norm_node_scale_global6.21.00.041.306.11.10.019.40
Per-node scale + magnitudemag_norm_global_scale_node12.81.90.354.1010.41.90.124.40
Both per node + magnitudemag_norm_node_scale_node1066.90.264.7034.93.80.123.90
Per-node scale with ring context
1-ring contextscale_per_node_ring131334.00.075.101109.70.128.40
2-ring contextscale_per_node_ring222513.80.176.1058.65.50.130.20
4-ring contextscale_per_node_ring412413.60.181.7040.05.10.028.20
8-ring contextscale_per_node_ring81279.00.073.5044.84.30.027.00
16-ring contextscale_per_node_ring1670.44.90.074.4022.12.30.025.40
32-ring contextscale_per_node_ring3253.14.70.067.0022.33.10.025.60
Width
Width 16width_1641.04.80.567.4021.95.50.226.30
Width 24width_2428.72.80.268.7013.62.80.123.90
Width 32width_3223.73.00.073.1014.82.50.027.40
Width 64width_6433.04.10.167.5014.53.40.025.80
Width 128width_12831.92.40.057.1014.22.10.024.40
Width 192width_19231.52.30.066.8013.12.20.024.40
Width 256width_25622.72.00.062.4011.71.80.024.70
Step scale
Per-iteration scalescale_per_iteration_scale1477.80.195.8020.73.90.028.60
No scalescale_wo_scale>9992005.0138072.711.92.134.60
Inputs
No current gradientnetwork_inputs_wo_current_gradients93.518.15.284.0051.519.75.552.80
No previous gradientnetwork_inputs_wo_previous_gradients11.11.80.551.7015.72.70.124.70
No gradientsnetwork_inputs_wo_gradients12612612610801081081081010
No last updatenetwork_inputs_wo_displacements20829.30.887.9024.18.40.628.20
Last update / RMSnetwork_inputs_RMS_displacements87.99.90.093.5024.83.30.033.40
Context window
Depth 3context_window_context_window_321.72.40.059.9010.51.10.024.10
Depth 5context_window_context_windows_521.91.30.159.5012.31.40.021.80

Reading

  • All models except three solve a single step: after 30 iterations they reach the same energy as the baseline. The exceptions are the model without gradient inputs (it never lowers the energy), the model without the current gradient and the model without a step scale (each 5 % missing).
  • Per-node scale models do not fail here. They start badly (after 5 iterations the energy is far above the start) and are level with the baseline after 30 iterations. Their rollouts break within 200 steps. So the per-node scale can solve one step from a cold start; the failure is in the rollout, where the scale carries over from step to step. More rings make the cold start better: 1 ring 34 % missing after 10 iterations, 32 rings 5 %.
  • Fastest from a cold start: per-node normalization with the magnitude input (6 % missing after 5 iterations, baseline 31 %). The magnitude input alone and the model without the previous gradient are also faster than the baseline here.
  • Per-node normalization without the magnitude input is slower from a cold start (66 % missing after 5 iterations), although its rollouts are the best. The magnitude input removes this.
  • Width has a small effect: 16 is the slowest; 96 to 256 are equal after 10 iterations.
  • The ranking differs from the rollout tables. A cold start rewards a fast step-size search; a rollout rewards stability over thousands of steps. Both are needed.

Gradient normalization × step scale

Gradient normalization: the gradient input is divided by the RMS of the whole mesh (global) or by the size of the gradient of that vertex (per node). Step scale: one learned scale per axis for the whole mesh (global) or one per vertex (per node). Magnitude input: log10 of the divisor as one more input channel.

Without the gradient magnitude input
global scale
per-node scale
global normalization
width_96
5 it OK10 it OK5 it 7 mm OK30 it OK
scale_per_node_scale
5 it NaN10 it NaN5 it 7 mm NaN30 it NaN
per-node normalization
norm_node_scale_global
5 it OK10 it OK5 it 7 mm OK30 it OK
norm_node_scale_node
5 it NaN10 it NaN5 it 7 mm NaN30 it NaN
With the gradient magnitude input
global scale
per-node scale
global normalization
network_inputs_w_gradient_magnitude
5 it far off10 it OK5 it 7 mm NaN
mag_norm_global_scale_node
5 it NaN10 it NaN5 it 7 mm NaN
per-node normalization
mag_norm_node_scale_global
5 it OK10 it OK5 it 7 mm OK
mag_norm_node_scale_node
5 it NaN10 it NaN5 it 7 mm NaN
Variant5 it · 15 mm
edgedepthdist.
10 it · 15 mm
edgedepthdist.
5 it · 7 mm
edgedepthdist.
30 it · 15 mm
edgedepthdist.
Baselinewidth_96
OK6.110.311 / 49
OK2.71.810 / 32
OK1.97.46 / 11
OK4.11.215 / 47
OK1.95.73 / 5
Per-node normalizationnorm_node_scale_global
OK4.72.911 / 26
OK4.21.610 / 21
OK2.25.95 / 5
OK4.02.617 / 123
OK1.96.83 / 4
Per-node scalescale_per_node_scale
NaN · step 60
NaN · step 60
NaN · step 60
NaN · step 60
NaN · step 60
Both per nodenorm_node_scale_node
NaN · step 120
NaN · step 120
NaN · step 60
NaN · step 120
NaN · step 60
Baseline + magnitudenetwork_inputs_w_gradient_magnitude
far off7.931.7116 / 202
far off9.210.3109 / 255
OK1.95.17 / 10
NaN · step 4040
–
Per-node normalization + magnitudemag_norm_node_scale_global
OK7.810.813 / 61
OK7.16.513 / 50
OK2.63.36 / 10
OK7.84.322 / 42
–
Per-node scale + magnitudemag_norm_global_scale_node
NaN · step 60
NaN · step 60
NaN · step 60
NaN · step 60
–
Both per node + magnitudemag_norm_node_scale_node
NaN · step 120
NaN · step 120
NaN · step 60
NaN · step 120
–

Reading

  • The column decides the result. Both models with a global scale work. All models with a per-node scale fail, with either normalization.
  • Per-node normalization with a global scale is better than the baseline row at 5 iterations and equal to it at 10 and 30 iterations. At 7 mm its end distance is larger (123 mm against 47 mm); one run each.
  • The magnitude input makes the baseline worse at 5 iterations and changes nothing at 10 iterations. With per-node normalization it changes little.

Per-node step scale: k-ring context and truncated scale

The scale head of a vertex reads the mean of its k-ring neighbourhood (network.scale_context_rings). “cut s” means solver.truncated_scale: true: at inference the per-vertex scale follows the DAT cut. All these models were trained without DAT.

Variant5 it · 15 mm5 it · 15 mm · cut s10 it · 15 mm10 it · 15 mm · cut s5 it · 7 mm5 it · 7 mm · cut s30 it · 15 mm30 it · 15 mm · cut s
Per-node scaleno neighbourhoodscale_per_node_scale
NaN · step 60
NaN · step 60
broken · step 120
broken · step 120
NaN · step 60
broken · step 120
NaN · step 60
broken · step 120
NaN · step 60
broken · step 60
1-ring contextscale_per_node_ring1
NaN · step 120
NaN · step 120
broken · step 180
broken · step 120
NaN · step 60
broken · step 120
NaN · step 120
broken · step 120
NaN · step 60
broken · step 60
2-ring contextscale_per_node_ring2
NaN · step 180
NaN · step 180
broken · step 360
broken · step 180
NaN · step 120
broken · step 240
NaN · step 180
broken · step 300
NaN · step 60
broken · step 60
4-ring contextscale_per_node_ring4
NaN · step 180
NaN · step 180
broken · step 300
broken · step 180
NaN · step 120
broken · step 120
NaN · step 180
broken · step 180
NaN · step 60
broken · step 60
8-ring contextscale_per_node_ring8
NaN · step 180
NaN · step 180
broken · step 180
broken · step 180
NaN · step 120
broken · step 120
NaN · step 180
broken · step 240
NaN · step 60
broken · step 120
16-ring contextscale_per_node_ring16
broken · step 240
NaN · step 240
broken · step 240
broken · step 240
NaN · step 120
broken · step 120
NaN · step 240
broken · step 240
NaN · step 60
broken · step 120
32-ring contextscale_per_node_ring32
broken · step 300
NaN · step 300
broken · step 300
broken · step 360
NaN · step 300
broken · step 240
broken · step 360
broken · step 300
NaN · step 120
broken · step 120

Check without DAT

Variant5 it · no DAT
edgedepthdist.
30 it · no DAT
edgedepthdist.
Baselinewidth_96
OK4.62.427 / 69
OK2.04.18 / 18
Per-node normalizationnorm_node_scale_global
OK3.74.116 / 31
OK1.95.58 / 18
Per-node scalescale_per_node_scale
NaN · step 60
NaN · step 60
Both per nodenorm_node_scale_node
broken · step 180
broken · step 120

Reading

  • No per-node scale model survives 200 steps. A neighbourhood of 1 to 32 rings for the scale head does not change this.
  • With the truncated scale the run no longer gives NaN, but the mesh is badly stretched at the first checks. So the cut is not the only cause.
  • DAT is not the cause: the same models also break without DAT, where the global-scale models run without problems.
  • The trainings already show the problem (see the last table): per-node scale runs restart 1.1 to 2.8 times as many episodes as the baseline. A larger ring count lowers this number.
  • The cause is not yet known.

Latent width

Same network and training, only the latent width changes. Width 96 is the main configuration.

Variant5 it · 15 mm
edgedepthdist.
10 it · 15 mm
edgedepthdist.
5 it · 7 mm
edgedepthdist.
30 it · 15 mm
edgedepthdist.
Width 16width_16
far off12.614.1156 / 179
far off10.97.6165 / 164
OK5.23.326 / 40
far off8.817.7137 / 157
–
Width 24width_24
NaN · step 420
NaN · step 480
NaN · step 480
OK4.63.538 / 114
NaN · step 1200
–
Width 32width_32
broken · step 240
broken · step 360
OK3.01.311 / 51
broken · step 240
–
Width 64width_64
lost4.31.5250 / 5.2 m
lost4.21.3230 / 7.5 m
OK1.94.88 / 14
lost8.21.488 / 7.1 m
–
Width 96baselinewidth_96
OK6.110.311 / 49
OK2.71.810 / 32
OK1.97.46 / 11
OK4.11.215 / 47
OK1.95.73 / 5
Width 128width_128
OK6.04.513 / 44
OK9.016.115 / 54
OK1.95.87 / 9
OK7.011.414 / 48
–
Width 192width_192
OK4.13.48 / 34
OK6.07.88 / 39
OK1.96.04 / 8
OK5.95.311 / 53
OK1.95.73 / 4
Width 256width_256
OK6.55.017 / 46
OK5.311.717 / 43
OK1.95.010 / 14
OK8.111.918 / 53
–

Reading

  • At 10 iterations widths 64 to 256 are equal (end distance 8 to 14 mm).
  • At 5 iterations only widths 96, 128, 192 and 256 stay on the reference. Width 64 keeps the mesh intact but a garment slides off the body.
  • Widths 16 to 32 need 10 iterations to finish, and 16 and 24 are then less accurate.
  • Widths 128, 192 and 256 give no clear gain over 96 on this scene.

Step scale mode

The scale ablations of ablations/2026_11.md.

Variant5 it · 15 mm
edgedepthdist.
10 it · 15 mm
edgedepthdist.
5 it · 7 mm
edgedepthdist.
30 it · 15 mm
edgedepthdist.
Global scalebaselinewidth_96
OK6.110.311 / 49
OK2.71.810 / 32
OK1.97.46 / 11
OK4.11.215 / 47
OK1.95.73 / 5
Per-iteration scalescale_per_iteration_scale
far off7.16.5100 / 167
far off8.425.7119 / 181
OK5.42.523 / 80
far off9.511.250 / 163
–
Per-node scalescale_per_node_scale
NaN · step 60
NaN · step 60
NaN · step 60
NaN · step 60
NaN · step 60
No scalescale_wo_scale
OK5.34.738 / 76
broken · step 2160
OK4.64.931 / 56
OK7.27.138 / 106
–
No iterationno scale, 1 iteration per stepscale_wo_iterationtraining step 423,400 of 500,000

Reading

  • The global scale is the best mode.
  • The per-iteration scale finishes every run but ends far from the reference at 5 iterations.
  • Without a scale, one of the two runs at 5 iterations and 15 mm breaks. The runs that finish are about 3 times as far from the reference at 25 % of the sequence.
  • The model without iteration is still in training. It needs its own test with 1 iteration per step.

Network inputs

One input removed or changed at a time.

Variant5 it · 15 mm
edgedepthdist.
10 it · 15 mm
edgedepthdist.
5 it · 7 mm
edgedepthdist.
30 it · 15 mm
edgedepthdist.
All inputsbaselinewidth_96
OK6.110.311 / 49
OK2.71.810 / 32
OK1.97.46 / 11
OK4.11.215 / 47
OK1.95.73 / 5
No current gradientnetwork_inputs_wo_current_gradients
NaN · step 2220
NaN · step 2160
NaN · step 120
NaN · step 1320
–
No previous gradientnetwork_inputs_wo_previous_gradients
lost7.019.1180 / 8.7 m
NaN · step 3900
OK4.26.623 / 68
far off5.35.8164 / 242
–
No gradientscurrent and previous removednetwork_inputs_wo_gradients
broken · step 2220
broken · step 2400
––
No last updatenetwork_inputs_wo_displacements
broken · step 1740
OK11.423.629 / 90
OK6.03.312 / 34
broken · step 1200
–
Last update / RMSinstead of / step scalenetwork_inputs_RMS_displacements
NaN · step 360
NaN · step 180
NaN · step 2340
OK4.214.515 / 78
–
+ gradient magnitudenetwork_inputs_w_gradient_magnitude
far off7.931.7116 / 202
far off9.210.3109 / 255
OK1.95.17 / 10
NaN · step 4040
–

Reading

  • Without the current gradient the solver gives NaN in every setting.
  • Without the previous gradient the 5-iteration runs end far from the reference; one loses a garment and one gives NaN. At 10 iterations it finishes.
  • Without both gradients the mesh breaks at 5 and at 10 iterations. This model also did not learn (see the training table).
  • Without the last update it breaks in two of three runs at 5 iterations. At 10 iterations it finishes.
  • The last update divided by its RMS (instead of by the step scale) gives NaN at 15 mm.
  • The gradient magnitude as an added input makes the 5-iteration result worse.

Context window

Number of message-passing rounds per iteration.

Variant5 it · 15 mm
edgedepthdist.
10 it · 15 mm
edgedepthdist.
5 it · 7 mm
edgedepthdist.
30 it · 15 mm
edgedepthdist.
Depth 1baselinewidth_96
OK6.110.311 / 49
OK2.71.810 / 32
OK1.97.46 / 11
OK4.11.215 / 47
OK1.95.73 / 5
Depth 3shared weightscontext_window_context_window_3
OK3.817.711 / 71
OK4.54.512 / 42
OK2.28.04 / 5
OK3.11.719 / 42
–
Depth 5shared weightscontext_window_context_windows_5
OK3.90.89 / 20
OK4.81.89 / 21
OK2.15.03 / 6
OK5.40.512 / 33
OK2.46.33 / 4

Reading

  • Depth 3 equals the baseline within the run-to-run spread.
  • Depth 5 is closer to the reference than the baseline at 5 iterations (end distance 20 to 21 mm against 32 to 49 mm) and equal at 10 and 30 iterations.
  • Depth 3 and 5 cost 3 and 5 message-passing rounds per iteration. A fair comparison needs equal time, which this page does not have.

Training side

Loss: median over the last 50,000 steps of the logged loss (energy after the update; the samples change, so small differences mean nothing). Restarts: how often the training pool started a new episode. Each run sees the same data, so more restarts than the baseline mean that more rollouts were cut short.

RunStateLossRestarts per 1,000 stepsvs. baseline
width_16done0.58371.0×
width_24done0.51361.0×
width_32done0.46361.0×
width_64done0.43361.0×
width_96done0.23361.0×
width_128done0.22361.0×
width_192done0.31361.0×
width_256done0.31361.0×
norm_node_scale_globaldone0.20361.0×
scale_per_node_scaledone1.731002.8×
norm_node_scale_nodedone1.72681.9×
network_inputs_w_gradient_magnitudedone0.44361.0×
mag_norm_node_scale_globaldone0.23351.0×
mag_norm_global_scale_nodedone1.55942.6×
mag_norm_node_scale_nodedone0.87601.7×
scale_per_node_ring1done0.88641.8×
scale_per_node_ring2done0.81521.5×
scale_per_node_ring4done0.62501.4×
scale_per_node_ring8done0.42411.1×
scale_per_node_ring16done0.21371.0×
scale_per_node_ring32done0.26361.0×
scale_per_iteration_scaledone0.35361.0×
scale_wo_scaledone0.41361.0×
scale_wo_iterationtraining 85 %3.4774320.7×
network_inputs_wo_current_gradientsdone1.09391.1×
network_inputs_wo_previous_gradientsdone0.35351.0×
network_inputs_wo_gradientsdone109.432587.2×
network_inputs_wo_displacementsdone0.56371.0×
network_inputs_RMS_displacementsdone0.39361.0×
context_window_context_window_3done0.38361.0×
context_window_context_windows_5done0.28361.0×

Reading

  • All global-scale runs restart about 36 episodes per 1,000 steps. This is the normal rate.
  • Per-node scale runs restart more often: 100 for the plain per-node scale, 41 to 64 with a ring context.
  • The model without gradient inputs did not learn (loss above 100). The model without iteration restarts most often.
  • The loss alone does not predict the inference result: widths 32 and 64 have a normal loss but fail at 5 iterations.