// embodied-efficiency console: theme toggle + the live deploy-compiler. // The Pareto frontier is static real-L4 data, so the compiler runs entirely in // the browser: move a slider, re-pick and redraw with no round-trip. (function () { "use strict"; // ---- Theme (light/dark), persisted, system fallback, no flash ---------- var root = document.documentElement; var THEME_KEY = "embodied-efficiency-theme"; function applyTheme(t) { t === "dark" ? root.classList.add("dark") : root.classList.remove("dark"); } (function initTheme() { var saved = localStorage.getItem(THEME_KEY); if (saved) applyTheme(saved); else applyTheme(window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"); })(); window.toggleTheme = function () { var dark = root.classList.toggle("dark"); localStorage.setItem(THEME_KEY, dark ? "dark" : "light"); if (window.__eeDraw) window.__eeDraw(); // redraw plot so axis colours follow the theme }; // ---- Deploy-compiler --------------------------------------------------- function initCompiler() { var dataEl = document.getElementById("configs-data"); var plotEl = document.getElementById("pareto"); var resultEl = document.getElementById("pick-result"); if (!dataEl || !plotEl || !resultEl) return; var CONFIGS = JSON.parse(dataEl.textContent); var els = { lat: document.getElementById("max_lat"), mb: document.getElementById("max_mb"), rmse: document.getElementById("max_rmse"), stale: document.getElementById("max_stale"), }; var vals = { lat: document.getElementById("v_lat"), mb: document.getElementById("v_mb"), rmse: document.getElementById("v_rmse"), stale: document.getElementById("v_stale"), }; var objBtns = Array.prototype.slice.call(document.querySelectorAll(".ee-obj")); var state = { objective: "latency" }; // latency slider is log-scaled: it spans the real data range tightly. var MS_LO = Math.log10(0.015), MS_HI = Math.log10(13); function latFromSlider() { return Math.pow(10, MS_LO + (els.lat.value / 1000) * (MS_HI - MS_LO)); } function fmtMs(ms) { return ms >= 1 ? ms.toFixed(2) : ms.toFixed(3); } function setObjective(obj) { state.objective = obj; objBtns.forEach(function (b) { var on = b.getAttribute("data-obj") === obj; b.classList.toggle("border-signal-500", on); b.classList.toggle("bg-signal-50", on); b.classList.toggle("text-signal-700", on); b.classList.toggle("dark:bg-signal-500/10", on); b.classList.toggle("dark:text-signal-300", on); b.classList.toggle("border-slate-200", !on); b.classList.toggle("text-slate-600", !on); b.classList.toggle("dark:border-white/10", !on); b.classList.toggle("dark:text-slate-300", !on); }); } function budget() { return { objective: state.objective, max_lat: latFromSlider(), max_mb: parseFloat(els.mb.value), max_rmse: parseFloat(els.rmse.value), max_stale: parseInt(els.stale.value, 10), }; } function pick(b) { var feas = CONFIGS.filter(function (c) { return c.ms_per_action <= b.max_lat && c.weight_mb <= b.max_mb && c.rmse <= b.max_rmse && c.staleness <= b.max_stale; }); if (!feas.length) return { chosen: null, feas: feas }; var key = b.objective === "footprint" ? "weight_mb" : "ms_per_action"; var chosen = feas.reduce(function (a, c) { return c[key] < a[key] ? c : a; }); return { chosen: chosen, feas: feas }; } // rMSE -> colour: emerald (low error) through amber to rose (high error). function lerp(a, b, t) { return a.map(function (x, i) { return Math.round(x + (b[i] - x) * t); }); } function rmseColor(r) { var EM = [16, 185, 129], AM = [217, 160, 60], RO = [244, 100, 110]; var t = Math.max(0, Math.min(1, r / 0.26)); var c = t < 0.5 ? lerp(EM, AM, t / 0.5) : lerp(AM, RO, (t - 0.5) / 0.5); return "rgb(" + c[0] + "," + c[1] + "," + c[2] + ")"; } function renderResult(res, b) { if (!res.chosen) { resultEl.innerHTML = '
' + '' + '
No config fits that budget.
Loosen a slider, the fidelity cap is usually the tight one.
'; return; } var c = res.chosen; var primary = b.objective === "footprint" ? { big: c.weight_mb + " MB", label: "of weights" } : { big: fmtMs(c.ms_per_action), label: "ms / action" }; resultEl.innerHTML = '
' + '
' + '' + ' Picked config' + '' + res.feas.length + ' of ' + CONFIGS.length + ' fit' + '
' + '
' + '
' + primary.big + '
' + '
' + primary.label + '
' + '
' + '' + c.precision + '' + '' + c.steps + ' flow steps' + 'chunk ' + c.exec_horizon + '' + '
' + '
' + '
' + statCell(fmtMs(c.ms_per_action), "ms / action") + statCell(c.weight_mb + " MB", "footprint") + statCell(c.rmse.toFixed(3), "action rMSE") + '
' + '
' + 'staleness of the last chunked action' + '' + c.staleness + ' steps' + '
' + '
'; } function statCell(big, label) { return '
' + '
' + big + '
' + '
' + label + '
'; } // ---- SVG Pareto scatter ---- function draw(res) { var W = 480, H = 300, m = { l: 50, r: 14, t: 14, b: 40 }; var iw = W - m.l - m.r, ih = H - m.t - m.b; var dark = root.classList.contains("dark"); var axis = dark ? "rgb(100 116 139)" : "rgb(148 163 184)"; var grid = dark ? "rgb(148 163 184 / 0.12)" : "rgb(15 23 42 / 0.07)"; var label = dark ? "rgb(148 163 184)" : "rgb(100 116 139)"; var xs = CONFIGS.map(function (c) { return Math.log10(c.ms_per_action); }); var xLo = Math.min.apply(null, xs), xHi = Math.max.apply(null, xs); xLo -= 0.12; xHi += 0.12; var yLo = 10, yHi = 54; function X(ms) { return m.l + (Math.log10(ms) - xLo) / (xHi - xLo) * iw; } function Y(mb) { return m.t + (1 - (mb - yLo) / (yHi - yLo)) * ih; } var feasSet = new Set(res.feas); var svg = ''; // x grid + ticks at decade-ish marks var xticks = [0.02, 0.05, 0.1, 0.25, 0.5, 1, 2, 5, 12]; xticks.forEach(function (t) { if (Math.log10(t) < xLo || Math.log10(t) > xHi) return; var x = X(t); svg += line(x, m.t, x, m.t + ih, grid, 1); svg += text(x, H - m.b + 16, t, label, "middle"); }); // y grid + ticks [13.7, 26.4, 51].forEach(function (mb) { var y = Y(mb); svg += line(m.l, y, m.l + iw, y, grid, 1); svg += text(m.l - 8, y + 3, mb, label, "end"); }); // axis lines svg += line(m.l, m.t + ih, m.l + iw, m.t + ih, axis, 1.2); svg += line(m.l, m.t, m.l, m.t + ih, axis, 1.2); // axis labels svg += 'ms / action (log scale, lower is faster)'; svg += 'weight (MB)'; // points (infeasible faded, feasible solid), picked drawn last with a ring CONFIGS.forEach(function (c) { if (c === res.chosen) return; var feasible = feasSet.has(c); svg += '' + '' + c.precision + ', ' + c.steps + ' steps, chunk ' + c.exec_horizon + ' — ' + fmtMs(c.ms_per_action) + ' ms/action, ' + c.weight_mb + ' MB, rMSE ' + c.rmse.toFixed(3) + ''; }); if (res.chosen) { var cx = X(res.chosen.ms_per_action), cy = Y(res.chosen.weight_mb); svg += ''; svg += ''; } svg += ""; plotEl.innerHTML = svg; } function line(x1, y1, x2, y2, stroke, w) { return ''; } function text(x, y, t, fill, anchor) { return '' + t + ''; } function update() { var b = budget(); vals.lat.textContent = fmtMs(b.max_lat); vals.mb.textContent = (b.max_mb % 1 === 0 ? b.max_mb : b.max_mb.toFixed(1)); vals.rmse.textContent = b.max_rmse.toFixed(3); vals.stale.textContent = b.max_stale; var res = pick(b); renderResult(res, b); draw(res); } window.__eeDraw = function () { update(); }; objBtns.forEach(function (b) { b.addEventListener("click", function () { setObjective(b.getAttribute("data-obj")); update(); }); }); Object.keys(els).forEach(function (k) { els[k].addEventListener("input", update); }); var reset = document.getElementById("reset-budget"); if (reset) reset.addEventListener("click", function () { els.lat.value = 1000; els.mb.value = 51; els.rmse.value = 0.05; els.stale.value = 49; setObjective("latency"); update(); }); setObjective("latency"); update(); } // ---- Supervisor scenario rows: reflect the checked radio --------------- function initScenarioStyling() { var labels = Array.prototype.slice.call(document.querySelectorAll(".ee-scen")); if (!labels.length) return; function refresh() { labels.forEach(function (l) { var input = l.querySelector("input[type=radio]"); var on = input && input.checked; l.classList.toggle("border-signal-400", on); l.classList.toggle("bg-signal-50/60", on); l.classList.toggle("dark:border-signal-400/40", on); l.classList.toggle("dark:bg-signal-500/10", on); }); } labels.forEach(function (l) { l.addEventListener("change", refresh); }); refresh(); } document.addEventListener("DOMContentLoaded", function () { initCompiler(); initScenarioStyling(); }); })();