import { DataTable } from 'primereact/datatable' import { Column } from 'primereact/column' import { FilterMatchMode } from 'primereact/api' import { MultiSelect } from 'primereact/multiselect' import { useState, useEffect } from 'react' import Medal from './Medal' import { Slider } from 'primereact/slider' import ScoreColumns from './ScoreColumns' const ModelTable = ({ data, selectedLanguages = [], allLanguages = [], machineTranslatedMetrics = [] }) => { const [filters, setFilters] = useState({ type: { value: null, matchMode: FilterMatchMode.IN }, size: { value: null, matchMode: FilterMatchMode.BETWEEN }, cost: { value: null, matchMode: FilterMatchMode.BETWEEN } }) const rankBodyTemplate = rowData => { return } const typeRowFilterTemplate = options => { return ( { options.filterApplyCallback(e.value) setFilters(prevFilters => ({ ...prevFilters, type: { value: e.value, matchMode: FilterMatchMode.IN } })) }} placeholder='All types' /> ) } const formatSize = size => { if (size === null) { return '' } else if (size >= 0 && size <= 1) { return size.toFixed(2) + '' } else if (size < 1000) { return size.toFixed(0) + '' } else if (size < 1000 * 1000) { return (size / 1000).toFixed(0) + 'K' } else if (size < 1000 * 1000 * 1000) { return (size / 1000 / 1000).toFixed(0) + 'M' } else { return (size / 1000 / 1000 / 1000).toFixed(0) + 'B' } } const SliderWithLabel = ({ value, onChange, min, max }) => { const p = 10; const start = value === null || value[0] === null ? min : Math.log(value[0]) / Math.log(p); const stop = value === null || value[1] === null ? max : Math.log(value[1]) / Math.log(p); const [_value, _setValue] = useState([start, stop]); useEffect(() => { const timer = setTimeout(() => { onChange({ value: // set to "no filter" when (almost) the whole range is selected _value[0] <= min + 0.1 && _value[1] >= max - 0.1 ? null : [p ** _value[0], p ** _value[1]], }); }, 1000); return () => clearTimeout(timer); }, [_value, onChange, min, max]); return ( {formatSize(p ** _value[0])} {formatSize(p ** _value[1])} _setValue(e.value)} placeholder='All sizes' min={min} max={max} step={0.01} range style={{ marginTop: '5rem' }} /> ) } const sizeFilterTemplate = options => { return ( { options.filterApplyCallback(e.value) setFilters(prevFilters => ({ ...prevFilters, size: { value: e.value, matchMode: FilterMatchMode.BETWEEN } })) }} /> ) } const costFilterTemplate = options => { return ( { options.filterApplyCallback(e.value) setFilters(prevFilters => ({ ...prevFilters, cost: { value: e.value, matchMode: FilterMatchMode.BETWEEN } })) }} /> ) } const sizeBodyTemplate = rowData => { const sizeStr = formatSize(rowData.size) return ( {sizeStr} ) } const modelBodyTemplate = rowData => ( {rowData.name} ) const typeBodyTemplate = rowData => { return rowData.type === 'open-source' ? ( ) : ( ) } const costBodyTemplate = rowData => { return ( {rowData.cost === null ? 'n/a' : `$${rowData.cost.toFixed(2)}`} ) } const getHeaderText = () => { // Count languages that have any evaluation data (any task scores available) const evaluatedLanguagesCount = allLanguages.filter(lang => { // Check if language has any task scores (not just average) const hasAnyScores = [ 'translation_from_bleu', 'translation_to_bleu', 'classification_accuracy', 'mmlu_accuracy', 'arc_accuracy', 'truthfulqa_accuracy', 'mgsm_accuracy' ].some(metric => lang[metric] !== null && lang[metric] !== undefined) return hasAnyScores }).length if (selectedLanguages.length === 0) { return ( AI Models Performance across {evaluatedLanguagesCount} evaluated languages ) } else if (selectedLanguages.length === 1) { return ( AI Models {selectedLanguages[0].language_name} performance ) } else { const languageNames = selectedLanguages.map(lang => lang.language_name).join(', ') return ( AI Models Performance for {languageNames} ) } } return ( {getHeaderText()}>} sortField='average' removableSort filters={filters} filterDisplay='menu' scrollable scrollHeight='600px' id='model-table' style={{ width: '100%', minHeight: '650px' }} emptyMessage='No models have been evaluated for the selected languages.' > } headerTooltip='Open-source / Closed-source' filter filterElement={typeRowFilterTemplate} showFilterMatchModes={false} body={typeBodyTemplate} /> {ScoreColumns(machineTranslatedMetrics)} ) } export default ModelTable