import Papa from 'papaparse'; import { DataTable } from 'simple-datatables'; const languageMap = { 'Arabic': 'ar', 'Turkish': 'tr', 'Swahili': 'sw', 'Russian': 'ru', 'Telugu': 'te', 'Thai': 'th', 'Chinese': 'zh', 'French': 'fr', 'Hindi': 'hi', }; const metricTypes = [ { value: 'max_score', label: 'Max Score' }, { value: 'avg_snr', label: 'Low Noise' }, { value: 'avg_spearman', label: 'Monotonicity' }, { value: 'max_n_std', label: 'Non-Randomness' }, { value: 'avg_kendall_tau_a', label: 'Ordering Consistency' } ]; const tableTypes = [ { value: 'gen', label: 'Generative' }, { value: 'mc', label: 'Multichoice' } ]; const taskFolders = [ { value: 'selected', label: 'FineTasks' }, { value: 'non_selected', label: 'Non-Selected' } ]; function createDropdown(options, onChange) { const select = document.createElement('select'); options.forEach(option => { const optionElement = document.createElement('option'); if (typeof option === 'object' && option.value && option.label) { optionElement.value = option.value; optionElement.textContent = option.label; } else { optionElement.value = option; optionElement.textContent = option; } select.appendChild(optionElement); }); select.addEventListener('change', onChange); return select; } function createPerTaskResultsTable(data, tableType, metric) { const tableWrapper = document.createElement('div'); tableWrapper.className = 'table-wrapper fine-tasks-table-wrapper'; const table = document.createElement('table'); table.className = 'results-table fine-tasks-results-table'; const columns = ['Task', 'Type', ...(tableType === 'gen' ? ['f1', 'prefix_match'] : ['acc', 'acc_norm', 'acc_norm_token', 'acc_norm_pmi'])]; const columnNameMap = { // 'Task': 'Task', // 'Type': 'Type', // 'f1': 'f1', // 'prefix_match': 'prefix_match', // 'acc': 'acc', 'acc_norm': 'acc_char', 'acc_norm_token': 'acc_token', 'acc_norm_pmi': 'acc_pmi', 'prefix_match': 'prefix' }; const taskMetricMap = { 'max_score': 'score', 'avg_snr': 'snr', 'avg_spearman': 'monotonicity', 'max_n_std': 'non-randomness', 'avg_kendall_tau_a': 'ordering' // 'avg_spearman': 'monotonicity', } const header = table.createTHead(); const headerRow = header.insertRow(); columns.forEach(column => { const th = document.createElement('th'); th.textContent = columnNameMap[column] || column; if (th.textContent !== "Task" && th.textContent !== "Type") { th.textContent += " " + (taskMetricMap[metric] || metric); } th.title = th.textContent; if (column === 'Type') th.style.width = '40px'; headerRow.appendChild(th); }); const body = table.createTBody(); data.forEach(row => { if (Object.values(row).every(value => value === '' || value === undefined || value === null)) { return; } const tr = body.insertRow(); columns.forEach(column => { const td = tr.insertCell(); let value = row[column]; if (column === 'Task') { const fullTaskName = value; // Store the full task name const parts = value.split('|'); value = parts.length > 1 ? parts[1] : value; value = value.split('_mcf')[0].split('_cf')[0]; td.title = fullTaskName; // Set the title attribute to show the full name on hover } else if (column === 'Type') { // Keep the task type as is } else if (typeof value === 'number') { value = value.toFixed(2); } else if (value && !isNaN(parseFloat(value))) { value = parseFloat(value).toFixed(2); } else { value = ''; } td.textContent = value; }); }); tableWrapper.appendChild(table); return tableWrapper; } export function initFineTasks(containerId) { const container = document.getElementById(containerId); if (!container) return; const perTaskTitleElement = document.createElement('h3'); perTaskTitleElement.textContent = 'Task Results'; perTaskTitleElement.className = 'fine-tasks-title'; const perTaskTableContainer = document.createElement('div'); perTaskTableContainer.className = 'table-container'; let perTaskDataTable; function updatePerTaskResults() { const language = languageDropdownPerTask.value; const metric = metricDropdownPerTask.value; const tableType = tableTypeDropdownPerTask.value; const taskFolder = taskFolderDropdownPerTask.value; const languageCode = languageMap[language]; if (!languageCode) { console.error(`Language code not found for ${language}`); perTaskTableContainer.innerHTML = `
Error: Language code not found for ${language}
`; return; } let url = `data/tasks/${taskFolder}/${languageCode}/${metric}/${tableType}_stats.csv`; fetch(url) .then(response => { if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } return response.text(); }) .then(csvText => { const results = Papa.parse(csvText, { header: true }).data; perTaskTableContainer.innerHTML = ''; const tableWrapper = createPerTaskResultsTable(results, tableType, metric); perTaskTableContainer.appendChild(tableWrapper); if (perTaskDataTable) { perTaskDataTable.destroy(); } perTaskDataTable = new DataTable('.fine-tasks-results-table', { perPage: 10, perPageSelect: false, searchable: false, sortable: true, fixedHeight: true, labels: { info: '' // This removes the "Showing 1 to X of Y entries" text } }); }) .catch(error => { console.error('Error fetching CSV:', error); perTaskTableContainer.innerHTML = `Error loading data: ${error.message}
`; }); } const perTaskControls = document.createElement('div'); perTaskControls.className = 'controls fine-tasks-controls'; // Task folder control group const taskFolderControlGroup = document.createElement('div'); taskFolderControlGroup.className = 'control-group'; const taskFolderLabelPerTask = document.createElement('label'); taskFolderLabelPerTask.textContent = 'Task Set: '; const taskFolderDropdownPerTask = createDropdown(taskFolders, updatePerTaskResults); taskFolderDropdownPerTask.value = 'selected'; // Set default to FineTasks taskFolderControlGroup.appendChild(taskFolderLabelPerTask); taskFolderControlGroup.appendChild(taskFolderDropdownPerTask); // Language control group const languageControlGroup = document.createElement('div'); languageControlGroup.className = 'control-group'; const languageLabelPerTask = document.createElement('label'); languageLabelPerTask.textContent = 'Language: '; const languageDropdownPerTask = createDropdown(Object.keys(languageMap), updatePerTaskResults); languageControlGroup.appendChild(languageLabelPerTask); languageControlGroup.appendChild(languageDropdownPerTask); // Table type control group const tableTypeControlGroup = document.createElement('div'); tableTypeControlGroup.className = 'control-group'; const tableTypeLabelPerTask = document.createElement('label'); tableTypeLabelPerTask.textContent = 'Type: '; const tableTypeDropdownPerTask = createDropdown(tableTypes, updatePerTaskResults); tableTypeControlGroup.appendChild(tableTypeLabelPerTask); tableTypeControlGroup.appendChild(tableTypeDropdownPerTask); // Metric control group const metricControlGroup = document.createElement('div'); metricControlGroup.className = 'control-group'; const metricLabelPerTask = document.createElement('label'); metricLabelPerTask.textContent = 'Criteria: '; const metricDropdownPerTask = createDropdown(metricTypes, updatePerTaskResults); metricDropdownPerTask.value = 'max_score'; // Set default to Max Score metricControlGroup.appendChild(metricLabelPerTask); metricControlGroup.appendChild(metricDropdownPerTask); perTaskControls.appendChild(taskFolderControlGroup); perTaskControls.appendChild(languageControlGroup); perTaskControls.appendChild(tableTypeControlGroup); perTaskControls.appendChild(metricControlGroup); container.appendChild(perTaskControls); // container.appendChild(perTaskTitleElement); container.appendChild(perTaskTableContainer); // Initialize with default values updatePerTaskResults(); }