Upload folder using huggingface_hub
Browse files- .gitattributes +7 -0
- demo.html +384 -0
- index.html +380 -18
- static/demo_data.js +1 -0
- static/paper/ablation_pruning.png +3 -0
- static/paper/architecture.png +3 -0
- static/paper/case_study.png +3 -0
- static/paper/case_study_medical.png +3 -0
- static/paper/case_study_reasoning.png +3 -0
- static/paper/comparison.png +3 -0
- static/paper/efficiency.png +3 -0
- static/style.css +746 -0
.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">← 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, τ<sub>pre</sub> 0.3, τ<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 (←)">◀ Prev</button>
|
| 197 |
+
<button id="btnNext" title="next step (→)">Next ▶</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: ← / → 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 |
+
· <a href="index.html">Project page</a>
|
| 210 |
+
· <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, "&").replace(/</g, "<").replace(/>/g, ">");
|
| 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 · 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 += " — 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 — CANDIDATES & PRE-EVALUATION (τ<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) : "—") + "</td><td class='num'>" +
|
| 275 |
+
(c.r_pre == null ? "—" : 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 — 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 (τ<sub>post</sub> = " + num(s.tau_post) + ")</span>";
|
| 291 |
+
h += "<div class='secline'>r_post = <b>" + num(s.r_post) + "</b> → " +
|
| 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> → 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 · 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 — 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 & 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 </span><span class='v'>" + num(s.reward) + "</span></span>" +
|
| 342 |
+
"<span><span class='k'>rollouts used </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 |
-
<!
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 · 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 · m&m · ToolBench · 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’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 & 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> · <a href="https://huggingface.co/datasets/Jize1/GTA" target="_blank" rel="noopener">HF dataset</a></td></tr>
|
| 199 |
+
<tr><td>m&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> · <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 & 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 |
+
© 2026 the authors · The University of Melbourne · The University of Western Australia · 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 = '×';
|
| 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
|
static/paper/architecture.png
ADDED
|
Git LFS Details
|
static/paper/case_study.png
ADDED
|
Git LFS Details
|
static/paper/case_study_medical.png
ADDED
|
Git LFS Details
|
static/paper/case_study_reasoning.png
ADDED
|
Git LFS Details
|
static/paper/comparison.png
ADDED
|
Git LFS Details
|
static/paper/efficiency.png
ADDED
|
Git LFS Details
|
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 |
+
}
|