Pleuron commited on
Commit
a6927da
·
verified ·
1 Parent(s): cd03d0d

Upload folder using huggingface_hub

Browse files
.gitattributes CHANGED
@@ -33,3 +33,10 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ static/paper/ablation_pruning.png filter=lfs diff=lfs merge=lfs -text
37
+ static/paper/architecture.png filter=lfs diff=lfs merge=lfs -text
38
+ static/paper/case_study.png filter=lfs diff=lfs merge=lfs -text
39
+ static/paper/case_study_medical.png filter=lfs diff=lfs merge=lfs -text
40
+ static/paper/case_study_reasoning.png filter=lfs diff=lfs merge=lfs -text
41
+ static/paper/comparison.png filter=lfs diff=lfs merge=lfs -text
42
+ static/paper/efficiency.png filter=lfs diff=lfs merge=lfs -text
demo.html ADDED
@@ -0,0 +1,384 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>ToolTree — Interactive Case Walkthrough</title>
7
+ <meta name="description" content="Step through real ToolTree search traces on two GTA tasks: candidate drafts, pre/post evaluation, bidirectional pruning, real tool outputs, and Q/N backpropagation.">
8
+ <link rel="icon" href="data:,">
9
+ <style>
10
+ :root {
11
+ --ink: #1c2430;
12
+ --muted: #5b6a7c;
13
+ --line: #dde4ec;
14
+ --bg: #f6f8fa;
15
+ --card: #ffffff;
16
+ --accent: #1f5fbf;
17
+ --ok: #1e8a4c;
18
+ --bad: #b3402f;
19
+ --warn: #8a6d1e;
20
+ }
21
+ * { box-sizing: border-box; }
22
+ body {
23
+ margin: 0;
24
+ background: var(--bg);
25
+ color: var(--ink);
26
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
27
+ font-size: 15px;
28
+ line-height: 1.5;
29
+ }
30
+ a { color: var(--accent); text-decoration: none; }
31
+ a:hover { text-decoration: underline; }
32
+ code { background: #eef2f7; border-radius: 4px; padding: 0 4px; font-size: .86em; }
33
+ .wrap { max-width: 980px; margin: 0 auto; padding: 20px 18px 60px; }
34
+ header h1 { font-size: 1.45rem; margin: 8px 0 4px; }
35
+ header .sub { color: var(--muted); font-size: .92rem; }
36
+ .navlinks { font-size: .9rem; margin-top: 6px; }
37
+ .navlinks a + a { margin-left: 14px; }
38
+ .banner {
39
+ margin: 14px 0 18px;
40
+ padding: 10px 14px;
41
+ background: #fff7e8;
42
+ border: 1px solid #ecd9ac;
43
+ border-radius: 8px;
44
+ font-size: .88rem;
45
+ color: #6a5320;
46
+ }
47
+ .card {
48
+ background: var(--card);
49
+ border: 1px solid var(--line);
50
+ border-radius: 10px;
51
+ padding: 16px 18px;
52
+ margin-bottom: 16px;
53
+ }
54
+ /* case tabs */
55
+ .tabs { display: flex; gap: 10px; flex-wrap: wrap; margin-bottom: 14px; }
56
+ .tabs button {
57
+ font: inherit;
58
+ padding: 8px 14px;
59
+ border: 1px solid var(--line);
60
+ border-radius: 8px;
61
+ background: #fff;
62
+ color: var(--ink);
63
+ cursor: pointer;
64
+ text-align: left;
65
+ }
66
+ .tabs button:hover { border-color: var(--accent); color: var(--accent); }
67
+ .tabs button.active { border-color: var(--accent); background: #eaf1fb; font-weight: 600; }
68
+ .query {
69
+ border-left: 3px solid var(--accent);
70
+ background: #f2f6fc;
71
+ padding: 8px 12px;
72
+ margin: 0 0 4px;
73
+ font-size: .92rem;
74
+ border-radius: 0 6px 6px 0;
75
+ }
76
+ .query .who { font-weight: 700; font-size: .78rem; color: var(--accent); display: block; }
77
+ /* controls */
78
+ .controls { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
79
+ .controls button {
80
+ font: inherit;
81
+ padding: 5px 14px;
82
+ border: 1px solid var(--line);
83
+ border-radius: 7px;
84
+ background: #fff;
85
+ color: var(--ink);
86
+ cursor: pointer;
87
+ }
88
+ .controls button:hover { border-color: var(--accent); color: var(--accent); }
89
+ .controls input[type=range] { flex: 1; min-width: 180px; accent-color: var(--accent); }
90
+ .controls .steplabel { font-variant-numeric: tabular-nums; font-weight: 600; min-width: 96px; }
91
+ .hint { color: var(--muted); font-size: .8rem; margin-top: 6px; }
92
+ /* step panel */
93
+ .stephead { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 8px; }
94
+ .stephead .sid { font-weight: 700; font-size: 1.05rem; }
95
+ .badge {
96
+ display: inline-block;
97
+ padding: 1px 10px;
98
+ border-radius: 6px;
99
+ font-size: .76rem;
100
+ font-weight: 700;
101
+ letter-spacing: .03em;
102
+ white-space: nowrap;
103
+ }
104
+ .badge.ok { background: #e2f3e8; color: var(--ok); border: 1px solid #bcdfc9; }
105
+ .badge.bad { background: #f7e8e5; color: var(--bad); border: 1px solid #e6c5be; }
106
+ .badge.gray { background: #eef1f5; color: var(--muted); border: 1px solid #d8dfe7; }
107
+ .secline { margin: 8px 0; font-size: .92rem; }
108
+ .seclabel { font-weight: 700; font-size: .78rem; color: var(--accent); letter-spacing: .04em; display: block; margin: 12px 0 4px; }
109
+ table.cands { width: 100%; border-collapse: collapse; font-size: .88rem; }
110
+ table.cands th, table.cands td {
111
+ text-align: left;
112
+ padding: 5px 8px;
113
+ border-bottom: 1px solid var(--line);
114
+ vertical-align: top;
115
+ }
116
+ table.cands th { color: var(--muted); font-weight: 600; font-size: .8rem; }
117
+ table.cands td.num { font-variant-numeric: tabular-nums; white-space: nowrap; }
118
+ pre.out {
119
+ background: #0f1720;
120
+ color: #cfd8e3;
121
+ border-radius: 8px;
122
+ padding: 12px 14px;
123
+ overflow-x: auto;
124
+ font-size: .8rem;
125
+ line-height: 1.45;
126
+ white-space: pre-wrap;
127
+ word-break: break-word;
128
+ margin: 6px 0;
129
+ }
130
+ pre.out.err { color: #f0a89c; }
131
+ .trunc { color: var(--warn); font-size: .78rem; }
132
+ ul.plain { margin: 4px 0; padding-left: 20px; font-size: .9rem; }
133
+ .answerbox {
134
+ border-left: 3px solid var(--ok);
135
+ background: #f0f9f3;
136
+ padding: 10px 14px;
137
+ border-radius: 0 6px 6px 0;
138
+ margin: 8px 0;
139
+ font-size: .95rem;
140
+ }
141
+ .stats { display: flex; gap: 22px; flex-wrap: wrap; font-size: .9rem; margin: 6px 0 2px; }
142
+ .stats .k { color: var(--muted); }
143
+ .stats .v { font-weight: 600; font-variant-numeric: tabular-nums; }
144
+ #error {
145
+ display: none;
146
+ background: #f7e8e5;
147
+ border: 1px solid #e6c5be;
148
+ color: var(--bad);
149
+ padding: 14px 16px;
150
+ border-radius: 8px;
151
+ margin-top: 14px;
152
+ }
153
+ footer { color: var(--muted); font-size: .8rem; margin-top: 26px; }
154
+ </style>
155
+ </head>
156
+ <body>
157
+ <div class="wrap">
158
+ <header>
159
+ <h1>ToolTree — Interactive Case Walkthrough</h1>
160
+ <div class="sub">Real execution traces from this repository (real tool-execution mode) on two GTA tasks:
161
+ step through each rollout — candidate drafts, pre-evaluation, execution with real tool outputs,
162
+ post-evaluation, pruning, and Q/N backpropagation.</div>
163
+ <div class="navlinks">
164
+ <a href="index.html">&larr; Project page</a>
165
+ <a href="https://github.com/SYang2000/ICLR_2026_ToolTree" target="_blank" rel="noopener">GitHub repo</a>
166
+ <a href="https://openreview.net/forum?id=Ef5O9gNNLE" target="_blank" rel="noopener">Paper (ICLR 2026)</a>
167
+ </div>
168
+ <div class="banner">
169
+ <b>Provenance:</b> every candidate draft, score (r_pre / r_post), Q/N value, tool output, and final
170
+ answer below is taken verbatim from a logged run of this repository on 5 GTA tasks with
171
+ <code>tool_execution: real</code> (seed 42, &tau;<sub>pre</sub> 0.3, &tau;<sub>post</sub> 0.4,
172
+ c 1.4, max 40 rollouts). Long OCR outputs are truncated to 300 characters and flagged. Failed tool
173
+ calls (e.g. a tool without a real backend) are shown verbatim — post-evaluation prunes those
174
+ branches. Task images are referenced by their dataset-relative paths and are not embedded here.
175
+ </div>
176
+ </header>
177
+
178
+ <div id="error">
179
+ Walkthrough data failed to load. This page needs <code>static/demo_data.js</code> next to it
180
+ (shipped in the repo under <code>docs/static/</code>). If you are viewing a copy of this file alone,
181
+ grab the full <code>docs/</code> directory from the
182
+ <a href="https://github.com/SYang2000/ICLR_2026_ToolTree" target="_blank" rel="noopener">GitHub repo</a>.
183
+ </div>
184
+
185
+ <noscript><p style="max-width:720px;margin:24px auto;padding:12px 16px;background:#fef3c7;border:1px solid #d97706;border-radius:8px;font-size:14px">This interactive walkthrough requires JavaScript. The search mechanism it illustrates is documented on the <a href="index.html">project page</a> and in the <a href="https://github.com/SYang2000/ICLR_2026_ToolTree">repository README</a>.</p></noscript>
186
+
187
+ <div id="app" style="display:none">
188
+ <div class="tabs" id="tabs"></div>
189
+
190
+ <div class="card">
191
+ <div class="query"><span class="who">USER QUERY</span><span id="query"></span></div>
192
+ </div>
193
+
194
+ <div class="card">
195
+ <div class="controls">
196
+ <button id="btnPrev" title="previous step (&larr;)">&#9664; Prev</button>
197
+ <button id="btnNext" title="next step (&rarr;)">Next &#9654;</button>
198
+ <input type="range" id="slider" min="0" max="1" value="0" step="1">
199
+ <span class="steplabel" id="stepLabel"></span>
200
+ </div>
201
+ <div class="hint">Keyboard: &larr; / &rarr; step through the search.</div>
202
+ </div>
203
+
204
+ <div class="card" id="stepPanel"></div>
205
+
206
+ <footer>
207
+ Data source: <code>static/demo_data.js</code>, generated from the audit log of a real-execution
208
+ validation run of this codebase (per-rollout AUDIT events, LLM traffic, and final results).
209
+ &middot; <a href="index.html">Project page</a>
210
+ &middot; <a href="https://github.com/SYang2000/ICLR_2026_ToolTree" target="_blank" rel="noopener">GitHub repo</a>
211
+ </footer>
212
+ </div>
213
+ </div>
214
+
215
+ <script src="static/demo_data.js"></script>
216
+ <script>
217
+ (function () {
218
+ "use strict";
219
+
220
+ var D = window.DEMO_DATA;
221
+ if (!D || !D.cases || !D.cases.length) {
222
+ document.getElementById("error").style.display = "block";
223
+ return;
224
+ }
225
+ document.getElementById("app").style.display = "block";
226
+
227
+ var caseIdx = 0;
228
+ var stepIdx = 0;
229
+ var slider = document.getElementById("slider");
230
+
231
+ function esc(s) {
232
+ return String(s == null ? "" : s)
233
+ .replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
234
+ }
235
+ function num(x) { return esc(String(x)); }
236
+ function args(a) { return "<code>" + esc(JSON.stringify(a)) + "</code>"; }
237
+
238
+ // ---------- tabs ----------
239
+ var tabsEl = document.getElementById("tabs");
240
+ D.cases.forEach(function (c, i) {
241
+ var b = document.createElement("button");
242
+ b.textContent = c.title;
243
+ b.addEventListener("click", function () { caseIdx = i; stepIdx = 0; render(); });
244
+ tabsEl.appendChild(b);
245
+ });
246
+
247
+ // ---------- step rendering ----------
248
+ function statusBadge(st) {
249
+ if (st === "kept") return "<span class='badge ok'>kept</span>";
250
+ if (st === "pre_pruned") return "<span class='badge bad'>pre-pruned</span>";
251
+ return "<span class='badge gray'>dedup &middot; duplicate action</span>";
252
+ }
253
+
254
+ function renderRollout(s, total) {
255
+ var h = "<div class='stephead'><span class='sid'>Rollout " + s.rollout + " of " +
256
+ total + "</span>";
257
+ if (s.post_pruned) h += "<span class='badge bad'>branch post-pruned</span>";
258
+ h += "</div>";
259
+
260
+ var sel = s.selected;
261
+ h += "<div class='secline'><b>Selection:</b> leaf <code>" + esc(sel.action) + "</code> " +
262
+ "(Q=" + num(sel.Q) + ", N=" + sel.N + ", r_pre=" + num(sel.r_pre) + ")";
263
+ if (s.realize) {
264
+ h += " &mdash; unvisited candidate; its stored argument draft is executed (<code>realize_leaf</code>)";
265
+ }
266
+ h += "</div>";
267
+
268
+ if (s.candidates.length) {
269
+ h += "<span class='seclabel'>EXPANSION &mdash; CANDIDATES &amp; PRE-EVALUATION (&tau;<sub>pre</sub> = " +
270
+ num(D.meta.tau_pre) + ")</span>";
271
+ h += "<table class='cands'><tr><th>tool</th><th>argument draft</th><th>r_pre</th><th>outcome</th></tr>";
272
+ s.candidates.forEach(function (c) {
273
+ h += "<tr><td><code>" + esc(c.tool) + "</code></td><td>" +
274
+ (c.args ? args(c.args) : "&mdash;") + "</td><td class='num'>" +
275
+ (c.r_pre == null ? "&mdash;" : num(c.r_pre)) + "</td><td>" +
276
+ statusBadge(c.status) + "</td></tr>";
277
+ });
278
+ h += "</table>";
279
+ }
280
+
281
+ if (s.executed) {
282
+ var ex = s.executed;
283
+ h += "<span class='seclabel'>EXECUTION &mdash; REAL TOOL OUTPUT</span>";
284
+ h += "<div class='secline'><b>" + esc(ex.tool) + "</b> " + args(ex.args) + "</div>";
285
+ h += "<pre class='out" + (ex.error ? " err" : "") + "'>" + esc(ex.output) + "</pre>";
286
+ if (ex.truncated) {
287
+ h += "<div class='trunc'>output truncated to " + D.meta.trunc_chars +
288
+ " characters for display; the full text is in the run artifacts</div>";
289
+ }
290
+ h += "<span class='seclabel'>POST-EVALUATION (&tau;<sub>post</sub> = " + num(s.tau_post) + ")</span>";
291
+ h += "<div class='secline'>r_post = <b>" + num(s.r_post) + "</b> &rarr; " +
292
+ (s.post_pruned ? "<span class='badge bad'>post-pruned</span>" : "<span class='badge ok'>kept</span>") +
293
+ "</div>";
294
+ }
295
+
296
+ if (s.backprop.length) {
297
+ h += "<span class='seclabel'>BACKPROPAGATION (reward " + num(s.backprop[0].reward) + ")</span>";
298
+ h += "<ul class='plain'>";
299
+ s.backprop.forEach(function (b) {
300
+ h += "<li><code>" + esc(b.node) + "</code> &rarr; Q=" + num(b.Q) + ", N=" + b.N + "</li>";
301
+ });
302
+ h += "</ul>";
303
+ h += "<div class='secline'><span class='badge gray'>best Q after rollout: " + num(s.best_q) + "</span></div>";
304
+ }
305
+ return h;
306
+ }
307
+
308
+ function renderTerminal(s) {
309
+ var h = "<div class='stephead'><span class='sid'>Search terminated</span>" +
310
+ "<span class='badge gray'>search_exhausted &middot; rollouts_used=" + s.rollouts_used + "</span></div>";
311
+ if (s.dedups.length) {
312
+ h += "<div class='secline'>Further expansion only produced duplicates of actions already on the path:</div><ul class='plain'>";
313
+ s.dedups.forEach(function (d) {
314
+ h += "<li><code>" + esc(d.tool) + "</code>" + (d.args ? " " + args(d.args) : "") +
315
+ " <span class='badge gray'>dedup</span></li>";
316
+ });
317
+ h += "</ul>";
318
+ } else {
319
+ h += "<div class='secline'>Every remaining candidate was pre-pruned, post-pruned, or a duplicate of an action already on the path.</div>";
320
+ }
321
+ h += "<div class='secline'>Nodes marked exhausted:</div><ul class='plain'>";
322
+ s.exhausted.forEach(function (e) {
323
+ h += "<li><code>" + esc(e.node) + "</code> (depth " + e.depth + ")</li>";
324
+ });
325
+ h += "</ul><div class='secline'>With no expandable leaf left, the search stops early &mdash; well under the budget of " +
326
+ D.meta.max_rollouts + " rollouts.</div>";
327
+ return h;
328
+ }
329
+
330
+ function renderFinal(s) {
331
+ var h = "<div class='stephead'><span class='sid'>Final trajectory &amp; answer</span>" +
332
+ "<span class='badge ok'>highest-reward path</span></div>";
333
+ h += "<span class='seclabel'>FINAL PLAN</span><ul class='plain'>";
334
+ s.plan.forEach(function (p, i) {
335
+ h += "<li>" + (i + 1) + ". <code>" + esc(p.tool) + "</code> " + args(p.args) + "</li>";
336
+ });
337
+ h += "</ul>";
338
+ h += "<span class='seclabel'>FINAL ANSWER</span>";
339
+ h += "<div class='answerbox'>" + esc(s.answer) + "</div>";
340
+ h += "<div class='stats'>" +
341
+ "<span><span class='k'>final reward&nbsp;</span><span class='v'>" + num(s.reward) + "</span></span>" +
342
+ "<span><span class='k'>rollouts used&nbsp;</span><span class='v'>" + s.rollouts_used + "</span></span>" +
343
+ "</div>";
344
+ return h;
345
+ }
346
+
347
+ function render() {
348
+ var c = D.cases[caseIdx];
349
+ var steps = c.steps;
350
+ stepIdx = Math.max(0, Math.min(steps.length - 1, stepIdx));
351
+
352
+ Array.prototype.forEach.call(tabsEl.children, function (b, i) {
353
+ b.className = i === caseIdx ? "active" : "";
354
+ });
355
+ document.getElementById("query").textContent = c.query;
356
+
357
+ slider.max = steps.length - 1;
358
+ slider.value = stepIdx;
359
+ document.getElementById("stepLabel").textContent = "step " + (stepIdx + 1) + " / " + steps.length;
360
+
361
+ var s = steps[stepIdx];
362
+ var totalRollouts = steps.filter(function (x) { return x.type === "rollout"; }).length;
363
+ var html;
364
+ if (s.type === "rollout") html = renderRollout(s, totalRollouts);
365
+ else if (s.type === "terminal") html = renderTerminal(s);
366
+ else html = renderFinal(s);
367
+ document.getElementById("stepPanel").innerHTML = html;
368
+ }
369
+
370
+ function goto(i) { stepIdx = i; render(); }
371
+
372
+ document.getElementById("btnPrev").addEventListener("click", function () { goto(stepIdx - 1); });
373
+ document.getElementById("btnNext").addEventListener("click", function () { goto(stepIdx + 1); });
374
+ slider.addEventListener("input", function () { goto(parseInt(slider.value, 10)); });
375
+ document.addEventListener("keydown", function (e) {
376
+ if (e.key === "ArrowLeft") { goto(stepIdx - 1); e.preventDefault(); }
377
+ else if (e.key === "ArrowRight") { goto(stepIdx + 1); e.preventDefault(); }
378
+ });
379
+
380
+ render();
381
+ })();
382
+ </script>
383
+ </body>
384
+ </html>
index.html CHANGED
@@ -1,19 +1,381 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  </html>
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>ToolTree: Efficient LLM Agent Tool Planning via Dual-Feedback Monte Carlo Tree Search and Bidirectional Pruning</title>
7
+ <meta name="description" content="ToolTree plans LLM agent tool use via dual-feedback Monte Carlo tree search with bidirectional pruning — state-of-the-art across 4 benchmarks with an average gain of ~10% over existing methods.">
8
+ <link rel="icon" href="data:,">
9
+ <link rel="stylesheet" href="static/style.css">
10
+ <script>document.documentElement.classList.add('js');</script>
11
+ </head>
12
+ <body>
13
+
14
+ <!-- ================= Sticky section nav (shown after scrolling past the hero) ================= -->
15
+ <nav class="topnav" id="topnav" aria-label="Page sections">
16
+ <div class="topnav-inner">
17
+ <a class="topnav-brand" href="#top">ToolTree</a>
18
+ <div class="topnav-links">
19
+ <a href="#overview">Overview</a>
20
+ <a href="#efficiency">Efficiency</a>
21
+ <a href="#method">Method</a>
22
+ <a href="#case-study">Case Study</a>
23
+ <a href="#results">Results</a>
24
+ <a href="#ablation">Ablation</a>
25
+ <a href="demo.html">Demo</a>
26
+ <a href="#bibtex">BibTeX</a>
27
+ </div>
28
+ </div>
29
+ </nav>
30
+
31
+ <!-- ================= Hero ================= -->
32
+ <header class="hero" id="top">
33
+ <div class="container">
34
+ <h1><span class="hero-name">ToolTree</span>: Efficient LLM Agent Tool Planning via Dual-Feedback Monte Carlo Tree Search and Bidirectional Pruning</h1>
35
+ <p class="authors">
36
+ Shuo Yang, Caren Han, Yihao Ding, Shuhe Wang, Eduard Hovy
37
+ </p>
38
+ <p class="affiliation">The University of Melbourne &#183; The University of Western Australia</p>
39
+ <p class="venue"><span class="venue-chip">ICLR 2026</span></p>
40
+ <nav class="button-row" aria-label="Paper links">
41
+ <a class="btn" href="https://openreview.net/forum?id=Ef5O9gNNLE" target="_blank" rel="noopener"><svg class="btn-ico" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>Paper</a>
42
+ <a class="btn" href="https://openreview.net/pdf?id=Ef5O9gNNLE" target="_blank" rel="noopener"><svg class="btn-ico" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>PDF</a>
43
+ <a class="btn" href="https://github.com/SYang2000/ICLR_2026_ToolTree" target="_blank" rel="noopener"><svg class="btn-ico" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg>Code</a>
44
+ <a class="btn" href="demo.html"><svg class="btn-ico" viewBox="0 0 24 24" aria-hidden="true" fill="currentColor" stroke="none"><polygon points="7 4 20 12 7 20 7 4"/></svg>Demo</a>
45
+ <a class="btn btn-ghost" href="#bibtex"><svg class="btn-ico" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"/></svg>BibTeX</a>
46
+ </nav>
47
+ </div>
48
+ </header>
49
+
50
+ <main>
51
+
52
+ <!-- ================= Metric callouts ================= -->
53
+ <section class="metrics">
54
+ <div class="container">
55
+ <div class="metric-grid reveal stagger">
56
+ <div class="metric-card">
57
+ <div class="metric-value">~10%</div>
58
+ <div class="metric-label">Average gain over existing methods</div>
59
+ <div class="metric-sub">Across both closed-set and open-set tool planning scenarios</div>
60
+ </div>
61
+ <div class="metric-card">
62
+ <div class="metric-value">SOTA</div>
63
+ <div class="metric-label">State-of-the-art across all 4 benchmarks</div>
64
+ <div class="metric-sub">GTA &#183; m&amp;m &#183; ToolBench &#183; RestBench</div>
65
+ </div>
66
+ <div class="metric-card">
67
+ <div class="metric-value">#1</div>
68
+ <div class="metric-label">Highest efficiency (performance gain per second)</div>
69
+ <div class="metric-sub">Compared with all baselines across step limits</div>
70
+ </div>
71
+ </div>
72
+ </div>
73
+ </section>
74
+
75
+ <!-- ================= Overview ================= -->
76
+ <section id="overview">
77
+ <div class="container">
78
+ <h2>Overview</h2>
79
+ <div class="abstract-card reveal">
80
+ <p class="abstract-text">
81
+ <strong>ToolTree</strong> is a novel Monte Carlo tree search-inspired planning paradigm for
82
+ LLM agent tool planning. It explores possible tool usage trajectories using a
83
+ <strong>dual-stage LLM evaluation</strong> and <strong>bidirectional pruning</strong> mechanism
84
+ that enables the agent to make informed, adaptive decisions over extended tool-use sequences
85
+ while pruning less promising branches before and after the tool execution.
86
+ </p>
87
+ </div>
88
+ </div>
89
+ </section>
90
+
91
+ <!-- ================= Efficiency (Figure 3) ================= -->
92
+ <section class="fig3-band section-alt" id="efficiency" aria-label="Progressive efficiency analysis">
93
+ <div class="container">
94
+ <h2>Efficiency</h2>
95
+ <figure class="paper-figure reveal">
96
+ <img src="static/paper/efficiency.png" alt="Three line charts across step limits comparing ReAct, Best-first, ToT, LATS, and ToolTree: performance versus step limit, running time versus step limit, and efficiency (performance gain per second) versus step limit — ToolTree sits highest on the performance and efficiency panels at every step limit.">
97
+ <figcaption><span class="fig-tag">Figure 3:</span> Progressive efficiency analysis across step limits.
98
+ ToolTree achieves the highest efficiency (performance gain per second) compared with all baselines.</figcaption>
99
+ </figure>
100
+ </div>
101
+ </section>
102
+
103
+ <!-- ================= Method ================= -->
104
+ <section id="method">
105
+ <div class="container">
106
+ <h2>Method</h2>
107
+ <figure class="paper-figure reveal">
108
+ <img src="static/paper/architecture.png" alt="ToolTree pipeline: an input query enters a repeated loop over the tool tree — selection, pre-evaluation of a candidate tool against a threshold before execution, expansion, execution, post-evaluation of the observed output, and backward-propagation — after which the answer predictor produces the final answer.">
109
+ <figcaption>Architecture overview of ToolTree. An input query is processed sequentially via iterative
110
+ dual evaluation-guided Monte Carlo Tree Search, including selection, pre-evaluation, expansion,
111
+ execution, post-evaluation and backward-propagation.</figcaption>
112
+ </figure>
113
+
114
+ <div class="mech-grid mech-grid-4 reveal stagger">
115
+ <div class="mech-card">
116
+ <span class="mech-num">1</span>
117
+ <h3>Pre-Evaluation</h3>
118
+ <p>
119
+ A fast predictive signal that estimates the utility of a tool <em>before</em> execution,
120
+ filtering schema- or slot-incompatible calls before expansion.
121
+ </p>
122
+ </div>
123
+ <div class="mech-card">
124
+ <span class="mech-num">2</span>
125
+ <h3>Post-Evaluation</h3>
126
+ <p>
127
+ Assesses the actual contribution of a tool <em>after</em> execution based on observed
128
+ outcomes, pruning unproductive branches using real feedback.
129
+ </p>
130
+ </div>
131
+ <div class="mech-card">
132
+ <span class="mech-num">3</span>
133
+ <h3>Bidirectional Pruning</h3>
134
+ <p>
135
+ Combines pre- and post-evaluation to eliminate unpromising branches, concentrating
136
+ computational budget on promising tool chains.
137
+ </p>
138
+ </div>
139
+ <div class="mech-card">
140
+ <span class="mech-num">4</span>
141
+ <h3>Answer Predictor</h3>
142
+ <p>
143
+ Incorporates the tool trajectories with the highest reward found by the MCTS to produce
144
+ the final prediction.
145
+ </p>
146
+ </div>
147
+ </div>
148
+
149
+ <figure class="paper-figure reveal">
150
+ <img src="static/paper/comparison.png" alt="Concept comparison on a street photo asking how many wheels are in total: greedy-based planning commits to a single tool chain and answers incorrectly; search-based planning explores more tool branches but still returns a wrong count; ToolTree prunes branches before (pre-pruning) and after (post-pruning) execution and answers correctly.">
151
+ <figcaption>Comparison of ToolTree with greedy search and search-based tool planning. ToolTree chooses
152
+ the optimal tool trajectory and answers correctly with bidirectional pruning.</figcaption>
153
+ </figure>
154
+ </div>
155
+ </section>
156
+
157
+ <!-- ================= Case study ================= -->
158
+ <section id="case-study" class="section-alt">
159
+ <div class="container">
160
+ <h2>Case Study</h2>
161
+ <span class="band-label">Qualitative case studies from the paper</span>
162
+ <div class="case-figure reveal">
163
+ <img src="static/paper/case_study.png" alt="Iterative inferencing on a road-sign query asking for the distance in miles: early iterations read the kilometre figure off the sign and return it unchanged for a low post-evaluation reward; later iterations add retrieval and unit-conversion tools, the reward rises, and the final iteration answers in miles.">
164
+ </div>
165
+ <p class="case-text reveal">
166
+ The query asks how many <em>miles</em> the journey is, while the road sign in the image gives the
167
+ distance in kilometres. In early iterations the agent simply reads the kilometre figure off the
168
+ sign and returns it unchanged, earning a low post-evaluation reward. Across later iterations the
169
+ search brings in retrieval and unit-conversion tools, the post-evaluation reward rises, and the
170
+ final trajectory converts the distance and answers in miles.
171
+ </p>
172
+ <figure class="paper-figure reveal">
173
+ <div class="figure-stack">
174
+ <img src="static/paper/case_study_medical.png" alt="Case study (a): a radiology image question about lung cancer risk — greedy search relies on generic image captioning and heuristic search on shallow heuristics, both missing the finding, while the MCTS-planned trajectory orchestrates domain-specific imaging tools and detects the risk.">
175
+ <img src="static/paper/case_study_reasoning.png" alt="Case study (b): a multi-hop knowledge reasoning question about the building seen behind an amusement area — greedy search and heuristic search answer from broad scene cues and the most prominent text, while the MCTS-planned trajectory chains recognition and search tools to identify the building correctly.">
176
+ </div>
177
+ <figcaption>Two qualitative case studies showcasing ToolTree&#8217;s iterative tool orchestration on
178
+ (a) a radiology image question and (b) a multi-hop knowledge reasoning task.</figcaption>
179
+ </figure>
180
+ </div>
181
+ </section>
182
+
183
+ <!-- ================= Results ================= -->
184
+ <section id="results">
185
+ <div class="container">
186
+ <h2>Results</h2>
187
+ <p>
188
+ ToolTree achieves state-of-the-art performance across 4 benchmarks spanning both closed-set and
189
+ open-set tool planning scenarios, with an average gain of ~10% over existing methods.
190
+ </p>
191
+
192
+ <div class="table-wrap reveal">
193
+ <table class="results">
194
+ <thead>
195
+ <tr><th>Benchmark</th><th>Setting</th><th>Tasks &amp; Tools</th><th>Official source</th></tr>
196
+ </thead>
197
+ <tbody>
198
+ <tr><td>GTA</td><td>Closed-set</td><td>229 real-world tasks, 14 executable tools</td><td><a href="https://github.com/open-compass/GTA" target="_blank" rel="noopener">open-compass/GTA</a> &#183; <a href="https://huggingface.co/datasets/Jize1/GTA" target="_blank" rel="noopener">HF dataset</a></td></tr>
199
+ <tr><td>m&amp;m</td><td>Closed-set</td><td>882 human-verified multi-step multimodal tasks, 33 tools</td><td><a href="https://github.com/RAIVNLab/mnms" target="_blank" rel="noopener">RAIVNLab/mnms</a> &#183; <a href="https://huggingface.co/datasets/zixianma/mnms" target="_blank" rel="noopener">HF dataset</a></td></tr>
200
+ <tr><td>ToolBench</td><td>Open-set</td><td>16,464 real-world REST APIs (RapidAPI)</td><td><a href="https://github.com/OpenBMB/ToolBench" target="_blank" rel="noopener">OpenBMB/ToolBench</a></td></tr>
201
+ <tr><td>RestBench</td><td>Open-set</td><td>TMDB &amp; Spotify REST scenarios</td><td><a href="https://github.com/Yifan-Song793/RestGPT" target="_blank" rel="noopener">Yifan-Song793/RestGPT</a></td></tr>
202
+ </tbody>
203
+ </table>
204
+ </div>
205
+
206
+ <p class="table-note reveal">
207
+ This repository ships no benchmark data; each benchmark is downloaded from its official source.
208
+ </p>
209
+
210
+ </div>
211
+ </section>
212
+
213
+ <!-- ================= Ablation ================= -->
214
+ <section id="ablation" class="section-alt">
215
+ <div class="container">
216
+ <h2>Pruning Ablation</h2>
217
+
218
+ <div class="ablation-block reveal">
219
+ <figure class="paper-figure figure-medium">
220
+ <img src="static/paper/ablation_pruning.png" alt="Two box plots comparing ToolTree against variants without pre-pruning, without post-pruning, and without both: the number of rollouts and the number of expanded nodes are lowest for full ToolTree and grow as pruning stages are disabled.">
221
+ </figure>
222
+ <p class="takeaway">Disabling pre-pruning, post-pruning, or both consistently increases the number of
223
+ rollouts and expanded nodes, confirming that bidirectional pruning concentrates the computational
224
+ budget on promising tool chains.</p>
225
+ </div>
226
+ </div>
227
+ </section>
228
+
229
+ <!-- ================= BibTeX ================= -->
230
+ <section id="bibtex">
231
+ <div class="container">
232
+ <h2>BibTeX</h2>
233
+ <div class="bibtex-box reveal">
234
+ <button class="copy-btn" id="copy-btn" type="button">Copy</button>
235
+ <pre id="bibtex-text">@inproceedings{yang2026tooltree,
236
+ title={ToolTree: Efficient {LLM} Tool Planning via Dual-Feedback Monte Carlo Tree Search and Bidirectional Pruning},
237
+ author={Shuo Yang and Caren Han and Yihao Ding and Shuhe Wang and Eduard Hovy},
238
+ booktitle={The Fourteenth International Conference on Learning Representations},
239
+ year={2026},
240
+ url={https://openreview.net/forum?id=Ef5O9gNNLE}
241
+ }</pre>
242
+ </div>
243
+ </div>
244
+ </section>
245
+
246
+ </main>
247
+
248
+ <footer>
249
+ <div class="container">
250
+ &#169; 2026 the authors &#183; The University of Melbourne &#183; The University of Western Australia &#183; Code released under the MIT License.
251
+ </div>
252
+ </footer>
253
+
254
+ <script>
255
+ /* Sticky section nav: slides in once the hero has scrolled out of view. */
256
+ (function () {
257
+ var hero = document.getElementById('top');
258
+ var nav = document.getElementById('topnav');
259
+ if (!hero || !nav || !('IntersectionObserver' in window)) return;
260
+ var io = new IntersectionObserver(function (entries) {
261
+ nav.classList.toggle('visible', !entries[0].isIntersecting);
262
+ }, { rootMargin: '-56px 0px 0px 0px' });
263
+ io.observe(hero);
264
+ })();
265
+
266
+ /* Scroll-reveal: fade/lift sections in as they enter the viewport.
267
+ Elements are only hidden when <html> carries the .js class (added in <head>),
268
+ so content stays visible with JS disabled; reduced-motion is handled in CSS. */
269
+ (function () {
270
+ var els = document.querySelectorAll('.reveal');
271
+ var i;
272
+ if (!('IntersectionObserver' in window)) {
273
+ for (i = 0; i < els.length; i++) els[i].classList.add('revealed');
274
+ return;
275
+ }
276
+ var io = new IntersectionObserver(function (entries) {
277
+ entries.forEach(function (en) {
278
+ if (en.isIntersecting) {
279
+ en.target.classList.add('revealed');
280
+ io.unobserve(en.target);
281
+ }
282
+ });
283
+ }, { threshold: 0.08, rootMargin: '0px 0px -8% 0px' });
284
+ for (i = 0; i < els.length; i++) io.observe(els[i]);
285
+ })();
286
+
287
+ /* Lightbox: click (or Enter/Space) on a paper figure opens it enlarged; ESC / click closes. */
288
+ (function () {
289
+ var imgs = document.querySelectorAll('figure.paper-figure img, .case-figure img');
290
+ if (!imgs.length) return;
291
+ var overlay = null, big = null, lastFocus = null;
292
+
293
+ function build() {
294
+ overlay = document.createElement('div');
295
+ overlay.className = 'lightbox';
296
+ overlay.setAttribute('role', 'dialog');
297
+ overlay.setAttribute('aria-modal', 'true');
298
+ overlay.setAttribute('aria-label', 'Enlarged figure');
299
+ big = document.createElement('img');
300
+ var closeBtn = document.createElement('button');
301
+ closeBtn.className = 'lightbox-close';
302
+ closeBtn.type = 'button';
303
+ closeBtn.setAttribute('aria-label', 'Close enlarged figure');
304
+ closeBtn.innerHTML = '&#215;';
305
+ overlay.appendChild(big);
306
+ overlay.appendChild(closeBtn);
307
+ overlay.addEventListener('click', close);
308
+ document.body.appendChild(overlay);
309
+ }
310
+ function open(img) {
311
+ if (!overlay) build();
312
+ lastFocus = img;
313
+ big.src = img.currentSrc || img.src;
314
+ big.alt = img.alt || '';
315
+ overlay.classList.add('open');
316
+ document.body.classList.add('no-scroll');
317
+ overlay.querySelector('.lightbox-close').focus();
318
+ }
319
+ function close() {
320
+ if (!overlay || !overlay.classList.contains('open')) return;
321
+ overlay.classList.remove('open');
322
+ document.body.classList.remove('no-scroll');
323
+ if (lastFocus && lastFocus.focus) lastFocus.focus();
324
+ }
325
+ document.addEventListener('keydown', function (e) {
326
+ if (e.key === 'Escape' || e.key === 'Esc') close();
327
+ });
328
+ Array.prototype.forEach.call(imgs, function (img) {
329
+ img.setAttribute('tabindex', '0');
330
+ img.setAttribute('role', 'button');
331
+ img.addEventListener('click', function () { open(img); });
332
+ img.addEventListener('keydown', function (e) {
333
+ if (e.key === 'Enter' || e.key === ' ' || e.key === 'Spacebar') {
334
+ e.preventDefault();
335
+ open(img);
336
+ }
337
+ });
338
+ });
339
+ })();
340
+
341
+ /* BibTeX copy button. */
342
+ (function () {
343
+ var btn = document.getElementById('copy-btn');
344
+ var pre = document.getElementById('bibtex-text');
345
+ if (!btn || !pre) return;
346
+
347
+ function flash(ok) {
348
+ btn.textContent = ok ? 'Copied!' : 'Copy failed — select the text manually';
349
+ setTimeout(function () { btn.textContent = 'Copy'; }, 2000);
350
+ }
351
+
352
+ function fallbackCopy(text) {
353
+ var ta = document.createElement('textarea');
354
+ ta.value = text;
355
+ ta.setAttribute('readonly', '');
356
+ ta.style.position = 'fixed';
357
+ ta.style.left = '-9999px';
358
+ document.body.appendChild(ta);
359
+ ta.select();
360
+ var ok = false;
361
+ try { ok = document.execCommand('copy'); } catch (e) { ok = false; }
362
+ document.body.removeChild(ta);
363
+ flash(ok);
364
+ }
365
+
366
+ btn.addEventListener('click', function () {
367
+ var text = pre.textContent;
368
+ if (navigator.clipboard && navigator.clipboard.writeText) {
369
+ navigator.clipboard.writeText(text).then(
370
+ function () { flash(true); },
371
+ function () { fallbackCopy(text); }
372
+ );
373
+ } else {
374
+ fallbackCopy(text);
375
+ }
376
+ });
377
+ })();
378
+ </script>
379
+
380
+ </body>
381
  </html>
static/demo_data.js ADDED
@@ -0,0 +1 @@
 
 
1
+ window.DEMO_DATA = {"meta":{"benchmark":"GTA","tool_execution":"real","seed":42,"tau_pre":0.3,"tau_post":0.4,"exploration_constant":1.4,"max_rollouts":40,"trunc_chars":300},"cases":[{"title":"Case 1 \u2014 Wholesale catalogue: total price (OCR \u2192 Calculator)","query":"I want to buy all the items in the picture, how much should it cost?","steps":[{"type":"rollout","candidates":[{"tool":"OCR","r_pre":0.8,"status":"kept","args":{"image":"image/image_407.jpg"}},{"tool":"Calculator","r_pre":0.3,"status":"kept","args":{"expression":"sum(float(item) for item in ocr_results.split())"}}],"backprop":[{"node":"OCR","reward":0.7,"Q":0.7,"N":1},{"node":"root","reward":0.7,"Q":0.7,"N":1}],"selected":{"action":"root","Q":0.0,"N":0,"r_pre":0.0},"executed":{"tool":"OCR","args":{"image":"image/image_407.jpg"},"output":"(204, 66, 398, 98) C 0 MPANY\n(691, 42, 1186, 120) VARIOUS ITEMS\n(1193, 32, 1231, 177) L\n(242, 92, 400, 146) LOGO\n(913, 137, 1184, 170) Summer 2020 Collection\n(364, 256, 574, 280) DUMMY PRODUCT #1\n(954, 256, 1166, 280) DUMMY PRODUCT #2\n(362, 286, 480, 310) ID : 202256\n(954, 286, 1070, 310) ID: 202250","error":false,"truncated":true},"r_post":0.7,"tau_post":0.4,"post_pruned":false,"rollout":1,"best_q":0.7},{"type":"rollout","candidates":[],"backprop":[{"node":"Calculator","reward":0.0,"Q":0.0,"N":1},{"node":"root","reward":0.0,"Q":0.35,"N":2}],"selected":{"action":"Calculator","Q":0.0,"N":0,"r_pre":0.3},"realize":"Calculator","executed":{"tool":"Calculator","args":{"expression":"sum(float(item) for item in ocr_results.split())"},"output":"invocation_failed: Sympify of expression 'could not parse 'sum(float(item) for item in ocr_results.split())'' failed, because of exception being raised:\nSyntaxError: cannot assign to function call (<string>, line 1)","error":true,"truncated":false},"r_post":0.0,"tau_post":0.4,"post_pruned":true,"rollout":2,"best_q":0.7},{"type":"rollout","candidates":[{"tool":"OCR","r_pre":null,"status":"dedup","args":{"image":"image/image_407.jpg"}},{"tool":"Calculator","r_pre":0.9,"status":"kept","args":{"expression":"45.99 + 32.99 + 869.99 + 29.99 + 125.99 + 4.99 + 12.99 + 22.99"}}],"backprop":[{"node":"Calculator","reward":0.9,"Q":0.9,"N":1},{"node":"OCR","reward":0.9,"Q":0.8,"N":2},{"node":"root","reward":0.9,"Q":0.533333,"N":3}],"selected":{"action":"OCR","Q":0.7,"N":1,"r_pre":0.8},"executed":{"tool":"Calculator","args":{"expression":"45.99 + 32.99 + 869.99 + 29.99 + 125.99 + 4.99 + 12.99 + 22.99"},"output":"1145.92","error":false,"truncated":false},"r_post":0.9,"tau_post":0.4,"post_pruned":false,"rollout":3,"best_q":0.8},{"type":"terminal","event":"search_exhausted","rollouts_used":3,"exhausted":[{"node":"Calculator","depth":2},{"node":"OCR","depth":1},{"node":"root","depth":0}],"dedups":[{"tool":"Calculator","args":{"expression":"45.99 + 32.99 + 869.99 + 29.99 + 125.99 + 4.99 + 12.99 + 22.99"}},{"tool":"OCR","args":{"image":"image/image_407.jpg"}}]},{"type":"final","plan":[{"tool":"OCR","args":{"image":"image/image_407.jpg"}},{"tool":"Calculator","args":{"expression":"45.99 + 32.99 + 869.99 + 29.99 + 125.99 + 4.99 + 12.99 + 22.99"}}],"answer":"The total cost for all the items in the picture is $1,145.92.","reward":0.9,"rollouts_used":3}]},{"title":"Case 2 \u2014 Counting sheep: equal numbers? (CountGivenObject \u00d7 2)","query":"Are there equal numbers of small and big sheep?","steps":[{"type":"rollout","candidates":[{"tool":"Calculator","r_pre":0.0,"status":"pre_pruned","args":{"expression":"len([1, 2]) == len([3, 4])"}},{"tool":"TextToBbox","r_pre":0.8,"status":"kept","args":{"image":"image/image_260.jpg","text":"sheep","top1":false}},{"tool":"CountGivenObject","r_pre":0.5,"status":"kept","args":{"image":"image/image_260.jpg","text":"small sheep"}}],"backprop":[{"node":"TextToBbox","reward":0.0,"Q":0.0,"N":1},{"node":"root","reward":0.0,"Q":0.0,"N":1}],"selected":{"action":"root","Q":0.0,"N":0,"r_pre":0.0},"executed":{"tool":"TextToBbox","args":{"image":"image/image_260.jpg","text":"sheep","top1":false},"output":"invocation_failed: No real backend for tool: TextToBbox","error":true,"truncated":false},"r_post":0.0,"tau_post":0.4,"post_pruned":true,"rollout":1,"best_q":0.0},{"type":"rollout","candidates":[],"backprop":[{"node":"CountGivenObject","reward":0.5,"Q":0.5,"N":1},{"node":"root","reward":0.5,"Q":0.25,"N":2}],"selected":{"action":"CountGivenObject","Q":0.0,"N":0,"r_pre":0.5},"realize":"CountGivenObject","executed":{"tool":"CountGivenObject","args":{"image":"image/image_260.jpg","text":"small sheep"},"output":4,"error":false,"truncated":false},"r_post":0.5,"tau_post":0.4,"post_pruned":false,"rollout":2,"best_q":0.5},{"type":"rollout","candidates":[{"tool":"Calculator","r_pre":0.0,"status":"pre_pruned","args":{"expression":"4 == 4"}},{"tool":"CountGivenObject","r_pre":0.9,"status":"kept","args":{"image":"image/image_260.jpg","text":"big sheep"}},{"tool":"TextToBbox","r_pre":0.7,"status":"kept","args":{"image":"image/image_260.jpg","text":"big sheep"}}],"backprop":[{"node":"CountGivenObject","reward":1.0,"Q":1.0,"N":1},{"node":"CountGivenObject","reward":1.0,"Q":0.75,"N":2},{"node":"root","reward":1.0,"Q":0.5,"N":3}],"selected":{"action":"CountGivenObject","Q":0.5,"N":1,"r_pre":0.5},"executed":{"tool":"CountGivenObject","args":{"image":"image/image_260.jpg","text":"big sheep"},"output":4,"error":false,"truncated":false},"r_post":1.0,"tau_post":0.4,"post_pruned":false,"rollout":3,"best_q":0.75},{"type":"rollout","candidates":[],"backprop":[{"node":"TextToBbox","reward":0.0,"Q":0.0,"N":1},{"node":"CountGivenObject","reward":0.0,"Q":0.5,"N":3},{"node":"root","reward":0.0,"Q":0.375,"N":4}],"selected":{"action":"TextToBbox","Q":0.0,"N":0,"r_pre":0.7},"realize":"TextToBbox","executed":{"tool":"TextToBbox","args":{"image":"image/image_260.jpg","text":"big sheep"},"output":"invocation_failed: No real backend for tool: TextToBbox","error":true,"truncated":false},"r_post":0.0,"tau_post":0.4,"post_pruned":true,"rollout":4,"best_q":0.5},{"type":"rollout","candidates":[{"tool":"Calculator","r_pre":0.0,"status":"pre_pruned","args":{"expression":"4 == 4"}},{"tool":"CountGivenObject","r_pre":0.2,"status":"pre_pruned","args":{"image":"image/image_260.jpg","text":"small sheep","bbox":"(0, 0, 100, 100)"}},{"tool":"TextToBbox","r_pre":0.3,"status":"kept","args":{"image":"image/image_260.jpg","text":"small sheep and big sheep","top1":false}}],"backprop":[{"node":"TextToBbox","reward":0.0,"Q":0.0,"N":1},{"node":"CountGivenObject","reward":0.0,"Q":0.5,"N":2},{"node":"CountGivenObject","reward":0.0,"Q":0.375,"N":4},{"node":"root","reward":0.0,"Q":0.3,"N":5}],"selected":{"action":"CountGivenObject","Q":1.0,"N":1,"r_pre":0.9},"executed":{"tool":"TextToBbox","args":{"image":"image/image_260.jpg","text":"small sheep and big sheep","top1":false},"output":"invocation_failed: No real backend for tool: TextToBbox","error":true,"truncated":false},"r_post":0.0,"tau_post":0.4,"post_pruned":true,"rollout":5,"best_q":0.375},{"type":"terminal","event":"search_exhausted","rollouts_used":5,"exhausted":[{"node":"CountGivenObject","depth":2},{"node":"CountGivenObject","depth":1},{"node":"root","depth":0}],"dedups":[]},{"type":"final","plan":[{"tool":"CountGivenObject","args":{"image":"image/image_260.jpg","text":"small sheep"}},{"tool":"CountGivenObject","args":{"image":"image/image_260.jpg","text":"big sheep"}}],"answer":"Based on the tool outputs, there are equal numbers of small and big sheep, with 4 small sheep and 4 big sheep.","reward":0.5,"rollouts_used":5}]}]};
static/paper/ablation_pruning.png ADDED

Git LFS Details

  • SHA256: 60a564a65fbc718511079a7ab2a045b0be93a3b533886aec6f50702a56480926
  • Pointer size: 131 Bytes
  • Size of remote file: 728 kB
static/paper/architecture.png ADDED

Git LFS Details

  • SHA256: 3ddf1247620532c40411453e682b2fefac82f3ef444dda678cf47e4cbced6b28
  • Pointer size: 131 Bytes
  • Size of remote file: 504 kB
static/paper/case_study.png ADDED

Git LFS Details

  • SHA256: da095a0b5c1938255ea83db072242bc836af96a6b2b47a6c5c788876c56d3250
  • Pointer size: 131 Bytes
  • Size of remote file: 228 kB
static/paper/case_study_medical.png ADDED

Git LFS Details

  • SHA256: e46a006f830bc5cecb0e58210a0f01ca35c0dfdcdef4a1704d5bf655e9079c5f
  • Pointer size: 131 Bytes
  • Size of remote file: 397 kB
static/paper/case_study_reasoning.png ADDED

Git LFS Details

  • SHA256: e2db1fbf1e0a4d2ecc165416c0128721b80e61f2ab69403812171b7578eaa646
  • Pointer size: 131 Bytes
  • Size of remote file: 485 kB
static/paper/comparison.png ADDED

Git LFS Details

  • SHA256: afc7116bbea94b44f6fea348910a3af54da3b2cf3303de5be1b44b0a0be93d60
  • Pointer size: 131 Bytes
  • Size of remote file: 765 kB
static/paper/efficiency.png ADDED

Git LFS Details

  • SHA256: db11916216ea371900022e22cfbb52a4684dd6f35dd3aec14fb4484fa4a0a1bd
  • Pointer size: 131 Bytes
  • Size of remote file: 127 kB
static/style.css ADDED
@@ -0,0 +1,746 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* ToolTree project page — hand-written, zero external dependencies. */
2
+
3
+ :root {
4
+ --ink: #1e293b;
5
+ --ink-strong: #0f172a;
6
+ --muted: #64748b;
7
+ --accent: #6d28d9;
8
+ --accent-dark: #5b21b6;
9
+ --accent-soft: #ede9fe;
10
+ --accent-faint: #f5f3ff;
11
+ --border: #e2e8f0;
12
+ --bg-alt: #f8fafc;
13
+ --card-shadow: 0 1px 2px rgba(15, 23, 42, 0.05), 0 4px 14px rgba(15, 23, 42, 0.06);
14
+ --card-shadow-lift: 0 2px 4px rgba(15, 23, 42, 0.06), 0 10px 28px rgba(15, 23, 42, 0.12);
15
+ --nav-h: 52px;
16
+ }
17
+
18
+ * { box-sizing: border-box; }
19
+
20
+ html {
21
+ scroll-behavior: smooth;
22
+ scroll-padding-top: calc(var(--nav-h) + 12px);
23
+ }
24
+
25
+ body {
26
+ margin: 0;
27
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue",
28
+ Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
29
+ font-size: 17px;
30
+ line-height: 1.65;
31
+ color: var(--ink);
32
+ background: #ffffff;
33
+ -webkit-font-smoothing: antialiased;
34
+ text-rendering: optimizeLegibility;
35
+ }
36
+
37
+ body.no-scroll { overflow: hidden; }
38
+
39
+ .container {
40
+ max-width: 960px;
41
+ margin: 0 auto;
42
+ padding: 0 24px;
43
+ }
44
+
45
+ section { padding: 56px 0; }
46
+ section.section-alt { background: var(--bg-alt); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); }
47
+
48
+ h2 {
49
+ font-size: 1.75rem;
50
+ line-height: 1.25;
51
+ margin: 0 0 20px;
52
+ color: var(--ink-strong);
53
+ letter-spacing: -0.01em;
54
+ text-align: center;
55
+ }
56
+
57
+ h3 {
58
+ font-size: 1.15rem;
59
+ margin: 32px 0 10px;
60
+ color: var(--ink-strong);
61
+ }
62
+
63
+ p { margin: 0 0 16px; }
64
+ a { color: var(--accent); }
65
+ a:hover { color: var(--accent-dark); }
66
+
67
+ /* ---------- Sticky section nav ---------- */
68
+
69
+ .topnav {
70
+ position: fixed;
71
+ top: 0;
72
+ left: 0;
73
+ right: 0;
74
+ z-index: 60;
75
+ display: none;
76
+ transform: translateY(-100%);
77
+ background: rgba(255, 255, 255, 0.92);
78
+ -webkit-backdrop-filter: blur(8px);
79
+ backdrop-filter: blur(8px);
80
+ border-bottom: 1px solid var(--border);
81
+ transition: transform 0.25s ease, box-shadow 0.25s ease;
82
+ }
83
+ html.js .topnav { display: block; }
84
+ .topnav.visible {
85
+ transform: translateY(0);
86
+ box-shadow: 0 4px 18px rgba(15, 23, 42, 0.06);
87
+ }
88
+
89
+ .topnav-inner {
90
+ max-width: 960px;
91
+ margin: 0 auto;
92
+ padding: 0 24px;
93
+ height: var(--nav-h);
94
+ display: flex;
95
+ align-items: center;
96
+ gap: 18px;
97
+ }
98
+
99
+ .topnav-brand {
100
+ font-weight: 800;
101
+ font-size: 1.02rem;
102
+ letter-spacing: -0.01em;
103
+ color: var(--accent-dark);
104
+ text-decoration: none;
105
+ flex: none;
106
+ }
107
+ .topnav-brand:hover { color: var(--accent); }
108
+
109
+ .topnav-links {
110
+ display: flex;
111
+ gap: 2px;
112
+ margin-left: auto;
113
+ overflow-x: auto;
114
+ scrollbar-width: none;
115
+ }
116
+ .topnav-links::-webkit-scrollbar { display: none; }
117
+
118
+ .topnav-links a {
119
+ color: var(--muted);
120
+ text-decoration: none;
121
+ font-size: 0.88rem;
122
+ font-weight: 500;
123
+ padding: 6px 10px;
124
+ border-radius: 8px;
125
+ white-space: nowrap;
126
+ transition: color 0.15s ease, background-color 0.15s ease;
127
+ }
128
+ .topnav-links a:hover {
129
+ color: var(--accent-dark);
130
+ background: var(--accent-faint);
131
+ }
132
+
133
+ /* ---------- Hero ---------- */
134
+
135
+ .hero {
136
+ position: relative;
137
+ overflow: hidden;
138
+ padding: 84px 0 60px;
139
+ text-align: center;
140
+ background:
141
+ radial-gradient(1100px 480px at 50% -140px, var(--accent-faint), rgba(255, 255, 255, 0) 72%),
142
+ radial-gradient(700px 340px at 88% -160px, #eef2ff, rgba(255, 255, 255, 0) 70%),
143
+ #ffffff;
144
+ }
145
+
146
+ /* Faint dot-grid, fading out below the fold — pure CSS, no assets. */
147
+ .hero::before {
148
+ content: "";
149
+ position: absolute;
150
+ inset: 0;
151
+ background-image:
152
+ linear-gradient(to right, rgba(15, 23, 42, 0.045) 1px, transparent 1px),
153
+ linear-gradient(to bottom, rgba(15, 23, 42, 0.045) 1px, transparent 1px);
154
+ background-size: 34px 34px;
155
+ -webkit-mask-image: radial-gradient(820px 460px at 50% -60px, rgba(0, 0, 0, 0.85), transparent 78%);
156
+ mask-image: radial-gradient(820px 460px at 50% -60px, rgba(0, 0, 0, 0.85), transparent 78%);
157
+ pointer-events: none;
158
+ }
159
+
160
+ .hero .container { position: relative; }
161
+
162
+ .hero h1 {
163
+ font-size: clamp(1.7rem, 4vw, 2.6rem);
164
+ line-height: 1.18;
165
+ letter-spacing: -0.022em;
166
+ font-weight: 800;
167
+ margin: 0 auto 28px;
168
+ max-width: 880px;
169
+ color: var(--ink-strong);
170
+ text-wrap: balance;
171
+ }
172
+
173
+ .hero h1 .hero-name { color: var(--accent); }
174
+ @supports ((-webkit-background-clip: text) or (background-clip: text)) {
175
+ .hero h1 .hero-name {
176
+ background: linear-gradient(115deg, #7c3aed 20%, #4f46e5 80%);
177
+ -webkit-background-clip: text;
178
+ background-clip: text;
179
+ -webkit-text-fill-color: transparent;
180
+ }
181
+ }
182
+
183
+ .authors {
184
+ font-size: 1.08rem;
185
+ font-weight: 500;
186
+ margin: 0 auto 6px;
187
+ max-width: 820px;
188
+ color: var(--ink);
189
+ }
190
+
191
+ .affiliation {
192
+ font-size: 0.97rem;
193
+ color: var(--muted);
194
+ margin-bottom: 0;
195
+ }
196
+
197
+ .venue { margin: 18px 0 30px; }
198
+
199
+ .venue-chip {
200
+ display: inline-block;
201
+ font-size: 0.85rem;
202
+ font-weight: 700;
203
+ letter-spacing: 0.04em;
204
+ color: var(--accent-dark);
205
+ background: var(--accent-soft);
206
+ border: 1px solid #ddd6fe;
207
+ border-radius: 999px;
208
+ padding: 5px 16px;
209
+ }
210
+
211
+ .button-row {
212
+ display: flex;
213
+ flex-wrap: wrap;
214
+ justify-content: center;
215
+ gap: 12px;
216
+ }
217
+
218
+ /* ---------- Buttons ---------- */
219
+
220
+ .btn {
221
+ display: inline-flex;
222
+ align-items: center;
223
+ gap: 8px;
224
+ padding: 10px 22px;
225
+ border-radius: 999px;
226
+ background: var(--ink-strong);
227
+ color: #ffffff;
228
+ text-decoration: none;
229
+ font-size: 0.96rem;
230
+ font-weight: 600;
231
+ border: 1px solid var(--ink-strong);
232
+ transition: background-color 0.18s ease, color 0.18s ease, border-color 0.18s ease,
233
+ transform 0.18s ease, box-shadow 0.18s ease;
234
+ }
235
+ .btn:hover {
236
+ background: #334155;
237
+ border-color: #334155;
238
+ color: #ffffff;
239
+ transform: translateY(-2px);
240
+ box-shadow: 0 6px 16px rgba(15, 23, 42, 0.16);
241
+ }
242
+ .btn:active { transform: translateY(0); box-shadow: none; }
243
+ .btn:focus-visible { outline: 3px solid var(--accent-soft); outline-offset: 2px; }
244
+
245
+ .btn .btn-ico { width: 15px; height: 15px; flex: none; opacity: 0.9; }
246
+
247
+ .btn-accent { background: var(--accent); border-color: var(--accent); }
248
+ .btn-accent:hover { background: var(--accent-dark); border-color: var(--accent-dark); }
249
+
250
+ .btn-outline {
251
+ background: #ffffff;
252
+ color: var(--accent-dark);
253
+ border-color: #c4b5fd;
254
+ }
255
+ .btn-outline:hover {
256
+ background: var(--accent);
257
+ border-color: var(--accent);
258
+ color: #ffffff;
259
+ box-shadow: 0 6px 16px rgba(109, 40, 217, 0.25);
260
+ }
261
+
262
+ .btn-ghost {
263
+ background: rgba(255, 255, 255, 0.7);
264
+ color: var(--ink);
265
+ border-color: var(--border);
266
+ }
267
+ .btn-ghost:hover {
268
+ background: #ffffff;
269
+ border-color: #cbd5e1;
270
+ color: var(--ink-strong);
271
+ box-shadow: 0 6px 16px rgba(15, 23, 42, 0.1);
272
+ }
273
+
274
+ /* ---------- Scroll-reveal (JS adds .js to <html>; no JS = always visible) ---------- */
275
+
276
+ html.js .reveal {
277
+ opacity: 0;
278
+ transform: translateY(16px);
279
+ transition: opacity 0.55s ease, transform 0.55s ease;
280
+ }
281
+ html.js .reveal.revealed {
282
+ opacity: 1;
283
+ transform: none;
284
+ }
285
+
286
+ /* Staggered grids: the container fades, children lift in one after another. */
287
+ html.js .reveal.stagger { transform: none; }
288
+ html.js .reveal.stagger > * {
289
+ opacity: 0;
290
+ transform: translateY(14px);
291
+ transition: opacity 0.5s ease, transform 0.5s ease, box-shadow 0.2s ease, border-color 0.2s ease;
292
+ }
293
+ html.js .reveal.stagger.revealed > * { opacity: 1; transform: none; }
294
+ html.js .reveal.stagger.revealed > :nth-child(2) {
295
+ transition: opacity 0.5s ease 0.12s, transform 0.5s ease 0.12s, box-shadow 0.2s ease 0s, border-color 0.2s ease 0s;
296
+ }
297
+ html.js .reveal.stagger.revealed > :nth-child(3) {
298
+ transition: opacity 0.5s ease 0.24s, transform 0.5s ease 0.24s, box-shadow 0.2s ease 0s, border-color 0.2s ease 0s;
299
+ }
300
+
301
+ /* ---------- Metric callout cards ---------- */
302
+
303
+ .metrics { padding: 8px 0 48px; }
304
+
305
+ .metric-grid {
306
+ display: grid;
307
+ grid-template-columns: repeat(3, 1fr);
308
+ gap: 20px;
309
+ }
310
+
311
+ .metric-card {
312
+ background: #ffffff;
313
+ border: 1px solid var(--border);
314
+ border-top: 3px solid var(--accent);
315
+ border-radius: 14px;
316
+ padding: 26px 22px 22px;
317
+ text-align: center;
318
+ box-shadow: var(--card-shadow);
319
+ transition: box-shadow 0.2s ease, border-color 0.2s ease;
320
+ }
321
+ .metric-card:hover { box-shadow: var(--card-shadow-lift); border-color: #cbd5e1; border-top-color: var(--accent); }
322
+
323
+ .metric-value {
324
+ font-size: 2.6rem;
325
+ font-weight: 700;
326
+ line-height: 1.1;
327
+ color: var(--accent);
328
+ letter-spacing: -0.02em;
329
+ }
330
+
331
+ .metric-label {
332
+ margin-top: 10px;
333
+ font-size: 0.96rem;
334
+ color: var(--ink);
335
+ }
336
+
337
+ .metric-sub {
338
+ margin-top: 6px;
339
+ font-size: 0.86rem;
340
+ color: var(--muted);
341
+ }
342
+
343
+ /* ---------- Showcase (the architecture figure inside Method) ---------- */
344
+ /* Breaks out of the 960px column, centered on the viewport — width/margin only,
345
+ no transform (transform belongs to the .reveal animation). */
346
+ figure.paper-figure.figure-hero {
347
+ width: min(1160px, calc(100vw - 48px));
348
+ margin-left: calc((100% - min(1160px, calc(100vw - 48px))) / 2);
349
+ }
350
+ figure.paper-figure.figure-hero img {
351
+ max-width: 100%;
352
+ padding: 14px;
353
+ border-radius: 18px;
354
+ border-color: #e2e8f0;
355
+ box-shadow: 0 10px 32px rgba(15, 23, 42, 0.10), 0 2px 8px rgba(15, 23, 42, 0.06);
356
+ }
357
+ figure.paper-figure.figure-hero img:hover {
358
+ box-shadow: 0 14px 40px rgba(109, 40, 217, 0.16), 0 3px 10px rgba(15, 23, 42, 0.08);
359
+ border-color: #c4b5fd;
360
+ }
361
+ figure.paper-figure.figure-hero figcaption { max-width: 900px; }
362
+
363
+ /* ---------- Figure 3 band (between abstract and method) ---------- */
364
+ .fig3-band { padding: 40px 0; }
365
+ .fig3-band figure.paper-figure { margin-top: 0; }
366
+
367
+ /* ---------- Figure 1 beside the abstract (unused fallback) ---------- */
368
+ .abstract-grid {
369
+ display: grid;
370
+ grid-template-columns: 1.15fr 0.62fr;
371
+ gap: 30px;
372
+ align-items: center;
373
+ }
374
+ .abstract-grid .abstract-card { max-width: none; margin: 0; }
375
+ figure.paper-figure.figure-side { margin: 0; }
376
+ figure.paper-figure.figure-side img { max-width: 100%; padding: 8px; }
377
+ figure.paper-figure.figure-side figcaption { font-size: 0.8rem; margin-top: 10px; }
378
+ @media (max-width: 880px) {
379
+ .abstract-grid { grid-template-columns: 1fr; }
380
+ figure.paper-figure.figure-side img { max-width: 420px; }
381
+ }
382
+
383
+ /* ---------- Abstract ---------- */
384
+
385
+ .abstract-card {
386
+ max-width: 800px;
387
+ margin: 0 auto;
388
+ background: var(--bg-alt, #f8fafc);
389
+ border: 1px solid var(--border);
390
+ border-left: 4px solid #6d28d9;
391
+ border-radius: 14px;
392
+ padding: 26px 32px;
393
+ }
394
+ .abstract-text {
395
+ margin: 0;
396
+ text-align: justify;
397
+ hyphens: auto;
398
+ line-height: 1.72;
399
+ }
400
+ @media (max-width: 640px) {
401
+ .abstract-card { padding: 18px 18px; }
402
+ .abstract-text { text-align: left; }
403
+ }
404
+
405
+ /* ---------- Paper figures ---------- */
406
+
407
+ figure.paper-figure {
408
+ margin: 26px auto 10px;
409
+ text-align: center;
410
+ }
411
+ figure.paper-figure img {
412
+ width: 100%;
413
+ max-width: 960px;
414
+ height: auto;
415
+ display: block;
416
+ margin: 0 auto;
417
+ background: #ffffff;
418
+ border: 1px solid var(--border);
419
+ border-radius: 14px;
420
+ padding: 10px;
421
+ transition: box-shadow 0.2s ease, border-color 0.2s ease;
422
+ }
423
+ figure.paper-figure img:hover { box-shadow: var(--card-shadow-lift); border-color: #cbd5e1; }
424
+ html.js figure.paper-figure img,
425
+ html.js .case-figure img { cursor: zoom-in; }
426
+ figure.paper-figure.figure-narrow img { max-width: 560px; }
427
+ figure.paper-figure.figure-medium img { max-width: 680px; }
428
+ figure.paper-figure .figure-stack img + img { margin-top: 14px; }
429
+ figure.paper-figure figcaption {
430
+ font-size: 0.88rem;
431
+ color: var(--muted);
432
+ text-align: center;
433
+ max-width: 820px;
434
+ margin: 12px auto 0;
435
+ }
436
+ figure.paper-figure figcaption .fig-tag {
437
+ font-weight: 600;
438
+ color: var(--ink);
439
+ }
440
+
441
+ .mech-grid {
442
+ display: grid;
443
+ grid-template-columns: repeat(3, 1fr);
444
+ gap: 20px;
445
+ margin-top: 34px;
446
+ }
447
+
448
+ .mech-card {
449
+ background: #ffffff;
450
+ border: 1px solid var(--border);
451
+ border-radius: 14px;
452
+ padding: 22px;
453
+ box-shadow: var(--card-shadow);
454
+ transition: box-shadow 0.2s ease, border-color 0.2s ease;
455
+ }
456
+ .mech-card:hover { box-shadow: var(--card-shadow-lift); border-color: #cbd5e1; }
457
+
458
+ .mech-card h3 {
459
+ margin: 0 0 10px;
460
+ font-size: 1.04rem;
461
+ color: var(--accent-dark);
462
+ }
463
+
464
+ .mech-card p { margin: 0; font-size: 0.94rem; color: var(--ink); }
465
+
466
+ .mech-num {
467
+ display: inline-flex;
468
+ align-items: center;
469
+ justify-content: center;
470
+ width: 26px;
471
+ height: 26px;
472
+ margin-bottom: 12px;
473
+ border-radius: 50%;
474
+ background: var(--accent-soft);
475
+ color: var(--accent-dark);
476
+ font-weight: 700;
477
+ font-size: 0.9rem;
478
+ }
479
+
480
+ .gradient-free {
481
+ margin: 30px auto 0;
482
+ max-width: 820px;
483
+ text-align: center;
484
+ font-size: 0.98rem;
485
+ background: var(--accent-faint);
486
+ border: 1px solid var(--accent-soft);
487
+ border-radius: 10px;
488
+ padding: 12px 18px;
489
+ color: var(--ink);
490
+ }
491
+
492
+ /* ---------- Tables ---------- */
493
+
494
+ .table-wrap { overflow-x: auto; margin: 20px 0 6px; }
495
+
496
+ table.results {
497
+ width: 100%;
498
+ border-collapse: collapse;
499
+ font-size: 0.94rem;
500
+ background: #ffffff;
501
+ }
502
+
503
+ table.results caption {
504
+ caption-side: top;
505
+ text-align: left;
506
+ font-weight: 600;
507
+ font-size: 1.02rem;
508
+ color: var(--ink-strong);
509
+ padding: 0 0 10px;
510
+ }
511
+
512
+ table.results th, table.results td {
513
+ padding: 8px 12px;
514
+ text-align: right;
515
+ border-bottom: 1px solid var(--border);
516
+ white-space: nowrap;
517
+ }
518
+
519
+ table.results th:first-child, table.results td:first-child { text-align: left; }
520
+
521
+ table.results thead th {
522
+ border-bottom: 2px solid var(--ink-strong);
523
+ color: var(--ink-strong);
524
+ font-weight: 600;
525
+ }
526
+
527
+ table.results tbody tr { transition: background-color 0.15s ease; }
528
+ table.results tbody tr:hover td { background: var(--bg-alt); }
529
+
530
+ table.results tr.ours td {
531
+ background: var(--accent-soft);
532
+ font-weight: 700;
533
+ color: var(--accent-dark);
534
+ }
535
+ table.results tr.ours:hover td { background: var(--accent-soft); }
536
+ table.results tr.ours td:first-child { border-left: 3px solid var(--accent); }
537
+
538
+ .table-note {
539
+ font-size: 0.86rem;
540
+ color: var(--muted);
541
+ margin: 8px 0 28px;
542
+ }
543
+
544
+ .takeaway {
545
+ font-size: 0.95rem;
546
+ margin: 10px 0 30px;
547
+ padding: 10px 16px;
548
+ background: var(--accent-faint);
549
+ border-left: 3px solid var(--accent);
550
+ border-radius: 0 8px 8px 0;
551
+ }
552
+
553
+ .ablation-block { margin-bottom: 8px; }
554
+
555
+ .block-title {
556
+ text-align: center;
557
+ margin-top: 44px;
558
+ font-size: 1.25rem;
559
+ }
560
+
561
+ .block-intro {
562
+ max-width: 820px;
563
+ margin: 0 auto 4px;
564
+ }
565
+
566
+ /* ---------- Efficiency & transfer ---------- */
567
+
568
+ .info-card {
569
+ background: #ffffff;
570
+ border: 1px solid var(--border);
571
+ border-radius: 14px;
572
+ padding: 24px;
573
+ box-shadow: var(--card-shadow);
574
+ transition: box-shadow 0.2s ease, border-color 0.2s ease;
575
+ }
576
+ .info-card:hover { box-shadow: var(--card-shadow-lift); border-color: #cbd5e1; }
577
+ .info-card h3 { margin: 0 0 10px; font-size: 1.08rem; }
578
+ .info-card p { margin: 0 0 10px; font-size: 0.96rem; }
579
+ .info-card p:last-child { margin-bottom: 0; }
580
+
581
+ .info-card-solo { max-width: 820px; margin: 18px auto 34px; }
582
+
583
+ /* ---------- Case study band ---------- */
584
+
585
+ .band-label {
586
+ display: inline-block;
587
+ font-size: 0.84rem;
588
+ font-weight: 600;
589
+ letter-spacing: 0.02em;
590
+ color: #92400e;
591
+ background: #fef3c7;
592
+ border: 1px solid #fde68a;
593
+ border-radius: 999px;
594
+ padding: 5px 14px;
595
+ margin-bottom: 18px;
596
+ }
597
+
598
+ .case-figure { margin: 18px 0; text-align: center; }
599
+ .case-figure img {
600
+ width: 100%;
601
+ max-width: 860px;
602
+ height: auto;
603
+ border: 1px solid var(--border);
604
+ border-radius: 14px;
605
+ background: #ffffff;
606
+ transition: box-shadow 0.2s ease, border-color 0.2s ease;
607
+ }
608
+ .case-figure img:hover { box-shadow: var(--card-shadow-lift); border-color: #cbd5e1; }
609
+
610
+ .case-text { max-width: 820px; margin: 0 auto 22px; }
611
+
612
+ .case-actions {
613
+ display: flex;
614
+ flex-wrap: wrap;
615
+ justify-content: center;
616
+ align-items: center;
617
+ gap: 18px;
618
+ }
619
+ .case-actions .aux-link { font-size: 0.95rem; }
620
+
621
+ #case-study { text-align: center; }
622
+ #case-study .case-text { text-align: left; }
623
+
624
+ /* ---------- Lightbox (created by JS on demand) ---------- */
625
+
626
+ .lightbox {
627
+ position: fixed;
628
+ inset: 0;
629
+ z-index: 100;
630
+ display: flex;
631
+ align-items: center;
632
+ justify-content: center;
633
+ padding: 30px;
634
+ background: rgba(15, 23, 42, 0.84);
635
+ opacity: 0;
636
+ visibility: hidden;
637
+ transition: opacity 0.2s ease, visibility 0.2s ease;
638
+ cursor: zoom-out;
639
+ }
640
+ .lightbox.open { opacity: 1; visibility: visible; }
641
+
642
+ .lightbox img {
643
+ max-width: min(1200px, 100%);
644
+ max-height: 92vh;
645
+ width: auto;
646
+ height: auto;
647
+ background: #ffffff;
648
+ border-radius: 10px;
649
+ padding: 8px;
650
+ box-shadow: 0 24px 70px rgba(0, 0, 0, 0.45);
651
+ }
652
+
653
+ .lightbox-close {
654
+ position: absolute;
655
+ top: 14px;
656
+ right: 18px;
657
+ width: 40px;
658
+ height: 40px;
659
+ border: 1px solid rgba(255, 255, 255, 0.35);
660
+ border-radius: 50%;
661
+ background: rgba(15, 23, 42, 0.5);
662
+ color: #f1f5f9;
663
+ font-size: 1.35rem;
664
+ line-height: 1;
665
+ cursor: pointer;
666
+ transition: background-color 0.15s ease, border-color 0.15s ease;
667
+ }
668
+ .lightbox-close:hover { background: rgba(51, 65, 85, 0.85); border-color: rgba(255, 255, 255, 0.6); }
669
+ .lightbox-close:focus-visible { outline: 3px solid var(--accent-soft); outline-offset: 2px; }
670
+
671
+ /* ---------- BibTeX ---------- */
672
+
673
+ .bibtex-box { position: relative; max-width: 860px; margin: 0 auto; }
674
+
675
+ .bibtex-box pre {
676
+ background: #0f172a;
677
+ color: #e2e8f0;
678
+ border-radius: 14px;
679
+ padding: 24px 26px;
680
+ overflow-x: auto;
681
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
682
+ font-size: 0.86rem;
683
+ line-height: 1.55;
684
+ margin: 0;
685
+ }
686
+
687
+ .copy-btn {
688
+ position: absolute;
689
+ top: 12px;
690
+ right: 12px;
691
+ background: #334155;
692
+ color: #e2e8f0;
693
+ border: 1px solid #475569;
694
+ border-radius: 8px;
695
+ padding: 6px 14px;
696
+ font-size: 0.84rem;
697
+ font-family: inherit;
698
+ cursor: pointer;
699
+ transition: background-color 0.15s ease;
700
+ }
701
+ .copy-btn:hover { background: #475569; }
702
+
703
+ /* ---------- Footer ---------- */
704
+
705
+ footer {
706
+ border-top: 1px solid var(--border);
707
+ padding: 30px 0 38px;
708
+ text-align: center;
709
+ font-size: 0.9rem;
710
+ color: var(--muted);
711
+ }
712
+
713
+ /* ---------- Responsive ---------- */
714
+
715
+ @media (max-width: 760px) {
716
+ section { padding: 42px 0; }
717
+ .hero { padding: 60px 0 46px; }
718
+ .metric-grid, .mech-grid { grid-template-columns: 1fr; }
719
+ .metric-value { font-size: 2.2rem; }
720
+ body { font-size: 16px; }
721
+ .topnav-inner { gap: 12px; padding: 0 16px; }
722
+ }
723
+
724
+ /* ---------- Reduced motion: no animation, everything visible ---------- */
725
+
726
+ @media (prefers-reduced-motion: reduce) {
727
+ html { scroll-behavior: auto; }
728
+ html.js .reveal,
729
+ html.js .reveal.stagger > * {
730
+ opacity: 1;
731
+ transform: none;
732
+ }
733
+ *, *::before, *::after {
734
+ transition: none !important;
735
+ animation: none !important;
736
+ }
737
+ .btn:hover { transform: none; }
738
+ }
739
+
740
+ /* 4-card mechanism grid: 2x2 on desktop, single column on narrow screens.
741
+ (Kept after the responsive block above so the narrow-screen override below
742
+ must also live here — same specificity, source order decides.) */
743
+ .mech-grid.mech-grid-4 { grid-template-columns: repeat(2, 1fr); }
744
+ @media (max-width: 760px) {
745
+ .mech-grid.mech-grid-4 { grid-template-columns: 1fr; }
746
+ }