const DEFAULT_CTX = "default"; const K_SIGMA = 1.0; const MIN_TOL = 0.25; const MODEL_COL_WIDTH = 180; const WINNER_COL_WIDTH = 120; const state = { contexts: [], contextMap: new Map(), envs: [], backendOrder: [], columnWidths: {}, filters: { search: "", quant: "", context: DEFAULT_CTX, backends: new Set(), sizeLo: null, sizeHi: null, }, ui: {}, sizeStats: { min: Infinity, max: -Infinity }, draggingEnv: null, }; document.addEventListener("DOMContentLoaded", async () => { cacheUI(); try { const res = await fetch("results.json"); const data = await res.json(); prepareData(data?.runs || []); initializeControls(); renderTables(); } catch (err) { console.error("Failed to load results.json", err); state.ui.stats.textContent = "Failed to load results.json"; } }); function cacheUI() { state.ui = { search: document.getElementById("filter-search"), quant: document.getElementById("filter-quant"), contextChips: document.getElementById("context-chips"), backendList: document.getElementById("backend-list"), backendAll: document.getElementById("backend-all"), backendNone: document.getElementById("backend-none"), sizeLo: document.getElementById("sizeLo"), sizeHi: document.getElementById("sizeHi"), sizeTrack: document.getElementById("sizeTrack"), sizeLoVal: document.getElementById("sizeLoVal"), sizeHiVal: document.getElementById("sizeHiVal"), stats: document.getElementById("stats-line"), resetBtn: document.getElementById("reset-layout"), tables: document.getElementById("tables"), }; } function prepareData(runs) { const contextMap = new Map(); const envSet = new Set(); const quantSet = new Set(); for (const run of runs) { const test = normalizeTest(run.test); if (!test || !run.env) continue; const contextKey = run.context || DEFAULT_CTX; const env = run.env; envSet.add(env); if (run.quant) quantSet.add(run.quant.toUpperCase()); const ctx = ensureContext(contextMap, contextKey, run.context_tokens); const testEntry = ensureTest(ctx, test.original); const modelName = run.model_clean || run.model; const row = ensureModel(testEntry, modelName, run); row.backends[env] = { mean: typeof run.tps_mean === "number" ? run.tps_mean : null, std: typeof run.tps_std === "number" ? run.tps_std : null, error: Boolean(run.error), error_type: run.error_type || null, }; } state.contextMap = contextMap; state.contexts = [...contextMap.values()].sort((a, b) => { if (a.key === DEFAULT_CTX) return -1; if (b.key === DEFAULT_CTX) return 1; if (a.tokens && b.tokens) return a.tokens - b.tokens; if (a.tokens) return -1; if (b.tokens) return 1; return a.key.localeCompare(b.key); }); state.envs = [...envSet].sort(); state.backendOrder = [...state.envs]; state.columnWidths = Object.fromEntries(state.envs.map((env) => [env, 120])); state.quantOptions = [...quantSet].sort(); state.filters.context = state.contexts[0]?.key || DEFAULT_CTX; state.filters.backends = new Set(state.envs); } function ensureContext(map, key, tokens) { if (!map.has(key)) { map.set(key, { key, label: formatContextLabel(key, tokens), tokens: tokens ?? null, tests: new Map(), }); } else if (tokens && !map.get(key).tokens) { const ctx = map.get(key); ctx.tokens = tokens; ctx.label = formatContextLabel(key, tokens); } return map.get(key); } function ensureTest(ctx, testName) { if (!ctx.tests.has(testName)) { ctx.tests.set(testName, { name: testName, models: new Map(), }); } return ctx.tests.get(testName); } function ensureModel(testEntry, modelName, run) { if (!testEntry.models.has(modelName)) { testEntry.models.set(modelName, { model: modelName, quant: (run.quant || "Unknown").toUpperCase(), sizeB: run.name_params_b ?? run.params_b ?? null, backends: {}, search_blob: [modelName, run.quant, run.env, run.test] .filter(Boolean) .map((s) => s.toString().toLowerCase()) .join(" "), }); } const row = testEntry.models.get(modelName); const sizeCandidate = run.name_params_b ?? run.params_b; if (row.sizeB == null && typeof sizeCandidate === "number") { row.sizeB = sizeCandidate; } if (typeof row.sizeB === "number") { state.sizeStats.min = Math.min(state.sizeStats.min, row.sizeB); state.sizeStats.max = Math.max(state.sizeStats.max, row.sizeB); } return row; } function initializeControls() { const { quant, contextChips, backendList, search, resetBtn, sizeLo, sizeHi } = state.ui; quant.innerHTML = ""; const anyOpt = document.createElement("option"); anyOpt.value = ""; anyOpt.textContent = "Any"; quant.appendChild(anyOpt); state.quantOptions.forEach((q) => { const opt = document.createElement("option"); opt.value = q; opt.textContent = q; quant.appendChild(opt); }); contextChips.innerHTML = ""; state.contexts.forEach((ctx) => { const btn = document.createElement("button"); btn.type = "button"; btn.className = "chip" + (ctx.key === state.filters.context ? " active" : ""); btn.dataset.context = ctx.key; btn.textContent = ctx.label; contextChips.appendChild(btn); }); renderBackendList(); setupSizeSlider(); search.addEventListener("input", (e) => { state.filters.search = (e.target.value || "").trim().toLowerCase(); renderTables(); }); quant.addEventListener("change", (e) => { state.filters.quant = e.target.value; renderTables(); }); contextChips.addEventListener("click", (e) => { const btn = e.target.closest("button[data-context]"); if (!btn) return; state.filters.context = btn.dataset.context; [...contextChips.querySelectorAll("button")].forEach((b) => b.classList.toggle("active", b === btn)); renderTables(); }); backendList.addEventListener("change", (e) => { const checkbox = e.target.closest("input[data-env]"); if (!checkbox) return; const env = checkbox.dataset.env; if (checkbox.checked) { state.filters.backends.add(env); } else { state.filters.backends.delete(env); } renderTables(); }); state.ui.backendAll.addEventListener("click", () => { state.filters.backends = new Set(state.envs); renderBackendList(); renderTables(); }); state.ui.backendNone.addEventListener("click", () => { state.filters.backends = new Set(); renderBackendList(); renderTables(); }); sizeLo.addEventListener("input", () => updateSizeUI(true)); sizeHi.addEventListener("input", () => updateSizeUI(true)); resetBtn.addEventListener("click", () => { state.filters.search = ""; state.filters.quant = ""; state.filters.context = state.contexts[0]?.key || DEFAULT_CTX; state.filters.backends = new Set(state.envs); search.value = ""; quant.value = ""; [...contextChips.querySelectorAll("button")].forEach((btn) => btn.classList.toggle("active", btn.dataset.context === state.filters.context) ); renderBackendList(); setupSizeSlider(); renderTables(); }); } function renderBackendList() { const container = state.ui.backendList; container.innerHTML = ""; state.backendOrder.forEach((env) => { const label = document.createElement("label"); label.className = "backend-item"; const checkbox = document.createElement("input"); checkbox.type = "checkbox"; checkbox.dataset.env = env; checkbox.checked = state.filters.backends.has(env); label.appendChild(checkbox); const baseSpan = document.createElement("span"); const { base, tags } = splitEnvName(env); baseSpan.textContent = base; label.appendChild(baseSpan); tags.forEach((tag) => { const pill = document.createElement("span"); pill.className = "tag"; pill.textContent = tag; label.appendChild(pill); }); container.appendChild(label); }); } function setupSizeSlider() { const { sizeLo, sizeHi } = state.ui; const minRaw = state.sizeStats.min === Infinity ? 0 : Math.floor(state.sizeStats.min || 0); const maxRaw = state.sizeStats.max === -Infinity ? 0 : Math.ceil(state.sizeStats.max || 0); const minB = Math.max(0, minRaw); const maxB = Math.max(minB, maxRaw); [sizeLo, sizeHi].forEach((inp) => { inp.min = minB; inp.max = maxB; inp.step = 1; }); sizeLo.value = minB; sizeHi.value = maxB; sizeLo.style.zIndex = 2; sizeHi.style.zIndex = 1; updateSizeUI(false); } function updateSizeUI(triggerRender) { const { sizeLo, sizeHi, sizeLoVal, sizeHiVal, sizeTrack } = state.ui; if (+sizeLo.value > +sizeHi.value) { if (document.activeElement === sizeLo) { sizeHi.value = sizeLo.value; } else { sizeLo.value = sizeHi.value; } } sizeLo.style.zIndex = +sizeLo.value >= +sizeHi.max - 1 ? 4 : 2; sizeHi.style.zIndex = +sizeHi.value <= +sizeLo.min + 1 ? 3 : 1; state.filters.sizeLo = +sizeLo.value; state.filters.sizeHi = +sizeHi.value; sizeLoVal.textContent = formatSizeLabel(state.filters.sizeLo); sizeHiVal.textContent = formatSizeLabel(state.filters.sizeHi); const range = (sizeHi.max - sizeLo.min) || 1; const minB = +sizeLo.min; const start = ((state.filters.sizeLo - minB) / range) * 100; const end = ((state.filters.sizeHi - minB) / range) * 100; sizeTrack.style.background = `linear-gradient(to right, #e3e7f1 ${start}%, var(--accent) ${start}%, var(--accent) ${end}%, #e3e7f1 ${end}%)`; if (triggerRender) renderTables(); } function renderTables() { const ctx = state.contextMap.get(state.filters.context); if (!ctx) { state.ui.tables.innerHTML = "
No data for this context.
"; state.ui.stats.textContent = "0 rows"; return; } const backendList = state.backendOrder.filter((env) => state.filters.backends.has(env)); const tests = [...ctx.tests.values()].sort((a, b) => a.name.localeCompare(b.name)); const frag = document.createDocumentFragment(); let totalRows = 0; for (const test of tests) { const models = filterModels(test.models); if (!models.length) continue; totalRows += models.length; const block = document.createElement("div"); block.className = "test-block"; const heading = document.createElement("h2"); heading.textContent = `${test.name.toUpperCase()} — tokens/second`; block.appendChild(heading); const tableWrap = document.createElement("div"); tableWrap.className = "table-wrap"; const scroller = document.createElement("div"); scroller.className = "table-scroll"; const modelsWithWinners = models.map((model) => { const winners = computeWinners(model, backendList); return { ...model, _cachedWinners: winners }; }); const table = buildSingleTable(modelsWithWinners, backendList); scroller.appendChild(table); tableWrap.appendChild(scroller); block.appendChild(tableWrap); setupResizeOverlay(scroller, backendList, table); frag.appendChild(block); } state.ui.tables.innerHTML = ""; if (frag.childNodes.length) { state.ui.tables.appendChild(frag); } else { state.ui.tables.innerHTML = "No models match the current filters.
"; } state.ui.stats.textContent = `Showing ${totalRows.toLocaleString()} model rows across ${backendList.length} backends`; } function buildSingleTable(models, backendList) { const table = document.createElement("table"); const colgroup = document.createElement("colgroup"); const colModel = document.createElement("col"); colModel.style.width = `${MODEL_COL_WIDTH}px`; colgroup.appendChild(colModel); const colWinner = document.createElement("col"); colWinner.style.width = `${WINNER_COL_WIDTH}px`; colgroup.appendChild(colWinner); backendList.forEach((env) => { const col = document.createElement("col"); col.style.width = `${state.columnWidths[env] || 120}px`; col.dataset.env = env; colgroup.appendChild(col); }); table.appendChild(colgroup); const thead = document.createElement("thead"); const headRow = document.createElement("tr"); headRow.appendChild(makeHeaderCell("Model", "model")); headRow.appendChild(makeHeaderCell("Winner", "winner")); backendList.forEach((env) => { const th = makeHeaderCell(env, "backend-header"); attachHeaderInteractions(th, env); headRow.appendChild(th); }); thead.appendChild(headRow); table.appendChild(thead); const tbody = document.createElement("tbody"); models.forEach((model) => { const tr = document.createElement("tr"); const tdModel = document.createElement("td"); tdModel.className = "model"; tdModel.innerHTML = `