diff --git a/README.md b/README.md index 47fd603..c9ee89d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # NuBench +**Website:** [graphnet-team.github.io/NuBench](https://graphnet-team.github.io/NuBench/) — interactive leaderboard, dataset downloads, and citation info. + This repository provides access to datasets, model predictions, and model artifacts for the NuBench dataset catalogue presented in [NuBench: An Open Benchmark for Deep Learning–Based Event Reconstruction in Neutrino Telescopes](https://arxiv.org/pdf/2511.13111). Datasets are available in two formats (SQLite and Parquet) - users may choose their preferred format. --- diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/docs/app.js b/docs/app.js new file mode 100644 index 0000000..90a35c7 --- /dev/null +++ b/docs/app.js @@ -0,0 +1,541 @@ +/* NuBench site — all rendering is driven by the NB object in data.js. */ +"use strict"; + +const $ = (sel, el = document) => el.querySelector(sel); +const SVG_NS = "http://www.w3.org/2000/svg"; + +/* ---------- task definitions ---------- + Column layout mirrors the paper's tables (2–6). `pair: true` marks + direction-style cells holding separate CC / NC values. */ +const TASKS = { + energy: { + label: "Energy", + desc: "Reconstruction of neutrino energy. Bias is the median percentage error (Etrue − Ereco)/Etrue × 100; σ is the 84th–16th percentile width of that error, both per true-energy range and including CC and NC events.", + takeaway: "ParticleNeT and DynEdge trade the lead across datasets; differences are mostly marginal, with GRIT slightly behind on the small geometries.", + groups: [ + { label: "E ≤ 10² GeV", cols: ["Bias [%]", "σ [%]"] }, + { label: "10² – 10³ GeV", cols: ["Bias [%]", "σ [%]"] }, + { label: "10³ – 10⁵ GeV", cols: ["Bias [%]", "σ [%]"] }, + ], + chart: { col: 3, label: "Energy resolution σ [%] · 10²–10³ GeV", better: "lower" }, + }, + direction: { + label: "Direction", + pair: true, + desc: "Reconstruction of the neutrino arrival direction. ψ is the opening angle between true and reconstructed direction; each cell reports νμ CC / νμ NC events separately.", + takeaway: "DeepIce leads on most geometries, at ~100× the parameter count; GRIT takes the sparse Triangle array and the ice dataset.", + groups: [ + { label: "E ≤ 10³ GeV · CC / NC", cols: ["ψ median [°]", "ψ ≤ 1° [%]", "ψ ≤ 5° [%]"] }, + { label: "10³ – 10⁵ GeV · CC / NC", cols: ["ψ median [°]", "ψ ≤ 1° [%]", "ψ ≤ 5° [%]"] }, + ], + chart: { col: 0, cc: true, label: "Median opening angle ψ [°] · νμ CC, E ≤ 10³ GeV", better: "lower" }, + }, + classification: { + label: "Track / Cascade", + desc: "Binary classification of event topology — track-like versus cascade-like — reported as ROC AUC, overall and per true-energy range.", + takeaway: "No single winner: GRIT leads on four datasets, ParticleNeT and DynEdge split the rest; separation is hardest at low energy everywhere.", + groups: [ + { label: "", cols: ["AUC (all E)"] }, + { label: "", cols: ["AUC · E ≤ 10²"] }, + { label: "", cols: ["AUC · 10²–10³"] }, + { label: "", cols: ["AUC · 10³–10⁵"] }, + ], + chart: { col: 0, label: "ROC AUC · all energies", better: "higher", ymin: 0.5 }, + }, + vertex: { + label: "Vertex", + desc: "Localization of the neutrino interaction vertex. Dxyz is the median Euclidean distance between true and reconstructed vertex; Dz and Dxy are its depth and radial components.", + takeaway: "DynEdge dominates vertex reconstruction, achieving the smallest distances on every dataset — often by a factor of 2–3.", + groups: [ + { label: "E ≤ 10³ GeV", cols: ["Dxyz [m]", "|Dz| [m]", "Dxy [m]"] }, + { label: "10³ – 10⁵ GeV", cols: ["Dxyz [m]", "|Dz| [m]", "Dxy [m]"] }, + ], + chart: { col: 0, label: "Median vertex distance Dxyz [m] · E ≤ 10³ GeV", better: "lower" }, + }, + inelasticity: { + label: "Inelasticity", + desc: "Estimation of the interaction inelasticity y — the fraction of neutrino energy transferred to the hadronic system. Reported are the median residual Ry and its 84th–16th percentile width σ, on νμ CC events.", + takeaway: "DynEdge is the most reliable at low energy, where inelasticity is hardest; above 1 TeV the three models converge.", + groups: [ + { label: "10 – 10² GeV", cols: ["Median Ry", "σ"] }, + { label: "10² – 10³ GeV", cols: ["Median Ry", "σ"] }, + { label: "10³ – 10⁵ GeV", cols: ["Median Ry", "σ"] }, + ], + chart: { col: 3, label: "Resolution σ of Ry · 10²–10³ GeV", better: "lower" }, + }, +}; + +/* Figures rendered from the paper's own PDFs (docs/assets/figures). An + artifact/preview build may define window.NB_FIG_SRC to swap in inlined + images instead of file paths. */ +const FIGURES = { + energy: [ + { file: "energy_he", caption: "Energy reconstruction on the five full-range datasets, split into νμ CC and νμ NC events. The diagonal denotes ideal reconstruction; shaded bands span the 16th–84th percentile of the reconstructed energy." }, + { file: "energy_le", caption: "Energy reconstruction on the two low-energy datasets, Flower S and Hexagon Ice LE." }, + ], + direction: [ + { file: "direction_he", caption: "Direction reconstruction on the five high-energy datasets: median opening angle as a function of neutrino energy, and the distribution of opening angles below 5°." }, + { file: "direction_le", caption: "Direction reconstruction on the two low-energy datasets, Flower S and Hexagon Ice LE." }, + ], + classification: [ + { file: "tc_roc", caption: "ROC curves for track/cascade classification on the seven datasets." }, + { file: "tc_scores", caption: "Distribution of classification scores on true track events — scores near 1 indicate confident track classification, scores near 0 confident cascade classification." }, + ], + vertex: [ + { file: "vertex_distance", caption: "Median Euclidean distance between true and reconstructed vertex as a function of neutrino energy (solid: νμ CC, dotted: νμ NC)." }, + { file: "vertex_contours", caption: "Vertex error contours: markers show the median error, contours the 68% quantile. Smaller areas mean lower variance; centers close to zero mean less bias." }, + ], + inelasticity: [ + { file: "inelasticity", caption: "Reconstruction of visible inelasticity on the six water-based datasets." }, + ], +}; + +const state = { task: "energy", dataset: {} }; + +/* ---------- helpers ---------- */ + +function el(tag, attrs = {}, ...children) { + const node = tag.includes(":svg") + ? document.createElementNS(SVG_NS, tag.replace(":svg", "")) + : document.createElement(tag); + for (const [k, v] of Object.entries(attrs)) { + if (k === "class") node.setAttribute("class", v); + else if (k.startsWith("on")) node.addEventListener(k.slice(2), v); + else node.setAttribute(k, v); + } + for (const c of children) { + if (c == null) continue; + node.append(c.nodeType ? c : document.createTextNode(c)); + } + return node; +} + +function svgEl(tag, attrs = {}, ...children) { + const node = document.createElementNS(SVG_NS, tag); + for (const [k, v] of Object.entries(attrs)) node.setAttribute(k, v); + for (const c of children) node.append(c.nodeType ? c : document.createTextNode(c)); + return node; +} + +const fmt = (v) => String(v); + +/* ---------- geometry art (top-down detector layouts) ---------- */ + +function phyllotaxis(n) { + const pts = []; + const golden = Math.PI * (3 - Math.sqrt(5)); + for (let i = 0; i < n; i++) { + const r = Math.sqrt((i + 0.5) / n); + const t = i * golden; + pts.push([r * Math.cos(t), r * Math.sin(t)]); + } + return pts; +} + +function hexLattice() { + // schematic hexagonal array with a denser infill near the center, + // echoing IceCube's main array + DeepCore + const pts = []; + for (let q = -5; q <= 5; q++) { + for (let r = Math.max(-5, -q - 5); r <= Math.min(5, -q + 5); r++) { + const x = q + r / 2; + const y = (r * Math.sqrt(3)) / 2; + pts.push([x / 5.2, y / 5.2]); + } + } + const infill = phyllotaxis(8).map(([x, y]) => [x * 0.16 + 0.05, y * 0.16 + 0.04]); + return { main: pts, infill }; +} + +function geometryArt(kind, nStrings, size = 130) { + const svg = svgEl("svg", { + width: size, height: size, + viewBox: "-1.15 -1.15 2.3 2.3", + "aria-hidden": "true", + }); + const dot = (x, y, r, cls = "gdot") => + svg.append(svgEl("circle", { cx: x.toFixed(3), cy: y.toFixed(3), r, class: cls })); + + if (kind === "sunflower") { + const r = nStrings > 600 ? 0.013 : nStrings > 120 ? 0.05 : 0.055; + for (const [x, y] of phyllotaxis(nStrings)) dot(x, y, r); + } else if (kind === "hexagon") { + const { main, infill } = hexLattice(); + for (const [x, y] of main) dot(x, y, 0.055); + for (const [x, y] of infill) dot(x, y, 0.028, "gdot infill"); + } else if (kind === "cluster") { + dot(0, 0, 0.09); + for (let i = 0; i < 7; i++) { + const t = (i / 7) * 2 * Math.PI - Math.PI / 2; + dot(0.62 * Math.cos(t), 0.62 * Math.sin(t), 0.09); + } + } else if (kind === "triangle") { + for (let i = 0; i < 3; i++) { + const t = (i / 3) * 2 * Math.PI - Math.PI / 2; + dot(0.6 * Math.cos(t), 0.6 * Math.sin(t), 0.11); + } + } + return svg; +} + +/* ---------- hero background ---------- */ + +function renderHeroArt() { + const host = $("#hero-art"); + const size = 780; + const svg = svgEl("svg", { + width: size, height: size, + viewBox: "-1.05 -1.05 2.1 2.1", + "aria-hidden": "true", + }); + const pts = phyllotaxis(640); + pts.forEach(([x, y], i) => { + const r = Math.hypot(x, y); + const c = svgEl("circle", { + cx: x.toFixed(3), cy: y.toFixed(3), + r: 0.008, + fill: "currentColor", + opacity: (0.28 * (1 - 0.75 * r)).toFixed(3), + }); + if (i % 37 === 0) c.setAttribute("class", "twinkle"); + svg.append(c); + }); + svg.style.color = "var(--accent)"; + host.append(svg); +} + +/* ---------- leaderboard ---------- */ + +function renderTabs() { + const host = $("#task-tabs"); + host.replaceChildren(); + for (const [key, t] of Object.entries(TASKS)) { + host.append(el("button", { + class: "task-tab" + (state.task === key ? " active" : ""), + onclick: () => { state.task = key; renderLeaderboard(); }, + }, t.label)); + } +} + +function availableModels(taskKey, dsKey) { + const ds = NB.results[taskKey][dsKey] || {}; + return NB.modelOrder.filter((m) => m in ds); +} + +function renderLegend(models) { + const box = el("div", { class: "legend" }); + for (const m of models) { + box.append(el("span", { class: "item" }, + el("span", { class: "dot", style: `background:${NB.models[m].color}` }), + NB.models[m].name)); + } + return box; +} + +function chartValue(taskKey, dsKey, model) { + const t = TASKS[taskKey]; + const row = (NB.results[taskKey][dsKey] || {})[model]; + if (!row) return null; + let cell = row[t.chart.col]; + if (cell == null) return null; + if (t.pair) cell = t.chart.cc ? cell.cc : cell.nc; + return cell ? cell.v : null; +} + +function renderChart(taskKey) { + const t = TASKS[taskKey]; + const dsKeys = NB.datasetOrder.filter((d) => d in NB.results[taskKey]); + const models = NB.modelOrder.filter((m) => + dsKeys.some((d) => m in NB.results[taskKey][d])); + + const W = 980, H = 300; + const pad = { l: 56, r: 10, t: 14, b: 34 }; + const pw = W - pad.l - pad.r, ph = H - pad.t - pad.b; + + let vmax = 0; + for (const d of dsKeys) for (const m of models) { + const v = chartValue(taskKey, d, m); + if (v != null && v > vmax) vmax = v; + } + const ymin = t.chart.ymin ?? 0; + // round tick step (1/2/2.5/5 × 10^k) targeting ~5 intervals + const rawStep = (vmax - ymin) / 5; + const mag = 10 ** Math.floor(Math.log10(rawStep)); + let step = mag, nTicks = 99; + for (const m of [1, 2, 2.5, 5, 10]) { + const s = m * mag; + const n = Math.ceil((vmax * 1.02 - ymin) / s); + if (Math.abs(n - 5) < Math.abs(nTicks - 5)) { step = s; nTicks = n; } + } + const ymax = ymin + step * nTicks; + const y = (v) => pad.t + ph * (1 - (v - ymin) / (ymax - ymin)); + + const svg = svgEl("svg", { + viewBox: `0 0 ${W} ${H}`, width: "100%", role: "img", + style: "min-width:720px", + }); + + for (let i = 0; i <= nTicks; i++) { + const v = ymin + step * i; + const yy = y(v); + svg.append(svgEl("line", { + x1: pad.l, x2: W - pad.r, y1: yy, y2: yy, + stroke: "var(--grid-line)", "stroke-width": 1, + })); + svg.append(svgEl("text", { + x: pad.l - 8, y: yy + 4, "text-anchor": "end", + "font-size": 11, fill: "var(--text-faint)", + }, +v.toFixed(6))); + } + + const groupW = pw / dsKeys.length; + const barW = Math.min(20, (groupW * 0.72) / models.length); + + dsKeys.forEach((d, gi) => { + const present = models.filter((m) => chartValue(taskKey, d, m) != null); + const total = present.length * barW; + const x0 = pad.l + gi * groupW + (groupW - total) / 2; + present.forEach((m, bi) => { + const v = chartValue(taskKey, d, m); + const yy = y(v); + const bar = svgEl("rect", { + x: (x0 + bi * barW + 1).toFixed(1), + y: yy.toFixed(1), + width: (barW - 2).toFixed(1), + height: Math.max(1.5, pad.t + ph - yy).toFixed(1), + rx: 2.5, + fill: NB.models[m].color, + }); + bar.append(svgEl("title", {}, `${NB.models[m].name} · ${NB.datasets[d].name}: ${v}`)); + svg.append(bar); + }); + svg.append(svgEl("text", { + x: pad.l + gi * groupW + groupW / 2, + y: H - 12, "text-anchor": "middle", + "font-size": 11.5, fill: "var(--text-muted)", + }, NB.datasets[d].name)); + }); + + svg.append(svgEl("line", { + x1: pad.l, x2: W - pad.r, y1: pad.t + ph, y2: pad.t + ph, + stroke: "var(--border-strong)", "stroke-width": 1, + })); + + return svg; +} + +function scalarCell(cell) { + const td = el("td", { class: "num" }); + if (cell == null) { td.textContent = "—"; return td; } + const span = el("span", { class: cell.b ? "best" : "" }, fmt(cell.v)); + td.append(span); + if (cell.e != null) td.append(el("span", { class: "err" }, ` ±${fmt(cell.e)}`)); + return td; +} + +function pairCell(cell) { + const td = el("td", { class: "num" }); + if (cell == null) { td.textContent = "—"; return td; } + const side = (s) => s == null + ? "—" + : el("span", { class: s.b ? "best" : "" }, fmt(s.v)); + td.append(side(cell.cc), el("span", { class: "err" }, " / "), side(cell.nc)); + return td; +} + +function renderTable(taskKey, dsKey) { + const t = TASKS[taskKey]; + const models = availableModels(taskKey, dsKey); + const table = el("table", { class: "results" }); + + const thead = el("thead"); + const hasGroups = t.groups.some((g) => g.label); + if (hasGroups) { + const tr = el("tr", { class: "groups" }, el("th")); + for (const g of t.groups) { + tr.append(el("th", { colspan: g.cols.length, class: g.label ? "group" : "" }, g.label)); + } + thead.append(tr); + } + const tr2 = el("tr", {}, el("th", {}, "Model")); + for (const g of t.groups) for (const c of g.cols) { + const th = el("th"); + th.innerHTML = c; + tr2.append(th); + } + thead.append(tr2); + table.append(thead); + + const tbody = el("tbody"); + for (const m of models) { + const row = NB.results[taskKey][dsKey][m]; + const tr = el("tr", {}, + el("td", { class: "model" }, + el("span", { class: "dot", style: `background:${NB.models[m].color}` }), + NB.models[m].name)); + for (const cell of row) tr.append(t.pair ? pairCell(cell) : scalarCell(cell)); + tbody.append(tr); + } + table.append(tbody); + return table; +} + +function renderLeaderboard() { + renderTabs(); + const t = TASKS[state.task]; + $("#task-desc").innerHTML = t.desc; + $("#task-takeaway").textContent = t.takeaway; + + const dsKeys = NB.datasetOrder.filter((d) => d in NB.results[state.task]); + if (!dsKeys.includes(state.dataset[state.task])) state.dataset[state.task] = dsKeys[0]; + const active = state.dataset[state.task]; + + // chart panel + const chartPanel = $("#chart-panel"); + const chartTitle = el("span"); + chartTitle.innerHTML = t.chart.label; + const chartParts = [ + el("div", { class: "panel-head" }, + el("div", { class: "panel-title" }, + chartTitle, + el("span", { class: "dir" }, + t.chart.better === "lower" ? "lower is better ↓" : "higher is better ↑")), + renderLegend(NB.modelOrder.filter((m) => + dsKeys.some((d) => m in NB.results[state.task][d])))), + el("div", { class: "chart-scroll" }, renderChart(state.task)), + ]; + if (t.chart.ymin) { + chartParts.push(el("div", { class: "chart-note" }, + "Axis starts at 0.5 — the AUC of a random classifier.")); + } + chartPanel.replaceChildren(...chartParts); + + // table panel + const chips = el("div", { class: "chip-row" }); + for (const d of dsKeys) { + chips.append(el("button", { + class: "chip" + (d === active ? " active" : ""), + onclick: () => { state.dataset[state.task] = d; renderLeaderboard(); }, + }, NB.datasets[d].name)); + } + const tablePanel = $("#table-panel"); + tablePanel.replaceChildren( + chips, + el("div", { class: "table-scroll" }, renderTable(state.task, active)), + el("div", { class: "tbl-note" }, + "Values as reported in the paper; ", + el("span", { class: "mono", style: "color:var(--best);font-weight:700" }, "highlighted"), + " marks the best model per metric (including statistical ties). Uncertainties are one bootstrap standard deviation. — indicates the model was not evaluated.") + ); + + renderFigures(state.task); +} + +function renderFigures(taskKey) { + const panel = $("#figures-panel"); + const figs = FIGURES[taskKey] || []; + const inlined = typeof window !== "undefined" && window.NB_FIG_SRC; + const grid = el("div", { class: "fig-grid" }); + for (const f of figs) { + const src = inlined ? window.NB_FIG_SRC[f.file] : `assets/figures/${f.file}.png`; + const img = el("img", { src, alt: f.caption, loading: "lazy" }); + // data: URIs can't be opened in a new tab, so only link real files + const frame = el("div", { class: "fig-frame" }, + inlined ? img : el("a", { href: src, target: "_blank", rel: "noopener" }, img)); + grid.append(el("figure", { class: "figure" }, frame, + el("figcaption", {}, f.caption))); + } + panel.replaceChildren( + el("div", { class: "panel-head" }, + el("div", { class: "panel-title" }, "Figures from the paper"), + el("div", { class: "legend" }, + el("span", { class: "item" }, "Model colors follow the paper's own scheme"))), + grid); +} + +/* ---------- datasets ---------- */ + +function renderDatasets() { + const host = $("#ds-grid"); + for (const key of NB.datasetOrder) { + const d = NB.datasets[key]; + const art = el("div", { class: "ds-art" }, + geometryArt(d.geo, d.strings), + el("span", { class: "scale" }, `${d.spacing} string spacing`)); + + const stats = el("div", { class: "ds-stats" }, + el("div", { class: "ds-stat" }, el("div", { class: "k" }, "Events"), el("div", { class: "v" }, d.events)), + el("div", { class: "ds-stat" }, el("div", { class: "k" }, "Strings · OMs"), el("div", { class: "v" }, `${d.strings} · ${d.oms.toLocaleString("en-US")}`)), + el("div", { class: "ds-stat" }, el("div", { class: "k" }, "Energy range"), el("div", { class: "v" }, d.erange)), + el("div", { class: "ds-stat" }, el("div", { class: "k" }, "νμ CC / NC [%]"), el("div", { class: "v" }, d.ccnc))); + + const links = el("div", { class: "ds-links" }); + const linkNames = { sqlite: "SQLite", parquet: "Parquet", predictions: "Predictions", artifacts: "Model artifacts" }; + for (const [k, label] of Object.entries(linkNames)) { + links.append(el("a", { href: d.links[k], target: "_blank", rel: "noopener" }, label + " ↓")); + } + + host.append(el("article", { class: "ds-card" }, + art, + el("div", { class: "ds-body" }, + el("div", { class: "ds-title-row" }, + el("h3", { class: "ds-title" }, d.name), + el("span", { class: "badge" }, d.inspiration), + el("span", { class: `badge ${d.medium.toLowerCase()}` }, d.medium)), + stats, links))); + } +} + +/* ---------- models ---------- */ + +function renderModels() { + const host = $("#model-grid"); + for (const key of NB.modelOrder) { + const m = NB.models[key]; + host.append(el("article", { class: "model-card", style: `--mc:${m.color}` }, + el("div", { class: "model-head" }, + el("h3", { class: "model-name" }, m.name), + el("span", { class: "model-params mono" }, m.params + " params")), + el("div", { class: "model-tags" }, + el("span", {}, m.paradigm), + el("span", {}, m.repr + " input")), + el("p", { class: "model-desc" }, m.desc), + el("a", { class: "model-src", href: m.src, target: "_blank", rel: "noopener" }, + "Source in GraphNeT →"))); + } +} + +/* ---------- misc ---------- */ + +function setupTheme() { + const root = document.documentElement; + const stored = localStorage.getItem("nb-theme"); + if (stored) root.dataset.theme = stored; + else if (!root.dataset.theme) root.dataset.theme = "dark"; + $("#theme-toggle").addEventListener("click", () => { + root.dataset.theme = root.dataset.theme === "dark" ? "light" : "dark"; + localStorage.setItem("nb-theme", root.dataset.theme); + }); +} + +function setupCopy() { + document.querySelectorAll("[data-copy]").forEach((btn) => { + btn.addEventListener("click", async () => { + const text = $(btn.dataset.copy).textContent; + try { + await navigator.clipboard.writeText(text); + btn.textContent = "Copied ✓"; + } catch { + btn.textContent = "Select & copy"; + } + setTimeout(() => { btn.textContent = "Copy"; }, 1600); + }); + }); +} + +renderHeroArt(); +renderLeaderboard(); +renderDatasets(); +renderModels(); +setupTheme(); +setupCopy(); diff --git a/docs/assets/figures/direction_he.png b/docs/assets/figures/direction_he.png new file mode 100644 index 0000000..21086ff Binary files /dev/null and b/docs/assets/figures/direction_he.png differ diff --git a/docs/assets/figures/direction_le.png b/docs/assets/figures/direction_le.png new file mode 100644 index 0000000..7282880 Binary files /dev/null and b/docs/assets/figures/direction_le.png differ diff --git a/docs/assets/figures/energy_he.png b/docs/assets/figures/energy_he.png new file mode 100644 index 0000000..68446f8 Binary files /dev/null and b/docs/assets/figures/energy_he.png differ diff --git a/docs/assets/figures/energy_le.png b/docs/assets/figures/energy_le.png new file mode 100644 index 0000000..f13fa3e Binary files /dev/null and b/docs/assets/figures/energy_le.png differ diff --git a/docs/assets/figures/inelasticity.png b/docs/assets/figures/inelasticity.png new file mode 100644 index 0000000..c7f10e3 Binary files /dev/null and b/docs/assets/figures/inelasticity.png differ diff --git a/docs/assets/figures/tc_roc.png b/docs/assets/figures/tc_roc.png new file mode 100644 index 0000000..240c3ae Binary files /dev/null and b/docs/assets/figures/tc_roc.png differ diff --git a/docs/assets/figures/tc_scores.png b/docs/assets/figures/tc_scores.png new file mode 100644 index 0000000..808c1f0 Binary files /dev/null and b/docs/assets/figures/tc_scores.png differ diff --git a/docs/assets/figures/vertex_contours.png b/docs/assets/figures/vertex_contours.png new file mode 100644 index 0000000..a50f2c7 Binary files /dev/null and b/docs/assets/figures/vertex_contours.png differ diff --git a/docs/assets/figures/vertex_distance.png b/docs/assets/figures/vertex_distance.png new file mode 100644 index 0000000..f9969a3 Binary files /dev/null and b/docs/assets/figures/vertex_distance.png differ diff --git a/docs/data.js b/docs/data.js new file mode 100644 index 0000000..9a90226 --- /dev/null +++ b/docs/data.js @@ -0,0 +1,3617 @@ +// Generated from the NuBench paper (arXiv:2511.13111) LaTeX sources. +// Results tables were parsed programmatically; bold flags (b) mark the +// best model per metric as designated in the paper (incl. statistical ties). +const NB = { + "paper": "https://arxiv.org/abs/2511.13111", + "repo": "https://github.com/graphnet-team/NuBench", + "graphnet": "https://github.com/graphnet-team/graphnet", + "modelOrder": [ + "particlenet", + "dynedge", + "grit", + "deepice" + ], + "models": { + "particlenet": { + "name": "ParticleNeT", + "params": "0.3M", + "paradigm": "GNN", + "repr": "Graph", + "color": "#8b95a5", + "desc": "Dynamic graph CNN operating on point clouds, adapted from jet tagging. In active use within the KM3NeT collaboration.", + "src": "https://github.com/graphnet-team/graphnet/blob/main/src/graphnet/models/gnn/particlenet.py" + }, + "dynedge": { + "name": "DynEdge", + "params": "1.3M", + "paradigm": "GNN", + "repr": "Graph", + "color": "#a78bfa", + "desc": "Graph neural network built on dynamic edge convolutions, developed and used within the IceCube collaboration.", + "src": "https://github.com/graphnet-team/graphnet/blob/main/src/graphnet/models/gnn/dynedge.py" + }, + "grit": { + "name": "GRIT", + "params": "8.8M", + "paradigm": "GNN + Transformer", + "repr": "Graph", + "color": "#34d399", + "desc": "Graph transformer combining graph representations with attention, bridging GNN- and transformer-based methods. Not trained on Flower S due to computational cost.", + "src": "https://github.com/graphnet-team/graphnet/blob/main/src/graphnet/models/gnn/grit.py" + }, + "deepice": { + "name": "DeepIce", + "params": "114M", + "paradigm": "Transformer", + "repr": "Sequence", + "desc": "Transformer encoder from a winning solution of the Kaggle “IceCube – Neutrinos in Deep Ice” challenge. Evaluated on direction reconstruction.", + "color": "#fbbf24", + "src": "https://github.com/graphnet-team/graphnet/blob/main/src/graphnet/models/gnn/icemix.py" + } + }, + "datasetOrder": [ + "flower_xl", + "flower_l", + "hexagon", + "hexagon_ice_le", + "flower_s", + "cluster", + "triangle" + ], + "datasets": { + "flower_xl": { + "name": "Flower XL", + "inspiration": "TRIDENT", + "medium": "Water", + "events": "10.1M", + "ccnc": "88 / 12", + "strings": 1211, + "oms": 24220, + "erange": "10 GeV – 100 TeV", + "spacing": "90 m", + "geo": "sunflower", + "links": { + "sqlite": "https://sid.erda.dk/share_redirect/foVpx81yBz", + "parquet": "https://sid.erda.dk/share_redirect/EjHdSveUxc", + "predictions": "https://sid.erda.dk/share_redirect/AOjybKOo2Q", + "artifacts": "https://sid.erda.dk/share_redirect/cR2WNVmk4l" + } + }, + "flower_l": { + "name": "Flower L", + "inspiration": "KM3NeT ARCA", + "medium": "Water", + "events": "24.0M", + "ccnc": "35 / 65", + "strings": 115, + "oms": 2070, + "erange": "10 GeV – 100 TeV", + "spacing": "72 m", + "geo": "sunflower", + "links": { + "sqlite": "https://sid.erda.dk/share_redirect/EJylHQXkBr", + "parquet": "https://sid.erda.dk/share_redirect/HBIS5alCHj", + "predictions": "https://sid.erda.dk/share_redirect/E0uj9YnZVZ", + "artifacts": "https://sid.erda.dk/share_redirect/fklOMcPIyB" + } + }, + "hexagon": { + "name": "Hexagon", + "inspiration": "IceCube", + "medium": "Water", + "events": "20.5M", + "ccnc": "48 / 52", + "strings": 86, + "oms": 5160, + "erange": "10 GeV – 100 TeV", + "spacing": "125 m", + "geo": "hexagon", + "links": { + "sqlite": "https://sid.erda.dk/share_redirect/GTf1gIlBbZ", + "parquet": "https://sid.erda.dk/share_redirect/GepbTY2MF4", + "predictions": "https://sid.erda.dk/share_redirect/A4hMrsbbl3", + "artifacts": "https://sid.erda.dk/share_redirect/BLx7Z17wQe" + } + }, + "hexagon_ice_le": { + "name": "Hexagon Ice LE", + "inspiration": "IceCube", + "medium": "Ice", + "events": "8.6M", + "ccnc": "57 / 43", + "strings": 86, + "oms": 5160, + "erange": "10 GeV – 1 TeV", + "spacing": "125 m", + "geo": "hexagon", + "links": { + "sqlite": "https://sid.erda.dk/share_redirect/b9VHSF9X64", + "parquet": "https://sid.erda.dk/share_redirect/Cx2PVxHusa", + "predictions": "https://sid.erda.dk/share_redirect/hCIaEIm3sn", + "artifacts": "https://sid.erda.dk/share_redirect/gckjyhPlul" + } + }, + "flower_s": { + "name": "Flower S", + "inspiration": "KM3NeT ORCA", + "medium": "Water", + "events": "20.5M", + "ccnc": "40 / 60", + "strings": 150, + "oms": 3300, + "erange": "10 GeV – 1 TeV", + "spacing": "12 m", + "geo": "sunflower", + "links": { + "sqlite": "https://sid.erda.dk/share_redirect/cUPqNKMRbQ", + "parquet": "https://sid.erda.dk/share_redirect/d08ELPHt2J", + "predictions": "https://sid.erda.dk/share_redirect/Ao3E9h8wLr", + "artifacts": "https://sid.erda.dk/share_redirect/c5iAXJ5F8d" + } + }, + "cluster": { + "name": "Cluster", + "inspiration": "Baikal-GVD", + "medium": "Water", + "events": "22.9M", + "ccnc": "49 / 51", + "strings": 8, + "oms": 288, + "erange": "10 GeV – 100 TeV", + "spacing": "52 m", + "geo": "cluster", + "links": { + "sqlite": "https://sid.erda.dk/share_redirect/EBamFwOU2D", + "parquet": "https://sid.erda.dk/share_redirect/C01vI5u9BJ", + "predictions": "https://sid.erda.dk/share_redirect/gZRbQvu0Ml", + "artifacts": "https://sid.erda.dk/share_redirect/efqZPPTYBU" + } + }, + "triangle": { + "name": "Triangle", + "inspiration": "P-ONE", + "medium": "Water", + "events": "23.1M", + "ccnc": "35 / 65", + "strings": 3, + "oms": 60, + "erange": "10 GeV – 100 TeV", + "spacing": "100 m", + "geo": "triangle", + "links": { + "sqlite": "https://sid.erda.dk/share_redirect/ER3B0TlPqR", + "parquet": "https://sid.erda.dk/share_redirect/ediHXAsygn", + "predictions": "https://sid.erda.dk/share_redirect/DZFXwMcQmP", + "artifacts": "https://sid.erda.dk/share_redirect/ctNHDFuzPN" + } + } + }, + "results": { + "energy": { + "flower_xl": { + "particlenet": [ + { + "v": -8.92, + "b": true, + "e": 0.18 + }, + { + "v": 120.16, + "b": true, + "e": 0.31 + }, + { + "v": 18.18, + "b": false, + "e": 0.14 + }, + { + "v": 101.61, + "b": false, + "e": 0.18 + }, + { + "v": 3.78, + "b": true, + "e": 0.05 + }, + { + "v": 90.11, + "b": true, + "e": 0.18 + } + ], + "dynedge": [ + { + "v": -70.08, + "b": false, + "e": 0.37 + }, + { + "v": 203.08, + "b": false, + "e": 0.54 + }, + { + "v": -6.93, + "b": true, + "e": 0.18 + }, + { + "v": 169.47, + "b": false, + "e": 0.58 + }, + { + "v": 4.14, + "b": false, + "e": 0.04 + }, + { + "v": 99.1, + "b": false, + "e": 0.33 + } + ], + "grit": [ + { + "v": -9.37, + "b": false, + "e": 0.21 + }, + { + "v": 122.63, + "b": false, + "e": 0.38 + }, + { + "v": 21.15, + "b": false, + "e": 0.18 + }, + { + "v": 99.74, + "b": true, + "e": 0.17 + }, + { + "v": 9.33, + "b": false, + "e": 0.06 + }, + { + "v": 90.42, + "b": false, + "e": 0.17 + } + ] + }, + "flower_l": { + "particlenet": [ + { + "v": -159.37, + "b": false, + "e": 0.34 + }, + { + "v": 279.99, + "b": false, + "e": 0.62 + }, + { + "v": -14.87, + "b": false, + "e": 0.11 + }, + { + "v": 215.52, + "b": false, + "e": 0.42 + }, + { + "v": 8.65, + "b": false, + "e": 0.03 + }, + { + "v": 106.54, + "b": true, + "e": 0.21 + } + ], + "dynedge": [ + { + "v": -106.46, + "b": true, + "e": 0.29 + }, + { + "v": 224.34, + "b": true, + "e": 0.42 + }, + { + "v": -8.03, + "b": true, + "e": 0.1 + }, + { + "v": 189.24, + "b": true, + "e": 0.31 + }, + { + "v": 3.13, + "b": true, + "e": 0.02 + }, + { + "v": 107.41, + "b": false, + "e": 0.16 + } + ], + "grit": [ + { + "v": -168.98, + "b": false, + "e": 0.29 + }, + { + "v": 289.28, + "b": false, + "e": 0.63 + }, + { + "v": -13.81, + "b": false, + "e": 0.1 + }, + { + "v": 212.77, + "b": false, + "e": 0.43 + }, + { + "v": 6.77, + "b": false, + "e": 0.03 + }, + { + "v": 108.47, + "b": false, + "e": 0.21 + } + ] + }, + "hexagon": { + "particlenet": [ + { + "v": -72.71, + "b": true, + "e": 0.21 + }, + { + "v": 202.89, + "b": true, + "e": 0.4 + }, + { + "v": 15.56, + "b": false, + "e": 0.05 + }, + { + "v": 141.0, + "b": true, + "e": 0.25 + }, + { + "v": 26.23, + "b": false, + "e": 0.02 + }, + { + "v": 86.25, + "b": true, + "e": 0.11 + } + ], + "dynedge": [ + { + "v": -74.7, + "b": false, + "e": 0.17 + }, + { + "v": 206.51, + "b": false, + "e": 0.42 + }, + { + "v": 14.05, + "b": false, + "e": 0.07 + }, + { + "v": 145.73, + "b": false, + "e": 0.28 + }, + { + "v": 25.76, + "b": true, + "e": 0.01 + }, + { + "v": 87.93, + "b": false, + "e": 0.11 + } + ], + "grit": [ + { + "v": -85.85, + "b": false, + "e": 0.18 + }, + { + "v": 226.39, + "b": false, + "e": 0.46 + }, + { + "v": 6.04, + "b": true, + "e": 0.1 + }, + { + "v": 156.1, + "b": false, + "e": 0.23 + }, + { + "v": 32.44, + "b": false, + "e": 0.03 + }, + { + "v": 94.11, + "b": false, + "e": 0.11 + } + ] + }, + "hexagon_ice_le": { + "particlenet": [ + { + "v": -90.01, + "b": true, + "e": 0.17 + }, + { + "v": 226.98, + "b": true, + "e": 0.42 + }, + { + "v": 13.98, + "b": false, + "e": 0.04 + }, + { + "v": 98.35, + "b": true, + "e": 0.07 + }, + null, + null + ], + "dynedge": [ + { + "v": -95.05, + "b": false, + "e": 0.14 + }, + { + "v": 240.7, + "b": false, + "e": 0.42 + }, + { + "v": 12.27, + "b": true, + "e": 0.04 + }, + { + "v": 101.0, + "b": false, + "e": 0.07 + }, + null, + null + ], + "grit": [ + { + "v": -90.85, + "b": false, + "e": 0.18 + }, + { + "v": 228.06, + "b": false, + "e": 0.36 + }, + { + "v": 14.58, + "b": false, + "e": 0.04 + }, + { + "v": 98.41, + "b": false, + "e": 0.06 + }, + null, + null + ] + }, + "flower_s": { + "particlenet": [ + { + "v": -29.29, + "b": true, + "e": 0.08 + }, + { + "v": 135.74, + "b": true, + "e": 0.12 + }, + { + "v": 4.44, + "b": true, + "e": 0.02 + }, + { + "v": 78.93, + "b": true, + "e": 0.09 + }, + null, + null + ], + "dynedge": [ + { + "v": -30.38, + "b": false, + "e": 0.07 + }, + { + "v": 138.61, + "b": false, + "e": 0.14 + }, + { + "v": 4.44, + "b": true, + "e": 0.02 + }, + { + "v": 79.85, + "b": false, + "e": 0.1 + }, + null, + null + ] + }, + "cluster": { + "particlenet": [ + { + "v": -48.44, + "b": false, + "e": 0.09 + }, + { + "v": 145.94, + "b": false, + "e": 0.13 + }, + { + "v": 11.91, + "b": false, + "e": 0.05 + }, + { + "v": 151.16, + "b": false, + "e": 0.34 + }, + { + "v": 15.84, + "b": false, + "e": 0.02 + }, + { + "v": 90.17, + "b": true, + "e": 0.17 + } + ], + "dynedge": [ + { + "v": -46.42, + "b": true, + "e": 0.09 + }, + { + "v": 145.23, + "b": true, + "e": 0.15 + }, + { + "v": 12.57, + "b": false, + "e": 0.05 + }, + { + "v": 148.77, + "b": true, + "e": 0.27 + }, + { + "v": 15.66, + "b": true, + "e": 0.02 + }, + { + "v": 90.3, + "b": true, + "e": 0.16 + } + ], + "grit": [ + { + "v": -58.18, + "b": false, + "e": 0.12 + }, + { + "v": 164.38, + "b": false, + "e": 0.15 + }, + { + "v": 10.27, + "b": true, + "e": 0.09 + }, + { + "v": 163.84, + "b": false, + "e": 0.25 + }, + { + "v": 17.96, + "b": false, + "e": 0.06 + }, + { + "v": 112.7, + "b": false, + "e": 0.13 + } + ] + }, + "triangle": { + "particlenet": [ + { + "v": -153.37, + "b": true, + "e": 0.45 + }, + { + "v": 341.05, + "b": true, + "e": 1.03 + }, + { + "v": -21.32, + "b": true, + "e": 0.16 + }, + { + "v": 213.14, + "b": false, + "e": 0.31 + }, + { + "v": 14.54, + "b": false, + "e": 0.04 + }, + { + "v": 110.3, + "b": true, + "e": 0.12 + } + ], + "dynedge": [ + { + "v": -196.2, + "b": false, + "e": 0.52 + }, + { + "v": 397.03, + "b": false, + "e": 1.07 + }, + { + "v": -27.62, + "b": false, + "e": 0.13 + }, + { + "v": 219.81, + "b": false, + "e": 0.37 + }, + { + "v": 5.03, + "b": true, + "e": 0.03 + }, + { + "v": 119.68, + "b": false, + "e": 0.13 + } + ], + "grit": [ + { + "v": -160.75, + "b": false, + "e": 0.44 + }, + { + "v": 341.64, + "b": true, + "e": 1.0 + }, + { + "v": -21.24, + "b": true, + "e": 0.12 + }, + { + "v": 198.59, + "b": true, + "e": 0.39 + }, + { + "v": 5.76, + "b": false, + "e": 0.04 + }, + { + "v": 117.82, + "b": false, + "e": 0.11 + } + ] + } + }, + "direction": { + "flower_xl": { + "particlenet": [ + { + "cc": { + "v": 14.33, + "b": false + }, + "nc": { + "v": 33.38, + "b": true + } + }, + { + "cc": { + "v": 1.56, + "b": false + }, + "nc": { + "v": 0.3, + "b": false + } + }, + { + "cc": { + "v": 21.75, + "b": false + }, + "nc": { + "v": 6.54, + "b": false + } + }, + { + "cc": { + "v": 1.6, + "b": false + }, + "nc": { + "v": 3.81, + "b": false + } + }, + { + "cc": { + "v": 27.23, + "b": false + }, + "nc": { + "v": 6.74, + "b": false + } + }, + { + "cc": { + "v": 91.05, + "b": false + }, + "nc": { + "v": 61.8, + "b": false + } + } + ], + "dynedge": [ + { + "cc": { + "v": 16.22, + "b": false + }, + "nc": { + "v": 33.47, + "b": false + } + }, + { + "cc": { + "v": 1.0, + "b": false + }, + "nc": { + "v": 0.3, + "b": false + } + }, + { + "cc": { + "v": 16.8, + "b": false + }, + "nc": { + "v": 5.98, + "b": false + } + }, + { + "cc": { + "v": 2.03, + "b": false + }, + "nc": { + "v": 4.07, + "b": false + } + }, + { + "cc": { + "v": 19.43, + "b": false + }, + "nc": { + "v": 5.92, + "b": false + } + }, + { + "cc": { + "v": 85.79, + "b": false + }, + "nc": { + "v": 59.1, + "b": false + } + } + ], + "deepice": [ + { + "cc": { + "v": 14.23, + "b": true + }, + "nc": { + "v": 33.6, + "b": false + } + }, + { + "cc": { + "v": 2.12, + "b": true + }, + "nc": { + "v": 0.39, + "b": true + } + }, + { + "cc": { + "v": 24.11, + "b": true + }, + "nc": { + "v": 7.01, + "b": true + } + }, + { + "cc": { + "v": 1.29, + "b": true + }, + "nc": { + "v": 3.21, + "b": true + } + }, + { + "cc": { + "v": 36.65, + "b": true + }, + "nc": { + "v": 9.98, + "b": true + } + }, + { + "cc": { + "v": 93.23, + "b": true + }, + "nc": { + "v": 67.15, + "b": true + } + } + ] + }, + "flower_l": { + "particlenet": [ + { + "cc": { + "v": 13.21, + "b": false + }, + "nc": { + "v": 20.66, + "b": false + } + }, + { + "cc": { + "v": 1.26, + "b": false + }, + "nc": { + "v": 0.6, + "b": false + } + }, + { + "cc": { + "v": 20.45, + "b": false + }, + "nc": { + "v": 11.54, + "b": false + } + }, + { + "cc": { + "v": 2.12, + "b": false + }, + "nc": { + "v": 3.5, + "b": false + } + }, + { + "cc": { + "v": 18.36, + "b": false + }, + "nc": { + "v": 8.27, + "b": false + } + }, + { + "cc": { + "v": 83.66, + "b": false + }, + "nc": { + "v": 64.89, + "b": false + } + } + ], + "dynedge": [ + { + "cc": { + "v": 11.6, + "b": false + }, + "nc": { + "v": 18.95, + "b": false + } + }, + { + "cc": { + "v": 2.12, + "b": false + }, + "nc": { + "v": 0.84, + "b": false + } + }, + { + "cc": { + "v": 26.46, + "b": false + }, + "nc": { + "v": 14.2, + "b": false + } + }, + { + "cc": { + "v": 1.54, + "b": false + }, + "nc": { + "v": 2.9, + "b": false + } + }, + { + "cc": { + "v": 30.67, + "b": false + }, + "nc": { + "v": 11.99, + "b": false + } + }, + { + "cc": { + "v": 88.76, + "b": false + }, + "nc": { + "v": 70.54, + "b": false + } + } + ], + "grit": [ + { + "cc": { + "v": 10.03, + "b": false + }, + "nc": { + "v": 17.54, + "b": false + } + }, + { + "cc": { + "v": 4.51, + "b": false + }, + "nc": { + "v": 1.25, + "b": false + } + }, + { + "cc": { + "v": 33.09, + "b": false + }, + "nc": { + "v": 17.87, + "b": false + } + }, + { + "cc": { + "v": 0.99, + "b": false + }, + "nc": { + "v": 2.14, + "b": false + } + }, + { + "cc": { + "v": 50.41, + "b": false + }, + "nc": { + "v": 21.11, + "b": false + } + }, + { + "cc": { + "v": 92.12, + "b": false + }, + "nc": { + "v": 77.03, + "b": false + } + } + ], + "deepice": [ + { + "cc": { + "v": 9.92, + "b": true + }, + "nc": { + "v": 17.19, + "b": true + } + }, + { + "cc": { + "v": 5.81, + "b": true + }, + "nc": { + "v": 1.32, + "b": true + } + }, + { + "cc": { + "v": 33.98, + "b": true + }, + "nc": { + "v": 18.47, + "b": true + } + }, + { + "cc": { + "v": 0.66, + "b": true + }, + "nc": { + "v": 1.86, + "b": true + } + }, + { + "cc": { + "v": 65.13, + "b": true + }, + "nc": { + "v": 28.14, + "b": true + } + }, + { + "cc": { + "v": 92.87, + "b": true + }, + "nc": { + "v": 78.44, + "b": true + } + } + ] + }, + "hexagon": { + "particlenet": [ + { + "cc": { + "v": 16.91, + "b": false + }, + "nc": { + "v": 32.44, + "b": false + } + }, + { + "cc": { + "v": 1.35, + "b": false + }, + "nc": { + "v": 0.45, + "b": false + } + }, + { + "cc": { + "v": 19.8, + "b": false + }, + "nc": { + "v": 8.38, + "b": false + } + }, + { + "cc": { + "v": 2.03, + "b": false + }, + "nc": { + "v": 3.86, + "b": false + } + }, + { + "cc": { + "v": 19.93, + "b": false + }, + "nc": { + "v": 8.1, + "b": false + } + }, + { + "cc": { + "v": 82.15, + "b": false + }, + "nc": { + "v": 59.55, + "b": false + } + } + ], + "dynedge": [ + { + "cc": { + "v": 16.61, + "b": false + }, + "nc": { + "v": 31.92, + "b": false + } + }, + { + "cc": { + "v": 1.5, + "b": false + }, + "nc": { + "v": 0.49, + "b": false + } + }, + { + "cc": { + "v": 20.89, + "b": false + }, + "nc": { + "v": 8.94, + "b": false + } + }, + { + "cc": { + "v": 1.76, + "b": false + }, + "nc": { + "v": 3.48, + "b": false + } + }, + { + "cc": { + "v": 25.62, + "b": false + }, + "nc": { + "v": 10.25, + "b": false + } + }, + { + "cc": { + "v": 83.92, + "b": false + }, + "nc": { + "v": 62.12, + "b": false + } + } + ], + "grit": [ + { + "cc": { + "v": 16.52, + "b": false + }, + "nc": { + "v": 32.34, + "b": false + } + }, + { + "cc": { + "v": 1.79, + "b": false + }, + "nc": { + "v": 0.54, + "b": false + } + }, + { + "cc": { + "v": 22.17, + "b": false + }, + "nc": { + "v": 9.27, + "b": false + } + }, + { + "cc": { + "v": 1.83, + "b": false + }, + "nc": { + "v": 3.42, + "b": false + } + }, + { + "cc": { + "v": 23.33, + "b": false + }, + "nc": { + "v": 10.03, + "b": false + } + }, + { + "cc": { + "v": 84.16, + "b": false + }, + "nc": { + "v": 63.15, + "b": false + } + } + ], + "deepice": [ + { + "cc": { + "v": 15.02, + "b": true + }, + "nc": { + "v": 30.73, + "b": true + } + }, + { + "cc": { + "v": 3.44, + "b": true + }, + "nc": { + "v": 0.82, + "b": true + } + }, + { + "cc": { + "v": 27.15, + "b": true + }, + "nc": { + "v": 11.39, + "b": true + } + }, + { + "cc": { + "v": 0.89, + "b": true + }, + "nc": { + "v": 2.53, + "b": true + } + }, + { + "cc": { + "v": 54.46, + "b": true + }, + "nc": { + "v": 20.08, + "b": true + } + }, + { + "cc": { + "v": 88.23, + "b": true + }, + "nc": { + "v": 68.74, + "b": true + } + } + ] + }, + "hexagon_ice_le": { + "particlenet": [ + { + "cc": { + "v": 23.84, + "b": false + }, + "nc": { + "v": 56.18, + "b": false + } + }, + { + "cc": { + "v": 1.81, + "b": false + }, + "nc": { + "v": 0.04, + "b": false + } + }, + { + "cc": { + "v": 20.98, + "b": false + }, + "nc": { + "v": 0.97, + "b": false + } + }, + null, + null, + null + ], + "dynedge": [ + { + "cc": { + "v": 23.6, + "b": false + }, + "nc": { + "v": 56.12, + "b": false + } + }, + { + "cc": { + "v": 2.26, + "b": false + }, + "nc": { + "v": 0.04, + "b": false + } + }, + { + "cc": { + "v": 22.24, + "b": false + }, + "nc": { + "v": 1.03, + "b": false + } + }, + null, + null, + null + ], + "grit": [ + { + "cc": { + "v": 21.91, + "b": true + }, + "nc": { + "v": 54.87, + "b": true + } + }, + { + "cc": { + "v": 2.71, + "b": true + }, + "nc": { + "v": 0.05, + "b": true + } + }, + { + "cc": { + "v": 23.94, + "b": true + }, + "nc": { + "v": 1.28, + "b": true + } + }, + null, + null, + null + ], + "deepice": [ + { + "cc": { + "v": 23.75, + "b": false + }, + "nc": { + "v": 56.21, + "b": false + } + }, + { + "cc": { + "v": 2.15, + "b": false + }, + "nc": { + "v": 0.05, + "b": true + } + }, + { + "cc": { + "v": 21.51, + "b": false + }, + "nc": { + "v": 1.08, + "b": false + } + }, + null, + null, + null + ] + }, + "flower_s": { + "particlenet": [ + { + "cc": { + "v": 2.27, + "b": false + }, + "nc": { + "v": 6.73, + "b": false + } + }, + { + "cc": { + "v": 18.37, + "b": false + }, + "nc": { + "v": 5.19, + "b": false + } + }, + { + "cc": { + "v": 77.24, + "b": false + }, + "nc": { + "v": 40.23, + "b": false + } + }, + null, + null, + null + ], + "dynedge": [ + { + "cc": { + "v": 2.13, + "b": false + }, + "nc": { + "v": 6.66, + "b": false + } + }, + { + "cc": { + "v": 20.67, + "b": false + }, + "nc": { + "v": 5.48, + "b": false + } + }, + { + "cc": { + "v": 78.4, + "b": false + }, + "nc": { + "v": 40.7, + "b": false + } + }, + null, + null, + null + ], + "deepice": [ + { + "cc": { + "v": 1.82, + "b": true + }, + "nc": { + "v": 6.38, + "b": true + } + }, + { + "cc": { + "v": 26.32, + "b": true + }, + "nc": { + "v": 7.11, + "b": true + } + }, + { + "cc": { + "v": 81.04, + "b": true + }, + "nc": { + "v": 42.29, + "b": true + } + }, + null, + null, + null + ] + }, + "cluster": { + "particlenet": [ + { + "cc": { + "v": 8.29, + "b": false + }, + "nc": { + "v": 14.55, + "b": false + } + }, + { + "cc": { + "v": 2.58, + "b": false + }, + "nc": { + "v": 1.3, + "b": false + } + }, + { + "cc": { + "v": 32.69, + "b": false + }, + "nc": { + "v": 19.83, + "b": false + } + }, + { + "cc": { + "v": 2.06, + "b": false + }, + "nc": { + "v": 2.47, + "b": false + } + }, + { + "cc": { + "v": 17.83, + "b": false + }, + "nc": { + "v": 14.08, + "b": false + } + }, + { + "cc": { + "v": 86.93, + "b": false + }, + "nc": { + "v": 78.43, + "b": false + } + } + ], + "dynedge": [ + { + "cc": { + "v": 7.66, + "b": false + }, + "nc": { + "v": 13.82, + "b": false + } + }, + { + "cc": { + "v": 3.25, + "b": false + }, + "nc": { + "v": 1.7, + "b": false + } + }, + { + "cc": { + "v": 36.03, + "b": false + }, + "nc": { + "v": 22.12, + "b": false + } + }, + { + "cc": { + "v": 1.88, + "b": false + }, + "nc": { + "v": 2.12, + "b": false + } + }, + { + "cc": { + "v": 21.11, + "b": false + }, + "nc": { + "v": 18.67, + "b": false + } + }, + { + "cc": { + "v": 88.02, + "b": false + }, + "nc": { + "v": 81.07, + "b": false + } + } + ], + "grit": [ + { + "cc": { + "v": 7.66, + "b": false + }, + "nc": { + "v": 13.74, + "b": false + } + }, + { + "cc": { + "v": 2.88, + "b": false + }, + "nc": { + "v": 1.48, + "b": false + } + }, + { + "cc": { + "v": 35.14, + "b": false + }, + "nc": { + "v": 21.62, + "b": false + } + }, + { + "cc": { + "v": 2.18, + "b": false + }, + "nc": { + "v": 2.6, + "b": false + } + }, + { + "cc": { + "v": 17.21, + "b": false + }, + "nc": { + "v": 13.64, + "b": false + } + }, + { + "cc": { + "v": 84.45, + "b": false + }, + "nc": { + "v": 77.34, + "b": false + } + } + ], + "deepice": [ + { + "cc": { + "v": 6.25, + "b": true + }, + "nc": { + "v": 12.15, + "b": true + } + }, + { + "cc": { + "v": 7.83, + "b": true + }, + "nc": { + "v": 3.0, + "b": true + } + }, + { + "cc": { + "v": 43.79, + "b": true + }, + "nc": { + "v": 27.16, + "b": true + } + }, + { + "cc": { + "v": 1.22, + "b": true + }, + "nc": { + "v": 1.35, + "b": true + } + }, + { + "cc": { + "v": 40.45, + "b": true + }, + "nc": { + "v": 37.53, + "b": true + } + }, + { + "cc": { + "v": 92.0, + "b": true + }, + "nc": { + "v": 86.23, + "b": true + } + } + ] + }, + "triangle": { + "particlenet": [ + { + "cc": { + "v": 30.47, + "b": false + }, + "nc": { + "v": 41.35, + "b": false + } + }, + { + "cc": { + "v": 0.22, + "b": false + }, + "nc": { + "v": 0.1, + "b": false + } + }, + { + "cc": { + "v": 4.9, + "b": false + }, + "nc": { + "v": 2.24, + "b": false + } + }, + { + "cc": { + "v": 6.41, + "b": false + }, + "nc": { + "v": 9.59, + "b": false + } + }, + { + "cc": { + "v": 2.66, + "b": false + }, + "nc": { + "v": 1.52, + "b": false + } + }, + { + "cc": { + "v": 38.81, + "b": false + }, + "nc": { + "v": 25.55, + "b": false + } + } + ], + "dynedge": [ + { + "cc": { + "v": 29.25, + "b": false + }, + "nc": { + "v": 39.94, + "b": false + } + }, + { + "cc": { + "v": 0.48, + "b": false + }, + "nc": { + "v": 0.16, + "b": false + } + }, + { + "cc": { + "v": 8.16, + "b": false + }, + "nc": { + "v": 3.28, + "b": false + } + }, + { + "cc": { + "v": 4.03, + "b": false + }, + "nc": { + "v": 6.22, + "b": false + } + }, + { + "cc": { + "v": 7.93, + "b": false + }, + "nc": { + "v": 4.9, + "b": false + } + }, + { + "cc": { + "v": 57.53, + "b": false + }, + "nc": { + "v": 43.18, + "b": false + } + } + ], + "grit": [ + { + "cc": { + "v": 28.36, + "b": true + }, + "nc": { + "v": 39.33, + "b": true + } + }, + { + "cc": { + "v": 0.94, + "b": true + }, + "nc": { + "v": 0.21, + "b": true + } + }, + { + "cc": { + "v": 10.28, + "b": true + }, + "nc": { + "v": 3.87, + "b": true + } + }, + { + "cc": { + "v": 2.96, + "b": true + }, + "nc": { + "v": 5.26, + "b": true + } + }, + { + "cc": { + "v": 18.21, + "b": true + }, + "nc": { + "v": 8.39, + "b": true + } + }, + { + "cc": { + "v": 64.59, + "b": true + }, + "nc": { + "v": 48.59, + "b": true + } + } + ], + "deepice": [ + { + "cc": { + "v": 28.49, + "b": false + }, + "nc": { + "v": 39.51, + "b": false + } + }, + { + "cc": { + "v": 0.72, + "b": false + }, + "nc": { + "v": 0.17, + "b": false + } + }, + { + "cc": { + "v": 9.35, + "b": false + }, + "nc": { + "v": 3.6, + "b": false + } + }, + { + "cc": { + "v": 3.08, + "b": false + }, + "nc": { + "v": 5.38, + "b": false + } + }, + { + "cc": { + "v": 16.17, + "b": false + }, + "nc": { + "v": 7.64, + "b": false + } + }, + { + "cc": { + "v": 64.03, + "b": false + }, + "nc": { + "v": 47.88, + "b": false + } + } + ] + } + }, + "vertex": { + "flower_xl": { + "particlenet": [ + { + "v": 42.9, + "b": false + }, + { + "v": 16.13, + "b": false + }, + { + "v": 36.77, + "b": false + }, + { + "v": 36.82, + "b": false + }, + { + "v": 16.55, + "b": false + }, + { + "v": 30.54, + "b": false + } + ], + "dynedge": [ + { + "v": 11.98, + "b": true + }, + { + "v": 3.04, + "b": true + }, + { + "v": 10.06, + "b": true + }, + { + "v": 4.31, + "b": true + }, + { + "v": 1.8, + "b": true + }, + { + "v": 3.35, + "b": true + } + ], + "grit": [ + { + "v": 35.51, + "b": false + }, + { + "v": 7.68, + "b": false + }, + { + "v": 32.86, + "b": false + }, + { + "v": 30.0, + "b": false + }, + { + "v": 6.91, + "b": false + }, + { + "v": 28.09, + "b": false + } + ] + }, + "flower_l": { + "particlenet": [ + { + "v": 17.47, + "b": false + }, + { + "v": 6.15, + "b": false + }, + { + "v": 14.09, + "b": false + }, + { + "v": 10.2, + "b": false + }, + { + "v": 4.36, + "b": false + }, + { + "v": 7.84, + "b": false + } + ], + "dynedge": [ + { + "v": 6.52, + "b": true + }, + { + "v": 1.96, + "b": true + }, + { + "v": 5.28, + "b": true + }, + { + "v": 2.2, + "b": true + }, + { + "v": 0.88, + "b": true + }, + { + "v": 1.75, + "b": true + } + ], + "grit": [ + { + "v": 13.59, + "b": false + }, + { + "v": 6.5, + "b": false + }, + { + "v": 9.69, + "b": false + }, + { + "v": 10.08, + "b": false + }, + { + "v": 6.01, + "b": false + }, + { + "v": 6.46, + "b": false + } + ] + }, + "hexagon": { + "particlenet": [ + { + "v": 25.46, + "b": false + }, + { + "v": 6.96, + "b": false + }, + { + "v": 22.0, + "b": false + }, + { + "v": 13.99, + "b": false + }, + { + "v": 5.08, + "b": false + }, + { + "v": 11.45, + "b": false + } + ], + "dynedge": [ + { + "v": 12.02, + "b": true + }, + { + "v": 2.09, + "b": true + }, + { + "v": 10.33, + "b": true + }, + { + "v": 2.37, + "b": true + }, + { + "v": 0.87, + "b": true + }, + { + "v": 1.93, + "b": true + } + ], + "grit": [ + { + "v": 41.3, + "b": false + }, + { + "v": 26.43, + "b": false + }, + { + "v": 25.72, + "b": false + }, + { + "v": 38.2, + "b": false + }, + { + "v": 28.14, + "b": false + }, + { + "v": 22.06, + "b": false + } + ] + }, + "hexagon_ice_le": { + "particlenet": [ + { + "v": 28.73, + "b": false + }, + { + "v": 8.49, + "b": false + }, + { + "v": 24.2, + "b": false + }, + null, + null, + null + ], + "dynedge": [ + { + "v": 26.04, + "b": true + }, + { + "v": 6.84, + "b": true + }, + { + "v": 21.94, + "b": true + }, + null, + null, + null + ], + "grit": [ + { + "v": 30.11, + "b": false + }, + { + "v": 9.39, + "b": false + }, + { + "v": 25.25, + "b": false + }, + null, + null, + null + ] + }, + "flower_s": { + "particlenet": [ + { + "v": 2.64, + "b": false + }, + { + "v": 1.3, + "b": false + }, + { + "v": 1.9, + "b": false + }, + null, + null, + null + ], + "dynedge": [ + { + "v": 1.55, + "b": true + }, + { + "v": 0.63, + "b": true + }, + { + "v": 1.25, + "b": true + }, + null, + null, + null + ] + }, + "cluster": { + "particlenet": [ + { + "v": 4.3, + "b": false + }, + { + "v": 1.84, + "b": false + }, + { + "v": 3.16, + "b": false + }, + { + "v": 2.25, + "b": false + }, + { + "v": 1.45, + "b": false + }, + { + "v": 1.15, + "b": false + } + ], + "dynedge": [ + { + "v": 2.97, + "b": true + }, + { + "v": 0.93, + "b": true + }, + { + "v": 2.52, + "b": true + }, + { + "v": 1.29, + "b": true + }, + { + "v": 0.44, + "b": true + }, + { + "v": 1.09, + "b": true + } + ], + "grit": [ + { + "v": 16.43, + "b": false + }, + { + "v": 5.04, + "b": false + }, + { + "v": 14.23, + "b": false + }, + { + "v": 13.06, + "b": false + }, + { + "v": 4.31, + "b": false + }, + { + "v": 10.89, + "b": false + } + ] + }, + "triangle": { + "particlenet": [ + { + "v": 21.74, + "b": false + }, + { + "v": 6.67, + "b": false + }, + { + "v": 18.27, + "b": false + }, + { + "v": 9.27, + "b": false + }, + { + "v": 4.56, + "b": false + }, + { + "v": 5.88, + "b": false + } + ], + "dynedge": [ + { + "v": 18.37, + "b": true + }, + { + "v": 2.97, + "b": true + }, + { + "v": 16.07, + "b": true + }, + { + "v": 2.9, + "b": true + }, + { + "v": 0.81, + "b": true + }, + { + "v": 2.54, + "b": false + } + ], + "grit": [ + { + "v": 19.32, + "b": false + }, + { + "v": 3.66, + "b": false + }, + { + "v": 16.96, + "b": false + }, + { + "v": 3.6, + "b": false + }, + { + "v": 1.95, + "b": false + }, + { + "v": 2.34, + "b": true + } + ] + } + }, + "inelasticity": { + "flower_xl": { + "particlenet": [ + { + "v": 0.249, + "b": false + }, + { + "v": 0.2981, + "b": false + }, + { + "v": 0.1124, + "b": false + }, + { + "v": 0.1904, + "b": false + }, + { + "v": 0.0398, + "b": false + }, + { + "v": 0.0958, + "b": false + } + ], + "dynedge": [ + { + "v": 0.181, + "b": true + }, + { + "v": 0.237, + "b": true + }, + { + "v": 0.1399, + "b": false + }, + { + "v": 0.2423, + "b": false + }, + { + "v": 0.0577, + "b": false + }, + { + "v": 0.1348, + "b": false + } + ], + "grit": [ + { + "v": 0.2467, + "b": false + }, + { + "v": 0.2932, + "b": false + }, + { + "v": 0.1088, + "b": true + }, + { + "v": 0.1843, + "b": true + }, + { + "v": 0.0345, + "b": true + }, + { + "v": 0.0836, + "b": true + } + ] + }, + "flower_l": { + "particlenet": [ + { + "v": 0.5185, + "b": false + }, + { + "v": 0.4921, + "b": false + }, + { + "v": 0.127, + "b": false + }, + { + "v": 0.2239, + "b": false + }, + { + "v": 0.0436, + "b": true + }, + { + "v": 0.1053, + "b": true + } + ], + "dynedge": [ + { + "v": 0.1812, + "b": true + }, + { + "v": 0.2405, + "b": false + }, + { + "v": 0.1107, + "b": true + }, + { + "v": 0.2065, + "b": true + }, + { + "v": 0.0435, + "b": true + }, + { + "v": 0.1071, + "b": false + } + ], + "grit": [ + { + "v": 0.1821, + "b": false + }, + { + "v": 0.2352, + "b": true + }, + { + "v": 0.1231, + "b": false + }, + { + "v": 0.2197, + "b": false + }, + { + "v": 0.0464, + "b": false + }, + { + "v": 0.1124, + "b": false + } + ] + }, + "hexagon": { + "particlenet": [ + { + "v": 0.1861, + "b": false + }, + { + "v": 0.2441, + "b": false + }, + { + "v": 0.1193, + "b": false + }, + { + "v": 0.2178, + "b": false + }, + { + "v": 0.0446, + "b": true + }, + { + "v": 0.1145, + "b": true + } + ], + "dynedge": [ + { + "v": 0.1851, + "b": true + }, + { + "v": 0.2438, + "b": true + }, + { + "v": 0.1182, + "b": true + }, + { + "v": 0.2171, + "b": true + }, + { + "v": 0.0454, + "b": false + }, + { + "v": 0.1167, + "b": false + } + ], + "grit": [ + { + "v": 0.4912, + "b": false + }, + { + "v": 0.484, + "b": false + }, + { + "v": 0.1554, + "b": false + }, + { + "v": 0.2798, + "b": false + }, + { + "v": 0.0545, + "b": false + }, + { + "v": 0.131, + "b": false + } + ] + }, + "flower_s": { + "particlenet": [ + { + "v": 0.2653, + "b": false + }, + { + "v": 0.5384, + "b": false + }, + { + "v": 0.0554, + "b": false + }, + { + "v": 0.0811, + "b": false + }, + null, + null + ], + "dynedge": [ + { + "v": 0.1276, + "b": true + }, + { + "v": 0.2453, + "b": true + }, + { + "v": 0.0405, + "b": true + }, + { + "v": 0.0713, + "b": true + }, + null, + null + ] + }, + "cluster": { + "particlenet": [ + { + "v": 0.3591, + "b": false + }, + { + "v": 0.4713, + "b": false + }, + { + "v": 0.077, + "b": true + }, + { + "v": 0.1193, + "b": true + }, + { + "v": 0.0345, + "b": true + }, + { + "v": 0.0858, + "b": true + } + ], + "dynedge": [ + { + "v": 0.1712, + "b": true + }, + { + "v": 0.2568, + "b": true + }, + { + "v": 0.0775, + "b": false + }, + { + "v": 0.1468, + "b": false + }, + { + "v": 0.0369, + "b": false + }, + { + "v": 0.0908, + "b": false + } + ], + "grit": [ + { + "v": 0.3962, + "b": false + }, + { + "v": 0.4659, + "b": false + }, + { + "v": 0.1034, + "b": false + }, + { + "v": 0.1512, + "b": false + }, + { + "v": 0.0469, + "b": false + }, + { + "v": 0.1123, + "b": false + } + ] + }, + "triangle": { + "particlenet": [ + { + "v": 0.3858, + "b": false + }, + { + "v": 0.4044, + "b": false + }, + { + "v": 0.1987, + "b": false + }, + { + "v": 0.2984, + "b": false + }, + { + "v": 0.0705, + "b": false + }, + { + "v": 0.1796, + "b": false + } + ], + "dynedge": [ + { + "v": 0.1846, + "b": true + }, + { + "v": 0.2401, + "b": true + }, + { + "v": 0.141, + "b": true + }, + { + "v": 0.2411, + "b": true + }, + { + "v": 0.0629, + "b": false + }, + { + "v": 0.1554, + "b": false + } + ], + "grit": [ + { + "v": 0.4061, + "b": false + }, + { + "v": 0.4158, + "b": false + }, + { + "v": 0.1769, + "b": false + }, + { + "v": 0.2818, + "b": false + }, + { + "v": 0.055, + "b": true + }, + { + "v": 0.1524, + "b": true + } + ] + } + }, + "classification": { + "flower_xl": { + "particlenet": [ + { + "v": 0.8954, + "b": false, + "e": 0.0004 + }, + { + "v": 0.6797, + "b": true, + "e": 0.0013 + }, + { + "v": 0.7969, + "b": false, + "e": 0.0009 + }, + { + "v": 0.9816, + "b": false, + "e": 0.0003 + } + ], + "dynedge": [ + { + "v": 0.889, + "b": false, + "e": 0.0004 + }, + { + "v": 0.678, + "b": true, + "e": 0.0014 + }, + { + "v": 0.797, + "b": false, + "e": 0.0012 + }, + { + "v": 0.9796, + "b": false, + "e": 0.0002 + } + ], + "grit": [ + { + "v": 0.9005, + "b": true, + "e": 0.0003 + }, + { + "v": 0.6702, + "b": false, + "e": 0.0013 + }, + { + "v": 0.8108, + "b": true, + "e": 0.0011 + }, + { + "v": 0.984, + "b": true, + "e": 0.0002 + } + ] + }, + "flower_l": { + "particlenet": [ + { + "v": 0.9308, + "b": false, + "e": 0.0002 + }, + { + "v": 0.5371, + "b": false, + "e": 0.0012 + }, + { + "v": 0.8012, + "b": false, + "e": 0.0007 + }, + { + "v": 0.986, + "b": false, + "e": 0.0001 + } + ], + "dynedge": [ + { + "v": 0.9318, + "b": false, + "e": 0.0002 + }, + { + "v": 0.5327, + "b": false, + "e": 0.001 + }, + { + "v": 0.8136, + "b": false, + "e": 0.0007 + }, + { + "v": 0.9859, + "b": false, + "e": 0.0001 + } + ], + "grit": [ + { + "v": 0.9462, + "b": true, + "e": 0.0001 + }, + { + "v": 0.5462, + "b": true, + "e": 0.0013 + }, + { + "v": 0.8512, + "b": true, + "e": 0.0006 + }, + { + "v": 0.9909, + "b": true, + "e": 0.0001 + } + ] + }, + "hexagon": { + "particlenet": [ + { + "v": 0.9177, + "b": false, + "e": 0.0002 + }, + { + "v": 0.656, + "b": false, + "e": 0.001 + }, + { + "v": 0.7898, + "b": false, + "e": 0.0005 + }, + { + "v": 0.9786, + "b": false, + "e": 0.0001 + } + ], + "dynedge": [ + { + "v": 0.934, + "b": true, + "e": 0.0001 + }, + { + "v": 0.6719, + "b": true, + "e": 0.001 + }, + { + "v": 0.8273, + "b": true, + "e": 0.0005 + }, + { + "v": 0.9853, + "b": true, + "e": 0.0001 + } + ], + "grit": [ + { + "v": 0.9219, + "b": false, + "e": 0.0002 + }, + { + "v": 0.6444, + "b": false, + "e": 0.001 + }, + { + "v": 0.798, + "b": false, + "e": 0.0006 + }, + { + "v": 0.9801, + "b": false, + "e": 0.0001 + } + ] + }, + "hexagon_ice_le": { + "particlenet": [ + { + "v": 0.7739, + "b": false, + "e": 0.0003 + }, + { + "v": 0.5473, + "b": false, + "e": 0.0009 + }, + { + "v": 0.8241, + "b": false, + "e": 0.0003 + }, + null + ], + "dynedge": [ + { + "v": 0.7714, + "b": false, + "e": 0.0003 + }, + { + "v": 0.5465, + "b": false, + "e": 0.0006 + }, + { + "v": 0.8215, + "b": false, + "e": 0.0003 + }, + null + ], + "grit": [ + { + "v": 0.7793, + "b": true, + "e": 0.0003 + }, + { + "v": 0.5505, + "b": true, + "e": 0.0007 + }, + { + "v": 0.8295, + "b": true, + "e": 0.0003 + }, + null + ] + }, + "flower_s": { + "particlenet": [ + { + "v": 0.9398, + "b": true, + "e": 0.0001 + }, + { + "v": 0.9198, + "b": true, + "e": 0.0002 + }, + { + "v": 0.9669, + "b": true, + "e": 0.0002 + }, + null + ], + "dynedge": [ + { + "v": 0.9339, + "b": false, + "e": 0.0001 + }, + { + "v": 0.9168, + "b": false, + "e": 0.0002 + }, + { + "v": 0.9619, + "b": false, + "e": 0.0002 + }, + null + ] + }, + "cluster": { + "particlenet": [ + { + "v": 0.9242, + "b": true, + "e": 0.0002 + }, + { + "v": 0.7536, + "b": true, + "e": 0.0007 + }, + { + "v": 0.8849, + "b": true, + "e": 0.0005 + }, + { + "v": 0.9908, + "b": true, + "e": 0.0001 + } + ], + "dynedge": [ + { + "v": 0.9223, + "b": false, + "e": 0.0001 + }, + { + "v": 0.754, + "b": true, + "e": 0.0005 + }, + { + "v": 0.8852, + "b": true, + "e": 0.0004 + }, + { + "v": 0.9891, + "b": false, + "e": 0.0001 + } + ], + "grit": [ + { + "v": 0.9014, + "b": false, + "e": 0.0002 + }, + { + "v": 0.7257, + "b": false, + "e": 0.0005 + }, + { + "v": 0.836, + "b": false, + "e": 0.0005 + }, + { + "v": 0.9856, + "b": false, + "e": 0.0001 + } + ] + }, + "triangle": { + "particlenet": [ + { + "v": 0.9205, + "b": false, + "e": 0.0002 + }, + { + "v": 0.5561, + "b": true, + "e": 0.0016 + }, + { + "v": 0.7748, + "b": false, + "e": 0.0005 + }, + { + "v": 0.9667, + "b": false, + "e": 0.0002 + } + ], + "dynedge": [ + { + "v": 0.9207, + "b": false, + "e": 0.0001 + }, + { + "v": 0.5322, + "b": false, + "e": 0.0013 + }, + { + "v": 0.7681, + "b": false, + "e": 0.0006 + }, + { + "v": 0.97, + "b": false, + "e": 0.0001 + } + ], + "grit": [ + { + "v": 0.9292, + "b": true, + "e": 0.0001 + }, + { + "v": 0.5479, + "b": false, + "e": 0.0011 + }, + { + "v": 0.7902, + "b": true, + "e": 0.0005 + }, + { + "v": 0.9744, + "b": true, + "e": 0.0001 + } + ] + } + } + } +}; diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..9b4c453 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,198 @@ + + + + + +NuBench — Neutrino Event Reconstruction Benchmark + + + + + + + + + + + +
+
+
+
+
+ Open benchmark · arXiv:2511.13111 +

