const $ = (id) => document.getElementById(id); const escape = (value) => String(value ?? '').replace(/[&<>"']/g, (c) => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c])); const number = (v) => v != null && Number.isFinite(Number(v)) ? Number(v) : null; const mean = (values) => { const a = values.map(number).filter((n) => n !== null); return a.length ? a.reduce((s,n) => s+n,0)/a.length : null; }; const fmt = (v, digits=3) => number(v) === null ? 'Not reported' : Number(v).toLocaleString('en-US',{maximumFractionDigits:digits,minimumFractionDigits:digits}); const countFmt = (v) => Number(v).toLocaleString('en-US'); const runtimeName = (v) => ({cpp:'C++',java:'Java',python:'Python'}[v] || v); const cols = [ {key:'compression_rate',label:'Average rate ↓',digits:4,visible:true}, {key:'overall_rate',label:'Overall rate ↓',digits:4,visible:false}, {key:'compression_time',label:'Encode ns/point ↓',digits:2,visible:true}, {key:'decompression_time',label:'Decode ns/point ↓',digits:2,visible:true}, {key:'compressed_bytes',label:'Compressed bytes',digits:0,visible:false}, {key:'original_bytes',label:'Original bytes',digits:0,visible:false}, ]; let snapshot, records=[], methods=new Map(), datasets=new Map(), currentRows=[], activeTab='overall'; let sort={key:'compression_rate',direction:1}; let selectedMethod=null; const state = () => ({runtime:$('runtime').value,dataset:$('dataset').value,dtype:$('dtype').value,precision:$('precision').value,family:$('family').value,mode:$('row-mode').value,search:$('search').value.trim().toLowerCase(),complete:$('complete-only').checked}); function scopeKey() { const s=state(); return s.dtype==='overall'?'overall':s.dtype==='int'?'integer':s.precision==='fixed'?'fixed_float':s.precision==='non_fixed'?'nonfixed_float':'float'; } function normalizeRecord(r) { return { ...r,configuration:r.algorithm_variant??r.algorithm??r.method,method:r.algorithm_variant??r.algorithm??r.method,runtime:r.runtime ?? r.implementation_language ?? snapshot.benchmark?.implementation_language ?? 'cpp', family:r.family ?? r.method_family ?? r.method ?? methods.get(r.algorithm)?.family ?? r.algorithm, compression_rate:number(r.compression_rate ?? r.average_compression_rate),compression_time:number(r.compression_time_ns_per_point ?? r.compression_time),decompression_time:number(r.decompression_time_ns_per_point ?? r.decompression_time), original_bytes:number(r.original_size_bytes ?? r.original_bytes ?? r.originalSize),compressed_bytes:number(r.compressed_size_bytes ?? r.compressed_bytes ?? r.compressedSize) }; } function filteredRecords(ignoreMethod=false) { const s=state(), scope=scopeKey(); let result=records.filter((r) => r.runtime===s.runtime && r.scope===scope && (s.dataset==='all'||r.dataset===s.dataset)); if(s.mode==='family') { const best=new Map(); for(const r of result){const key=`${r.dataset}\0${r.family}`;const prev=best.get(key);if(!prev||r.compression_rate({...r,method:r.family})); } return ignoreMethod?result:result.filter(r=>(s.family==='all'||r.family===s.family)&&(!s.search||(s.mode==='family'?r.family:`${r.method} ${r.family}`).toLowerCase().includes(s.search))); } function aggregate(input) { const groups=new Map(); for(const r of input) { if(!groups.has(r.method)) groups.set(r.method,[]); groups.get(r.method).push(r); } const totalDatasets=new Set(filteredRecords(true).map(r=>r.dataset)).size; const rows=[]; for(const [method,source] of groups) { const hasBytes=source.every(r=>r.original_bytes!==null && r.original_bytes>0 && r.compressed_bytes!==null && r.compressed_bytes>0); const original=hasBytes?source.reduce((s,r)=>s+r.original_bytes,0):null, compressed=hasBytes?source.reduce((s,r)=>s+r.compressed_bytes,0):null; rows.push({method,family:source[0].family,runtime:source[0].runtime,compression_rate:mean(source.map(r=>r.compression_rate)),compression_time:mean(source.map(r=>r.compression_time)),decompression_time:mean(source.map(r=>r.decompression_time)),overall_rate:hasBytes?compressed/original:null,original_bytes:original,compressed_bytes:compressed,coverage:new Set(source.map(r=>r.dataset)).size,totalDatasets,source}); } return rows.filter(r=>!state().complete||r.coverage===totalDatasets).sort((a,b)=>{ const av=number(a[sort.key]),bv=number(b[sort.key]); if(av===null&&bv===null)return a.method.localeCompare(b.method); if(av===null)return 1;if(bv===null)return -1; return sort.direction*(av-bv)||a.method.localeCompare(b.method); }); } function renderTable() { const visible=cols.filter(c=>c.visible); $('leaderboard').querySelector('thead').innerHTML=`PositionMethod / configuration${visible.map(c=>``).join('')}Dataset coverage`; const minima=Object.fromEntries(visible.map(c=>[c.key,Math.min(...currentRows.map(r=>number(r[c.key])).filter(n=>n!==null))])); $('leaderboard').querySelector('tbody').innerHTML=currentRows.length?currentRows.map((r,i)=>`${i+1}${escape(r.family)} · ${escape(runtimeName(r.runtime))}${visible.map(c=>`${fmt(r[c.key],c.digits)}`).join('')}${r.coverage} / ${r.totalDatasets}`).join(''):`No measurements match this selection. Try another runtime, data type, or dataset.`; for(const button of $('leaderboard').querySelectorAll('[data-sort]'))button.addEventListener('click',()=>{const key=button.dataset.sort;sort={key,direction:sort.key===key?-sort.direction:1};refresh();}); for(const button of $('leaderboard').querySelectorAll('[data-method]'))button.addEventListener('click',()=>showMethod(button.dataset.method,true)); $('row-count').textContent=`${currentRows.length} ${state().mode==='family'?'method families':'method configurations'} · sorted by ${cols.find(c=>c.key===sort.key)?.label??sort.key}`; $('download').disabled=!currentRows.length; } function refresh() { if(!snapshot)return; $('precision').disabled=$('dtype').value!=='float'; if(scopeKey()==='float'&&!records.some(r=>r.scope==='float')) { // The exporter must publish an explicit all-float scope; never combine // preaggregated fixed/non-fixed metrics and call it an all-float result. $('results-note').textContent='All-float measurements are not available in this snapshot. Select a precision category.'; } else $('results-note').textContent=state().mode==='family'?'Each family uses its lowest-rate measured configuration per dataset. Configurations may differ across datasets; use Exact configuration for fixed parameters.':'Each row retains one exact configuration. Lower compression rates and lower ns/point are better. Coverage counts datasets, not identical column sets.'; currentRows=aggregate(filteredRecords()); const s=state(),scope=scopeKey(),ds=s.dataset==='all'?'all measured datasets':s.dataset; const names={overall:'all numeric columns',integer:'integer columns',float:'floating-point columns',fixed_float:'fixed-precision float columns',nonfixed_float:'non-fixed-precision float columns'}; $('selection-summary').textContent=`${runtimeName(s.runtime)} · ${names[scope]||scope} · ${ds} · ${currentRows.length} methods`; $('view-title').textContent=activeTab==='dataset'?`${s.dataset==='all'?'Dataset':s.dataset} leaderboard`:activeTab==='tradeoffs'?'Storage and execution trade-offs':'Overall leaderboard'; renderTable(); if(activeTab==='tradeoffs')renderChart(); if(selectedMethod)showMethod(selectedMethod,false); } function setTab(tab) { activeTab=['overall','dataset','tradeoffs','methods','paper','about'].includes(tab)?tab:'overall'; for(const b of document.querySelectorAll('[data-tab]')){b.classList.toggle('active',b.dataset.tab===activeTab);if(b.dataset.tab===activeTab)b.setAttribute('aria-current','page');else b.removeAttribute('aria-current');} $('results-view').hidden=['methods','paper','about'].includes(activeTab);$('methods-view').hidden=activeTab!=='methods';$('paper-view').hidden=activeTab!=='paper';$('about-view').hidden=activeTab!=='about';$('chart-view').hidden=activeTab!=='tradeoffs'; if(activeTab==='dataset'&&$('dataset').value==='all'){const first=[...datasets.keys()].find(k=>records.some(r=>r.dataset===k&&r.runtime===$('runtime').value));if(first)$('dataset').value=first;} if(activeTab==='overall')$('dataset').value='all'; refresh(); } function showMethod(method,focus=false) { const row=currentRows.find(r=>r.method===method), detail=$('method-detail'); if(!row){selectedMethod=null;detail.hidden=true;return;}selectedMethod=method; const meta=methods.get(method)??methods.get(row.source[0].configuration), pipeline=meta?.operator_pipeline; const source=row.source.slice().sort((a,b)=>a.dataset.localeCompare(b.dataset)); detail.innerHTML=`

${escape(method)}

${escape(row.family)} · ${escape(runtimeName(row.runtime))} · ${row.coverage} measured datasets

${fmt(row.compression_rate,4)}average compression rate
${fmt(row.compression_time,2)}encoding ns/point
${fmt(row.decompression_time,2)}decoding ns/point
${row.coverage} / ${row.totalDatasets}dataset coverage
${pipeline?`

Interpretive operator mapping: ${escape(typeof pipeline==='string'?pipeline:JSON.stringify(pipeline))}

`:''}

Dataset metrics below come from the published result files. Independent round-trip evidence and hardware are ${snapshot.benchmark?.roundtrip_evidence?'documented in the manifest':'not reported for this snapshot'}.

${source.map(r=>``).join('')}
DatasetConfigurationRate ↓Encode ns/point ↓Decode ns/point ↓Original bytesCompressed bytes
${escape(r.dataset)}${escape(r.configuration)}${fmt(r.compression_rate,4)}${fmt(r.compression_time,2)}${fmt(r.decompression_time,2)}${fmt(r.original_bytes,0)}${fmt(r.compressed_bytes,0)}
`; detail.hidden=false;$('close-detail').addEventListener('click',()=>{detail.hidden=true;selectedMethod=null;}); if(focus){detail.scrollIntoView({block:'nearest',behavior:'auto'});detail.focus({preventScroll:true});} } function renderChart() { const metric=$('chart-metric').value; const valid=currentRows.filter(r=>r.compression_rate>0&&r[metric]>0); if(!valid.length){$('chart').innerHTML='

No positive measurements to plot for this selection.

';return;} const width=1100,height=410,pad={left:85,right:35,top:30,bottom:65}; const maxRate=Math.max(...valid.map(r=>r.compression_rate))*1.08; const logs=valid.map(r=>Math.log10(r[metric]));let minLog=Math.floor(Math.min(...logs)),maxLog=Math.ceil(Math.max(...logs));if(maxLog===minLog)maxLog=minLog+1; const x=r=>pad.left+r/maxRate*(width-pad.left-pad.right),y=n=>height-pad.bottom-(Math.log10(n)-minLog)/(maxLog-minLog)*(height-pad.top-pad.bottom); let graph=''; for(let i=0;i<=5;i++){const rate=maxRate*i/5,px=x(rate);graph+=`${fmt(rate,2)}`;} for(let i=minLog;i<=maxLog;i++){const n=10**i,py=y(n);graph+=`${n.toLocaleString('en-US',{maximumFractionDigits:3})}`;} for(const r of valid)graph+=`${escape(r.method)} | rate ${fmt(r.compression_rate,4)} | ${fmt(r[metric],2)} ns/point | coverage ${r.coverage}/${r.totalDatasets}`; graph+=`Average compression rate (compressed / original) ↓${metric==='compression_time'?'Encoding':'Decoding'} ns/point (log scale) ↓`; $('chart').innerHTML=`${graph}`; for(const p of $('chart').querySelectorAll('[data-method]')){p.addEventListener('click',()=>showMethod(p.dataset.method,true));p.addEventListener('keydown',e=>{if(e.key==='Enter'||e.key===' '){e.preventDefault();showMethod(p.dataset.method,true);}});} } function csv() { const quote=v=>{let text=String(v??'');if(typeof v==='string'&&/^[=+@-]/.test(text))text="'"+text;return `"${text.replace(/"/g,'""')}"`;}; const columns=['position','method','runtime','scope','row_mode','selected_dataset','sort_metric','sort_direction','average_compression_rate','overall_compression_rate','encode_ns_per_point','decode_ns_per_point','dataset_coverage','datasets_in_scope','selected_configuration_by_dataset']; const body=currentRows.map((r,i)=>[i+1,r.method,r.runtime,scopeKey(),state().mode,state().dataset,sort.key,sort.direction===1?'ascending':'descending',r.compression_rate,r.overall_rate,r.compression_time,r.decompression_time,r.coverage,r.totalDatasets,JSON.stringify(Object.fromEntries(r.source.map(s=>[s.dataset,s.configuration])))].map(quote).join(',')); const url=URL.createObjectURL(new Blob(['\ufeff'+[columns.join(','),...body].join('\r\n')],{type:'text/csv;charset=utf-8'}));const a=document.createElement('a');a.href=url;a.download=`THULab-compression-${state().runtime}-${scopeKey()}-${state().dataset}.csv`;a.click();setTimeout(()=>URL.revokeObjectURL(url),1000); } function renderAbout() { const b=snapshot.benchmark||{},s=snapshot.source||{},c=snapshot.coverage||{}; const notes=[b.scope_note,b.aggregation_note,b.selection_note,...(b.notes||[]),...(b.measurement_boundaries||[])].filter(Boolean); $('methodology').innerHTML=notes.map(n=>`

