2026-10-28 13:01 · fcp v5.2 (CUDA), package untouched, prototype in scripts/gwn.py ·
the same 10 objects, 180 clouds, metric and references as fcp_2710_tests' synthesis
(its eps and local prototypes are run again here for the normals) · tables from report/bench2.csv by scripts/make_page.py
gwn has the lowest error on all 18 cloud types and the best normals on 17 of 18; with the closing (recommended) its part count at zero noise is within a few parts of the mesh route's on every object but the open box. Objects: the ten of fcp_2710_tests, the open box in place of the loaf pan (2026-10-28). eps and local are fcp_2710_tests' prototypes, run again here with the same σ. One setting for every cloud; σ = 0 unless the per-point noise is known.
Without σ (row 1 of the ablation: global iso, no splats) the winding number is still accurate on noisy clouds (1.2 %: 0.57× the package's error) but makes 4.6× the parts: σ buys the part count.
The pieces that matter, from the ablation: the local iso-value (thin parts survive), the tangent splats (walls of a spacing stay closed: clean 10k parts 262 → 176 with the loaf pan), the patch flips (density: the striped battery's normals 44 % inverted → 2.5 %), off when σ is given (1.2 % 10k error 14.8 → 9.2), and the 2D closing (fewer parts at zero noise, below).
Parts against the mesh route's on the mesh the cloud came from (the noisy mesh for mesh noise, else the clean
mesh). Error: mean symmetric nearest-point distance to the clean mesh / diagonal (geometric mean over objects; ratio to the
package per object, geometric mean). Normals: the descriptor's SDF normal (Shape.normal(method="sdf")) at 3000
points of the clean mesh against the outward face normal, oriented. 1024 atoms, 128 layers, up +z. sigma (the per-point
noise) is given to eps, local and gwn on the point-noise clouds, 0 elsewhere. Green: best per cloud (parts ratio nearest 1).
| cloud | slicer | parts | mesh | median parts / mesh | objects within ±25 % | error ×10⁻³ | error / package | normal median ° | PGP10 % | PGP30 % | empty | encode s |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| clean · 10000 | package | 209 | 134 | 1.43 | 4 | 3.75 | 1.00 | 8.6 | 50.9 | 77.8 | False | 0.17 |
| eps | 185 | 134 | 1.09 | 6 | 3.80 | 1.01 | 8.4 | 49.9 | 77.6 | False | 1.28 | |
| local | 180 | 134 | 1.24 | 6 | 3.27 | 0.87 | 8.8 | 49.7 | 78.6 | False | 1.97 | |
| gwn | 136 | 134 | 0.94 | 8 | 3.01 | 0.80 | 7.2 | 56.2 | 83.0 | False | 1.81 | |
| gwn + closing | 128 | 134 | 0.86 | 8 | 3.09 | 0.82 | 7.2 | 57.0 | 84.4 | False | 3.89 | |
| mesh noise 0.2 % · 10000 | package | 282 | 265 | 1.10 | 7 | 3.96 | 1.00 | 12.2 | 44.5 | 72.7 | False | 0.15 |
| eps | 258 | 265 | 0.95 | 7 | 3.99 | 1.01 | 12.5 | 43.5 | 73.1 | False | 1.17 | |
| local | 266 | 265 | 1.00 | 7 | 3.78 | 0.95 | 11.4 | 42.3 | 73.1 | False | 1.63 | |
| gwn | 213 | 265 | 0.84 | 7 | 3.54 | 0.89 | 9.6 | 48.8 | 79.0 | False | 1.60 | |
| gwn + closing | 189 | 275 | 0.72 | 5 | 3.49 | 0.88 | 9.9 | 51.0 | 80.1 | False | 2.54 | |
| mesh noise 0.6 % · 10000 | package | 273 | 224 | 1.08 | 7 | 6.38 | 1.00 | 20.8 | 31.0 | 65.3 | False | 0.17 |
| eps | 248 | 224 | 1.00 | 5 | 6.43 | 1.01 | 21.2 | 30.4 | 65.9 | False | 1.20 | |
| local | 269 | 224 | 1.06 | 5 | 6.27 | 0.98 | 21.3 | 30.7 | 65.1 | False | 1.75 | |
| gwn | 201 | 224 | 0.86 | 7 | 5.73 | 0.90 | 15.7 | 35.8 | 71.7 | False | 1.63 | |
| gwn + closing | 181 | 221 | 0.85 | 8 | 5.58 | 0.87 | 15.0 | 36.4 | 73.4 | False | 3.59 | |
| mesh noise 1 % · 10000 | package | 237 | 194 | 0.99 | 8 | 8.26 | 1.00 | 25.3 | 26.0 | 59.5 | False | 0.16 |
| eps | 215 | 194 | 0.92 | 7 | 8.27 | 1.00 | 25.9 | 25.1 | 58.7 | False | 1.16 | |
| local | 220 | 194 | 0.94 | 8 | 8.84 | 1.07 | 27.0 | 24.5 | 57.6 | False | 1.56 | |
| gwn | 178 | 194 | 0.83 | 8 | 7.74 | 0.94 | 17.1 | 29.9 | 65.2 | False | 1.85 | |
| gwn + closing | 170 | 200 | 0.83 | 8 | 8.31 | 1.01 | 16.8 | 28.3 | 63.8 | False | 2.46 | |
| point noise 0.12 % · 10000 | package | 249 | 134 | 1.67 | 3 | 4.00 | 1.00 | 9.5 | 47.5 | 75.7 | False | 0.18 |
| eps | 226 | 134 | 1.54 | 3 | 4.04 | 1.01 | 9.8 | 46.8 | 75.7 | False | 1.25 | |
| local | 216 | 134 | 1.47 | 3 | 3.90 | 0.98 | 10.2 | 45.2 | 73.9 | False | 1.64 | |
| gwn | 146 | 134 | 0.94 | 7 | 3.06 | 0.76 | 7.8 | 55.2 | 82.0 | False | 1.71 | |
| gwn + closing | 131 | 134 | 0.94 | 8 | 3.29 | 0.82 | 8.1 | 55.5 | 82.4 | False | 2.98 | |
| point noise 0.6 % · 10000 | package | 1398 | 134 | 9.59 | 0 | 8.97 | 1.00 | 55.1 | 12.8 | 30.1 | False | 0.27 |
| eps | 349 | 134 | 2.33 | 3 | 6.99 | 0.78 | 30.2 | 24.4 | 51.6 | False | 1.17 | |
| local | 364 | 134 | 2.45 | 3 | 6.51 | 0.73 | 29.1 | 25.3 | 53.8 | False | 2.69 | |
| gwn | 284 | 134 | 1.27 | 2 | 4.68 | 0.52 | 22.1 | 32.9 | 62.6 | False | 2.49 | |
| gwn + closing | 264 | 134 | 1.50 | 2 | 5.04 | 0.56 | 22.5 | 33.1 | 63.1 | False | 4.21 | |
| point noise 1.2 % · 10000 | package | 3216 | 134 | 26.52 | 0 | 13.42 | 1.00 | 72.4 | 8.0 | 20.9 | False | 0.39 |
| eps | 165 | 134 | 1.42 | 0 | 9.50 | 0.71 | 29.3 | 21.4 | 49.9 | False | 1.14 | |
| local | 170 | 134 | 1.44 | 0 | 10.01 | 0.75 | 33.7 | 19.1 | 46.4 | False | 6.81 | |
| gwn | 188 | 134 | 0.69 | 1 | 8.84 | 0.66 | 33.8 | 22.0 | 50.2 | False | 3.51 | |
| gwn + closing | 183 | 134 | 0.69 | 1 | 8.79 | 0.66 | 33.1 | 22.5 | 51.0 | False | 5.38 | |
| density gradient · 10000 | package | 887 | 134 | 6.44 | 0 | 7.29 | 1.00 | 48.0 | 24.0 | 41.4 | False | 0.26 |
| eps | 827 | 134 | 6.04 | 0 | 7.25 | 0.99 | 48.5 | 23.6 | 41.0 | False | 1.79 | |
| local | 248 | 134 | 1.96 | 4 | 4.42 | 0.61 | 17.8 | 37.2 | 66.1 | False | 2.29 | |
| gwn | 200 | 134 | 1.49 | 3 | 3.72 | 0.51 | 10.4 | 48.1 | 74.0 | False | 2.48 | |
| gwn + closing | 191 | 134 | 1.46 | 4 | 3.98 | 0.55 | 13.6 | 48.6 | 74.3 | False | 3.08 | |
| density stripes · 10000 | package | 1323 | 134 | 9.85 | 0 | 9.59 | 1.00 | 57.1 | 14.0 | 30.1 | False | 0.28 |
| eps | 1199 | 134 | 8.89 | 0 | 9.15 | 0.95 | 58.4 | 13.4 | 29.5 | False | 1.98 | |
| local | 607 | 134 | 4.10 | 1 | 7.16 | 0.75 | 42.6 | 26.1 | 47.9 | False | 2.74 | |
| gwn | 273 | 134 | 1.67 | 1 | 4.37 | 0.46 | 12.1 | 44.8 | 71.0 | False | 2.85 | |
| gwn + closing | 243 | 134 | 1.54 | 3 | 3.77 | 0.39 | 14.0 | 46.5 | 72.7 | False | 3.42 | |
| clean · 2048 | package | 273 | 134 | 2.49 | 3 | 6.86 | 1.00 | 28.4 | 30.7 | 56.3 | False | 0.15 |
| eps | 237 | 134 | 2.23 | 1 | 7.39 | 1.08 | 28.0 | 26.8 | 53.8 | False | 0.70 | |
| local | 222 | 134 | 1.78 | 1 | 6.57 | 0.96 | 30.4 | 28.5 | 55.4 | False | 0.84 | |
| gwn | 171 | 134 | 1.39 | 1 | 4.74 | 0.69 | 18.2 | 43.0 | 69.8 | False | 0.29 | |
| gwn + closing | 143 | 134 | 1.04 | 3 | 4.67 | 0.68 | 18.7 | 42.6 | 70.6 | False | 0.71 | |
| mesh noise 0.2 % · 2048 | package | 319 | 265 | 1.15 | 5 | 5.85 | 1.00 | 25.0 | 27.6 | 54.7 | False | 0.14 |
| eps | 280 | 265 | 1.04 | 5 | 6.24 | 1.07 | 28.0 | 24.9 | 53.1 | False | 0.67 | |
| local | 258 | 265 | 1.01 | 7 | 6.78 | 1.16 | 26.2 | 28.5 | 56.7 | False | 0.84 | |
| gwn | 216 | 265 | 0.85 | 6 | 4.92 | 0.84 | 19.1 | 38.2 | 66.3 | False | 0.29 | |
| gwn + closing | 162 | 275 | 0.66 | 4 | 4.81 | 0.82 | 14.0 | 39.9 | 69.4 | False | 0.51 | |
| mesh noise 0.6 % · 2048 | package | 310 | 224 | 1.17 | 4 | 8.56 | 1.00 | 32.7 | 19.2 | 47.4 | False | 0.14 |
| eps | 270 | 224 | 1.00 | 3 | 8.66 | 1.01 | 31.9 | 18.7 | 47.7 | False | 0.70 | |
| local | 278 | 224 | 0.97 | 5 | 7.99 | 0.93 | 32.7 | 20.5 | 49.2 | False | 0.86 | |
| gwn | 210 | 224 | 0.76 | 3 | 7.46 | 0.87 | 25.2 | 26.8 | 59.3 | False | 0.32 | |
| gwn + closing | 173 | 221 | 0.72 | 4 | 7.33 | 0.86 | 22.3 | 29.5 | 63.1 | False | 0.49 | |
| mesh noise 1 % · 2048 | package | 294 | 194 | 1.30 | 5 | 10.37 | 1.00 | 34.7 | 17.8 | 45.2 | False | 0.15 |
| eps | 261 | 194 | 1.12 | 4 | 10.57 | 1.02 | 34.0 | 17.5 | 45.2 | False | 0.74 | |
| local | 284 | 194 | 1.05 | 5 | 10.54 | 1.02 | 36.5 | 16.0 | 43.2 | False | 0.85 | |
| gwn | 200 | 194 | 0.91 | 5 | 10.50 | 1.01 | 31.1 | 22.6 | 54.7 | False | 0.32 | |
| gwn + closing | 184 | 200 | 0.88 | 7 | 9.96 | 0.96 | 25.3 | 24.7 | 59.0 | False | 0.74 | |
| point noise 0.12 % · 2048 | package | 278 | 134 | 2.43 | 3 | 6.02 | 1.00 | 26.0 | 28.3 | 54.8 | False | 0.15 |
| eps | 249 | 134 | 2.01 | 2 | 6.43 | 1.07 | 28.9 | 25.5 | 51.2 | False | 0.76 | |
| local | 250 | 134 | 2.15 | 1 | 6.61 | 1.10 | 31.4 | 26.3 | 52.8 | False | 0.86 | |
| gwn | 185 | 134 | 1.24 | 3 | 5.40 | 0.90 | 18.4 | 39.6 | 66.3 | False | 0.29 | |
| gwn + closing | 171 | 134 | 1.12 | 3 | 4.64 | 0.77 | 18.3 | 40.1 | 68.3 | False | 0.53 | |
| point noise 0.6 % · 2048 | package | 454 | 134 | 3.74 | 0 | 9.04 | 1.00 | 50.0 | 13.0 | 33.5 | False | 0.16 |
| eps | 329 | 134 | 3.10 | 1 | 9.44 | 1.04 | 39.5 | 14.3 | 37.9 | False | 0.70 | |
| local | 323 | 134 | 2.99 | 1 | 8.82 | 0.98 | 46.9 | 13.5 | 37.1 | False | 0.99 | |
| gwn | 211 | 134 | 1.65 | 1 | 7.08 | 0.78 | 27.6 | 19.8 | 51.1 | False | 0.32 | |
| gwn + closing | 198 | 134 | 1.40 | 2 | 7.71 | 0.85 | 29.4 | 22.1 | 52.2 | False | 0.41 | |
| point noise 1.2 % · 2048 | package | 762 | 134 | 6.23 | 0 | 10.83 | 1.00 | 66.4 | 7.3 | 21.6 | False | 0.18 |
| eps | 187 | 134 | 1.85 | 3 | 13.68 | 1.26 | 48.4 | 10.7 | 33.5 | False | 0.72 | |
| local | 193 | 134 | 1.96 | 2 | 13.31 | 1.23 | 51.0 | 10.2 | 32.7 | False | 1.16 | |
| gwn | 157 | 134 | 1.01 | 2 | 10.72 | 0.99 | 40.7 | 15.4 | 43.6 | False | 0.35 | |
| gwn + closing | 150 | 134 | 0.92 | 1 | 10.75 | 0.99 | 41.8 | 15.0 | 43.2 | False | 1.03 | |
| density gradient · 2048 | package | 538 | 134 | 3.65 | 2 | 7.61 | 1.00 | 41.8 | 17.0 | 37.3 | False | 0.22 |
| eps | 487 | 134 | 3.39 | 2 | 7.74 | 1.02 | 44.7 | 17.1 | 37.0 | False | 0.92 | |
| local | 240 | 134 | 2.11 | 2 | 7.04 | 0.92 | 28.8 | 24.5 | 51.8 | False | 1.10 | |
| gwn | 236 | 134 | 1.93 | 3 | 6.04 | 0.79 | 21.6 | 33.6 | 60.3 | False | 0.32 | |
| gwn + closing | 192 | 134 | 1.58 | 3 | 6.16 | 0.81 | 20.7 | 35.8 | 63.6 | False | 0.56 | |
| density stripes · 2048 | package | 554 | 134 | 4.64 | 1 | 7.68 | 1.00 | 51.2 | 17.5 | 37.7 | False | 0.26 |
| eps | 476 | 134 | 4.02 | 0 | 7.71 | 1.00 | 53.2 | 16.8 | 36.9 | False | 0.84 | |
| local | 354 | 134 | 3.29 | 2 | 7.28 | 0.95 | 46.9 | 19.5 | 41.7 | False | 1.18 | |
| gwn | 224 | 134 | 1.59 | 4 | 5.52 | 0.72 | 21.2 | 34.2 | 61.8 | False | 0.33 | |
| gwn + closing | 182 | 134 | 1.15 | 2 | 5.14 | 0.67 | 17.5 | 38.7 | 67.5 | False | 0.69 |
parts · error ×10⁻³ · normal median; bold: parts nearest the mesh's, lowest error.
| object | mesh parts | package | eps | local | gwn | gwn + closing |
|---|---|---|---|---|---|---|
| battery_stepped | 4 | 6 · 3.46 · 3° | 4 · 3.53 · 3° | 5 · 3.53 · 3° | 4 · 3.42 · 2° | 3 · 3.43 · 3° |
| dress | 17 | 17 · 3.19 · 29° | 13 · 3.11 · 28° | 16 · 3.02 · 27° | 13 · 2.52 · 24° | 14 · 2.53 · 24° |
| elephant | 27 | 32 · 4.29 · 27° | 28 · 4.44 · 26° | 25 · 4.51 · 26° | 19 · 4.00 · 23° | 19 · 3.98 · 23° |
| bowl_of | 5 | 14 · 2.69 · 2° | 14 · 2.69 · 2° | 14 · 2.68 · 2° | 4 · 2.65 · 1° | 4 · 2.65 · 1° |
| bowl_gso | 6 | 20 · 2.75 · 4° | 20 · 2.75 · 4° | 19 · 2.79 · 4° | 6 · 2.65 · 3° | 6 · 2.65 · 3° |
| mug | 8 | 13 · 3.00 · 3° | 12 · 3.05 · 3° | 12 · 3.10 · 4° | 9 · 2.93 · 2° | 8 · 2.91 · 2° |
| dino | 25 | 27 · 2.47 · 16° | 21 · 2.67 · 18° | 22 · 2.65 · 17° | 21 · 2.42 · 15° | 21 · 2.38 · 15° |
| shoe | 22 | 30 · 7.74 · 29° | 25 · 7.81 · 28° | 27 · 4.92 · 31° | 24 · 4.38 · 24° | 22 · 6.13 · 16° |
| horse | 18 | 16 · 2.33 · 13° | 14 · 2.32 · 13° | 14 · 2.35 · 13° | 16 · 2.22 · 11° | 16 · 2.22 · 12° |
| open_box | 2 | 34 · 11.85 · 3° | 34 · 11.85 · 3° | 26 · 4.05 · 5° | 20 · 3.63 · 1° | 15 · 3.50 · 2° |
parts · error ×10⁻³ · normal median; bold: parts nearest the mesh's, lowest error.
| object | mesh parts | package | eps | local | gwn | gwn + closing |
|---|---|---|---|---|---|---|
| battery_stepped | 4 | 16 · 4.56 · 7° | 14 · 4.81 · 9° | 15 · 5.62 · 13° | 6 · 4.07 · 4° | 6 · 4.05 · 3° |
| dress | 17 | 12 · 4.10 · 35° | 7 · 4.36 · 33° | 12 · 4.52 · 34° | 7 · 3.53 · 29° | 6 · 3.49 · 29° |
| elephant | 27 | 21 · 5.58 · 36° | 15 · 5.62 · 29° | 17 · 5.64 · 32° | 12 · 4.93 · 29° | 9 · 4.87 · 25° |
| bowl_of | 5 | 21 · 18.81 · 5° | 18 · 17.30 · 17° | 22 · 7.53 · 7° | 13 · 3.15 · 2° | 11 · 3.14 · 2° |
| bowl_gso | 6 | 42 · 14.52 · 31° | 37 · 15.19 · 37° | 32 · 9.57 · 39° | 22 · 3.81 · 7° | 14 · 3.93 · 7° |
| mug | 8 | 26 · 5.34 · 19° | 24 · 8.33 · 26° | 18 · 5.34 · 11° | 12 · 3.60 · 4° | 9 · 3.58 · 4° |
| dino | 25 | 22 · 3.81 · 25° | 19 · 3.93 · 27° | 20 · 4.56 · 29° | 17 · 4.51 · 22° | 16 · 4.56 · 22° |
| shoe | 22 | 38 · 7.43 · 36° | 32 · 8.03 · 38° | 29 · 9.82 · 47° | 28 · 7.39 · 26° | 21 · 7.24 · 26° |
| horse | 18 | 15 · 3.63 · 20° | 13 · 3.84 · 22° | 10 · 3.68 · 22° | 16 · 3.22 · 14° | 16 · 3.33 · 15° |
| open_box | 2 | 60 · 14.71 · 71° | 58 · 15.53 · 75° | 47 · 16.42 · 70° | 38 · 17.47 · 40° | 35 · 14.91 · 42° |
parts · error ×10⁻³ · normal median; bold: parts nearest the mesh's, lowest error.
| object | mesh parts | package | eps | local | gwn | gwn + closing |
|---|---|---|---|---|---|---|
| battery_stepped | 4 | 82 · 5.45 · 20° | 14 · 5.29 · 13° | 14 · 5.32 · 14° | 6 · 4.20 · 7° | 8 · 4.16 · 7° |
| dress | 17 | 60 · 5.36 · 51° | 11 · 4.73 · 32° | 13 · 4.80 · 32° | 8 · 4.16 · 28° | 9 · 4.11 · 28° |
| elephant | 27 | 58 · 6.68 · 49° | 14 · 5.35 · 28° | 15 · 5.14 · 28° | 8 · 4.38 · 23° | 8 · 4.40 · 23° |
| bowl_of | 5 | 138 · 15.38 · 73° | 26 · 5.09 · 8° | 23 · 7.33 · 8° | 21 · 3.79 · 3° | 18 · 4.67 · 3° |
| bowl_gso | 6 | 246 · 18.72 · 87° | 52 · 11.86 · 61° | 48 · 11.48 · 44° | 49 · 6.01 · 36° | 44 · 11.10 · 39° |
| mug | 8 | 88 · 14.15 · 80° | 35 · 11.65 · 39° | 32 · 6.16 · 30° | 27 · 4.65 · 14° | 25 · 4.23 · 10° |
| dino | 25 | 119 · 5.08 · 43° | 20 · 6.36 · 28° | 20 · 6.41 · 26° | 13 · 4.10 · 21° | 12 · 4.17 · 22° |
| shoe | 22 | 180 · 9.03 · 59° | 25 · 7.93 · 38° | 31 · 5.69 · 35° | 23 · 4.98 · 25° | 21 · 5.05 · 27° |
| horse | 18 | 96 · 4.87 · 38° | 21 · 5.44 · 23° | 22 · 5.27 · 22° | 18 · 3.14 · 14° | 18 · 3.15 · 15° |
| open_box | 2 | 331 · 19.08 · 68° | 131 · 10.79 · 72° | 146 · 10.45 · 69° | 111 · 9.67 · 75° | 101 · 9.72 · 75° |
parts · error ×10⁻³ · normal median; bold: parts nearest the mesh's, lowest error.
| object | mesh parts | package | eps | local | gwn | gwn + closing |
|---|---|---|---|---|---|---|
| battery_stepped | 4 | 265 · 9.89 · 47° | 9 · 5.93 · 10° | 9 · 6.55 · 14° | 3 · 5.71 · 7° | 3 · 5.76 · 8° |
| dress | 17 | 145 · 7.67 · 66° | 4 · 9.18 · 43° | 7 · 9.42 · 44° | 3 · 8.51 · 39° | 3 · 8.51 · 39° |
| elephant | 27 | 266 · 9.75 · 57° | 4 · 7.19 · 29° | 5 · 7.46 · 30° | 6 · 6.62 · 24° | 6 · 6.61 · 24° |
| bowl_of | 5 | 389 · 24.00 · 79° | 16 · 9.57 · 18° | 18 · 9.16 · 29° | 20 · 8.26 · 20° | 21 · 8.19 · 20° |
| bowl_gso | 6 | 476 · 25.35 · 80° | 22 · 8.93 · 26° | 26 · 9.39 · 36° | 30 · 9.57 · 41° | 29 · 9.62 · 40° |
| mug | 8 | 268 · 16.88 · 82° | 28 · 8.93 · 40° | 27 · 11.26 · 40° | 35 · 9.64 · 47° | 32 · 9.33 · 37° |
| dino | 25 | 267 · 8.33 · 58° | 12 · 14.04 · 36° | 11 · 13.77 · 37° | 8 · 7.18 · 29° | 8 · 7.18 · 29° |
| shoe | 22 | 430 · 14.59 · 81° | 13 · 6.67 · 25° | 14 · 7.58 · 32° | 14 · 9.23 · 41° | 14 · 9.25 · 38° |
| horse | 18 | 310 · 9.12 · 51° | 10 · 17.67 · 30° | 11 · 17.34 · 30° | 8 · 15.84 · 19° | 8 · 15.86 · 19° |
| open_box | 2 | 400 · 22.48 · 87° | 47 · 12.05 · 69° | 42 · 12.55 · 75° | 61 · 11.33 · 78° | 59 · 11.03 · 72° |
parts · error ×10⁻³ · normal median; bold: parts nearest the mesh's, lowest error.
| object | mesh parts | package | eps | local | gwn | gwn + closing |
|---|---|---|---|---|---|---|
| battery_stepped | 4 | 36 · 8.16 · 30° | 11 · 8.23 · 22° | 11 · 8.22 · 22° | 5 · 7.14 · 15° | 5 · 7.20 · 15° |
| dress | 17 | 46 · 8.48 · 62° | 6 · 13.67 · 50° | 4 · 14.52 · 50° | 3 · 9.64 · 41° | 3 · 9.64 · 41° |
| elephant | 27 | 49 · 8.90 · 56° | 8 · 10.83 · 39° | 6 · 10.74 · 38° | 5 · 8.24 · 27° | 4 · 8.22 · 27° |
| bowl_of | 5 | 73 · 15.91 · 74° | 25 · 12.99 · 59° | 25 · 13.38 · 62° | 27 · 11.13 · 54° | 27 · 11.15 · 54° |
| bowl_gso | 6 | 111 · 13.53 · 81° | 25 · 15.15 · 46° | 27 · 13.33 · 55° | 28 · 10.78 · 54° | 28 · 11.08 · 56° |
| mug | 8 | 59 · 14.99 · 78° | 26 · 15.66 · 63° | 27 · 14.45 · 62° | 22 · 12.73 · 47° | 23 · 12.71 · 47° |
| dino | 25 | 71 · 8.68 · 59° | 19 · 17.17 · 47° | 14 · 17.22 · 47° | 9 · 10.68 · 31° | 9 · 10.67 · 31° |
| shoe | 22 | 112 · 10.37 · 71° | 21 · 12.65 · 52° | 24 · 11.62 · 52° | 17 · 9.90 · 41° | 13 · 9.72 · 43° |
| horse | 18 | 63 · 8.77 · 55° | 17 · 16.57 · 44° | 21 · 16.96 · 45° | 10 · 14.37 · 23° | 9 · 14.49 · 24° |
| open_box | 2 | 142 · 14.16 · 87° | 29 · 16.97 · 83° | 34 · 15.56 · 79° | 31 · 15.33 · 78° | 29 · 15.35 · 76° |
parts · error ×10⁻³ · normal median; bold: parts nearest the mesh's, lowest error.
| object | mesh parts | package | eps | local | gwn | gwn + closing |
|---|---|---|---|---|---|---|
| battery_stepped | 4 | 178 · 14.48 · 88° | 157 · 12.47 · 88° | 145 · 13.55 · 87° | 20 · 4.33 · 6° | 16 · 3.93 · 3° |
| dress | 17 | 116 · 6.25 · 55° | 100 · 6.20 · 55° | 82 · 6.82 · 60° | 18 · 2.91 · 26° | 19 · 2.80 · 26° |
| elephant | 27 | 177 · 12.20 · 62° | 160 · 11.23 · 62° | 92 · 11.88 · 70° | 37 · 5.61 · 36° | 38 · 5.38 · 32° |
| bowl_of | 5 | 61 · 10.25 · 62° | 58 · 10.23 · 62° | 21 · 3.63 · 11° | 12 · 2.77 · 2° | 10 · 2.67 · 1° |
| bowl_gso | 6 | 80 · 7.32 · 54° | 75 · 7.29 · 58° | 24 · 13.86 · 15° | 11 · 2.76 · 4° | 10 · 2.89 · 4° |
| mug | 8 | 40 · 11.04 · 59° | 39 · 10.99 · 59° | 16 · 3.66 · 8° | 12 · 2.99 · 3° | 10 · 3.02 · 3° |
| dino | 25 | 156 · 8.40 · 52° | 143 · 7.79 · 51° | 30 · 3.49 · 27° | 33 · 3.14 · 21° | 29 · 2.99 · 19° |
| shoe | 22 | 233 · 8.75 · 61° | 209 · 8.57 · 62° | 42 · 6.95 · 41° | 66 · 9.34 · 53° | 58 · 7.70 · 48° |
| horse | 18 | 164 · 8.78 · 48° | 149 · 8.13 · 45° | 81 · 6.89 · 44° | 23 · 2.79 · 17° | 23 · 2.56 · 15° |
| open_box | 2 | 118 · 11.19 · 23° | 109 · 10.61 · 33° | 74 · 10.48 · 65° | 41 · 19.28 · 7° | 30 · 7.09 · 13° |
parts · error ×10⁻³ · normal median; bold: parts nearest the mesh's, lowest error.
| object | mesh parts | package | eps | local | gwn | gwn + closing |
|---|---|---|---|---|---|---|
| battery_stepped | 4 | 161 · 16.19 · 92° | 151 · 15.59 · 92° | 23 · 6.96 · 22° | 9 · 4.07 · 4° | 8 · 4.04 · 3° |
| dress | 17 | 69 · 6.75 · 57° | 65 · 6.71 · 57° | 17 · 3.20 · 29° | 25 · 3.81 · 32° | 24 · 3.53 · 30° |
| elephant | 27 | 113 · 11.89 · 69° | 106 · 11.67 · 69° | 25 · 4.82 · 29° | 29 · 4.39 · 26° | 32 · 4.51 · 29° |
| bowl_of | 5 | 41 · 3.99 · 19° | 40 · 4.00 · 18° | 16 · 3.78 · 8° | 9 · 2.74 · 2° | 8 · 2.73 · 1° |
| bowl_gso | 6 | 51 · 6.81 · 35° | 46 · 6.76 · 35° | 18 · 3.91 · 9° | 9 · 2.67 · 3° | 9 · 2.68 · 3° |
| mug | 8 | 12 · 3.21 · 4° | 11 · 3.29 · 5° | 15 · 3.44 · 5° | 8 · 3.01 · 3° | 7 · 3.01 · 3° |
| dino | 25 | 98 · 6.87 · 52° | 93 · 7.05 · 53° | 25 · 3.07 · 20° | 26 · 2.58 · 17° | 26 · 2.61 · 16° |
| shoe | 22 | 165 · 11.60 · 70° | 157 · 11.57 · 69° | 45 · 8.41 · 38° | 37 · 8.14 · 41° | 34 · 5.90 · 33° |
| horse | 18 | 97 · 7.34 · 44° | 89 · 7.19 · 44° | 14 · 2.61 · 15° | 23 · 2.84 · 17° | 17 · 2.71 · 15° |
| open_box | 2 | 80 · 6.38 · 20° | 69 · 6.30 · 25° | 50 · 7.79 · 15° | 25 · 5.67 · 4° | 26 · 16.90 · 12° |
The exact end: with 50 000 clean points (σ = 0, no closing) gwn gives 126 parts against the mesh route's 134 (package 145): within two on every object but the elephant (22 against 27); mean error 2.80 against 2.79 (package 2.87), normal median 6.9° against 6.8°. The open box: mesh 2, gwn 4, package 6.
parts · error ×10⁻³ (geometric mean on the last row) · normal median · encode seconds.
| object | mesh route | package | gwn |
|---|---|---|---|
| battery_stepped | 4 · 3.29 · 0.5° · 0.7 s | 5 · 3.33 · 2.0° · 0.5 s | 4 · 3.35 · 1.9° · 39.4 s |
| dress | 17 · 2.19 · 22.5° · 0.5 s | 20 · 2.41 · 23.6° · 0.5 s | 18 · 2.27 · 22.8° · 11.3 s |
| elephant | 27 · 4.10 · 25.0° · 0.1 s | 24 · 4.24 · 27.5° · 0.3 s | 22 · 3.92 · 23.7° · 23.5 s |
| bowl_of | 5 · 2.63 · 1.2° · 0.1 s | 5 · 2.63 · 1.2° · 0.4 s | 4 · 2.64 · 1.4° · 53.7 s |
| bowl_gso | 6 · 2.62 · 2.7° · 0.2 s | 6 · 2.63 · 2.9° · 0.5 s | 5 · 2.63 · 2.7° · 52.3 s |
| mug | 8 · 2.92 · 2.3° · 0.2 s | 8 · 2.93 · 2.5° · 0.4 s | 7 · 2.94 · 2.6° · 25.3 s |
| dino | 25 · 2.23 · 13.9° · 0.1 s | 26 · 2.32 · 15.0° · 0.3 s | 23 · 2.22 · 14.0° · 20.1 s |
| shoe | 22 · 2.99 · 10.9° · 0.2 s | 28 · 3.27 · 14.9° · 0.3 s | 22 · 3.04 · 12.1° · 31.5 s |
| horse | 18 · 2.17 · 11.1° · 0.1 s | 17 · 2.20 · 11.3° · 0.3 s | 17 · 2.17 · 11.0° · 25.2 s |
| open_box | 2 · 3.31 · 0.7° · 0.5 s | 6 · 3.34 · 1.4° · 0.9 s | 4 · 3.36 · 0.9° · 38.5 s |
| all | 134 · 2.79 · 6.8° · 0.2 s | 145 · 2.87 · 7.1° · 0.4 s | 126 · 2.80 · 6.9° · 28.4 s |
Goal: at zero noise, as few parts as the mesh route gives on the same clean mesh (the reference, per object; the elephant left out, its mesh-route encode is poor). The extra parts came from walls of about a spacing that open at single layers (open-box study). The fix in the slicer: a morphological closing of each layer's inside region by 0.75 spacings; the pixels it adds (gaps under 1.5 spacings) become just inside, the rest of the field is kept, so the contour keeps its sub-pixel position. Nine objects, mesh 107 parts: 10k 109 parts, sum |parts − mesh| 24 (gwn 117 / 32, package 177 / 74), error 3.01 (2.91 / 3.70); 2048 134 / 73 (159 / 92, package 252 / 167). On every cloud type it gives fewer parts at about the same error (main table, "gwn + closing").
A 3D closing (all layers on one grid, the layer step as the third spacing; 1 spacing, with the 2D one) gets 2048 to 105 parts (|Δ| 58) but fills concave steps (the battery's ledge at 2048: 4 → 2 parts, error ×2.4): not recommended. No better: larger splats (1.75, 2.5 spacings), a larger mollifier (0.75 spacings), larger 2D closings.
256 layers do not help. The mesh route goes from 107 to 139 parts and the clouds fall further behind (10k with closing 158, |Δ| 55; 2048 189, |Δ| 108): thin and flat-walled objects get twice the layers to break on while the cut tolerance stays one spacing; the organic ones stay at or under the mesh's count.
parts · error ×10⁻³; bold: parts nearest the mesh route's on the clean mesh (same layers); last row: total parts, sum of |parts − mesh parts| over the objects, geometric-mean error.
| object | mesh | package | gwn | gwn + 2D closing 0.75 s | gwn + 3D closing 1 s + 2D 0.75 s |
|---|---|---|---|---|---|
| battery_stepped | 4 | 6 · 3.46 | 4 · 3.42 | 3 · 3.43 | 2 · 3.51 |
| dress | 17 | 17 · 3.19 | 13 · 2.52 | 14 · 2.53 | 13 · 2.60 |
| bowl_of | 5 | 14 · 2.69 | 4 · 2.65 | 4 · 2.65 | 4 · 2.65 |
| bowl_gso | 6 | 20 · 2.75 | 6 · 2.65 | 6 · 2.65 | 6 · 2.64 |
| mug | 8 | 13 · 3.00 | 9 · 2.93 | 8 · 2.91 | 7 · 2.96 |
| dino | 25 | 27 · 2.47 | 21 · 2.42 | 21 · 2.38 | 21 · 2.44 |
| shoe | 22 | 30 · 7.74 | 24 · 4.38 | 22 · 6.13 | 21 · 3.44 |
| horse | 18 | 16 · 2.33 | 16 · 2.22 | 16 · 2.22 | 16 · 2.24 |
| open_box | 2 | 34 · 11.85 | 20 · 3.63 | 15 · 3.50 | 18 · 3.49 |
| all | 107 | 177 (|Δ| 74) · 3.70 | 117 (|Δ| 32) · 2.91 | 109 (|Δ| 24) · 3.01 | 108 (|Δ| 31) · 2.85 |
| object | mesh | package | gwn | gwn + 2D closing 0.75 s | gwn + 3D closing 1 s + 2D 0.75 s |
|---|---|---|---|---|---|
| battery_stepped | 4 | 16 · 4.56 | 6 · 4.07 | 6 · 4.05 | 2 · 9.84 |
| dress | 17 | 12 · 4.10 | 7 · 3.53 | 6 · 3.49 | 7 · 3.65 |
| bowl_of | 5 | 21 · 18.81 | 13 · 3.15 | 11 · 3.14 | 10 · 3.34 |
| bowl_gso | 6 | 42 · 14.52 | 22 · 3.81 | 14 · 3.93 | 13 · 3.77 |
| mug | 8 | 26 · 5.34 | 12 · 3.60 | 9 · 3.58 | 8 · 3.59 |
| dino | 25 | 22 · 3.81 | 17 · 4.51 | 16 · 4.56 | 16 · 4.59 |
| shoe | 22 | 38 · 7.43 | 28 · 7.39 | 21 · 7.24 | 15 · 4.96 |
| horse | 18 | 15 · 3.63 | 16 · 3.22 | 16 · 3.33 | 16 · 3.34 |
| open_box | 2 | 60 · 14.71 | 38 · 17.47 | 35 · 14.91 | 18 · 15.01 |
| all | 107 | 252 (|Δ| 167) · 7.02 | 159 (|Δ| 92) · 4.72 | 134 (|Δ| 73) · 4.65 | 105 (|Δ| 58) · 4.97 |
parts · error ×10⁻³; bold: parts nearest the mesh route's on the clean mesh (same layers); last row: total parts, sum of |parts − mesh parts| over the objects, geometric-mean error.
| object | mesh | package | gwn | gwn + 2D closing 0.75 s | gwn + 3D closing 1 s + 2D 0.75 s |
|---|---|---|---|---|---|
| battery_stepped | 4 | 21 · 3.50 | 7 · 3.37 | 7 · 3.40 | 7 · 3.41 |
| dress | 23 | 43 · 3.25 | 24 · 2.61 | 18 · 2.72 | 16 · 2.61 |
| bowl_of | 5 | 22 · 2.72 | 9 · 2.64 | 8 · 2.64 | 8 · 2.65 |
| bowl_gso | 7 | 29 · 2.80 | 15 · 2.66 | 14 · 2.66 | 13 · 2.65 |
| mug | 10 | 20 · 3.07 | 12 · 2.90 | 11 · 2.90 | 11 · 2.90 |
| dino | 34 | 39 · 2.67 | 29 · 2.50 | 28 · 2.55 | 27 · 2.52 |
| shoe | 34 | 49 · 8.64 | 38 · 4.40 | 30 · 4.43 | 19 · 3.51 |
| horse | 20 | 19 · 2.41 | 17 · 2.31 | 17 · 2.38 | 16 · 2.35 |
| open_box | 2 | 54 · 6.13 | 32 · 4.37 | 25 · 3.66 | 25 · 3.59 |
| all | 139 | 296 (|Δ| 159) · 3.56 | 183 (|Δ| 60) · 3.00 | 158 (|Δ| 55) · 2.98 | 142 (|Δ| 69) · 2.88 |
| object | mesh | package | gwn | gwn + 2D closing 0.75 s | gwn + 3D closing 1 s + 2D 0.75 s |
|---|---|---|---|---|---|
| battery_stepped | 4 | 23 · 4.82 | 8 · 4.10 | 9 · 4.36 | 2 · 9.76 |
| dress | 23 | 24 · 4.25 | 10 · 3.40 | 12 · 3.61 | 7 · 3.80 |
| bowl_of | 5 | 34 · 9.52 | 17 · 3.19 | 15 · 3.25 | 13 · 3.29 |
| bowl_gso | 7 | 61 · 7.56 | 28 · 6.35 | 18 · 3.96 | 16 · 3.87 |
| mug | 10 | 37 · 6.58 | 20 · 3.62 | 16 · 3.60 | 16 · 3.63 |
| dino | 34 | 35 · 4.05 | 26 · 4.50 | 22 · 4.60 | 18 · 4.83 |
| shoe | 34 | 52 · 7.68 | 36 · 6.13 | 31 · 7.25 | 20 · 7.43 |
| horse | 20 | 16 · 3.71 | 18 · 3.40 | 17 · 3.40 | 17 · 3.42 |
| open_box | 2 | 125 · 13.06 | 74 · 17.62 | 49 · 16.55 | 21 · 15.63 |
| all | 139 | 407 (|Δ| 276) · 6.25 | 237 (|Δ| 144) · 4.92 | 189 (|Δ| 108) · 4.81 | 130 (|Δ| 93) · 5.30 |
Is the loaf pan's part count the mesh or the wall? Open boxes written by hand (exact, watertight, no lid), walls and floor of t point
spacings at 10k points (scripts/openbox.py): a cube and a box of the loaf pan's proportions. The loaf pan's own wall is 1.45 %
of the diagonal (median, by ray casting): 1.2 spacings at 10k, 0.5 at 2048, 2.6 at 50k (where gwn gives its 7 parts).
parts · error ×10⁻³ · normal median; bold: parts nearest the mesh route's, lowest error.
| box | cloud | mesh route | package | eps | local | gwn |
|---|---|---|---|---|---|---|
| cube_t0.5s | clean_10000 | 2 · 4.22 · 1° | 61 · 35.76 · 86° | 61 · 35.76 · 86° | 55 · 32.75 · 85° | 49 · 23.86 · 82° |
| cube_t0.5s | clean_2048 | 107 · 20.68 · 89° | 93 · 21.41 · 88° | 63 · 24.07 · 89° | 3 · 13.18 · 46° | |
| cube_t0.5s | pn0p6_10000 | 160 · 24.64 · 90° | 69 · 29.21 · 87° | 70 · 23.37 · 86° | 38 · 14.78 · 71° | |
| cube_t1s | clean_10000 | 2 · 4.23 · 1° | 54 · 17.55 · 70° | 54 · 17.55 · 70° | 52 · 17.79 · 65° | 16 · 5.41 · 8° |
| cube_t1s | clean_2048 | 58 · 16.98 · 83° | 57 · 16.90 · 84° | 44 · 24.52 · 84° | 32 · 18.82 · 62° | |
| cube_t1s | pn0p6_10000 | 178 · 22.49 · 86° | 90 · 19.37 · 82° | 81 · 19.53 · 83° | 90 · 15.09 · 83° | |
| cube_t2s | clean_10000 | 2 · 4.10 · 1° | 10 · 4.47 · 4° | 10 · 4.47 · 4° | 10 · 4.45 · 5° | 4 · 4.41 · 3° |
| cube_t2s | clean_2048 | 33 · 14.43 · 28° | 30 · 15.12 · 33° | 27 · 12.55 · 32° | 11 · 5.24 · 4° | |
| cube_t2s | pn0p6_10000 | 80 · 22.79 · 72° | 18 · 5.85 · 9° | 19 · 6.28 · 13° | 9 · 4.92 · 5° | |
| cube_t4s | clean_10000 | 2 · 4.03 · 1° | 5 · 4.36 · 4° | 4 · 4.40 · 5° | 5 · 4.37 · 4° | 3 · 4.14 · 3° |
| cube_t4s | clean_2048 | 11 · 5.28 · 5° | 9 · 6.24 · 8° | 8 · 5.99 · 8° | 7 · 4.59 · 3° | |
| cube_t4s | pn0p6_10000 | 27 · 5.63 · 13° | 7 · 5.61 · 10° | 7 · 5.62 · 9° | 5 · 4.86 · 6° | |
| pan_t0.5s | clean_10000 | 2 · 3.39 · 0° | 123 · 16.21 · 80° | 120 · 15.96 · 79° | 95 · 22.88 · 85° | 70 · 18.28 · 77° |
| pan_t0.5s | clean_2048 | 89 · 22.66 · 90° | 75 · 22.60 · 90° | 63 · 15.24 · 90° | 9 · 16.74 · 41° | |
| pan_t0.5s | pn0p6_10000 | 275 · 17.82 · 88° | 93 · 14.58 · 85° | 91 · 26.47 · 86° | 96 · 16.41 · 87° | |
| pan_t1s | clean_10000 | 2 · 3.40 · 0° | 55 · 18.53 · 73° | 55 · 18.53 · 73° | 46 · 7.27 · 4° | 29 · 5.37 · 1° |
| pan_t1s | clean_2048 | 89 · 15.55 · 79° | 82 · 15.98 · 82° | 68 · 18.15 · 88° | 44 · 9.23 · 7° | |
| pan_t1s | pn0p6_10000 | 313 · 16.62 · 84° | 123 · 12.29 · 79° | 123 · 15.59 · 80° | 126 · 9.64 · 66° | |
| pan_t2s | clean_10000 | 2 · 3.34 · 0° | 13 · 3.72 · 3° | 12 · 3.74 · 3° | 10 · 3.91 · 4° | 8 · 3.52 · 2° |
| pan_t2s | clean_2048 | 54 · 8.91 · 13° | 51 · 10.31 · 31° | 44 · 12.14 · 21° | 24 · 6.08 · 7° | |
| pan_t2s | pn0p6_10000 | 229 · 19.65 · 88° | 61 · 7.95 · 19° | 63 · 11.45 · 19° | 57 · 5.02 · 7° |

Does decoding fewer atoms (the shortest prefix holding 95 / 99 / 99.5 / 99.9 % of the descriptor's atom energy, the sum of squared
atom values) give a better surface or normals? No, from 6144 atoms (the most a descriptor holds) as from 1024: on all ten
objects and every cloud, clean or noisy (0.12 / 0.6 % with σ given), the full descriptor has the best normals and, but for one tie, the
lowest error. From 6144: 99.9 % (300–800 atoms) costs 1.1–1.45× the error and 2.6–5.7° of normal median; 99 % 1.3–3.2×. The one tie is
0.6 % noise at 2048 points, where the error is flat from 99.9 % (and the first 1024 atoms are 3 % better, 4 objects of 10) while
the normals still want every atom (+6° at 1024). The energy sits in ring means and low harmonics; detail and normals need the small
atoms. And 6144 atoms beat 1024 on normals everywhere (1–6° of median) and on error everywhere but 0.6 % noise at 2048 (6–12 % lower) (clean 10k 7.2° → 5.5°, 0.6 % 10k
22.5° → 16.2°). The rest of this page encodes 1024 atoms, the package default, as fcp_2710_tests' ablation.
scripts/energy_prefix.py (FCP_ATOMS=6144).
| descriptor | cloud | energy | atoms (median) | error ×10⁻³ | error / full | objects better (2 %) | normal median ° | PGP10 % |
|---|---|---|---|---|---|---|---|---|
| mesh route | clean | first 1024 atoms | 1024 | 2.79 | 1.12 | 0 | 6.8 | 61.4 |
| mesh route | clean | 95 % | 27 | 18.72 | 7.55 | 0 | 39.5 | 20.4 |
| mesh route | clean | 99 % | 66 | 7.93 | 3.20 | 0 | 18.0 | 34.2 |
| mesh route | clean | 99.5 % | 102 | 5.63 | 2.27 | 0 | 11.4 | 44.2 |
| mesh route | clean | 99.9 % | 285 | 3.61 | 1.45 | 0 | 8.4 | 52.8 |
| mesh route | clean | full | 6144 | 2.48 | 1.00 | 0 | 4.5 | 70.5 |
| gwn+close | clean · 10000 | first 1024 atoms | 1024 | 3.09 | 1.10 | 0 | 7.2 | 57.0 |
| gwn+close | clean · 10000 | 95 % | 25 | 17.44 | 6.20 | 0 | 36.2 | 17.6 |
| gwn+close | clean · 10000 | 99 % | 74 | 7.99 | 2.84 | 0 | 20.9 | 35.4 |
| gwn+close | clean · 10000 | 99.5 % | 111 | 6.30 | 2.24 | 0 | 17.2 | 41.9 |
| gwn+close | clean · 10000 | 99.9 % | 284 | 3.89 | 1.38 | 0 | 11.7 | 49.9 |
| gwn+close | clean · 10000 | full | 6144 | 2.81 | 1.00 | 0 | 5.5 | 64.1 |
| gwn+close | clean · 2048 | first 1024 atoms | 1024 | 4.67 | 1.06 | 0 | 18.7 | 42.6 |
| gwn+close | clean · 2048 | 95 % | 36 | 18.69 | 4.26 | 0 | 39.8 | 17.1 |
| gwn+close | clean · 2048 | 99 % | 158 | 8.75 | 1.99 | 0 | 27.6 | 31.1 |
| gwn+close | clean · 2048 | 99.5 % | 270 | 7.01 | 1.60 | 0 | 25.1 | 35.4 |
| gwn+close | clean · 2048 | 99.9 % | 716 | 5.12 | 1.16 | 0 | 20.2 | 40.4 |
| gwn+close | clean · 2048 | full | 6144 | 4.39 | 1.00 | 0 | 13.7 | 47.2 |
| gwn+close | pn0p12 · 10000 | first 1024 atoms | 1024 | 3.29 | 1.09 | 0 | 8.1 | 55.5 |
| gwn+close | pn0p12 · 10000 | 95 % | 29 | 17.12 | 5.65 | 0 | 39.4 | 13.4 |
| gwn+close | pn0p12 · 10000 | 99 % | 74 | 8.92 | 2.95 | 0 | 18.5 | 34.1 |
| gwn+close | pn0p12 · 10000 | 99.5 % | 112 | 6.49 | 2.14 | 0 | 16.3 | 39.8 |
| gwn+close | pn0p12 · 10000 | 99.9 % | 317 | 4.07 | 1.35 | 1 | 11.3 | 47.4 |
| gwn+close | pn0p12 · 10000 | full | 6144 | 3.03 | 1.00 | 0 | 6.9 | 61.5 |
| gwn+close | pn0p12 · 2048 | first 1024 atoms | 1024 | 4.64 | 1.07 | 1 | 18.3 | 40.1 |
| gwn+close | pn0p12 · 2048 | 95 % | 48 | 18.19 | 4.20 | 0 | 39.0 | 18.2 |
| gwn+close | pn0p12 · 2048 | 99 % | 168 | 8.81 | 2.03 | 0 | 27.5 | 30.5 |
| gwn+close | pn0p12 · 2048 | 99.5 % | 271 | 7.03 | 1.62 | 0 | 25.4 | 31.4 |
| gwn+close | pn0p12 · 2048 | 99.9 % | 733 | 4.92 | 1.14 | 1 | 19.9 | 37.5 |
| gwn+close | pn0p12 · 2048 | full | 6144 | 4.33 | 1.00 | 0 | 14.0 | 45.1 |
| gwn+close | pn0p6 · 10000 | first 1024 atoms | 1024 | 5.04 | 1.06 | 2 | 22.5 | 33.1 |
| gwn+close | pn0p6 · 10000 | 95 % | 43 | 19.90 | 4.20 | 0 | 42.8 | 14.1 |
| gwn+close | pn0p6 · 10000 | 99 % | 157 | 9.23 | 1.95 | 1 | 31.3 | 23.5 |
| gwn+close | pn0p6 · 10000 | 99.5 % | 248 | 7.15 | 1.51 | 1 | 28.7 | 25.6 |
| gwn+close | pn0p6 · 10000 | 99.9 % | 634 | 5.27 | 1.11 | 1 | 23.7 | 31.0 |
| gwn+close | pn0p6 · 10000 | full | 6144 | 4.74 | 1.00 | 0 | 16.2 | 37.2 |
| gwn+close | pn0p6 · 2048 | first 1024 atoms | 1024 | 7.71 | 0.97 | 4 | 29.4 | 22.1 |
| gwn+close | pn0p6 · 2048 | 95 % | 39 | 20.48 | 2.57 | 0 | 49.8 | 9.4 |
| gwn+close | pn0p6 · 2048 | 99 % | 159 | 10.29 | 1.29 | 1 | 35.4 | 17.1 |
| gwn+close | pn0p6 · 2048 | 99.5 % | 282 | 8.96 | 1.13 | 2 | 33.2 | 18.5 |
| gwn+close | pn0p6 · 2048 | 99.9 % | 826 | 7.93 | 1.00 | 4 | 28.9 | 22.3 |
| gwn+close | pn0p6 · 2048 | full | 6144 | 7.97 | 1.00 | 0 | 20.9 | 25.0 |
| descriptor | cloud | energy | atoms (median) | error ×10⁻³ | error / full | objects better (2 %) | normal median ° | PGP10 % |
|---|---|---|---|---|---|---|---|---|
| mesh route | clean | 95 % | 27 | 18.81 | 6.74 | 0 | 39.5 | 20.4 |
| mesh route | clean | 99 % | 65 | 8.03 | 2.88 | 0 | 18.6 | 34.0 |
| mesh route | clean | 99.5 % | 99 | 5.75 | 2.06 | 0 | 11.9 | 43.9 |
| mesh route | clean | full | 1024 | 2.79 | 1.00 | 0 | 6.8 | 61.4 |
| gwn+close | clean · 10000 | 95 % | 25 | 17.57 | 5.68 | 0 | 36.4 | 17.6 |
| gwn+close | clean · 10000 | 99 % | 73 | 8.13 | 2.63 | 0 | 20.9 | 34.9 |
| gwn+close | clean · 10000 | 99.5 % | 108 | 6.45 | 2.09 | 0 | 17.4 | 41.5 |
| gwn+close | clean · 10000 | full | 1024 | 3.09 | 1.00 | 0 | 7.2 | 57.0 |
| gwn+close | clean · 2048 | 95 % | 36 | 18.72 | 4.00 | 0 | 40.6 | 17.1 |
| gwn+close | clean · 2048 | 99 % | 151 | 8.87 | 1.90 | 0 | 27.6 | 31.6 |
| gwn+close | clean · 2048 | 99.5 % | 250 | 7.23 | 1.55 | 0 | 26.0 | 35.5 |
| gwn+close | clean · 2048 | full | 1024 | 4.67 | 1.00 | 0 | 18.7 | 42.6 |
| gwn+close | pn0p12 · 10000 | 95 % | 29 | 17.17 | 5.21 | 0 | 39.8 | 13.5 |
| gwn+close | pn0p12 · 10000 | 99 % | 74 | 9.03 | 2.74 | 0 | 18.6 | 33.6 |
| gwn+close | pn0p12 · 10000 | 99.5 % | 110 | 6.66 | 2.02 | 0 | 16.3 | 39.4 |
| gwn+close | pn0p12 · 10000 | full | 1024 | 3.29 | 1.00 | 0 | 8.1 | 55.5 |
| gwn+close | pn0p12 · 2048 | 95 % | 48 | 18.30 | 3.94 | 0 | 39.1 | 18.1 |
| gwn+close | pn0p12 · 2048 | 99 % | 162 | 9.05 | 1.95 | 0 | 27.6 | 30.7 |
| gwn+close | pn0p12 · 2048 | 99.5 % | 255 | 7.34 | 1.58 | 0 | 25.6 | 31.3 |
| gwn+close | pn0p12 · 2048 | full | 1024 | 4.64 | 1.00 | 0 | 18.3 | 40.1 |
| gwn+close | pn0p6 · 10000 | 95 % | 43 | 20.08 | 3.98 | 0 | 43.2 | 14.0 |
| gwn+close | pn0p6 · 10000 | 99 % | 153 | 9.59 | 1.90 | 0 | 31.0 | 23.5 |
| gwn+close | pn0p6 · 10000 | 99.5 % | 239 | 7.60 | 1.51 | 0 | 29.0 | 25.6 |
| gwn+close | pn0p6 · 10000 | full | 1024 | 5.04 | 1.00 | 0 | 22.5 | 33.1 |
| gwn+close | pn0p6 · 2048 | 95 % | 38 | 20.70 | 2.69 | 0 | 49.9 | 9.2 |
| gwn+close | pn0p6 · 2048 | 99 % | 152 | 10.52 | 1.36 | 0 | 35.8 | 16.9 |
| gwn+close | pn0p6 · 2048 | 99.5 % | 261 | 9.19 | 1.19 | 1 | 33.2 | 18.0 |
| gwn+close | pn0p6 · 2048 | full | 1024 | 7.71 | 1.00 | 0 | 29.4 | 22.1 |
Decoded at 96 cells per axis for the picture (the scores from the decode at the layers), coloured by part.


Your knee (docs/noisy_clouds.md §3 in fcp_devel): with the noise in the atoms (a noisy mesh, exact slices), |v| in
selection order stays high, drops, then decays as T−1: the tail is the noise. Here on point clouds, 6144 atoms, gwn + closing,
the knee by Kneedle (the atom farthest below the chord of log |v|, running median 64, against log T; the last 5 % left out),
scripts/knee.py.
| descriptor | knee (median atoms) | energy at the knee | tail slope | Chamfer knee / full | normal knee / full ° | best normal (atoms) | objects: normal better at the knee | objects: Chamfer better at the knee |
|---|---|---|---|---|---|---|---|---|
| mesh route (clean mesh) | 118 | 99.73 % | -1.55 | 5.06 / 2.48 | 12.8 / 4.5 | 4.5 (6144) | 0 of 10 | 0 of 10 |
| 0.12 %, σ given | 112 | 99.61 % | -1.57 | 6.39 / 3.03 | 14.1 / 6.9 | 6.6 (4146) | 0 of 10 | 0 of 10 |
| 0.6 %, σ given | 131 | 99.36 % | -1.68 | 8.81 / 4.74 | 22.5 / 16.2 | 16.2 (5081) | 0 of 10 | 0 of 10 |
| 0.6 %, σ = 0 | 165 | 99.38 % | -1.23 | 9.42 / 5.11 | 30.2 / 24.9 | 23.7 (2147) | 3 of 10 | 0 of 10 |
| 1.2 %, σ given | 72 | 99.04 % | -1.76 | 14.65 / 8.76 | 43.7 / 23.9 | 23.8 (5236) | 0 of 10 | 0 of 10 |
| 1.2 %, σ = 0 | 269 | 98.78 % | -1.09 | 13.65 / 8.25 | 46.4 / 46.4 | 43.6 (3258) | 4 of 10 | 0 of 10 |
knee atoms (energy): Chamfer knee / full · normal median knee / full.
| object | 0.6 %, σ = 0 | 1.2 %, σ = 0 |
|---|---|---|
| battery_stepped | 121 (99.4 %): 7.45 / 4.17 · 5° / 9° | 241 (98.6 %): 8.80 / 6.27 · 9° / 28° |
| bowl_gso | 5835 (100.0 %): 9.86 / 9.85 · 25° / 24° | 5616 (100.0 %): 7.50 / 7.52 · 53° / 53° |
| bowl_of | 92 (97.4 %): 17.61 / 3.82 · 13° / 13° | 5834 (100.0 %): 26.74 / 26.86 · 45° / 45° |
| dino | 267 (99.6 %): 5.65 / 3.88 · 30° / 30° | 297 (99.1 %): 8.32 / 7.28 · 40° / 47° |
| dress | 155 (97.7 %): 6.36 / 3.63 · 38° / 34° | 192 (95.7 %): 8.91 / 6.81 · 47° / 53° |
| elephant | 100 (97.8 %): 12.01 / 3.88 · 37° / 23° | 203 (98.2 %): 10.82 / 6.44 · 39° / 38° |
| horse | 169 (99.4 %): 5.68 / 3.32 · 23° / 26° | 354 (99.0 %): 8.11 / 7.20 · 38° / 44° |
| mug | 161 (97.5 %): 17.16 / 4.16 · 32° / 17° | 64 (69.2 %): 61.09 / 7.67 · 83° / 42° |
| open_box | 5835 (100.0 %): 23.24 / 23.56 · 55° / 54° | 5826 (100.0 %): 9.57 / 9.52 · 67° / 66° |
| shoe | 5831 (100.0 %): 4.36 / 4.37 · 31° / 31° | 64 (60.3 %): 33.48 / 6.86 · 84° / 53° |


C sets how far the tolerance reaches once σ is given: larger C gives fewer parts and smoother surfaces, and loses detail under C σ (the horse's legs at 1.2 % noise). gwn uses C = 3.
| cloud | slicer | parts | mesh | median parts / mesh | objects within ±25 % | error ×10⁻³ | error / package | normal median ° | PGP10 % | PGP30 % | empty | encode s |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| point noise 0.12 % · 10000 | C = 3 (gwn) | 146 | 134 | 0.94 | 7 | 3.06 | 0.76 | 7.8 | 55.2 | 82.0 | False | 1.71 |
| point noise 0.6 % · 10000 | C = 3 (gwn) | 284 | 134 | 1.27 | 2 | 4.68 | 0.52 | 22.1 | 32.9 | 62.6 | False | 2.49 |
| point noise 1.2 % · 10000 | C = 3 (gwn) | 188 | 134 | 0.69 | 1 | 8.84 | 0.66 | 33.8 | 22.0 | 50.2 | False | 3.51 |
| point noise 0.12 % · 2048 | C = 3 (gwn) | 185 | 134 | 1.24 | 3 | 5.40 | 0.90 | 18.4 | 39.6 | 66.3 | False | 0.29 |
| point noise 0.6 % · 2048 | C = 3 (gwn) | 211 | 134 | 1.65 | 1 | 7.08 | 0.78 | 27.6 | 19.8 | 51.1 | False | 0.32 |
| point noise 1.2 % · 2048 | C = 3 (gwn) | 157 | 134 | 1.01 | 2 | 10.72 | 0.99 | 40.7 | 15.4 | 43.6 | False | 0.35 |
Each row adds one piece (σ given on the point-noise clouds from row 6). Tried and dropped, numbers in report/bench.csv:
per-point flips by the jump of w (they flip thin walls); a thin-sheet band from a normalized point density, flagged by cancelling normals or
by low winding contrast (more parts and error everywhere, 3x the error under noise: noisy normals cancel like a thin wall); a noise
estimate from w itself (reads 1/3 of σ on thin-walled objects, overlaps clean and noisy at 2048: report/sigma_gwn_v*.txt);
the cut tolerance following σ (no change); the point-test cut rule (about 10 % fewer parts, slightly more error).
| cloud | slicer | parts | mesh | median parts / mesh | objects within ±25 % | error ×10⁻³ | error / package | normal median ° | PGP10 % | PGP30 % | empty | encode s |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| clean · 10000 | package | 209 | 134 | 1.43 | 4 | 3.75 | 1.00 | 8.6 | 50.9 | 77.8 | False | 0.17 |
| 7. gwn: + patch flips only when sigma = 0 | 136 | 134 | 0.94 | 8 | 3.01 | 0.80 | 7.2 | 56.2 | 83.0 | False | 1.81 | |
| clean · 2048 | package | 273 | 134 | 2.49 | 3 | 6.86 | 1.00 | 28.4 | 30.7 | 56.3 | False | 0.15 |
| 7. gwn: + patch flips only when sigma = 0 | 171 | 134 | 1.39 | 1 | 4.74 | 0.69 | 18.2 | 43.0 | 69.8 | False | 0.29 | |
| point noise 0.6 % · 10000 | package | 1398 | 134 | 9.59 | 0 | 8.97 | 1.00 | 55.1 | 12.8 | 30.1 | False | 0.27 |
| 7. gwn: + patch flips only when sigma = 0 | 284 | 134 | 1.27 | 2 | 4.68 | 0.52 | 22.1 | 32.9 | 62.6 | False | 2.49 | |
| point noise 1.2 % · 10000 | package | 3216 | 134 | 26.52 | 0 | 13.42 | 1.00 | 72.4 | 8.0 | 20.9 | False | 0.39 |
| 7. gwn: + patch flips only when sigma = 0 | 188 | 134 | 0.69 | 1 | 8.84 | 0.66 | 33.8 | 22.0 | 50.2 | False | 3.51 | |
| density stripes · 10000 | package | 1323 | 134 | 9.85 | 0 | 9.59 | 1.00 | 57.1 | 14.0 | 30.1 | False | 0.28 |
| 7. gwn: + patch flips only when sigma = 0 | 273 | 134 | 1.67 | 1 | 4.37 | 0.46 | 12.1 | 44.8 | 71.0 | False | 2.85 |
One global field replaces the per-layer flood. For the oriented, area-weighted points the mollified generalized winding number
w(x) = 1/(4π) Σi ai ni·(pi − x) / (|pi − x|² + εi²)3/2
is about 1 inside and 0 outside, and each layer's rings are its iso-contour on that layer's raster (surf's own marching squares and loop chaining). The steps, each with the literature it comes from:
Everything after the slicer is the package's (tracking, tracked-fit cuts with fit_tol="auto", atoms). The field is a direct
O(points × pixels) sum on the GPU (CuPy kernels in gwn.py).
sigma_gwn_v2.txt).api/DECISIONS.md: a new slicer (and encoder version), noise= (σ) as the
encoder's tolerance parameter.Points within half a layer (grey), the mesh's section (black), the package's rings (blue), the GWN variants' rings (orange), at the layers with the most GWN rings. bowl_gso 2048: the rim wall is far thinner than the spacing, the earliest GWN breaks it into beads; mug, point noise 1.2 %: with σ and the first orientation the outside read as inside (the raster border is a contour), fixed by the outside probes and the global check; loaf pan 10k: a wall of about a spacing, fragmented before the splats.




Rendered before the open box replaced the loaf pan, and without the closing.