NuBench

+

An open benchmark for deep learning–based event reconstruction + in neutrino telescopes — seven large-scale simulated datasets across six + detector geometries, with baseline results for four reconstruction models + on five core tasks.

+ +
+
129.7M
simulated ν events
+
7
datasets
+
6
detector geometries
+
5
reconstruction tasks
+
4
baseline models
+
+
+
+
+ +
+
+
+
Results
+

Leaderboard

+

Baseline performance of four reconstruction algorithms on the NuBench test + partitions, exactly as reported in the paper. Pick a task, compare models + across geometries, then drill into per-dataset metrics.

+
+
+

+
+
+
+
+
+
+ +
+
+
+
Data
+

Seven datasets, six geometries

+

Simulated νμ charged- and neutral-current interactions produced with + Prometheus, with a simplified detector response. Geometries are inspired by — + but not identical to — existing and proposed telescopes in water and ice. + Each dataset ships in SQLite and Parquet, with train/test selections, + baseline predictions, and trained model artifacts.

+
+
+
+
+ +
+
+
+
Baselines
+

Four reconstruction models

+

Two architectures in active use within existing collaborations, one + graph transformer, and one Kaggle-winning transformer — all implemented and + trained in the open-source GraphNeT framework.

+
+
+
+
+ +
+
+
+
Usage
+

