Spaces:
Runtime error
Runtime error
import Papa from 'papaparse'; | |
import { DataTable } from 'simple-datatables'; | |
const languageMap = { | |
'All Languages': 'final_rankings.csv', | |
'Arabic': 'results_ar.csv', | |
'Turkish': 'results_tr.csv', | |
'Swahili': 'results_sw.csv', | |
'Russian': 'results_ru.csv', | |
'Telugu': 'results_te.csv', | |
'Thai': 'results_th.csv', | |
'Chinese': 'results_zh.csv', | |
'French': 'results_fr.csv', | |
'Hindi': 'results_hi.csv', | |
}; | |
const versionMap = { | |
'v1': 'v1', | |
'v2': 'v2' | |
}; | |
const versionChangelog = { | |
'v1': 'Initial release of FineTasks Leaderboard', | |
'v2': 'Changes in v2:\n' + | |
'• Fixed a bug in the rescaling of scores\n' + | |
'• Switched to using Native choice prefixes for Thai/Telugu/Hindi/Arabics\n' + | |
'• Added Options: anchors before showing options for continuation tasks (e.g Hellawag) - consistent improvement in scores\n' + | |
'• Removed openai/gpt-4o-mini' | |
}; | |
const columnNameMap = { | |
'runname': 'Model', | |
'agg_score_macro': 'Score', | |
'agg_score_RES': 'RES Score', | |
'agg_score_RC': 'RC Score', | |
'agg_score_GK': 'GK Score', | |
'agg_score_NLU': 'NLU Score', | |
'avg_rank_macro': 'Multilingual Score', | |
'rank': 'Rank' | |
}; | |
function createDropdown(options, onChange, initialValue = null) { | |
const select = document.createElement('select'); | |
options.forEach(option => { | |
const optionElement = document.createElement('option'); | |
optionElement.value = option; | |
optionElement.textContent = option; | |
if (initialValue && option === initialValue) { | |
optionElement.selected = true; | |
} | |
select.appendChild(optionElement); | |
}); | |
select.addEventListener('change', onChange); | |
return select; | |
} | |
function processTaskName(taskName) { | |
const parts = taskName.split('|'); | |
let processedName = parts.length > 1 ? parts[1] : taskName; | |
processedName = processedName.split('_mcf')[0].split('_cf')[0]; | |
return processedName; | |
} | |
function sanitizeColumnName(name) { | |
return name.replace(/[^a-zA-Z0-9-_]/g, '_'); | |
} | |
function createResultsTable(data, extraColumn) { | |
const tableWrapper = document.createElement('div'); | |
tableWrapper.className = 'table-wrapper leaderboard-table-wrapper'; | |
const table = document.createElement('table'); | |
table.className = 'results-table leaderboard-results-table'; | |
const columns = extraColumn === 'All Languages' | |
? ['rank', 'runname', 'avg_rank_macro'] | |
: ['rank', 'runname', 'agg_score_macro', extraColumn].filter(Boolean); | |
const header = table.createTHead(); | |
const headerRow = header.insertRow(); | |
columns.forEach(column => { | |
const th = document.createElement('th'); | |
th.textContent = columnNameMap[column] || processTaskName(column); | |
th.className = `column-${sanitizeColumnName(column)}`; // Sanitize the column name | |
headerRow.appendChild(th); | |
}); | |
const body = table.createTBody(); | |
data.forEach((row, index) => { | |
if (!row.runname) return; // Skip rows without a model name | |
const tr = body.insertRow(); | |
// Add gradient background for top 3 positions | |
if (index < 3) { | |
const opacity = 1 - (index * 0.25); // Creates a fading effect: 1, 0.75, 0.5 | |
tr.style.backgroundColor = `rgba(255, 165, 0, ${opacity * 0.2})`; // Light orange with fading opacity | |
tr.style.fontWeight = 600; // Make text slightly bolder for top 3 | |
} | |
columns.forEach(column => { | |
const td = tr.insertCell(); | |
td.className = `column-${sanitizeColumnName(column)}`; | |
if (column === 'rank') { | |
td.textContent = index + 1; | |
// Add special styling for top 3 ranks | |
if (index < 3) { | |
td.style.fontWeight = 'bold'; | |
switch(index) { | |
case 0: | |
td.style.color = '#FFB800'; // Gold | |
break; | |
case 1: | |
td.style.color = '#C0C0C0'; // Silver | |
break; | |
case 2: | |
td.style.color = '#CD7F32'; // Bronze | |
break; | |
} | |
} | |
} else if (column === 'runname') { | |
const modelName = row[column]; | |
let displayName; | |
// Check if it's a chat model | |
const chatModels = [ | |
'CohereForAI/c4ai-command-r-plus-08-2024', | |
'openai/gpt-4o-mini', | |
'silma-ai/SILMA-9B-Instruct-v1.0', | |
'microsoft/Phi-3.5-mini-instruct', | |
'TURKCELL/Turkcell-LLM-7b-v1' | |
]; | |
if (chatModels.some(chatModel => modelName.includes(chatModel))) { | |
displayName = `💬 ${modelName}`; | |
} else { | |
displayName = `🟢 ${modelName}`; | |
} | |
if (modelName.split("/")[0] !== "openai") | |
displayName = `<a href="https://huggingface.co/${modelName}">${displayName}</a>`; | |
td.innerHTML = displayName; | |
td.title = modelName; // Add full model name as tooltip | |
td.style.cursor = 'help'; // Change cursor to indicate hover functionality | |
} else { | |
const value = row[column]; | |
td.textContent = typeof value === 'number' ? value.toFixed(2) : value; | |
} | |
}); | |
}); | |
tableWrapper.appendChild(table); | |
return tableWrapper; | |
} | |
function createChangelog() { | |
const changelogContainer = document.createElement('div'); | |
changelogContainer.className = 'changelog-container'; | |
const changelogHeader = document.createElement('div'); | |
changelogHeader.className = 'changelog-header'; | |
const arrow = document.createElement('span'); | |
arrow.className = 'changelog-arrow'; | |
arrow.textContent = '▶'; | |
const label = document.createElement('span'); | |
label.textContent = 'Changelog'; | |
label.className = 'changelog-label'; | |
const content = document.createElement('div'); | |
content.className = 'changelog-content'; | |
content.style.display = 'none'; | |
changelogHeader.appendChild(arrow); | |
changelogHeader.appendChild(label); | |
changelogContainer.appendChild(changelogHeader); | |
changelogContainer.appendChild(content); | |
// Toggle changelog visibility | |
changelogHeader.addEventListener('click', () => { | |
const isVisible = content.style.display !== 'none'; | |
content.style.display = isVisible ? 'none' : 'block'; | |
arrow.textContent = isVisible ? '▶' : '▼'; | |
}); | |
return { container: changelogContainer, content }; | |
} | |
export function initLeaderboardResults(containerId) { | |
const container = document.getElementById(containerId); | |
if (!container) return; | |
const titleElement = document.createElement('h3'); | |
titleElement.textContent = 'FineTasks Leaderboard'; | |
titleElement.className = 'leaderboard-title'; | |
// Create changelog | |
const { container: changelogContainer, content: changelogContent } = createChangelog(); | |
const tableContainer = document.createElement('div'); | |
tableContainer.className = 'table-container'; | |
let leaderboardDataTable; | |
let currentData = []; | |
// Create caption element | |
const captionElement = document.createElement('figcaption'); | |
captionElement.className = 'table-caption'; | |
captionElement.textContent = container.dataset.caption || ''; | |
// Define update functions first | |
async function updateLanguageTable() { | |
const selectedVersion = versionDropdown.value; | |
const selectedLanguage = languageDropdown.value; | |
const csvFile = languageMap[selectedLanguage]; | |
try { | |
const response = await fetch(`data/os_models/${selectedVersion}/${csvFile}`); | |
if (!response.ok) { | |
throw new Error(`HTTP error! status: ${response.status}`); | |
} | |
const csvText = await response.text(); | |
const results = Papa.parse(csvText, { header: true, dynamicTyping: true }).data; | |
currentData = selectedLanguage === 'All Languages' | |
? results.sort((a, b) => a.avg_rank_macro - b.avg_rank_macro) | |
: results.sort((a, b) => b.agg_score_macro - a.agg_score_macro); | |
if (selectedLanguage !== 'All Languages') { | |
const columnOptions = ['None'].concat(Object.keys(currentData[0]).filter(key => | |
!['runname', 'seed', 'steps', 'agg_score_micro', 'rank', 'avg_rank_macro', ''].includes(key) | |
)); | |
extraColumnDropdown.innerHTML = ''; | |
columnOptions.forEach(option => { | |
const optionElement = document.createElement('option'); | |
optionElement.value = option; | |
optionElement.textContent = option === 'None' ? 'None' : processTaskName(option); | |
extraColumnDropdown.appendChild(optionElement); | |
}); | |
extraColumnDropdown.value = 'None'; | |
extraColumnLabel.style.display = 'inline'; | |
extraColumnDropdown.style.display = 'inline'; | |
} else { | |
extraColumnLabel.style.display = 'none'; | |
extraColumnDropdown.style.display = 'none'; | |
} | |
updateTable(); | |
updateChangelog(); | |
} catch (error) { | |
console.error('Error fetching CSV:', error); | |
tableContainer.innerHTML = `<p>Error loading data: ${error.message}</p>`; | |
} | |
} | |
function updateTable() { | |
const extraColumn = languageDropdown.value === 'All Languages' ? 'All Languages' : | |
(extraColumnDropdown.value === 'None' ? null : extraColumnDropdown.value); | |
tableContainer.innerHTML = ''; | |
const tableWrapper = createResultsTable(currentData, extraColumn); | |
tableContainer.appendChild(tableWrapper); | |
if (leaderboardDataTable) { | |
leaderboardDataTable.destroy(); | |
} | |
leaderboardDataTable = new DataTable('.leaderboard-results-table', { | |
perPage: 10, | |
perPageSelect: false, | |
searchable: false, | |
sortable: true, | |
fixedHeight: true, | |
labels: { | |
info: '' | |
} | |
}); | |
setTimeout(adjustColumnWidths, 0); | |
} | |
function updateChangelog() { | |
const selectedVersion = versionDropdown.value; | |
changelogContent.textContent = versionChangelog[selectedVersion]; | |
} | |
// Add this function to get URL parameters | |
function getUrlParameter(name) { | |
const urlParams = new URLSearchParams(window.location.search); | |
return urlParams.get(name); | |
} | |
// Add this function to set URL parameters | |
function updateUrlParameter(key, value) { | |
const urlParams = new URLSearchParams(window.location.search); | |
if (value) { | |
urlParams.set(key, value); | |
} else { | |
urlParams.delete(key); | |
} | |
const newUrl = `${window.location.pathname}${urlParams.toString() ? '?' + urlParams.toString() : ''}`; | |
window.history.pushState({ path: newUrl }, '', newUrl); | |
} | |
// Get initial language from URL | |
const urlLanguage = getUrlParameter('language'); | |
const initialLanguage = urlLanguage && Object.keys(languageMap).includes(urlLanguage) | |
? urlLanguage | |
: 'All Languages'; | |
// Create dropdowns with initial values | |
const languageLabel = document.createElement('label'); | |
languageLabel.textContent = 'Language: '; | |
const languageDropdown = createDropdown( | |
Object.keys(languageMap), | |
(e) => { | |
updateLanguageTable(); | |
updateUrlParameter('language', e.target.value === 'All Languages' ? null : e.target.value); | |
}, | |
initialLanguage | |
); | |
const extraColumnLabel = document.createElement('label'); | |
extraColumnLabel.textContent = 'Task: '; | |
const extraColumnDropdown = createDropdown(['None'], updateTable); | |
const versionLabel = document.createElement('label'); | |
versionLabel.textContent = 'Version: '; | |
const versionDropdown = createDropdown(Object.keys(versionMap), updateLanguageTable); | |
// Create controls | |
const controls = document.createElement('div'); | |
controls.className = 'controls leaderboard-controls fine-tasks-controls'; | |
const versionControlGroup = document.createElement('div'); | |
versionControlGroup.className = 'control-group'; | |
versionControlGroup.appendChild(versionLabel); | |
versionControlGroup.appendChild(versionDropdown); | |
const languageControlGroup = document.createElement('div'); | |
languageControlGroup.className = 'control-group'; | |
languageControlGroup.appendChild(languageLabel); | |
languageControlGroup.appendChild(languageDropdown); | |
const extraColumnControlGroup = document.createElement('div'); | |
extraColumnControlGroup.className = 'control-group'; | |
extraColumnControlGroup.appendChild(extraColumnLabel); | |
extraColumnControlGroup.appendChild(extraColumnDropdown); | |
controls.appendChild(versionControlGroup); | |
controls.appendChild(languageControlGroup); | |
controls.appendChild(extraColumnControlGroup); | |
// Add elements to container in new order | |
container.appendChild(titleElement); | |
container.appendChild(tableContainer); | |
container.appendChild(captionElement); | |
container.appendChild(controls); | |
container.appendChild(changelogContainer); | |
// Initialize with URL language if present | |
versionDropdown.value = 'v2'; | |
languageDropdown.value = initialLanguage; | |
updateLanguageTable(); | |
} | |
function adjustColumnWidths() { | |
const table = document.querySelector('.leaderboard-results-table'); | |
if (!table) return; | |
const columns = table.querySelectorAll('th'); | |
columns.forEach((column, index) => { | |
const columnClass = column.className; | |
const cells = table.querySelectorAll(`td.${columnClass}`); | |
let maxWidth = column.offsetWidth; | |
cells.forEach(cell => { | |
maxWidth = Math.max(maxWidth, cell.offsetWidth); | |
}); | |
let adjustedWidth; | |
if (index === 0) { // Rank column | |
adjustedWidth = 50; | |
} else if (index === 1) { // Model name column | |
adjustedWidth = 200; | |
} else if (index === 2) { // Macro score column | |
adjustedWidth = 100; | |
} else { // Extra column or any other column | |
adjustedWidth = Math.min(maxWidth, 150); // Set a maximum width of 150px for other columns | |
} | |
column.style.width = `${adjustedWidth}px`; | |
cells.forEach(cell => { | |
cell.style.width = `${adjustedWidth}px`; | |
}); | |
}); | |
} | |