Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 9 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -181,13 +181,15 @@ SHA-256 so consumers can reject a partially updated artifact pair.
Every aggregate is separated by task/config revision, model revision, runner
revision, container digest, hardware, resolution, appliance, target-data access,
smoke/full scope, and a digest of every protocol override. Context length,
epochs, and sample limits remain visible in the generated table.
The website's rank groups use a separate comparison-protocol digest covering
effective context length and epochs, tuning method/trial budget/selection
protocol, and the immutable runner, contrib, container, and hardware tuple. It
intentionally excludes model-specific selected parameters and the study digest,
so different models remain comparable and evaluation seeds from one frozen
study can still aggregate. A corrected
epochs, sample limits, tuning records, and runtime provenance remain visible in
the generated artifacts.

Public rank is generated once, in Python, within an evaluation cohort defined by
task/config revision, profile, resolution, appliance, sample limit, target-data
access, and smoke/full scope. Architecture choices such as context length and
epoch count, and provenance changes such as a later container build, do not
reset rank. The complete comparison-protocol digest still records those details
for audit and exact reproduction. A corrected
full run becomes `full-verified`, and a smoke run becomes `smoke-verified`, only
after the required seeds 10, 20, and 42 pass source, container, and dataset
provenance checks. Incomplete clean smoke matrices are labelled `smoke-partial`.
Expand Down
20 changes: 6 additions & 14 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -925,7 +925,7 @@ <h2>Built to become NILM's ImageNet</h2>
<div class="lb-sub" id="live-leaderboard-summary">Loading immutable result bundles&hellip;</div>
<div class="table-container">
<table class="lb">
<thead><tr><th>Group rank</th><th>Model</th><th>Task / appliance</th><th>MAE&darr; (W)</th><th>F1&uarr;</th><th>Params</th><th>Time&darr;</th><th>Peak VRAM&darr;</th><th>Status</th></tr></thead>
<thead><tr><th>Rank</th><th>Model</th><th>Task / appliance</th><th>MAE&darr; (W)</th><th>F1&uarr;</th><th>Params</th><th>Time&darr;</th><th>Peak VRAM&darr;</th><th>Status</th></tr></thead>
<tbody id="live-leaderboard-body">
<tr><td colspan="9" style="color:var(--text-muted)">Loading&hellip;</td></tr>
</tbody>
Expand Down Expand Up @@ -1558,12 +1558,6 @@ <h2>Cite NILMBench2026</h2>
function memoryInMiB(value) {
return value == null ? '&mdash;' : `${(Number(value) / 1048576).toFixed(1)} MiB`;
}
function comparisonKey(entry) {
return [
entry.comparison_protocol_sha256,
entry.appliance,
].join('|');
}
async function loadLiveLeaderboard() {
const body = document.getElementById('live-leaderboard-body');
const summary = document.getElementById('live-leaderboard-summary');
Expand All @@ -1578,9 +1572,10 @@ <h2>Cite NILMBench2026</h2>
return;
}
const statusOrder = {'full-verified': 0, 'smoke-verified': 1, 'smoke-partial': 2, 'candidate': 3, 'smoke-unverified': 4};
entries.sort((a,b)=>comparisonKey(a).localeCompare(comparisonKey(b)) ||
(statusOrder[a.status]??9)-(statusOrder[b.status]??9) || a.mae_mean-b.mae_mean);
const ranks = new Map();
entries.sort((a,b)=>a.ranking_protocol_sha256.localeCompare(b.ranking_protocol_sha256) ||
(statusOrder[a.status]??9)-(statusOrder[b.status]??9) ||
(a.rank??Number.MAX_SAFE_INTEGER)-(b.rank??Number.MAX_SAFE_INTEGER) ||
a.mae_mean-b.mae_mean);
body.innerHTML = entries.map((entry) => {
const protocol = [
entry.sequence_length ? `seq ${entry.sequence_length}` : null,
Expand All @@ -1589,10 +1584,7 @@ <h2>Cite NILMBench2026</h2>
].filter(Boolean).join(' / ');
const task = `${entry.task} / ${entry.appliance} / ${entry.sample_period}s` +
(protocol ? ` / ${protocol}` : '');
const key = comparisonKey(entry);
const isVerified = entry.status === 'full-verified' || entry.status === 'smoke-verified';
const rank = isVerified ? (ranks.get(key) ?? 0) + 1 : null;
if (rank != null) ranks.set(key, rank);
const rank = Number.isInteger(entry.rank) ? entry.rank : null;
const cls = rank === 1 ? ' class="gold"' : '';
return `<tr${cls}><td class="rank">${rank ?? '&mdash;'}</td><td>${escHTML(entry.model)}</td>` +
`<td class="fam">${escHTML(task)}</td>` +
Expand Down
Loading
Loading