Getting started

+
+
+
+ 1 +

Download

+

Grab the format you prefer from the dataset cards above — SQLite and + Parquet contain identical data.

+
wget -P data/ \
+  <download-link>
+
+
+ 2 +

Extract

+

All files end in .tar.gz, but only some are actually + compressed.

+
# SQLite & model artifacts
+tar -xzf file.tar.gz
+# Parquet & predictions
+tar -xf file.tar.gz
+
+
+ 3 +

Load with GraphNeT

+

Both formats are compatible with the + GraphNeT + Dataset classes (SQLite recommended). Train/test partitions are defined + by the included selection files.

+
from graphnet.data.dataset import (
+    SQLiteDataset,
+)
+
+
+
+
+ +
+
+
+
Reference
+

Citation

+

If you use the NuBench datasets, predictions, or model artifacts in your + work, please cite:

+
+
+

NuBench

+ +
@article{orsoe2025nubench,
+  title   = {NuBench: An Open Benchmark for Deep Learning--Based Event
+             Reconstruction in Neutrino Telescopes},
+  author  = {{\O}rs{\o}e, Rasmus F. and Meighen-Berger, Stephan and Lazar,
+             Jeffrey and Prado, Jorge and Moz{\'u}n-Mateo, Iv{\'a}n and
+             Rosted, Aske and Weigel, Philip and Llorente Anaya, Arturo},
+  journal = {arXiv preprint arXiv:2511.13111},
+  year    = {2025}
+}
+
+ +
+
+ + + + + + + diff --git a/docs/styles.css b/docs/styles.css new file mode 100644 index 0000000..cc3b2a8 --- /dev/null +++ b/docs/styles.css @@ -0,0 +1,698 @@ +/* NuBench — minimal dark theme with Cherenkov-cyan accent. */ + +:root, +:root[data-theme="dark"] { + --bg: #0a0f1a; + --bg-elev: #0f1626; + --bg-card: #101828; + --border: rgba(148, 178, 218, 0.13); + --border-strong: rgba(148, 178, 218, 0.25); + --text: #e7edf6; + --text-muted: #93a1b7; + --text-faint: #64748b; + --accent: #38cde0; + --accent-soft: rgba(56, 205, 224, 0.12); + --accent-text: #6ee4f2; + --best: #6ee4f2; + --code-bg: #0c1322; + --shadow: 0 12px 40px rgba(2, 8, 20, 0.5); + --grid-line: rgba(148, 178, 218, 0.09); + color-scheme: dark; +} + +/* OS light preference applies until an explicit theme is stamped on :root */ +@media (prefers-color-scheme: light) { + :root:not([data-theme="dark"]) { + --bg: #fafbfd; + --bg-elev: #ffffff; + --bg-card: #ffffff; + --border: rgba(15, 40, 80, 0.1); + --border-strong: rgba(15, 40, 80, 0.2); + --text: #0d1626; + --text-muted: #4b5a70; + --text-faint: #8494aa; + --accent: #0891b2; + --accent-soft: rgba(8, 145, 178, 0.08); + --accent-text: #0e7490; + --best: #0e7490; + --code-bg: #f1f4f9; + --shadow: 0 10px 30px rgba(15, 40, 80, 0.08); + --grid-line: rgba(15, 40, 80, 0.07); + color-scheme: light; + } +} + +:root[data-theme="light"] { + --bg: #fafbfd; + --bg-elev: #ffffff; + --bg-card: #ffffff; + --border: rgba(15, 40, 80, 0.1); + --border-strong: rgba(15, 40, 80, 0.2); + --text: #0d1626; + --text-muted: #4b5a70; + --text-faint: #8494aa; + --accent: #0891b2; + --accent-soft: rgba(8, 145, 178, 0.08); + --accent-text: #0e7490; + --best: #0e7490; + --code-bg: #f1f4f9; + --shadow: 0 10px 30px rgba(15, 40, 80, 0.08); + --grid-line: rgba(15, 40, 80, 0.07); + color-scheme: light; +} + +* { box-sizing: border-box; margin: 0; padding: 0; } + +html { scroll-behavior: smooth; } + +body { + background: var(--bg); + color: var(--text); + font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, + "Helvetica Neue", Arial, sans-serif; + font-size: 16px; + line-height: 1.6; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; +} + +.mono, +code, pre, td.num, .stat-num { + font-family: ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, + "Liberation Mono", monospace; +} + +a { color: var(--accent-text); text-decoration: none; } +a:hover { text-decoration: underline; } + +.wrap { max-width: 1120px; margin: 0 auto; padding: 0 24px; } + +/* ---------- nav ---------- */ + +.nav { + position: sticky; + top: 0; + z-index: 50; + backdrop-filter: blur(14px); + -webkit-backdrop-filter: blur(14px); + background: color-mix(in srgb, var(--bg) 78%, transparent); + border-bottom: 1px solid var(--border); +} + +.nav-inner { + display: flex; + align-items: center; + gap: 28px; + height: 60px; +} + +.brand { + display: flex; + align-items: baseline; + gap: 2px; + font-weight: 700; + font-size: 1.12rem; + letter-spacing: -0.02em; + color: var(--text); +} +.brand:hover { text-decoration: none; } +.brand .nu { color: var(--accent); } + +.nav-links { + display: flex; + gap: 22px; + font-size: 0.92rem; + color: var(--text-muted); +} +.nav-links a { color: var(--text-muted); } +.nav-links a:hover { color: var(--text); text-decoration: none; } + +.nav-spacer { flex: 1; } + +.nav-actions { display: flex; align-items: center; gap: 10px; } + +.icon-btn { + display: inline-flex; + align-items: center; + justify-content: center; + width: 34px; + height: 34px; + border-radius: 8px; + border: 1px solid var(--border); + background: transparent; + color: var(--text-muted); + cursor: pointer; +} +.icon-btn:hover { color: var(--text); border-color: var(--border-strong); } +.icon-btn svg { width: 17px; height: 17px; } + +/* ---------- hero ---------- */ + +.hero { + position: relative; + overflow: hidden; + border-bottom: 1px solid var(--border); +} + +.hero-bg { + position: absolute; + inset: 0; + pointer-events: none; +} +.hero-bg svg { position: absolute; right: -140px; top: -120px; opacity: 0.85; } + +.hero-glow { + position: absolute; + width: 720px; + height: 720px; + right: -180px; + top: -260px; + background: radial-gradient(circle, + rgba(56, 205, 224, 0.14) 0%, + rgba(56, 205, 224, 0.04) 40%, + transparent 70%); + pointer-events: none; +} +:root[data-theme="light"] .hero-glow { opacity: 0.5; } + +.hero-inner { + position: relative; + padding: 96px 0 84px; + max-width: 820px; +} + +.hero-kicker { + display: inline-flex; + align-items: center; + gap: 8px; + font-size: 0.8rem; + font-weight: 600; + letter-spacing: 0.12em; + text-transform: uppercase; + color: var(--accent-text); + margin-bottom: 20px; +} +.hero-kicker::before { + content: ""; + width: 22px; + height: 1px; + background: var(--accent); +} + +.hero h1 { + font-size: clamp(2.6rem, 6vw, 4rem); + font-weight: 750; + letter-spacing: -0.035em; + line-height: 1.05; + margin-bottom: 22px; +} +.hero h1 .nu { color: var(--accent); } + +.hero p.lede { + font-size: 1.14rem; + color: var(--text-muted); + max-width: 620px; + margin-bottom: 34px; +} + +.btn-row { display: flex; flex-wrap: wrap; gap: 12px; margin-bottom: 56px; } + +.btn { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 10px 18px; + border-radius: 10px; + font-size: 0.94rem; + font-weight: 600; + border: 1px solid var(--border-strong); + color: var(--text); + transition: border-color 0.15s, background 0.15s; +} +.btn:hover { text-decoration: none; border-color: var(--accent); } +.btn svg { width: 16px; height: 16px; } + +.btn.primary { + background: var(--accent); + border-color: var(--accent); + color: #06222a; +} +.btn.primary:hover { filter: brightness(1.08); } + +.stat-row { + display: flex; + flex-wrap: wrap; + gap: 0; + border-top: 1px solid var(--border); + padding-top: 26px; +} +.stat { + padding-right: 30px; + margin-right: 30px; + border-right: 1px solid var(--border); +} +.stat:last-child { border-right: none; margin-right: 0; padding-right: 0; } +.stat-num { + font-size: 1.5rem; + font-weight: 650; + letter-spacing: -0.02em; + color: var(--text); +} +.stat-num .unit { color: var(--accent-text); font-size: 1.05rem; } +.stat-label { + font-size: 0.82rem; + color: var(--text-faint); + margin-top: 2px; +} + +/* ---------- sections ---------- */ + +section { padding: 84px 0 10px; } + +.sec-head { max-width: 680px; margin-bottom: 40px; } +.sec-kicker { + font-size: 0.78rem; + font-weight: 650; + letter-spacing: 0.12em; + text-transform: uppercase; + color: var(--accent-text); + margin-bottom: 10px; +} +.sec-head h2 { + font-size: 1.9rem; + font-weight: 700; + letter-spacing: -0.025em; + margin-bottom: 12px; +} +.sec-head p { color: var(--text-muted); font-size: 0.98rem; } + +/* ---------- leaderboard ---------- */ + +.task-tabs { + display: flex; + flex-wrap: wrap; + gap: 6px; + padding: 5px; + border: 1px solid var(--border); + border-radius: 12px; + background: var(--bg-elev); + width: fit-content; + margin-bottom: 26px; +} +.task-tab { + padding: 8px 16px; + border-radius: 8px; + border: none; + background: transparent; + color: var(--text-muted); + font-size: 0.92rem; + font-weight: 600; + cursor: pointer; + transition: background 0.15s, color 0.15s; +} +.task-tab:hover { color: var(--text); } +.task-tab.active { + background: var(--accent-soft); + color: var(--accent-text); +} + +.task-desc { + color: var(--text-muted); + font-size: 0.95rem; + max-width: 780px; + margin-bottom: 8px; +} +.task-desc .metric-note { color: var(--text-faint); } + +.task-takeaway { + display: flex; + gap: 10px; + align-items: baseline; + font-size: 0.95rem; + color: var(--text); + background: var(--accent-soft); + border: 1px solid color-mix(in srgb, var(--accent) 25%, transparent); + border-radius: 10px; + padding: 10px 16px; + max-width: 780px; + margin: 16px 0 30px; +} +.task-takeaway::before { + content: "▸"; + color: var(--accent-text); +} + +.panel { + background: var(--bg-card); + border: 1px solid var(--border); + border-radius: 16px; + padding: 26px 26px 20px; + margin-bottom: 22px; +} + +.panel-head { + display: flex; + flex-wrap: wrap; + align-items: baseline; + justify-content: space-between; + gap: 12px; + margin-bottom: 18px; +} +.panel-title { font-size: 1.02rem; font-weight: 650; } +.panel-title .dir { + font-size: 0.8rem; + font-weight: 600; + color: var(--text-faint); + margin-left: 10px; +} + +.legend { display: flex; flex-wrap: wrap; gap: 16px; font-size: 0.85rem; color: var(--text-muted); } +.legend .item { display: inline-flex; align-items: center; gap: 7px; } +.legend .dot { width: 9px; height: 9px; border-radius: 3px; } + +.chart-scroll { overflow-x: auto; } +.chart-scroll svg { display: block; } +.chart-note { font-size: 0.8rem; color: var(--text-faint); margin-top: 8px; } + +/* dataset chips */ +.chip-row { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-bottom: 18px; +} +.chip { + padding: 6px 14px; + border-radius: 999px; + font-size: 0.87rem; + font-weight: 550; + border: 1px solid var(--border); + background: transparent; + color: var(--text-muted); + cursor: pointer; + transition: border-color 0.15s, color 0.15s, background 0.15s; +} +.chip:hover { color: var(--text); border-color: var(--border-strong); } +.chip.active { + border-color: var(--accent); + color: var(--accent-text); + background: var(--accent-soft); +} + +/* results table */ +.table-scroll { overflow-x: auto; } + +table.results { + width: 100%; + border-collapse: collapse; + font-size: 0.9rem; + white-space: nowrap; +} +table.results th, table.results td { + padding: 9px 14px; + text-align: right; +} +table.results th:first-child, table.results td:first-child { + text-align: left; + padding-left: 4px; +} +table.results thead th { + font-size: 0.8rem; + font-weight: 600; + color: var(--text-faint); + border-bottom: 1px solid var(--border-strong); +} +table.results thead tr.groups th { + border-bottom: none; + padding-bottom: 2px; + color: var(--text-muted); + font-weight: 650; +} +table.results thead tr.groups th.group { + border-bottom: 1px solid var(--border); +} +table.results tbody tr { border-bottom: 1px solid var(--border); } +table.results tbody tr:last-child { border-bottom: none; } +table.results td.num { font-size: 0.88rem; color: var(--text-muted); } +table.results td.num .err { font-size: 0.72rem; color: var(--text-faint); } +table.results td.num .best { color: var(--best); font-weight: 700; } +table.results td.model { + font-weight: 600; + color: var(--text); + display: flex; + align-items: center; + gap: 9px; +} +table.results td.model .dot { width: 9px; height: 9px; border-radius: 3px; flex: none; } +.tbl-note { font-size: 0.8rem; color: var(--text-faint); margin-top: 12px; } + +/* paper figures */ +.fig-grid { display: grid; gap: 26px; } +.figure { margin: 0; } +.fig-frame { + background: #ffffff; + border: 1px solid var(--border); + border-radius: 12px; + padding: 16px; +} +.fig-frame img { display: block; width: 100%; height: auto; } +.fig-frame a { display: block; } +.figure figcaption { + font-size: 0.84rem; + color: var(--text-muted); + line-height: 1.55; + margin-top: 10px; + max-width: 900px; +} + +/* ---------- datasets ---------- */ + +.card-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); + gap: 18px; +} + +.ds-card { + background: var(--bg-card); + border: 1px solid var(--border); + border-radius: 16px; + overflow: hidden; + display: flex; + flex-direction: column; + transition: border-color 0.15s; +} +.ds-card:hover { border-color: var(--border-strong); } + +.ds-art { + position: relative; + background: + radial-gradient(120% 90% at 50% 0%, + rgba(56, 205, 224, 0.07), transparent 60%), + var(--bg-elev); + border-bottom: 1px solid var(--border); + display: flex; + align-items: center; + justify-content: center; + height: 170px; +} +.ds-art svg { display: block; } +.ds-art .scale { + position: absolute; + right: 12px; + bottom: 9px; + font-size: 0.72rem; + color: var(--text-faint); +} + +.ds-body { padding: 18px 20px 20px; display: flex; flex-direction: column; flex: 1; } + +.ds-title-row { + display: flex; + align-items: center; + gap: 10px; + margin-bottom: 14px; +} +.ds-title { font-size: 1.06rem; font-weight: 650; letter-spacing: -0.01em; } + +.badge { + font-size: 0.7rem; + font-weight: 650; + letter-spacing: 0.05em; + text-transform: uppercase; + padding: 3px 8px; + border-radius: 6px; + border: 1px solid var(--border-strong); + color: var(--text-muted); +} +.badge.ice { color: #9ecbff; border-color: rgba(158, 203, 255, 0.4); } +:root[data-theme="light"] .badge.ice { color: #2563eb; border-color: rgba(37, 99, 235, 0.4); } +.badge.water { color: var(--accent-text); border-color: color-mix(in srgb, var(--accent) 40%, transparent); } + +.ds-stats { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 10px 18px; + margin-bottom: 16px; +} +.ds-stat .k { font-size: 0.73rem; color: var(--text-faint); } +.ds-stat .v { font-size: 0.9rem; font-weight: 600; color: var(--text); } + +.ds-links { + margin-top: auto; + display: flex; + flex-wrap: wrap; + gap: 7px; + padding-top: 14px; + border-top: 1px solid var(--border); +} +.ds-links a { + font-size: 0.8rem; + font-weight: 600; + padding: 5px 11px; + border-radius: 8px; + border: 1px solid var(--border); + color: var(--text-muted); +} +.ds-links a:hover { + text-decoration: none; + color: var(--accent-text); + border-color: var(--accent); +} + +/* ---------- models ---------- */ + +.model-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); + gap: 18px; +} +.model-card { + background: var(--bg-card); + border: 1px solid var(--border); + border-top: 3px solid var(--mc, var(--accent)); + border-radius: 14px; + padding: 20px; + display: flex; + flex-direction: column; +} +.model-head { + display: flex; + align-items: baseline; + justify-content: space-between; + margin-bottom: 4px; +} +.model-name { font-size: 1.05rem; font-weight: 700; letter-spacing: -0.01em; } +.model-params { font-size: 0.8rem; color: var(--text-faint); } +.model-tags { display: flex; gap: 6px; flex-wrap: wrap; margin-bottom: 12px; } +.model-tags span { + font-size: 0.72rem; + color: var(--text-muted); + border: 1px solid var(--border); + padding: 2px 8px; + border-radius: 6px; +} +.model-desc { font-size: 0.88rem; color: var(--text-muted); flex: 1; margin-bottom: 14px; } +.model-src { font-size: 0.84rem; font-weight: 600; } + +/* ---------- getting started ---------- */ + +.steps { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 18px; } +.step { + background: var(--bg-card); + border: 1px solid var(--border); + border-radius: 14px; + padding: 20px; +} +.step-n { + display: inline-flex; + width: 26px; + height: 26px; + align-items: center; + justify-content: center; + border-radius: 8px; + background: var(--accent-soft); + color: var(--accent-text); + font-weight: 700; + font-size: 0.85rem; + margin-bottom: 12px; +} +.step h3 { font-size: 0.98rem; font-weight: 650; margin-bottom: 8px; } +.step p { font-size: 0.87rem; color: var(--text-muted); margin-bottom: 12px; } + +pre { + background: var(--code-bg); + border: 1px solid var(--border); + border-radius: 10px; + padding: 13px 15px; + font-size: 0.8rem; + line-height: 1.55; + overflow-x: auto; + color: var(--text); +} +pre .c { color: var(--text-faint); } + +/* ---------- citation ---------- */ + +.cite-box { + position: relative; + background: var(--bg-card); + border: 1px solid var(--border); + border-radius: 14px; + padding: 20px; + margin-bottom: 16px; +} +.cite-box h3 { font-size: 0.95rem; font-weight: 650; margin-bottom: 10px; } +.copy-btn { + position: absolute; + top: 14px; + right: 14px; + font-size: 0.78rem; + font-weight: 600; + padding: 5px 11px; + border-radius: 8px; + border: 1px solid var(--border); + background: transparent; + color: var(--text-muted); + cursor: pointer; +} +.copy-btn:hover { color: var(--accent-text); border-color: var(--accent); } + +.rel-links { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 4px; } + +/* ---------- footer ---------- */ + +footer { + margin-top: 90px; + border-top: 1px solid var(--border); + padding: 36px 0 48px; + font-size: 0.86rem; + color: var(--text-faint); +} +.foot-inner { display: flex; flex-wrap: wrap; gap: 18px; justify-content: space-between; } +.foot-links { display: flex; gap: 18px; } +.foot-links a { color: var(--text-muted); } + +/* ---------- generative art ---------- */ + +.gdot { fill: var(--accent); opacity: 0.75; } +.gdot.infill { fill: var(--text-muted); opacity: 0.9; } + +@keyframes twinkle { + 0%, 100% { opacity: 0.1; } + 50% { opacity: 0.55; } +} +.twinkle { animation: twinkle 4.2s ease-in-out infinite; } +@media (prefers-reduced-motion: reduce) { + .twinkle { animation: none; } +} + +/* ---------- responsive ---------- */ + +@media (max-width: 720px) { + .nav-links { display: none; } + .hero-inner { padding: 64px 0 56px; } + .stat { padding-right: 22px; margin-right: 22px; } + section { padding: 60px 0 6px; } + .panel { padding: 18px 16px 14px; } +}