zhicao commited on
Commit
c32f0f0
·
verified ·
1 Parent(s): 8aeb062

Scheduled Commit

Browse files
ablation_runs/ablation_section_preview.html ADDED
@@ -0,0 +1,263 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ <!-- ======================= ABLATION ======================= -->
3
+ <section id="ablation">
4
+ <p class="sec-eyebrow">ablation</p>
5
+ <h2>Ablation: what track, force, and deformation tactile each buy</h2>
6
+
7
+ <div class="prose">
8
+ <p>Four variants of the cascade are trained from the same Wan2.2 foundation
9
+ weights on the <code>trex_mini_force</code> episode &mdash; identical anchors,
10
+ LoRA budget (r=4 on q,k,v,o,k_img,v_img,ffn), learning rate, batch size,
11
+ seed, and 3,000 single-GPU steps &mdash; so every difference below is
12
+ attributable to the ablated component, not to training budget.
13
+ <b>B</b> removes the track pathway structurally (no track tokens, encoder,
14
+ decoder, or loss): the packed block shrinks from 617 to 117 tokens &mdash;
15
+ exactly the pre-track architecture with the force stage kept. <b>C</b>
16
+ removes the force stage (no Stage-2 transformer, no tactile input, no
17
+ force/VQ loss); at inference its coarse model carries the flow all the way
18
+ to &tau;=0. <b>D</b> keeps the full model and adds ten per-finger
19
+ deformation-camera tokens (96&times;96 crops &rarr; 4-layer CNN &rarr; d 768)
20
+ beside the F6 and VQ-history tokens in Stage 2.</p>
21
+ </div>
22
+
23
+ <div class="legend" role="list" aria-label="Ablation variant legend">
24
+ <span class="k" role="listitem"><span class="vs vs-full"></span>A &middot; full (track + force)</span>
25
+ <span class="k" role="listitem"><span class="vs vs-notrack"></span>B &middot; no track (pre-track structure)</span>
26
+ <span class="k" role="listitem"><span class="vs vs-noforce"></span>C &middot; no force stage</span>
27
+ <span class="k" role="listitem"><span class="vs vs-deform"></span>D &middot; deform tactile + force</span>
28
+ </div>
29
+
30
+
31
+ <div class="tbl-wrap">
32
+ <table>
33
+ <thead><tr><th>Variant</th><th>Stage-1 tokens / block</th>
34
+ <th>Stage-2 tokens</th><th>Losses optimized</th></tr></thead>
35
+ <tbody>
36
+ <tr><td><span class="chip"><span class="vs vs-full"></span>&nbsp;A &middot; full</span></td>
37
+ <td class="shape">100 obs + 16 act + 1 st + 500 trk = 617</td>
38
+ <td class="shape">16 act + 10 F6 + 10 VQ + mem</td>
39
+ <td>dynamics &middot; action &middot; 20&middot;track &middot; force &middot; VQ</td></tr>
40
+ <tr><td><span class="chip"><span class="vs vs-notrack"></span>&nbsp;B &middot; no track</span></td>
41
+ <td class="shape">100 obs + 16 act + 1 st = 117</td>
42
+ <td class="shape">16 act + 10 F6 + 10 VQ + mem</td>
43
+ <td>dynamics &middot; action &middot; force &middot; VQ</td></tr>
44
+ <tr><td><span class="chip"><span class="vs vs-noforce"></span>&nbsp;C &middot; no force</span></td>
45
+ <td class="shape">617</td>
46
+ <td class="shape">&mdash; (coarse runs &tau;&rarr;0)</td>
47
+ <td>dynamics &middot; action &middot; 20&middot;track</td></tr>
48
+ <tr><td><span class="chip"><span class="vs vs-deform"></span>&nbsp;D &middot; deform + force</span></td>
49
+ <td class="shape">617</td>
50
+ <td class="shape">16 act + 10 F6 + 10 VQ + <b>10 deform</b> + mem</td>
51
+ <td>dynamics &middot; action &middot; 20&middot;track &middot; force &middot; VQ</td></tr>
52
+ </tbody>
53
+ </table>
54
+ </div>
55
+
56
+ <figure>
57
+ <div class="quad">
58
+ <div><svg viewBox="0 0 520 230" role="img" aria-label="action flow MSE">
59
+ <text class="th" x="46" y="15">action flow MSE</text>
60
+ <line class="grid-cell" x1="46" y1="157.3" x2="510" y2="157.3"></line>
61
+ <text class="ts" x="40" y="160.3" text-anchor="end">0.5</text>
62
+ <line class="grid-cell" x1="46" y1="108.6" x2="510" y2="108.6"></line>
63
+ <text class="ts" x="40" y="111.6" text-anchor="end">1</text>
64
+ <line class="grid-cell" x1="46" y1="59.9" x2="510" y2="59.9"></line>
65
+ <text class="ts" x="40" y="62.9" text-anchor="end">2</text>
66
+ <line class="grid-cell" x1="46.0" y1="26" x2="46.0" y2="200"></line>
67
+ <text class="ts" x="46.0" y="214" text-anchor="middle">0k</text>
68
+ <line class="grid-cell" x1="200.7" y1="26" x2="200.7" y2="200"></line>
69
+ <text class="ts" x="200.7" y="214" text-anchor="middle">1k</text>
70
+ <line class="grid-cell" x1="355.3" y1="26" x2="355.3" y2="200"></line>
71
+ <text class="ts" x="355.3" y="214" text-anchor="middle">2k</text>
72
+ <line class="grid-cell" x1="510.0" y1="26" x2="510.0" y2="200"></line>
73
+ <text class="ts" x="510.0" y="214" text-anchor="middle">3k</text>
74
+ <text class="ts" x="510" y="224" text-anchor="end">step</text>
75
+ <path class="vw v-full" d="M46.0 26.5 L49.1 26.0 L52.2 28.0 L55.3 32.8 L58.4 38.5 L61.5 44.3 L64.6 49.8 L67.7 55.2 L70.7 60.0 L73.8 64.6 L76.9 68.9 L80.0 72.8 L83.1 76.6 L86.2 79.8 L89.3 82.9 L92.4 85.6 L95.5 88.2 L98.6 90.6 L101.7 92.8 L104.8 94.7 L107.9 96.4 L111.0 98.0 L114.1 99.5 L117.1 100.9 L120.2 102.3 L123.3 103.5 L126.4 104.7 L129.5 105.7 L132.6 106.8 L135.7 107.9 L138.8 109.3 L141.9 110.6 L145.0 111.5 L148.1 112.8 L151.2 114.3 L154.3 115.8 L157.4 116.9 L160.5 118.1 L163.5 119.3 L166.6 120.9 L169.7 122.3 L172.8 123.5 L175.9 125.0 L179.0 126.2 L182.1 127.8 L185.2 129.2 L188.3 130.7 L191.4 131.7 L194.5 133.7 L197.6 135.2 L200.7 137.2 L203.8 139.4 L206.9 140.8 L209.9 141.8 L213.0 144.1 L216.1 146.2 L219.2 147.8 L222.3 149.4 L225.4 150.5 L228.5 152.0 L231.6 153.7 L234.7 154.8 L237.8 155.7 L240.9 157.5 L244.0 158.7 L247.1 160.0 L250.2 161.5 L253.3 161.1 L256.3 161.1 L259.4 161.7 L262.5 163.0 L265.6 164.3 L268.7 165.4 L271.8 165.6 L274.9 166.5 L278.0 168.2 L281.1 169.9 L284.2 170.6 L287.3 170.9 L290.4 172.1 L293.5 171.9 L296.6 172.1 L299.7 173.0 L302.7 174.2 L305.8 176.0 L308.9 177.1 L312.0 177.5 L315.1 177.8 L318.2 179.0 L321.3 179.9 L324.4 181.0 L327.5 181.5 L330.6 181.8 L333.7 183.7 L336.8 185.5 L339.9 184.7 L343.0 183.4 L346.1 183.9 L349.1 183.0 L352.2 184.5 L355.3 184.1 L358.4 184.9 L361.5 184.2 L364.6 184.3 L367.7 184.7 L370.8 187.0 L373.9 187.2 L377.0 188.9 L380.1 189.1 L383.2 187.6 L386.3 188.4 L389.4 189.2 L392.5 190.8 L395.5 191.1 L398.6 189.5 L401.7 187.6 L404.8 188.7 L407.9 190.3 L411.0 190.7 L414.1 191.6 L417.2 191.4 L420.3 189.8 L423.4 190.5 L426.5 191.2 L429.6 191.7 L432.7 192.6 L435.8 193.2 L438.9 193.9 L441.9 192.9 L445.0 194.0 L448.1 195.0 L451.2 195.3 L454.3 195.7 L457.4 196.1 L460.5 197.1 L463.6 195.4 L466.7 195.5 L469.8 197.0 L472.9 196.7 L476.0 196.7 L479.1 196.5 L482.2 196.1 L485.3 196.2 L488.3 195.9 L491.4 197.2 L494.5 197.2 L497.6 196.9 L500.7 194.4 L503.8 196.5 L506.9 199.6 L508.5 198.1"></path>
76
+ <circle class="vdot v-full" cx="508.5" cy="198.1" r="3.5"></circle>
77
+ <path class="vw v-notrack" d="M46.0 30.7 L49.1 30.4 L52.2 32.6 L55.3 37.6 L58.4 43.3 L61.5 49.0 L64.6 54.4 L67.7 59.6 L70.7 64.1 L73.8 68.5 L76.9 72.6 L80.0 76.2 L83.1 79.7 L86.2 82.8 L89.3 85.7 L92.4 88.1 L95.5 90.4 L98.6 92.7 L101.7 94.6 L104.8 96.4 L107.9 98.0 L111.0 99.6 L114.1 101.0 L117.1 102.4 L120.2 103.7 L123.3 104.9 L126.4 106.2 L129.5 107.4 L132.6 108.6 L135.7 110.0 L138.8 110.9 L141.9 111.9 L145.0 113.2 L148.1 114.6 L151.2 115.8 L154.3 117.1 L157.4 118.4 L160.5 120.0 L163.5 121.1 L166.6 122.1 L169.7 123.5 L172.8 125.8 L175.9 127.2 L179.0 128.5 L182.1 130.0 L185.2 131.4 L188.3 132.8 L191.4 134.4 L194.5 135.5 L197.6 136.5 L200.7 138.1 L203.8 139.8 L206.9 141.5 L209.9 142.3 L213.0 143.6 L216.1 145.9 L219.2 148.1 L222.3 149.2 L225.4 151.1 L228.5 152.1 L231.6 152.9 L234.7 154.2 L237.8 155.7 L240.9 157.2 L244.0 159.3 L247.1 160.4 L250.2 162.7 L253.3 165.1 L256.3 166.4 L259.4 167.1 L262.5 168.0 L265.6 169.0 L268.7 169.6 L271.8 171.4 L274.9 172.0 L278.0 172.7 L281.1 174.5 L284.2 175.0 L287.3 176.4 L290.4 175.0 L293.5 176.0 L296.6 176.5 L299.7 177.5 L302.7 178.4 L305.8 180.5 L308.9 181.0 L312.0 182.2 L315.1 182.0 L318.2 184.0 L321.3 183.9 L324.4 182.7 L327.5 183.2 L330.6 183.9 L333.7 185.0 L336.8 186.3 L339.9 187.0 L343.0 188.0 L346.1 188.2 L349.1 186.5 L352.2 187.1 L355.3 187.9 L358.4 187.8 L361.5 189.6 L364.6 189.3 L367.7 192.2 L370.8 191.2 L373.9 191.5 L377.0 192.8 L380.1 193.0 L383.2 194.9 L386.3 195.4 L389.4 196.5 L392.5 196.9 L395.5 197.0 L398.6 194.9 L401.7 195.6 L404.8 195.7 L407.9 195.8 L411.0 196.6 L414.1 197.3 L417.2 196.3 L420.3 198.0 L423.4 197.2 L426.5 197.7 L429.6 197.8 L432.7 197.2 L435.8 196.2 L438.9 197.0 L441.9 195.6 L445.0 195.5 L448.1 194.6 L451.2 194.0 L454.3 193.7 L457.4 194.0 L460.5 194.2 L463.6 195.3 L466.7 194.2 L469.8 193.7 L472.9 192.2 L476.0 194.7 L479.1 194.5 L482.2 194.4 L485.3 196.0 L488.3 196.9 L491.4 194.9 L494.5 197.3 L497.6 200.0 L500.7 199.8 L503.8 199.9 L506.9 198.8 L508.5 198.2"></path>
78
+ <circle class="vdot v-notrack" cx="508.5" cy="198.2" r="3.5"></circle>
79
+ <path class="vw v-noforce" d="M46.0 26.5 L47.5 26.4 L49.1 26.2 L50.6 26.4 L52.2 27.9 L53.7 30.2 L55.3 32.7 L56.8 35.6 L58.4 38.5 L59.9 41.3 L61.5 44.3 L63.0 47.3 L64.6 49.9 L66.1 52.8 L67.7 55.5 L69.2 57.8 L70.7 60.2 L72.3 62.5 L73.8 64.7 L75.4 66.9 L76.9 69.0 L78.5 71.0 L80.0 72.9 L81.6 74.8 L83.1 76.8 L84.7 78.3 L86.2 80.0 L87.8 81.6 L89.3 83.0 L90.9 84.4 L92.4 85.8 L93.9 87.2 L95.5 88.4 L97.0 89.7 L98.6 90.8 L100.1 91.9 L101.7 93.0 L103.2 94.0 L104.8 94.9 L106.3 95.9 L107.9 96.7 L109.4 97.6 L111.0 98.4 L112.5 99.0 L114.1 99.7 L115.6 100.5 L117.1 101.2 L118.7 101.9 L120.2 102.6 L121.8 103.1 L123.3 103.6 L124.9 104.4 L126.4 104.9 L128.0 105.4 L129.5 106.1 L131.1 106.6 L132.6 107.2 L134.2 107.9 L135.7 108.5 L137.3 109.1 L138.8 109.8 L140.3 110.5 L141.9 111.2 L143.4 111.6 L145.0 112.3 L146.5 112.8 L148.1 113.4 L149.6 113.9 L151.2 114.5 L152.7 115.1 L154.3 115.5 L155.8 116.3 L157.4 117.0 L158.9 117.5 L160.5 118.6 L162.0 119.3 L163.5 119.9 L165.1 120.7 L166.6 121.5 L168.2 122.4 L169.7 123.2 L171.3 123.9 L172.8 124.6 L174.4 125.1 L175.9 126.0 L177.5 126.3 L179.0 127.3 L180.6 128.0 L182.1 128.7 L183.7 129.4 L185.2 130.1 L186.7 130.7"></path>
80
+ <circle class="vdot v-noforce" cx="186.7" cy="130.7" r="3.5"></circle>
81
+ </svg></div>
82
+ <div><svg viewBox="0 0 520 230" role="img" aria-label="dynamics (video flow) MSE">
83
+ <text class="th" x="46" y="15">dynamics (video flow) MSE</text>
84
+ <line class="grid-cell" x1="46" y1="154.8" x2="510" y2="154.8"></line>
85
+ <text class="ts" x="40" y="157.8" text-anchor="end">0.5</text>
86
+ <line class="grid-cell" x1="46" y1="100.1" x2="510" y2="100.1"></line>
87
+ <text class="ts" x="40" y="103.1" text-anchor="end">1</text>
88
+ <line class="grid-cell" x1="46" y1="45.5" x2="510" y2="45.5"></line>
89
+ <text class="ts" x="40" y="48.5" text-anchor="end">2</text>
90
+ <line class="grid-cell" x1="46.0" y1="26" x2="46.0" y2="200"></line>
91
+ <text class="ts" x="46.0" y="214" text-anchor="middle">0k</text>
92
+ <line class="grid-cell" x1="200.7" y1="26" x2="200.7" y2="200"></line>
93
+ <text class="ts" x="200.7" y="214" text-anchor="middle">1k</text>
94
+ <line class="grid-cell" x1="355.3" y1="26" x2="355.3" y2="200"></line>
95
+ <text class="ts" x="355.3" y="214" text-anchor="middle">2k</text>
96
+ <line class="grid-cell" x1="510.0" y1="26" x2="510.0" y2="200"></line>
97
+ <text class="ts" x="510.0" y="214" text-anchor="middle">3k</text>
98
+ <text class="ts" x="510" y="224" text-anchor="end">step</text>
99
+ <path class="vw v-full" d="M46.0 26.0 L49.1 26.7 L52.2 27.7 L55.3 29.9 L58.4 32.4 L61.5 35.6 L64.6 39.2 L67.7 42.6 L70.7 46.5 L73.8 51.2 L76.9 56.4 L80.0 62.9 L83.1 70.2 L86.2 77.0 L89.3 83.9 L92.4 90.3 L95.5 96.4 L98.6 102.3 L101.7 107.9 L104.8 113.9 L107.9 118.0 L111.0 121.5 L114.1 125.7 L117.1 129.8 L120.2 133.8 L123.3 136.2 L126.4 139.4 L129.5 141.8 L132.6 144.5 L135.7 146.7 L138.8 149.2 L141.9 152.2 L145.0 152.3 L148.1 154.4 L151.2 156.8 L154.3 159.6 L157.4 159.8 L160.5 160.6 L163.5 162.0 L166.6 163.5 L169.7 164.5 L172.8 164.5 L175.9 165.1 L179.0 165.2 L182.1 166.1 L185.2 166.5 L188.3 167.2 L191.4 166.8 L194.5 168.7 L197.6 169.3 L200.7 170.8 L203.8 172.3 L206.9 172.5 L209.9 171.8 L213.0 173.8 L216.1 175.3 L219.2 175.5 L222.3 176.0 L225.4 175.6 L228.5 175.9 L231.6 176.9 L234.7 176.7 L237.8 176.8 L240.9 178.0 L244.0 178.0 L247.1 178.6 L250.2 179.2 L253.3 177.2 L256.3 175.7 L259.4 175.8 L262.5 175.9 L265.6 176.0 L268.7 176.5 L271.8 176.0 L274.9 175.8 L278.0 176.9 L281.1 177.5 L284.2 177.8 L287.3 177.3 L290.4 178.2 L293.5 177.7 L296.6 177.4 L299.7 177.8 L302.7 178.3 L305.8 179.6 L308.9 180.2 L312.0 180.6 L315.1 180.1 L318.2 180.8 L321.3 181.5 L324.4 181.8 L327.5 181.8 L330.6 181.7 L333.7 183.1 L336.8 184.2 L339.9 183.1 L343.0 181.1 L346.1 181.6 L349.1 180.4 L352.2 181.5 L355.3 180.7 L358.4 181.1 L361.5 179.9 L364.6 179.7 L367.7 179.6 L370.8 181.7 L373.9 181.6 L377.0 182.8 L380.1 182.8 L383.2 181.4 L386.3 182.1 L389.4 182.7 L392.5 183.9 L395.5 184.0 L398.6 182.6 L401.7 180.5 L404.8 181.2 L407.9 182.2 L411.0 182.6 L414.1 183.2 L417.2 183.2 L420.3 181.7 L423.4 182.0 L426.5 182.6 L429.6 182.9 L432.7 183.7 L435.8 184.2 L438.9 184.5 L441.9 183.4 L445.0 184.8 L448.1 185.4 L451.2 185.7 L454.3 186.0 L457.4 186.3 L460.5 187.1 L463.6 185.6 L466.7 185.4 L469.8 186.6 L472.9 186.3 L476.0 186.3 L479.1 185.9 L482.2 185.4 L485.3 185.8 L488.3 185.8 L491.4 186.8 L494.5 186.5 L497.6 186.5 L500.7 184.5 L503.8 186.0 L506.9 188.3 L508.5 187.2"></path>
100
+ <circle class="vdot v-full" cx="508.5" cy="187.2" r="3.5"></circle>
101
+ <path class="vw v-notrack" d="M46.0 28.4 L49.1 29.7 L52.2 30.3 L55.3 32.5 L58.4 35.4 L61.5 38.5 L64.6 43.1 L67.7 47.8 L70.7 53.1 L73.8 59.4 L76.9 66.2 L80.0 73.0 L83.1 80.1 L86.2 87.1 L89.3 94.4 L92.4 101.1 L95.5 107.6 L98.6 113.1 L101.7 117.8 L104.8 122.6 L107.9 127.3 L111.0 131.2 L114.1 135.5 L117.1 139.6 L120.2 143.0 L123.3 146.5 L126.4 150.4 L129.5 153.2 L132.6 155.2 L135.7 158.0 L138.8 158.5 L141.9 159.2 L145.0 160.8 L148.1 163.4 L151.2 164.5 L154.3 166.7 L157.4 168.3 L160.5 169.4 L163.5 169.8 L166.6 169.6 L169.7 170.2 L172.8 173.7 L175.9 174.5 L179.0 175.2 L182.1 175.1 L185.2 175.9 L188.3 176.4 L191.4 177.2 L194.5 177.1 L197.6 176.4 L200.7 177.3 L203.8 178.1 L206.9 178.1 L209.9 178.1 L213.0 178.2 L216.1 180.4 L219.2 181.8 L222.3 181.4 L225.4 183.0 L228.5 182.8 L231.6 182.4 L234.7 182.6 L237.8 183.6 L240.9 184.7 L244.0 186.5 L247.1 187.0 L250.2 188.7 L253.3 190.4 L256.3 190.6 L259.4 191.0 L262.5 190.9 L265.6 190.8 L268.7 190.5 L271.8 192.1 L274.9 191.2 L278.0 190.8 L281.1 191.9 L284.2 191.9 L287.3 192.5 L290.4 190.3 L293.5 190.5 L296.6 190.5 L299.7 190.8 L302.7 191.3 L305.8 193.0 L308.9 192.8 L312.0 193.9 L315.1 192.7 L318.2 194.6 L321.3 194.2 L324.4 192.5 L327.5 192.5 L330.6 192.8 L333.7 193.5 L336.8 194.1 L339.9 194.2 L343.0 194.7 L346.1 194.7 L349.1 193.1 L352.2 193.3 L355.3 193.9 L358.4 193.6 L361.5 194.6 L364.6 193.7 L367.7 196.1 L370.8 195.1 L373.9 195.4 L377.0 196.2 L380.1 196.5 L383.2 198.2 L386.3 198.5 L389.4 199.1 L392.5 199.1 L395.5 199.4 L398.6 197.6 L401.7 197.8 L404.8 197.6 L407.9 197.2 L411.0 197.9 L414.1 198.4 L417.2 197.6 L420.3 199.4 L423.4 198.6 L426.5 198.6 L429.6 198.5 L432.7 197.4 L435.8 196.6 L438.9 197.4 L441.9 196.3 L445.0 196.4 L448.1 195.3 L451.2 195.0 L454.3 194.8 L457.4 195.0 L460.5 195.3 L463.6 196.2 L466.7 194.8 L469.8 194.1 L472.9 192.5 L476.0 194.7 L479.1 194.5 L482.2 194.2 L485.3 196.0 L488.3 197.3 L491.4 195.2 L494.5 197.2 L497.6 200.0 L500.7 199.8 L503.8 199.8 L506.9 198.7 L508.5 198.1"></path>
102
+ <circle class="vdot v-notrack" cx="508.5" cy="198.1" r="3.5"></circle>
103
+ <path class="vw v-noforce" d="M46.0 26.0 L47.5 26.3 L49.1 26.9 L50.6 27.3 L52.2 27.9 L53.7 28.7 L55.3 29.9 L56.8 31.1 L58.4 32.4 L59.9 33.5 L61.5 35.1 L63.0 36.7 L64.6 38.6 L66.1 40.5 L67.7 42.5 L69.2 44.6 L70.7 46.4 L72.3 48.7 L73.8 51.0 L75.4 53.4 L76.9 56.5 L78.5 59.5 L80.0 62.9 L81.6 66.4 L83.1 70.1 L84.7 73.7 L86.2 77.1 L87.8 80.4 L89.3 83.5 L90.9 86.9 L92.4 90.3 L93.9 93.3 L95.5 96.4 L97.0 99.7 L98.6 102.5 L100.1 105.2 L101.7 108.4 L103.2 111.7 L104.8 114.6 L106.3 116.8 L107.9 118.7 L109.4 121.1 L111.0 123.2 L112.5 125.2 L114.1 127.2 L115.6 129.2 L117.1 131.5 L118.7 133.2 L120.2 134.9 L121.8 136.4 L123.3 137.3 L124.9 139.6 L126.4 141.5 L128.0 142.1 L129.5 144.0 L131.1 144.8 L132.6 147.0 L134.2 148.2 L135.7 148.9 L137.3 149.9 L138.8 151.6 L140.3 152.6 L141.9 153.9 L143.4 154.4 L145.0 155.6 L146.5 156.4 L148.1 157.6 L149.6 157.8 L151.2 159.1 L152.7 159.4 L154.3 159.3 L155.8 160.5 L157.4 161.1 L158.9 161.4 L160.5 162.6 L162.0 163.7 L163.5 163.8 L165.1 164.4 L166.6 165.6 L168.2 166.8 L169.7 167.5 L171.3 167.6 L172.8 167.6 L174.4 167.3 L175.9 167.7 L177.5 166.9 L179.0 167.3 L180.6 167.3 L182.1 167.2 L183.7 167.2 L185.2 167.2 L186.7 166.9"></path>
104
+ <circle class="vdot v-noforce" cx="186.7" cy="166.9" r="3.5"></circle>
105
+ </svg></div>
106
+ <div><svg viewBox="0 0 520 230" role="img" aria-label="track loss (weighted sum)">
107
+ <text class="th" x="46" y="15">track loss (weighted sum)</text>
108
+ <line class="grid-cell" x1="46" y1="185.5" x2="510" y2="185.5"></line>
109
+ <text class="ts" x="40" y="188.5" text-anchor="end">0.2</text>
110
+ <line class="grid-cell" x1="46" y1="145.2" x2="510" y2="145.2"></line>
111
+ <text class="ts" x="40" y="148.2" text-anchor="end">0.5</text>
112
+ <line class="grid-cell" x1="46" y1="114.6" x2="510" y2="114.6"></line>
113
+ <text class="ts" x="40" y="117.6" text-anchor="end">1</text>
114
+ <line class="grid-cell" x1="46" y1="84.1" x2="510" y2="84.1"></line>
115
+ <text class="ts" x="40" y="87.1" text-anchor="end">2</text>
116
+ <line class="grid-cell" x1="46" y1="43.8" x2="510" y2="43.8"></line>
117
+ <text class="ts" x="40" y="46.8" text-anchor="end">5</text>
118
+ <line class="grid-cell" x1="46.0" y1="26" x2="46.0" y2="200"></line>
119
+ <text class="ts" x="46.0" y="214" text-anchor="middle">0k</text>
120
+ <line class="grid-cell" x1="200.7" y1="26" x2="200.7" y2="200"></line>
121
+ <text class="ts" x="200.7" y="214" text-anchor="middle">1k</text>
122
+ <line class="grid-cell" x1="355.3" y1="26" x2="355.3" y2="200"></line>
123
+ <text class="ts" x="355.3" y="214" text-anchor="middle">2k</text>
124
+ <line class="grid-cell" x1="510.0" y1="26" x2="510.0" y2="200"></line>
125
+ <text class="ts" x="510.0" y="214" text-anchor="middle">3k</text>
126
+ <text class="ts" x="510" y="224" text-anchor="end">step</text>
127
+ <path class="vw v-full" d="M46.0 38.6 L49.1 34.8 L52.2 32.1 L55.3 30.1 L58.4 28.2 L61.5 26.9 L64.6 26.0 L67.7 26.6 L70.7 27.8 L73.8 29.5 L76.9 31.8 L80.0 33.6 L83.1 35.1 L86.2 37.4 L89.3 39.6 L92.4 42.0 L95.5 44.7 L98.6 47.2 L101.7 49.7 L104.8 52.1 L107.9 55.1 L111.0 58.3 L114.1 61.1 L117.1 64.0 L120.2 66.8 L123.3 69.8 L126.4 72.7 L129.5 75.6 L132.6 78.6 L135.7 81.3 L138.8 83.9 L141.9 86.5 L145.0 89.3 L148.1 91.9 L151.2 94.4 L154.3 96.9 L157.4 99.3 L160.5 101.9 L163.5 104.4 L166.6 107.0 L169.7 109.4 L172.8 111.6 L175.9 113.7 L179.0 115.9 L182.1 118.3 L185.2 120.7 L188.3 122.8 L191.4 125.0 L194.5 127.3 L197.6 129.7 L200.7 131.8 L203.8 134.3 L206.9 136.5 L209.9 138.2 L213.0 140.5 L216.1 142.4 L219.2 144.1 L222.3 146.1 L225.4 147.6 L228.5 149.2 L231.6 150.9 L234.7 152.5 L237.8 154.1 L240.9 156.0 L244.0 157.5 L247.1 158.8 L250.2 160.1 L253.3 160.4 L256.3 160.9 L259.4 162.1 L262.5 163.5 L265.6 164.4 L268.7 165.7 L271.8 166.0 L274.9 166.8 L278.0 168.6 L281.1 169.7 L284.2 170.9 L287.3 171.4 L290.4 172.6 L293.5 173.4 L296.6 173.3 L299.7 174.8 L302.7 176.2 L305.8 177.8 L308.9 178.5 L312.0 179.2 L315.1 179.8 L318.2 181.1 L321.3 182.0 L324.4 183.0 L327.5 183.6 L330.6 184.1 L333.7 185.3 L336.8 186.6 L339.9 186.1 L343.0 184.9 L346.1 186.4 L349.1 186.4 L352.2 187.6 L355.3 188.0 L358.4 188.8 L361.5 189.0 L364.6 189.7 L367.7 190.0 L370.8 191.2 L373.9 190.9 L377.0 192.6 L380.1 192.8 L383.2 191.3 L386.3 192.8 L389.4 194.1 L392.5 195.4 L395.5 195.3 L398.6 194.1 L401.7 193.1 L404.8 194.3 L407.9 195.3 L411.0 195.4 L414.1 196.2 L417.2 195.0 L420.3 193.4 L423.4 193.8 L426.5 195.1 L429.6 195.1 L432.7 196.7 L435.8 196.6 L438.9 197.1 L441.9 195.2 L445.0 196.6 L448.1 198.0 L451.2 197.6 L454.3 197.1 L457.4 197.3 L460.5 198.9 L463.6 197.9 L466.7 197.5 L469.8 199.4 L472.9 199.1 L476.0 199.1 L479.1 199.2 L482.2 198.7 L485.3 198.1 L488.3 198.5 L491.4 199.3 L494.5 199.3 L497.6 199.2 L500.7 196.9 L503.8 198.4 L506.9 200.0 L508.5 198.2"></path>
128
+ <circle class="vdot v-full" cx="508.5" cy="198.2" r="3.5"></circle>
129
+ <path class="vw v-noforce" d="M46.0 38.6 L47.5 36.8 L49.1 34.3 L50.6 32.6 L52.2 31.6 L53.7 30.7 L55.3 29.7 L56.8 28.9 L58.4 28.5 L59.9 28.1 L61.5 27.7 L63.0 27.4 L64.6 27.1 L66.1 26.9 L67.7 27.1 L69.2 27.0 L70.7 27.9 L72.3 28.7 L73.8 29.7 L75.4 30.8 L76.9 31.3 L78.5 32.5 L80.0 33.5 L81.6 34.5 L83.1 35.5 L84.7 36.7 L86.2 37.8 L87.8 38.9 L89.3 40.4 L90.9 41.5 L92.4 42.6 L93.9 44.0 L95.5 45.3 L97.0 46.5 L98.6 47.7 L100.1 49.2 L101.7 50.2 L103.2 51.2 L104.8 52.4 L106.3 53.9 L107.9 55.4 L109.4 56.9 L111.0 58.3 L112.5 59.7 L114.1 61.2 L115.6 62.7 L117.1 64.1 L118.7 65.6 L120.2 67.1 L121.8 68.5 L123.3 70.0 L124.9 71.4 L126.4 72.8 L128.0 74.3 L129.5 75.7 L131.1 77.1 L132.6 78.5 L134.2 79.8 L135.7 81.1 L137.3 82.5 L138.8 83.8 L140.3 85.0 L141.9 86.3 L143.4 87.7 L145.0 88.9 L146.5 90.4 L148.1 91.8 L149.6 93.1 L151.2 94.4 L152.7 95.7 L154.3 96.9 L155.8 98.1 L157.4 99.4 L158.9 100.7 L160.5 101.9 L162.0 103.2 L163.5 104.5 L165.1 105.8 L166.6 107.1 L168.2 108.3 L169.7 109.7 L171.3 110.8 L172.8 111.9 L174.4 113.1 L175.9 114.2 L177.5 115.2 L179.0 116.6 L180.6 117.7 L182.1 118.9 L183.7 120.0 L185.2 121.1 L186.7 122.1"></path>
130
+ <circle class="vdot v-noforce" cx="186.7" cy="122.1" r="3.5"></circle>
131
+ </svg></div>
132
+ <div><svg viewBox="0 0 520 230" role="img" aria-label="force flow MSE">
133
+ <text class="th" x="46" y="15">force flow MSE</text>
134
+ <line class="grid-cell" x1="46" y1="121.3" x2="510" y2="121.3"></line>
135
+ <text class="ts" x="40" y="124.3" text-anchor="end">1</text>
136
+ <line class="grid-cell" x1="46.0" y1="26" x2="46.0" y2="200"></line>
137
+ <text class="ts" x="46.0" y="214" text-anchor="middle">0k</text>
138
+ <line class="grid-cell" x1="200.7" y1="26" x2="200.7" y2="200"></line>
139
+ <text class="ts" x="200.7" y="214" text-anchor="middle">1k</text>
140
+ <line class="grid-cell" x1="355.3" y1="26" x2="355.3" y2="200"></line>
141
+ <text class="ts" x="355.3" y="214" text-anchor="middle">2k</text>
142
+ <line class="grid-cell" x1="510.0" y1="26" x2="510.0" y2="200"></line>
143
+ <text class="ts" x="510.0" y="214" text-anchor="middle">3k</text>
144
+ <text class="ts" x="510" y="224" text-anchor="end">step</text>
145
+ <path class="vw v-full" d="M46.0 26.0 L49.1 27.5 L52.2 30.1 L55.3 35.3 L58.4 40.6 L61.5 45.6 L64.6 49.5 L67.7 54.3 L70.7 56.4 L73.8 59.1 L76.9 62.4 L80.0 65.3 L83.1 68.7 L86.2 71.7 L89.3 75.3 L92.4 78.3 L95.5 81.6 L98.6 85.1 L101.7 88.0 L104.8 90.1 L107.9 92.1 L111.0 94.3 L114.1 96.1 L117.1 97.7 L120.2 99.4 L123.3 100.6 L126.4 101.7 L129.5 102.8 L132.6 104.1 L135.7 105.2 L138.8 106.3 L141.9 107.0 L145.0 107.3 L148.1 107.9 L151.2 108.6 L154.3 109.3 L157.4 109.9 L160.5 110.7 L163.5 111.0 L166.6 111.5 L169.7 111.9 L172.8 112.2 L175.9 112.6 L179.0 113.1 L182.1 113.3 L185.2 113.7 L188.3 114.0 L191.4 114.4 L194.5 114.8 L197.6 115.2 L200.7 115.3 L203.8 115.8 L206.9 116.2 L209.9 116.4 L213.0 116.8 L216.1 117.4 L219.2 117.7 L222.3 118.3 L225.4 118.8 L228.5 119.2 L231.6 119.7 L234.7 120.1 L237.8 120.5 L240.9 121.0 L244.0 122.0 L247.1 122.8 L250.2 123.7 L253.3 124.4 L256.3 125.0 L259.4 125.5 L262.5 126.3 L265.6 127.1 L268.7 127.9 L271.8 129.2 L274.9 130.2 L278.0 131.3 L281.1 132.4 L284.2 133.2 L287.3 134.4 L290.4 135.6 L293.5 136.4 L296.6 138.3 L299.7 139.9 L302.7 140.9 L305.8 142.6 L308.9 144.1 L312.0 146.0 L315.1 148.0 L318.2 149.5 L321.3 151.1 L324.4 152.5 L327.5 154.0 L330.6 155.4 L333.7 157.0 L336.8 158.9 L339.9 160.2 L343.0 161.9 L346.1 163.4 L349.1 164.9 L352.2 166.2 L355.3 167.4 L358.4 168.9 L361.5 170.1 L364.6 172.0 L367.7 173.8 L370.8 174.1 L373.9 175.5 L377.0 176.8 L380.1 178.5 L383.2 180.1 L386.3 181.4 L389.4 182.5 L392.5 183.9 L395.5 185.0 L398.6 185.3 L401.7 185.6 L404.8 186.6 L407.9 187.8 L411.0 189.4 L414.1 189.8 L417.2 190.6 L420.3 190.7 L423.4 191.0 L426.5 192.1 L429.6 193.1 L432.7 194.0 L435.8 195.4 L438.9 195.9 L441.9 196.9 L445.0 196.9 L448.1 197.5 L451.2 197.9 L454.3 197.3 L457.4 198.0 L460.5 198.5 L463.6 198.3 L466.7 198.4 L469.8 198.9 L472.9 199.1 L476.0 199.4 L479.1 199.7 L482.2 199.4 L485.3 199.1 L488.3 199.3 L491.4 199.5 L494.5 199.9 L497.6 200.0 L500.7 198.8 L503.8 199.1 L506.9 198.9 L508.5 199.2"></path>
146
+ <circle class="vdot v-full" cx="508.5" cy="199.2" r="3.5"></circle>
147
+ <path class="vw v-notrack" d="M46.0 29.6 L49.1 29.0 L52.2 31.0 L55.3 36.5 L58.4 41.7 L61.5 47.0 L64.6 51.2 L67.7 56.5 L70.7 59.3 L73.8 63.0 L76.9 66.9 L80.0 71.1 L83.1 75.5 L86.2 79.0 L89.3 82.7 L92.4 85.3 L95.5 87.8 L98.6 90.8 L101.7 93.0 L104.8 94.7 L107.9 96.2 L111.0 97.7 L114.1 99.0 L117.1 100.6 L120.2 102.0 L123.3 102.6 L126.4 103.7 L129.5 104.6 L132.6 105.5 L135.7 106.4 L138.8 107.5 L141.9 108.0 L145.0 108.4 L148.1 108.9 L151.2 109.2 L154.3 109.8 L157.4 110.2 L160.5 110.7 L163.5 110.6 L166.6 111.2 L169.7 111.2 L172.8 111.4 L175.9 111.5 L179.0 111.9 L182.1 112.1 L185.2 112.5 L188.3 112.8 L191.4 113.5 L194.5 113.6 L197.6 113.4 L200.7 113.8 L203.8 114.3 L206.9 114.6 L209.9 114.7 L213.0 115.2 L216.1 116.1 L219.2 116.3 L222.3 116.5 L225.4 116.7 L228.5 117.0 L231.6 117.6 L234.7 117.3 L237.8 117.7 L240.9 118.0 L244.0 118.5 L247.1 118.7 L250.2 119.2 L253.3 119.7 L256.3 119.9 L259.4 120.3 L262.5 120.8 L265.6 121.5 L268.7 122.0 L271.8 122.6 L274.9 122.6 L278.0 123.2 L281.1 124.1 L284.2 124.4 L287.3 124.8 L290.4 125.3 L293.5 125.6 L296.6 126.3 L299.7 127.0 L302.7 127.7 L305.8 128.3 L308.9 128.9 L312.0 129.3 L315.1 129.9 L318.2 130.8 L321.3 131.7 L324.4 132.5 L327.5 133.4 L330.6 134.1 L333.7 135.1 L336.8 136.2 L339.9 137.1 L343.0 138.0 L346.1 138.6 L349.1 139.9 L352.2 140.4 L355.3 141.7 L358.4 142.7 L361.5 143.0 L364.6 143.8 L367.7 144.9 L370.8 145.6 L373.9 146.6 L377.0 147.9 L380.1 149.3 L383.2 149.9 L386.3 151.2 L389.4 152.1 L392.5 152.6 L395.5 153.1 L398.6 153.6 L401.7 154.3 L404.8 155.5 L407.9 156.2 L411.0 156.8 L414.1 157.5 L417.2 158.1 L420.3 158.7 L423.4 159.4 L426.5 159.7 L429.6 161.0 L432.7 161.5 L435.8 161.5 L438.9 161.7 L441.9 162.3 L445.0 162.5 L448.1 163.3 L451.2 164.2 L454.3 164.4 L457.4 164.8 L460.5 164.9 L463.6 165.2 L466.7 166.3 L469.8 167.1 L472.9 167.1 L476.0 167.7 L479.1 167.7 L482.2 168.1 L485.3 167.6 L488.3 167.1 L491.4 167.0 L494.5 166.9 L497.6 167.1 L500.7 167.3 L503.8 167.3 L506.9 167.5 L508.5 167.7"></path>
148
+ <circle class="vdot v-notrack" cx="508.5" cy="167.7" r="3.5"></circle>
149
+ </svg></div>
150
+ </div>
151
+ <figcaption><b>Figure A1 &mdash; Same-step training loss convergence.</b>
152
+ Identical data, LoRA budget, seed, and 3,000 single-GPU steps for all four
153
+ variants; curves are EMA-smoothed (half-life 80 steps), log-scaled y.
154
+ Track loss exists only where track tokens exist; force loss only where the
155
+ force stage exists.</figcaption>
156
+ </figure>
157
+
158
+ <div class="tbl-wrap">
159
+ <table>
160
+ <thead><tr><th>Variant (mean loss, steps 2,800&ndash;3,000)</th><th>action</th>
161
+ <th>dynamics</th><th>track</th><th>force</th></tr></thead>
162
+ <tbody><tr><td><span class="chip"><span class="vs vs-full"></span>&nbsp;A · full (track+force)</span></td><td class="shape">0.2819</td><td class="shape">0.3325</td><td class="shape">0.1501</td><td class="shape">0.6187</td></tr>
163
+ <tr><td><span class="chip"><span class="vs vs-notrack"></span>&nbsp;B · no track</span></td><td class="shape">0.2749</td><td class="shape">0.2837</td><td class="shape">&mdash;</td><td class="shape">0.7535</td></tr>
164
+ <tr><td><span class="chip"><span class="vs vs-noforce"></span>&nbsp;C · no force stage</span></td><td class="shape">&mdash;</td><td class="shape">&mdash;</td><td class="shape">&mdash;</td><td class="shape">&mdash;</td></tr></tbody>
165
+ </table>
166
+ </div>
167
+ <h3>Controlled evaluation on frozen checkpoints</h3>
168
+ <div class="prose"><p>All numbers below come from the same fixed
169
+ anchor sets, noise seeds, and prompts for every variant
170
+ (<code>scripts/eval/trex_ablation_eval.py</code>). Open-loop: each variant
171
+ runs its own full sampling loop from pure noise on 16 anchors and is scored
172
+ against the ground-truth normalized delta-base chunk.</p></div>
173
+ <figure><svg viewBox="0 0 560 138" role="img" aria-label="open-loop action MSE ↓ (16 anchors, normalized 62-D)">
174
+ <text class="th" x="0" y="14">open-loop action MSE ↓ (16 anchors, normalized 62-D)</text>
175
+ <text class="t" x="232" y="39" text-anchor="end">A · cascade (+force stage)</text>
176
+ <rect class="v-full" x="240" y="26" width="133.1" height="16" rx="3"></rect>
177
+ <text class="ts" x="379.1" y="39">0.205</text>
178
+ <text class="t" x="232" y="67" text-anchor="end">A · coarse only</text>
179
+ <rect class="v-full vfaded" x="240" y="54" width="250.0" height="16" rx="3"></rect>
180
+ <text class="ts" x="496.0" y="67">0.386</text>
181
+ <text class="t" x="232" y="95" text-anchor="end">B · cascade (+force stage)</text>
182
+ <rect class="v-notrack" x="240" y="82" width="149.0" height="16" rx="3"></rect>
183
+ <text class="ts" x="395.0" y="95">0.230</text>
184
+ <text class="t" x="232" y="123" text-anchor="end">B · coarse only</text>
185
+ <rect class="v-notrack vfaded" x="240" y="110" width="248.4" height="16" rx="3"></rect>
186
+ <text class="ts" x="494.4" y="123">0.383</text>
187
+ </svg><figcaption><b>Figure A2 &mdash; Open-loop reconstruction.</b> Faded bars: the coarse action read out at &tau;=0 without tactile refinement (for C this is its only mode). Solid bars: the full cascade.</figcaption></figure>
188
+
189
+ <div class="tbl-wrap">
190
+ <table>
191
+ <thead><tr><th>flow MSE @ fixed &tau;</th><th>&tau;=0.8</th><th>&tau;=0.6</th><th>&tau;=0.4</th><th>&tau;=0.2</th><th>&tau;=0.05</th></tr></thead>
192
+ <tbody><tr><td><span class="chip"><span class="vs vs-full"></span>&nbsp;A &middot; action</span></td><td class="shape">0.139</td><td class="shape">0.204</td><td class="shape">0.399</td><td class="shape">0.752</td><td class="shape">1.076</td></tr><tr><td><span class="chip"><span class="vs vs-notrack"></span>&nbsp;B &middot; action</span></td><td class="shape">0.124</td><td class="shape">0.191</td><td class="shape">0.388</td><td class="shape">0.745</td><td class="shape">1.078</td></tr><tr><td><span class="chip"><span class="vs vs-full"></span>&nbsp;A &middot; dynamics</span></td><td class="shape">0.215</td><td class="shape">0.280</td><td class="shape">0.414</td><td class="shape">0.724</td><td class="shape">1.131</td></tr><tr><td><span class="chip"><span class="vs vs-notrack"></span>&nbsp;B &middot; dynamics</span></td><td class="shape">0.178</td><td class="shape">0.229</td><td class="shape">0.341</td><td class="shape">0.628</td><td class="shape">1.064</td></tr></tbody>
193
+ </table>
194
+ </div>
195
+ <figure><svg viewBox="0 0 640 146" role="img" aria-label="Stage-1: where action queries attend (mass share)">
196
+ <text class="th" x="0" y="14">Stage-1: where action queries attend (mass share)</text>
197
+ <text class="t" x="102" y="39" text-anchor="end">A · layer 0</text>
198
+ <rect class="sg-cond" x="110.0" y="26" width="12.6" height="18" rx="3"></rect>
199
+ <rect class="sg-obs" x="124.6" y="26" width="53.4" height="18" rx="3"></rect>
200
+ <text class="ts" x="152.3" y="39" text-anchor="middle">11%</text>
201
+ <rect class="sg-act" x="180.0" y="26" width="29.9" height="18" rx="3"></rect>
202
+ <rect class="sg-st" x="211.9" y="26" width="0.5" height="18" rx="3"></rect>
203
+ <rect class="sg-trkp" x="212.7" y="26" width="233.6" height="18" rx="3"></rect>
204
+ <text class="ts" x="330.5" y="39" text-anchor="middle">45%</text>
205
+ <rect class="sg-trkf" x="448.3" y="26" width="177.7" height="18" rx="3"></rect>
206
+ <text class="ts" x="538.2" y="39" text-anchor="middle">35%</text>
207
+ <text class="t" x="102" y="67" text-anchor="end">A · layer 29</text>
208
+ <rect class="sg-cond" x="110.0" y="54" width="25.6" height="18" rx="3"></rect>
209
+ <rect class="sg-obs" x="137.6" y="54" width="49.5" height="18" rx="3"></rect>
210
+ <text class="ts" x="163.4" y="67" text-anchor="middle">10%</text>
211
+ <rect class="sg-act" x="189.1" y="54" width="95.2" height="18" rx="3"></rect>
212
+ <text class="ts" x="237.7" y="67" text-anchor="middle">19%</text>
213
+ <rect class="sg-st" x="286.3" y="54" width="0.5" height="18" rx="3"></rect>
214
+ <rect class="sg-trkp" x="287.6" y="54" width="296.0" height="18" rx="3"></rect>
215
+ <text class="ts" x="436.6" y="67" text-anchor="middle">58%</text>
216
+ <rect class="sg-trkf" x="585.6" y="54" width="40.4" height="18" rx="3"></rect>
217
+ <text class="ts" x="606.8" y="67" text-anchor="middle">8%</text>
218
+ <text class="t" x="102" y="95" text-anchor="end">B · layer 0</text>
219
+ <rect class="sg-cond" x="110.0" y="82" width="106.6" height="18" rx="3"></rect>
220
+ <text class="ts" x="164.3" y="95" text-anchor="middle">21%</text>
221
+ <rect class="sg-obs" x="218.6" y="82" width="260.7" height="18" rx="3"></rect>
222
+ <text class="ts" x="349.9" y="95" text-anchor="middle">51%</text>
223
+ <rect class="sg-act" x="481.3" y="82" width="138.5" height="18" rx="3"></rect>
224
+ <text class="ts" x="551.5" y="95" text-anchor="middle">27%</text>
225
+ <rect class="sg-st" x="621.8" y="82" width="4.2" height="18" rx="3"></rect>
226
+ <text class="t" x="102" y="123" text-anchor="end">B · layer 29</text>
227
+ <rect class="sg-cond" x="110.0" y="110" width="51.4" height="18" rx="3"></rect>
228
+ <text class="ts" x="136.7" y="123" text-anchor="middle">10%</text>
229
+ <rect class="sg-obs" x="163.4" y="110" width="124.6" height="18" rx="3"></rect>
230
+ <text class="ts" x="226.7" y="123" text-anchor="middle">24%</text>
231
+ <rect class="sg-act" x="290.0" y="110" width="331.7" height="18" rx="3"></rect>
232
+ <text class="ts" x="456.9" y="123" text-anchor="middle">64%</text>
233
+ <rect class="sg-st" x="623.7" y="110" width="2.3" height="18" rx="3"></rect>
234
+ </svg><figcaption><b>Figure A3 &mdash; Stage-1 attention routing.</b> Share of self-attention mass from action queries onto each token group at &tau;=0.4 (mean over heads/blocks).</figcaption></figure>
235
+ <figure><svg viewBox="0 0 640 90" role="img" aria-label="Stage-2: where action queries attend (mass share)">
236
+ <text class="th" x="0" y="14">Stage-2: where action queries attend (mass share)</text>
237
+ <text class="t" x="102" y="39" text-anchor="end">A · L0–L5 mean</text>
238
+ <rect class="sg-act" x="110.0" y="26" width="12.3" height="18" rx="3"></rect>
239
+ <rect class="sg-f6" x="124.3" y="26" width="6.9" height="18" rx="3"></rect>
240
+ <rect class="sg-vq" x="133.2" y="26" width="8.4" height="18" rx="3"></rect>
241
+ <rect class="sg-mem" x="143.6" y="26" width="482.4" height="18" rx="3"></rect>
242
+ <text class="ts" x="385.8" y="39" text-anchor="middle">94%</text>
243
+ <text class="t" x="102" y="67" text-anchor="end">B · L0–L5 mean</text>
244
+ <rect class="sg-act" x="110.0" y="54" width="105.4" height="18" rx="3"></rect>
245
+ <text class="ts" x="163.7" y="67" text-anchor="middle">21%</text>
246
+ <rect class="sg-f6" x="217.4" y="54" width="49.2" height="18" rx="3"></rect>
247
+ <text class="ts" x="243.0" y="67" text-anchor="middle">10%</text>
248
+ <rect class="sg-vq" x="268.6" y="54" width="51.1" height="18" rx="3"></rect>
249
+ <text class="ts" x="295.1" y="67" text-anchor="middle">10%</text>
250
+ <rect class="sg-mem" x="321.7" y="54" width="304.3" height="18" rx="3"></rect>
251
+ <text class="ts" x="474.8" y="67" text-anchor="middle">59%</text>
252
+ </svg><figcaption><b>Figure A4 &mdash; Stage-2 attention routing.</b> Action-query mass over F6 / VQ-history / deform / coarse-memory tokens during real cascaded refinement.</figcaption></figure>
253
+
254
+ <div class="tbl-wrap">
255
+ <table>
256
+ <thead><tr><th>Tactile sensitivity (normalized units)</th>
257
+ <th>mean |&Delta;a| tactile vs masked</th><th>max |&Delta;a|</th>
258
+ <th>mean |refinement|</th></tr></thead>
259
+ <tbody><tr><td><span class="chip"><span class="vs vs-full"></span>&nbsp;A · full (track+force)</span></td><td class="shape">0.0141</td><td class="shape">0.0664</td><td class="shape">0.2452</td></tr><tr><td><span class="chip"><span class="vs vs-notrack"></span>&nbsp;B · no track</span></td><td class="shape">0.0256</td><td class="shape">0.1309</td><td class="shape">0.2472</td></tr></tbody>
260
+ </table>
261
+ </div>
262
+
263
+ </section>
ablation_runs/eval_part1.json ADDED
@@ -0,0 +1,432 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "full": {
3
+ "checkpoint": "checkpoints/ablate_full_3k/checkpoint-3000",
4
+ "use_track": true,
5
+ "use_force": true,
6
+ "use_deform_tactile": false,
7
+ "forward_tau_losses": {
8
+ "0.8": {
9
+ "action_loss": [
10
+ 0.13885498046875,
11
+ 0.021893762307867347
12
+ ],
13
+ "dynamics_loss": [
14
+ 0.214599609375,
15
+ 0.028883325232585192
16
+ ],
17
+ "track_flow_loss": [
18
+ 0.01959228515625,
19
+ 0.005815500664137739
20
+ ],
21
+ "force_loss": [
22
+ 0.6427408854166666,
23
+ 0.07174448889029805
24
+ ]
25
+ },
26
+ "0.6": {
27
+ "action_loss": [
28
+ 0.20402018229166666,
29
+ 0.027474107787100906
30
+ ],
31
+ "dynamics_loss": [
32
+ 0.2801106770833333,
33
+ 0.02749254221890766
34
+ ],
35
+ "track_flow_loss": [
36
+ 0.025583902994791668,
37
+ 0.009258714454018649
38
+ ],
39
+ "force_loss": [
40
+ 0.6427408854166666,
41
+ 0.07174448889029805
42
+ ]
43
+ },
44
+ "0.4": {
45
+ "action_loss": [
46
+ 0.3986002604166667,
47
+ 0.0390743661447396
48
+ ],
49
+ "dynamics_loss": [
50
+ 0.4138997395833333,
51
+ 0.025458871788911118
52
+ ],
53
+ "track_flow_loss": [
54
+ 0.051778157552083336,
55
+ 0.017947368985419505
56
+ ],
57
+ "force_loss": [
58
+ 0.6427408854166666,
59
+ 0.07174448889029805
60
+ ]
61
+ },
62
+ "0.2": {
63
+ "action_loss": [
64
+ 0.7521158854166666,
65
+ 0.048475014437045466
66
+ ],
67
+ "dynamics_loss": [
68
+ 0.7236328125,
69
+ 0.020585171554378095
70
+ ],
71
+ "track_flow_loss": [
72
+ 0.270751953125,
73
+ 0.02853870589963502
74
+ ],
75
+ "force_loss": [
76
+ 0.6427408854166666,
77
+ 0.07174448889029805
78
+ ]
79
+ },
80
+ "0.05": {
81
+ "action_loss": [
82
+ 1.0758463541666667,
83
+ 0.05334471104376999
84
+ ],
85
+ "dynamics_loss": [
86
+ 1.1305338541666667,
87
+ 0.01504103522415094
88
+ ],
89
+ "track_flow_loss": [
90
+ 0.912109375,
91
+ 0.026373214974647258
92
+ ],
93
+ "force_loss": [
94
+ 0.6427408854166666,
95
+ 0.07174448889029805
96
+ ]
97
+ }
98
+ },
99
+ "openloop_action_mse": {
100
+ "cascade": [
101
+ 0.20543859526515007,
102
+ 0.10553651615425272,
103
+ 16
104
+ ],
105
+ "coarse_only": [
106
+ 0.3859300408512354,
107
+ 0.09367721956997326,
108
+ 16
109
+ ]
110
+ },
111
+ "openloop_action_mse_split": {
112
+ "cascade_arm": 0.29095884039998055,
113
+ "cascade_hand": 0.1704530455172062,
114
+ "coarse_arm": 0.42187667451798916,
115
+ "coarse_hand": 0.3712246026843786
116
+ },
117
+ "stage1_attention": {
118
+ "0": {
119
+ "action": {
120
+ "cond_obs": 0.028233155608177185,
121
+ "obs": 0.10685919225215912,
122
+ "action": 0.06159074231982231,
123
+ "state": 0.001643829746171832,
124
+ "track_past": 0.4548226296901703,
125
+ "track_future": 0.3468504846096039
126
+ },
127
+ "obs": {
128
+ "cond_obs": 0.053328514099121094,
129
+ "obs": 0.5826746821403503,
130
+ "action": 0.009129117242991924,
131
+ "state": 0.0005130452918820083,
132
+ "track_past": 0.1784334033727646,
133
+ "track_future": 0.1759212762117386
134
+ }
135
+ },
136
+ "14": {
137
+ "action": {
138
+ "cond_obs": 0.04729510098695755,
139
+ "obs": 0.08689284324645996,
140
+ "action": 0.20308324694633484,
141
+ "state": 0.0032673801761120558,
142
+ "track_past": 0.6379822492599487,
143
+ "track_future": 0.021479224786162376
144
+ },
145
+ "obs": {
146
+ "cond_obs": 0.16180963814258575,
147
+ "obs": 0.6352365016937256,
148
+ "action": 0.013975701294839382,
149
+ "state": 0.006121945567429066,
150
+ "track_past": 0.167484849691391,
151
+ "track_future": 0.015371335670351982
152
+ }
153
+ },
154
+ "29": {
155
+ "action": {
156
+ "cond_obs": 0.05335542559623718,
157
+ "obs": 0.09940896928310394,
158
+ "action": 0.18759986758232117,
159
+ "state": 0.0025236550718545914,
160
+ "track_past": 0.5753425359725952,
161
+ "track_future": 0.08176963031291962
162
+ },
163
+ "obs": {
164
+ "cond_obs": 0.09543927758932114,
165
+ "obs": 0.7705966234207153,
166
+ "action": 0.01101355254650116,
167
+ "state": 0.0004360256134532392,
168
+ "track_past": 0.07644421607255936,
169
+ "track_future": 0.046070314943790436
170
+ }
171
+ }
172
+ },
173
+ "stage2_attention": [
174
+ {
175
+ "action": 0.033935546875,
176
+ "f6": 0.0230712890625,
177
+ "vq": 0.024169921875,
178
+ "memory": 0.91796875
179
+ },
180
+ {
181
+ "action": 0.0322265625,
182
+ "f6": 0.0208740234375,
183
+ "vq": 0.023681640625,
184
+ "memory": 0.921875
185
+ },
186
+ {
187
+ "action": 0.0274658203125,
188
+ "f6": 0.01708984375,
189
+ "vq": 0.0203857421875,
190
+ "memory": 0.93359375
191
+ },
192
+ {
193
+ "action": 0.0250244140625,
194
+ "f6": 0.01513671875,
195
+ "vq": 0.0185546875,
196
+ "memory": 0.94140625
197
+ },
198
+ {
199
+ "action": 0.024169921875,
200
+ "f6": 0.01416015625,
201
+ "vq": 0.017333984375,
202
+ "memory": 0.9453125
203
+ },
204
+ {
205
+ "action": 0.0228271484375,
206
+ "f6": 0.0130615234375,
207
+ "vq": 0.0157470703125,
208
+ "memory": 0.94921875
209
+ }
210
+ ],
211
+ "tactile_sensitivity": {
212
+ "mean_abs_delta_vs_masked": 0.014084354043006897,
213
+ "max_abs_delta_vs_masked": 0.06640625,
214
+ "mean_abs_refinement": 0.2452070713043213
215
+ }
216
+ },
217
+ "notrack": {
218
+ "checkpoint": "checkpoints/ablate_notrack_3k/checkpoint-3000",
219
+ "use_track": false,
220
+ "use_force": true,
221
+ "use_deform_tactile": false,
222
+ "forward_tau_losses": {
223
+ "0.8": {
224
+ "action_loss": [
225
+ 0.12394205729166667,
226
+ 0.02089633950925863
227
+ ],
228
+ "dynamics_loss": [
229
+ 0.178466796875,
230
+ 0.028673447679287072
231
+ ],
232
+ "track_flow_loss": [
233
+ 0.0,
234
+ 0.0
235
+ ],
236
+ "force_loss": [
237
+ 0.7783203125,
238
+ 0.043793139306208324
239
+ ]
240
+ },
241
+ "0.6": {
242
+ "action_loss": [
243
+ 0.19099934895833334,
244
+ 0.028310372080589903
245
+ ],
246
+ "dynamics_loss": [
247
+ 0.22908528645833334,
248
+ 0.028607776677988368
249
+ ],
250
+ "track_flow_loss": [
251
+ 0.0,
252
+ 0.0
253
+ ],
254
+ "force_loss": [
255
+ 0.7783203125,
256
+ 0.043793139306208324
257
+ ]
258
+ },
259
+ "0.4": {
260
+ "action_loss": [
261
+ 0.3876953125,
262
+ 0.035242046640337726
263
+ ],
264
+ "dynamics_loss": [
265
+ 0.3413899739583333,
266
+ 0.029684818436720592
267
+ ],
268
+ "track_flow_loss": [
269
+ 0.0,
270
+ 0.0
271
+ ],
272
+ "force_loss": [
273
+ 0.7783203125,
274
+ 0.043793139306208324
275
+ ]
276
+ },
277
+ "0.2": {
278
+ "action_loss": [
279
+ 0.7447916666666666,
280
+ 0.0426817276121973
281
+ ],
282
+ "dynamics_loss": [
283
+ 0.6276041666666666,
284
+ 0.024927330363381052
285
+ ],
286
+ "track_flow_loss": [
287
+ 0.0,
288
+ 0.0
289
+ ],
290
+ "force_loss": [
291
+ 0.7783203125,
292
+ 0.043793139306208324
293
+ ]
294
+ },
295
+ "0.05": {
296
+ "action_loss": [
297
+ 1.0777994791666667,
298
+ 0.054336633312902415
299
+ ],
300
+ "dynamics_loss": [
301
+ 1.0641276041666667,
302
+ 0.01625975747883096
303
+ ],
304
+ "track_flow_loss": [
305
+ 0.0,
306
+ 0.0
307
+ ],
308
+ "force_loss": [
309
+ 0.7783203125,
310
+ 0.043793139306208324
311
+ ]
312
+ }
313
+ },
314
+ "openloop_action_mse": {
315
+ "cascade": [
316
+ 0.22997993603348732,
317
+ 0.1032914996028219,
318
+ 16
319
+ ],
320
+ "coarse_only": [
321
+ 0.38339873775839806,
322
+ 0.09786209841435693,
323
+ 16
324
+ ]
325
+ },
326
+ "openloop_action_mse_split": {
327
+ "cascade_arm": 0.29843927826732397,
328
+ "cascade_hand": 0.2019738396629691,
329
+ "coarse_arm": 0.4064813628792763,
330
+ "coarse_hand": 0.373955849558115
331
+ },
332
+ "stage1_attention": {
333
+ "0": {
334
+ "action": {
335
+ "cond_obs": 0.20962195098400116,
336
+ "obs": 0.507138729095459,
337
+ "action": 0.27125489711761475,
338
+ "state": 0.011984430253505707,
339
+ "track_past": 0.0,
340
+ "track_future": 0.0
341
+ },
342
+ "obs": {
343
+ "cond_obs": 0.16306498646736145,
344
+ "obs": 0.7571282386779785,
345
+ "action": 0.07827480137348175,
346
+ "state": 0.001532059395685792,
347
+ "track_past": 0.0,
348
+ "track_future": 0.0
349
+ }
350
+ },
351
+ "14": {
352
+ "action": {
353
+ "cond_obs": 0.09229698032140732,
354
+ "obs": 0.18946343660354614,
355
+ "action": 0.6833343505859375,
356
+ "state": 0.03490526229143143,
357
+ "track_past": 0.0,
358
+ "track_future": 0.0
359
+ },
360
+ "obs": {
361
+ "cond_obs": 0.26676031947135925,
362
+ "obs": 0.6440349221229553,
363
+ "action": 0.054011691361665726,
364
+ "state": 0.03519308567047119,
365
+ "track_past": 0.0,
366
+ "track_future": 0.0
367
+ }
368
+ },
369
+ "29": {
370
+ "action": {
371
+ "cond_obs": 0.10308176279067993,
372
+ "obs": 0.24439243972301483,
373
+ "action": 0.6442670822143555,
374
+ "state": 0.008258762769401073,
375
+ "track_past": 0.0,
376
+ "track_future": 0.0
377
+ },
378
+ "obs": {
379
+ "cond_obs": 0.15114127099514008,
380
+ "obs": 0.8275548219680786,
381
+ "action": 0.019980238750576973,
382
+ "state": 0.0013237263774499297,
383
+ "track_past": 0.0,
384
+ "track_future": 0.0
385
+ }
386
+ }
387
+ },
388
+ "stage2_attention": [
389
+ {
390
+ "action": 0.1103515625,
391
+ "f6": 0.0625,
392
+ "vq": 0.06640625,
393
+ "memory": 0.76171875
394
+ },
395
+ {
396
+ "action": 0.1904296875,
397
+ "f6": 0.09814453125,
398
+ "vq": 0.0966796875,
399
+ "memory": 0.61328125
400
+ },
401
+ {
402
+ "action": 0.3359375,
403
+ "f6": 0.146484375,
404
+ "vq": 0.1513671875,
405
+ "memory": 0.365234375
406
+ },
407
+ {
408
+ "action": 0.283203125,
409
+ "f6": 0.12353515625,
410
+ "vq": 0.1259765625,
411
+ "memory": 0.466796875
412
+ },
413
+ {
414
+ "action": 0.193359375,
415
+ "f6": 0.08984375,
416
+ "vq": 0.09716796875,
417
+ "memory": 0.62109375
418
+ },
419
+ {
420
+ "action": 0.1298828125,
421
+ "f6": 0.072265625,
422
+ "vq": 0.0771484375,
423
+ "memory": 0.71875
424
+ }
425
+ ],
426
+ "tactile_sensitivity": {
427
+ "mean_abs_delta_vs_masked": 0.025584066286683083,
428
+ "max_abs_delta_vs_masked": 0.130859375,
429
+ "mean_abs_refinement": 0.24716320633888245
430
+ }
431
+ }
432
+ }
ablation_runs/tools/make_ablation_section.py ADDED
@@ -0,0 +1,332 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Assemble the ablation section HTML for the Track-Force Cascade artifact."""
2
+ import json
3
+ import sys
4
+ from pathlib import Path
5
+
6
+ TOOLS = Path(__file__).parent
7
+ sys.path.insert(0, str(TOOLS))
8
+ from chartlib import line_chart, stacked_hbar, hbar, VARIANTS, VAR_LABEL # noqa: E402
9
+ from loss_series import series_for, load_components # noqa: E402
10
+
11
+ RUNS = {v: f"/scratch1/home/zhicao/dreamzero/checkpoints/ablate_{v}_3k/loss_log.jsonl"
12
+ for v in VARIANTS}
13
+
14
+ EXTRA_CSS = """
15
+ /* ---- ablation additions ---- */
16
+ :root {
17
+ --v-full: #3c7ec0;
18
+ --v-notrack: #c26a1e;
19
+ --v-noforce: #6f66bd;
20
+ --v-deform: #b54e7f;
21
+ }
22
+ @media (prefers-color-scheme: dark) {
23
+ :root:not([data-theme="light"]) {
24
+ --v-full: #5895d1;
25
+ --v-notrack: #c98136;
26
+ --v-noforce: #8d7fd6;
27
+ --v-deform: #d76a94;
28
+ }
29
+ }
30
+ :root[data-theme="dark"] {
31
+ --v-full: #5895d1;
32
+ --v-notrack: #c98136;
33
+ --v-noforce: #8d7fd6;
34
+ --v-deform: #d76a94;
35
+ }
36
+ .vw { fill: none; stroke-width: 2; stroke-linejoin: round; stroke-linecap: round; }
37
+ .vdot { stroke: var(--surface); stroke-width: 2; }
38
+ .vw.v-full { stroke: var(--v-full); }
39
+ .vw.v-notrack { stroke: var(--v-notrack); }
40
+ .vw.v-noforce { stroke: var(--v-noforce); }
41
+ .vw.v-deform { stroke: var(--v-deform); }
42
+ .vdot.v-full, rect.v-full { fill: var(--v-full); }
43
+ .vdot.v-notrack, rect.v-notrack { fill: var(--v-notrack); }
44
+ .vdot.v-noforce, rect.v-noforce { fill: var(--v-noforce); }
45
+ .vdot.v-deform, rect.v-deform { fill: var(--v-deform); }
46
+ .vfaded { opacity: 0.45; }
47
+ .vs { display: inline-block; width: 13px; height: 3px; border-radius: 2px; }
48
+ .vs-full { background: var(--v-full); }
49
+ .vs-notrack { background: var(--v-notrack); }
50
+ .vs-noforce { background: var(--v-noforce); }
51
+ .vs-deform { background: var(--v-deform); }
52
+ .sg-cond { fill: var(--c-obs); opacity: 0.45; }
53
+ .sg-obs { fill: var(--c-obs); }
54
+ .sg-act { fill: var(--c-act); }
55
+ .sg-st { fill: var(--c-st); }
56
+ .sg-trkp { fill: var(--c-trk); }
57
+ .sg-trkf { fill: var(--c-trk); opacity: 0.45; }
58
+ .sg-f6 { fill: var(--c-frc); }
59
+ .sg-vq { fill: var(--c-frc); opacity: 0.45; }
60
+ .sg-deform { fill: var(--c-frc); opacity: 0.7; }
61
+ .sg-mem { fill: var(--c-mem); }
62
+ .sw-solid-trk { background: var(--c-trk); border-color: var(--c-trk); }
63
+ .quad { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; }
64
+ @media (max-width: 900px) { .quad { grid-template-columns: 1fr; } }
65
+ """
66
+
67
+ STAGE1_GROUPS = ["cond_obs", "obs", "action", "state", "track_past", "track_future"]
68
+ STAGE1_CLASS = {"cond_obs": "sg-cond", "obs": "sg-obs", "action": "sg-act",
69
+ "state": "sg-st", "track_past": "sg-trkp", "track_future": "sg-trkf"}
70
+ STAGE2_GROUPS = ["action", "f6", "vq", "deform", "memory"]
71
+ STAGE2_CLASS = {"action": "sg-act", "f6": "sg-f6", "vq": "sg-vq",
72
+ "deform": "sg-deform", "memory": "sg-mem"}
73
+ SHORT = {"full": "A", "notrack": "B", "noforce": "C", "deform": "D"}
74
+
75
+ VARIANT_LEGEND = """
76
+ <div class="legend" role="list" aria-label="Ablation variant legend">
77
+ <span class="k" role="listitem"><span class="vs vs-full"></span>A &middot; full (track + force)</span>
78
+ <span class="k" role="listitem"><span class="vs vs-notrack"></span>B &middot; no track (pre-track structure)</span>
79
+ <span class="k" role="listitem"><span class="vs vs-noforce"></span>C &middot; no force stage</span>
80
+ <span class="k" role="listitem"><span class="vs vs-deform"></span>D &middot; deform tactile + force</span>
81
+ </div>
82
+ """
83
+
84
+ PROTOCOL_PROSE = """
85
+ <div class="prose">
86
+ <p>Four variants of the cascade are trained from the same Wan2.2 foundation
87
+ weights on the <code>trex_mini_force</code> episode &mdash; identical anchors,
88
+ LoRA budget (r=4 on q,k,v,o,k_img,v_img,ffn), learning rate, batch size,
89
+ seed, and 3,000 single-GPU steps &mdash; so every difference below is
90
+ attributable to the ablated component, not to training budget.
91
+ <b>B</b> removes the track pathway structurally (no track tokens, encoder,
92
+ decoder, or loss): the packed block shrinks from 617 to 117 tokens &mdash;
93
+ exactly the pre-track architecture with the force stage kept. <b>C</b>
94
+ removes the force stage (no Stage-2 transformer, no tactile input, no
95
+ force/VQ loss); at inference its coarse model carries the flow all the way
96
+ to &tau;=0. <b>D</b> keeps the full model and adds ten per-finger
97
+ deformation-camera tokens (96&times;96 crops &rarr; 4-layer CNN &rarr; d 768)
98
+ beside the F6 and VQ-history tokens in Stage 2.</p>
99
+ </div>"""
100
+
101
+ VARIANT_TABLE = """
102
+ <div class="tbl-wrap">
103
+ <table>
104
+ <thead><tr><th>Variant</th><th>Stage-1 tokens / block</th>
105
+ <th>Stage-2 tokens</th><th>Losses optimized</th></tr></thead>
106
+ <tbody>
107
+ <tr><td><span class="chip"><span class="vs vs-full"></span>&nbsp;A &middot; full</span></td>
108
+ <td class="shape">100 obs + 16 act + 1 st + 500 trk = 617</td>
109
+ <td class="shape">16 act + 10 F6 + 10 VQ + mem</td>
110
+ <td>dynamics &middot; action &middot; 20&middot;track &middot; force &middot; VQ</td></tr>
111
+ <tr><td><span class="chip"><span class="vs vs-notrack"></span>&nbsp;B &middot; no track</span></td>
112
+ <td class="shape">100 obs + 16 act + 1 st = 117</td>
113
+ <td class="shape">16 act + 10 F6 + 10 VQ + mem</td>
114
+ <td>dynamics &middot; action &middot; force &middot; VQ</td></tr>
115
+ <tr><td><span class="chip"><span class="vs vs-noforce"></span>&nbsp;C &middot; no force</span></td>
116
+ <td class="shape">617</td>
117
+ <td class="shape">&mdash; (coarse runs &tau;&rarr;0)</td>
118
+ <td>dynamics &middot; action &middot; 20&middot;track</td></tr>
119
+ <tr><td><span class="chip"><span class="vs vs-deform"></span>&nbsp;D &middot; deform + force</span></td>
120
+ <td class="shape">617</td>
121
+ <td class="shape">16 act + 10 F6 + 10 VQ + <b>10 deform</b> + mem</td>
122
+ <td>dynamics &middot; action &middot; 20&middot;track &middot; force &middot; VQ</td></tr>
123
+ </tbody>
124
+ </table>
125
+ </div>"""
126
+
127
+
128
+ def loss_figure():
129
+ charts = {}
130
+ for variant, path in RUNS.items():
131
+ if Path(path).exists():
132
+ charts[variant] = series_for(
133
+ path, ["action_loss", "dynamics_loss", "track_loss", "force_loss"]
134
+ )
135
+ panels = []
136
+ for component, title in (
137
+ ("action_loss", "action flow MSE"),
138
+ ("dynamics_loss", "dynamics (video flow) MSE"),
139
+ ("track_loss", "track loss (weighted sum)"),
140
+ ("force_loss", "force flow MSE"),
141
+ ):
142
+ series = {
143
+ v: charts[v][component]
144
+ for v in VARIANTS
145
+ if v in charts and component in charts[v]
146
+ and max(x[1] for x in charts[v][component]) > 1e-8
147
+ }
148
+ if series:
149
+ panels.append(line_chart(series, title=title, width=520, height=230))
150
+ grid = "\n".join(f"<div>{p}</div>" for p in panels)
151
+ return f"""
152
+ <figure>
153
+ <div class="quad">
154
+ {grid}
155
+ </div>
156
+ <figcaption><b>Figure A1 &mdash; Same-step training loss convergence.</b>
157
+ Identical data, LoRA budget, seed, and 3,000 single-GPU steps for all four
158
+ variants; curves are EMA-smoothed (half-life 80 steps), log-scaled y.
159
+ Track loss exists only where track tokens exist; force loss only where the
160
+ force stage exists.</figcaption>
161
+ </figure>"""
162
+
163
+
164
+ def final_loss_table(last_n=200):
165
+ rows = []
166
+ for variant in VARIANTS:
167
+ path = RUNS[variant]
168
+ if not Path(path).exists():
169
+ continue
170
+ raw = load_components(path)
171
+ cells = {}
172
+ for component in ("action_loss", "dynamics_loss", "track_loss", "force_loss"):
173
+ pts = raw.get(component, [])
174
+ tail = [v for s, v in pts if s >= 3000 - last_n]
175
+ cells[component] = (sum(tail) / len(tail)) if tail else None
176
+ rows.append((variant, cells))
177
+
178
+ def fmt(v):
179
+ return "&mdash;" if v is None or v < 1e-9 else f"{v:.4f}"
180
+
181
+ body = "\n".join(
182
+ f'<tr><td><span class="chip"><span class="vs vs-{v}"></span>&nbsp;{VAR_LABEL[v]}</span></td>'
183
+ + "".join(
184
+ f'<td class="shape">{fmt(c[k])}</td>'
185
+ for k in ("action_loss", "dynamics_loss", "track_loss", "force_loss")
186
+ )
187
+ + "</tr>"
188
+ for v, c in rows
189
+ )
190
+ return f"""
191
+ <div class="tbl-wrap">
192
+ <table>
193
+ <thead><tr><th>Variant (mean loss, steps 2,800&ndash;3,000)</th><th>action</th>
194
+ <th>dynamics</th><th>track</th><th>force</th></tr></thead>
195
+ <tbody>{body}</tbody>
196
+ </table>
197
+ </div>"""
198
+
199
+
200
+ def tau_table(eval_data):
201
+ taus = ["0.8", "0.6", "0.4", "0.2", "0.05"]
202
+ head = "".join(f"<th>&tau;={t}</th>" for t in taus)
203
+ body_rows = []
204
+ for metric, label in (("action_loss", "action"), ("dynamics_loss", "dynamics")):
205
+ for variant in VARIANTS:
206
+ r = eval_data.get(variant)
207
+ if not r:
208
+ continue
209
+ cells = "".join(
210
+ f'<td class="shape">{r["forward_tau_losses"][t][metric][0]:.3f}</td>'
211
+ for t in taus
212
+ )
213
+ body_rows.append(
214
+ f'<tr><td><span class="chip"><span class="vs vs-{variant}"></span>'
215
+ f"&nbsp;{SHORT[variant]} &middot; {label}</span></td>{cells}</tr>"
216
+ )
217
+ return f"""
218
+ <div class="tbl-wrap">
219
+ <table>
220
+ <thead><tr><th>flow MSE @ fixed &tau;</th>{head}</tr></thead>
221
+ <tbody>{"".join(body_rows)}</tbody>
222
+ </table>
223
+ </div>"""
224
+
225
+
226
+ def openloop_figure(eval_data):
227
+ rows = []
228
+ for variant in VARIANTS:
229
+ r = eval_data.get(variant)
230
+ if not r:
231
+ continue
232
+ ol = r["openloop_action_mse"]
233
+ if "cascade" in ol:
234
+ rows.append((f"{SHORT[variant]} · cascade (+force stage)",
235
+ ol["cascade"][0], f"v-{variant}"))
236
+ rows.append((f"{SHORT[variant]} · coarse only",
237
+ ol["coarse_only"][0], f"v-{variant} vfaded"))
238
+ return hbar(rows, width=560, left=240, title="open-loop action MSE ↓ (16 anchors, normalized 62-D)",
239
+ fmt=lambda v: f"{v:.3f}")
240
+
241
+
242
+ def stage1_attention_figure(eval_data, layers=("0", "29")):
243
+ rows = []
244
+ for variant in VARIANTS:
245
+ r = eval_data.get(variant)
246
+ if not r or "stage1_attention" not in r:
247
+ continue
248
+ for layer in layers:
249
+ masses = r["stage1_attention"].get(layer, {}).get("action")
250
+ if masses:
251
+ rows.append((f"{SHORT[variant]} · layer {layer}", masses))
252
+ return stacked_hbar(rows, STAGE1_GROUPS, STAGE1_CLASS, width=640, left=110,
253
+ title="Stage-1: where action queries attend (mass share)")
254
+
255
+
256
+ def stage2_attention_figure(eval_data):
257
+ rows = []
258
+ for variant in VARIANTS:
259
+ r = eval_data.get(variant)
260
+ if not r or not r.get("stage2_attention"):
261
+ continue
262
+ layers = r["stage2_attention"]
263
+ mean = {}
264
+ for key in STAGE2_GROUPS:
265
+ vals = [layer.get(key, 0.0) for layer in layers]
266
+ mean[key] = sum(vals) / len(vals)
267
+ rows.append((f"{SHORT[variant]} · L0–L5 mean", mean))
268
+ return stacked_hbar(rows, STAGE2_GROUPS, STAGE2_CLASS, width=640, left=110,
269
+ title="Stage-2: where action queries attend (mass share)")
270
+
271
+
272
+ def sensitivity_table(eval_data):
273
+ rows = []
274
+ for variant in VARIANTS:
275
+ r = eval_data.get(variant)
276
+ if not r or "tactile_sensitivity" not in r:
277
+ continue
278
+ t = r["tactile_sensitivity"]
279
+ rows.append(
280
+ f'<tr><td><span class="chip"><span class="vs vs-{variant}"></span>'
281
+ f'&nbsp;{VAR_LABEL[variant]}</span></td>'
282
+ f'<td class="shape">{t["mean_abs_delta_vs_masked"]:.4f}</td>'
283
+ f'<td class="shape">{t["max_abs_delta_vs_masked"]:.4f}</td>'
284
+ f'<td class="shape">{t["mean_abs_refinement"]:.4f}</td></tr>'
285
+ )
286
+ return f"""
287
+ <div class="tbl-wrap">
288
+ <table>
289
+ <thead><tr><th>Tactile sensitivity (normalized units)</th>
290
+ <th>mean |&Delta;a| tactile vs masked</th><th>max |&Delta;a|</th>
291
+ <th>mean |refinement|</th></tr></thead>
292
+ <tbody>{"".join(rows)}</tbody>
293
+ </table>
294
+ </div>"""
295
+
296
+
297
+ def build_section(eval_data, findings_html=""):
298
+ parts = [
299
+ '\n <!-- ======================= ABLATION ======================= -->',
300
+ ' <section id="ablation">',
301
+ ' <p class="sec-eyebrow">ablation</p>',
302
+ ' <h2>Ablation: what track, force, and deformation tactile each buy</h2>',
303
+ PROTOCOL_PROSE,
304
+ VARIANT_LEGEND,
305
+ VARIANT_TABLE,
306
+ loss_figure(),
307
+ final_loss_table(),
308
+ ' <h3>Controlled evaluation on frozen checkpoints</h3>',
309
+ ''' <div class="prose"><p>All numbers below come from the same fixed
310
+ anchor sets, noise seeds, and prompts for every variant
311
+ (<code>scripts/eval/trex_ablation_eval.py</code>). Open-loop: each variant
312
+ runs its own full sampling loop from pure noise on 16 anchors and is scored
313
+ against the ground-truth normalized delta-base chunk.</p></div>''',
314
+ f' <figure>{openloop_figure(eval_data)}<figcaption><b>Figure A2 &mdash; Open-loop reconstruction.</b> Faded bars: the coarse action read out at &tau;=0 without tactile refinement (for C this is its only mode). Solid bars: the full cascade.</figcaption></figure>',
315
+ tau_table(eval_data),
316
+ f' <figure>{stage1_attention_figure(eval_data)}<figcaption><b>Figure A3 &mdash; Stage-1 attention routing.</b> Share of self-attention mass from action queries onto each token group at &tau;=0.4 (mean over heads/blocks).</figcaption></figure>',
317
+ f' <figure>{stage2_attention_figure(eval_data)}<figcaption><b>Figure A4 &mdash; Stage-2 attention routing.</b> Action-query mass over F6 / VQ-history / deform / coarse-memory tokens during real cascaded refinement.</figcaption></figure>',
318
+ sensitivity_table(eval_data),
319
+ findings_html,
320
+ ' </section>\n',
321
+ ]
322
+ return "\n".join(parts)
323
+
324
+
325
+ if __name__ == "__main__":
326
+ eval_path = sys.argv[1] if len(sys.argv) > 1 else \
327
+ "/scratch1/home/zhicao/dreamzero/ablation_runs/eval_part1.json"
328
+ eval_data = json.load(open(eval_path))
329
+ section = build_section(eval_data)
330
+ out = TOOLS.parent / "ablation_section_preview.html"
331
+ out.write_text(section)
332
+ print(f"wrote {out} ({len(section)} chars)")
scripts/eval/trex_ablation_eval.py CHANGED
@@ -562,6 +562,7 @@ def main() -> None:
562
  key: [float(np.mean(v)), float(np.std(v)), len(v)]
563
  for key, v in openloop.items()
564
  }
 
565
  record["openloop_action_mse_split"] = {
566
  key: float(np.mean(v)) for key, v in split_metrics.items()
567
  }
 
562
  key: [float(np.mean(v)), float(np.std(v)), len(v)]
563
  for key, v in openloop.items()
564
  }
565
+ record["openloop_action_mse_raw"] = openloop
566
  record["openloop_action_mse_split"] = {
567
  key: float(np.mean(v)) for key, v in split_metrics.items()
568
  }