Spaces:
Running
Running
| 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 = `<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: '' // This removes the "Showing 1 to X of Y entries" text | |
| } | |
| }); | |
| }) | |
| .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'; | |
| // 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(); | |
| } | |