${escape(n)}

`).join(''); const definitions=b.metric_definitions||{};if(Object.keys(definitions).length)$('methodology').innerHTML+=`
${Object.entries(definitions).map(([k,v])=>`
${escape(k.replaceAll('_',' '))}
${escape(typeof v==='string'?v:JSON.stringify(v))}
`).join('')}
`; const exclusions=c.exclusions||c.excluded_datasets||snapshot.exclusions||[]; const info={ 'Snapshot exported':snapshot.exported_at||s.exported_at||'Not reported','Dataset scope generated':s.generated_at||'Not reported', 'Source checkout':s.git_commit||'Not reported','Source files':`${s.source_files?.length??0} metadata inputs and ${s.result_csv_files_used?.length??0} result CSVs (hashes in manifest)`,'Result entries across scopes':`${records.length} (scope slices can reuse a measurement)`,'Worktree source state':s.worktree_dirty_inputs?.length?'Includes current local changes; input file hashes identify the published snapshot.':'See manifest for source file hashes.','Runtime environment':b.hardware||'Hardware details are not recorded in this exported result snapshot.','Lossless evidence':b.roundtrip_evidence||'Lossless-design method filter from the source project; per-run round-trip verification is not recorded here.'}; $('provenance').innerHTML=`${Object.entries(info).map(([k,v])=>``).join('')}
${escape(k)}${escape(v)}
${exclusions.length?`

Excluded or unavailable results

${escape(typeof exclusions==='string'?exclusions:JSON.stringify(exclusions))}

`:''}`; const groups=new Map();for(const r of records){if(!groups.has(r.family))groups.set(r.family,[]);groups.get(r.family).push(r.configuration);} $('method-catalog').innerHTML=`
${[...groups].sort((a,b)=>a[0].localeCompare(b[0])).map(([family,names])=>`

${escape(family)}

    ${[...new Set(names)].sort().map(n=>`
  • ${escape(n)}
  • `).join('')}
`).join('')}
`; } function init() { if(snapshot.compact_records){const t=snapshot.record_tables;snapshot.dataset_results=snapshot.compact_records.map(r=>({dataset:t.datasets[r[0]],scope:t.scopes[r[1]],runtime:t.runtimes[r[2]],family:t.families[r[3]],method:t.configurations[r[4]],algorithm_variant:t.configurations[r[4]],compression_rate:r[5],compression_time_ns_per_point:r[6],decompression_time_ns_per_point:r[7],original_size_bytes:r[8],compressed_size_bytes:r[9]}));delete snapshot.compact_records;} for(const m of snapshot.methods||[]) { const method=typeof m==='string'?{name:m}:m;methods.set(method.name??method.method,method);for(const c of method.configurations||[])methods.set(c.algorithm_variant,{...method,name:c.algorithm_variant,family:method.name}); } for(const d of snapshot.datasets||[])datasets.set(d.key??d.dataset,d); records=(snapshot.dataset_results||snapshot.records||[]).map(normalizeRecord).filter(r=>r.method&&r.dataset&&r.compression_rate>0); for(const r of records)if(!methods.has(r.method))methods.set(r.method,{name:r.method,family:r.family}); const runtimes=[...new Set(records.map(r=>r.runtime))].sort((a,b)=>['cpp','java','python'].indexOf(a)-['cpp','java','python'].indexOf(b)); $('runtime').innerHTML=runtimes.map(r=>``).join(''); $('dataset').innerHTML=''+[...datasets.values()].sort((a,b)=>(a.key??a.dataset).localeCompare(b.key??b.dataset)).map(d=>``).join(''); $('family').innerHTML=''+[...new Set(records.map(r=>r.family))].sort().map(f=>``).join(''); $('dataset-count').textContent=countFmt(new Set(records.map(r=>r.dataset)).size);$('method-count').textContent=countFmt(new Set(records.map(r=>r.family)).size);$('runtime-count').textContent=runtimes.length;$('record-count').textContent=countFmt(snapshot.coverage?.runtime_configuration_count??new Set(records.map(r=>`${r.runtime}\0${r.method}`)).size); const exported=snapshot.exported_at||snapshot.source?.exported_at||'not reported';$('snapshot').textContent=`Result snapshot exported · ${String(exported).replace('T',' ').slice(0,19)}${exported==='not reported'?'':' UTC'}`;$('footer-snapshot').textContent=`Source inputs documented in the manifest`; $('column-options').innerHTML=cols.map(c=>``).join(''); for(const input of $('column-options').querySelectorAll('input'))input.addEventListener('change',()=>{cols.find(c=>c.key===input.dataset.column).visible=input.checked;renderTable();}); for(const id of ['runtime','dtype','precision','dataset','family','row-mode','complete-only'])$(id).addEventListener('change',refresh);$('search').addEventListener('input',refresh);$('chart-metric').addEventListener('change',renderChart);$('download').addEventListener('click',csv); $('reset').addEventListener('click',()=>{$('runtime').value=runtimes.includes('cpp')?'cpp':runtimes[0];$('dtype').value='overall';$('precision').value='all';$('dataset').value='all';$('row-mode').value='family';$('search').value='';$('family').value='all';$('complete-only').checked=false;selectedMethod=null;$('method-detail').hidden=true;sort={key:'compression_rate',direction:1};setTab(activeTab);}); for(const tab of document.querySelectorAll('[data-tab]'))tab.addEventListener('click',()=>{history.replaceState(null,'',`#${tab.dataset.tab}`);setTab(tab.dataset.tab);}); const renderPaper=()=>{const rows=(snapshot.paper_table3?.rows||[]).filter(r=>r.scope===$('paper-scope').value);$('paper-table').querySelector('tbody').innerHTML=rows.map(r=>`${escape(r.method)}${fmt(r.rank,1)}${fmt(r.average_compression_rate,4)}${fmt(r.average_compression_time_ns_per_point,1)}${fmt(r.average_decompression_time_ns_per_point,1)}${fmt(r.median_balanced_score,4)}`).join('');};$('paper-scope').addEventListener('change',renderPaper);renderPaper(); renderAbout();setTab(location.hash.slice(1)||'overall'); document.documentElement.dataset.ready='true'; } function setupTheme() { let stored;try{stored=localStorage.getItem('thulab-theme');}catch{} const query=new URLSearchParams(location.search).get('__theme'); const theme=stored||(['dark','light'].includes(query)?query:matchMedia('(prefers-color-scheme:dark)').matches?'dark':'light'); document.documentElement.dataset.theme=theme;$('theme').textContent=theme==='dark'?'Light mode':'Dark mode'; $('theme').addEventListener('click',()=>{const next=document.documentElement.dataset.theme==='dark'?'light':'dark';document.documentElement.dataset.theme=next;$('theme').textContent=next==='dark'?'Light mode':'Dark mode';try{localStorage.setItem('thulab-theme',next);}catch{}}); } setupTheme(); try { const response=await fetch('./ui-data.json');if(!response.ok)throw new Error(`Snapshot request returned ${response.status}`);snapshot=await response.json();init(); } catch(e){$('load-error').hidden=false;$('load-error').textContent=`The result snapshot could not be loaded. Please reload the page or download the JSON from the repository. ${e.message}`;$('snapshot').textContent='Snapshot unavailable';$('leaderboard').querySelector('tbody').innerHTML='Results unavailable.';}