| 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 = { |
| |
| |
| |
| |
| |
| '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' |
| |
| } |
|
|
| 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; |
| const parts = value.split('|'); |
| value = parts.length > 1 ? parts[1] : value; |
| value = value.split('_mcf')[0].split('_cf')[0]; |
| td.title = fullTaskName; |
| } else if (column === 'Type') { |
| |
| } 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 = `<p>Error: Language code not found for ${language}</p>`; |
| 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: '' |
| } |
| }); |
|
|
| }) |
| .catch(error => { |
| console.error('Error fetching CSV:', error); |
| perTaskTableContainer.innerHTML = `<p>Error loading data: ${error.message}</p>`; |
| }); |
| } |
|
|
| const perTaskControls = document.createElement('div'); |
| perTaskControls.className = 'controls fine-tasks-controls'; |
|
|
| |
| 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'; |
| taskFolderControlGroup.appendChild(taskFolderLabelPerTask); |
| taskFolderControlGroup.appendChild(taskFolderDropdownPerTask); |
|
|
| |
| 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); |
|
|
| |
| 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); |
|
|
| |
| 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'; |
| metricControlGroup.appendChild(metricLabelPerTask); |
| metricControlGroup.appendChild(metricDropdownPerTask); |
|
|
| perTaskControls.appendChild(taskFolderControlGroup); |
| perTaskControls.appendChild(languageControlGroup); |
| perTaskControls.appendChild(tableTypeControlGroup); |
| perTaskControls.appendChild(metricControlGroup); |
|
|
| container.appendChild(perTaskControls); |
| |
| container.appendChild(perTaskTableContainer); |
|
|
| |
| updatePerTaskResults(); |
| } |
|
|