| | import React, { useState, useEffect, useRef } from 'react'; |
| | import { DataTable } from 'primereact/datatable'; |
| | import { Column } from 'primereact/column'; |
| | import Table from '../styled_components/Table'; |
| | import { Button } from 'primereact/button'; |
| | import { Tooltip } from 'primereact/tooltip'; |
| | import jsPDF from 'jspdf'; |
| | import autoTable from 'jspdf-autotable'; |
| | import axios from "axios"; |
| | import { useContext } from "react"; |
| | import { DataContext } from "../DataContext"; |
| | import { ProgressSpinner } from 'primereact/progressspinner'; |
| | import styled from 'styled-components'; |
| |
|
| | export function Leaderboard({ baseUrl }) { |
| |
|
| | const [products, setProducts] = useState(null); |
| | const dt = useRef(null); |
| | const { sharedData, setSharedData } = useContext(DataContext); |
| |
|
| |
|
| | let data = [ |
| | { Model: "OpenAi/whisper", WER: 0.15, FS: 0.87, FS_G: 8.41, FS_L: 0.85, FS_SEG: 0.8, FS_E: 0.8 }, |
| | { Model: "OpenAi/whisper-mini", WER: 0.25, FS: 0.8, FS_G: 0.85, FS_L: 0.75, FS_SEG: 0.65, FS_E: 0.8 } |
| | ] |
| |
|
| | useEffect(() => { |
| | if (!(sharedData && sharedData.Leaderboard)) { |
| | const fetchData = async () => { |
| | const headers = { |
| | 'ngrok-skip-browser-warning': "10008" |
| | }; |
| | const res = await axios.get(`${baseUrl}/fetch`, { headers }); |
| | let Data = res.data.data; |
| | const uniqueData = Data.filter((value, index, self) => |
| | index === self.findIndex((t) => t.Model === value.Model) |
| | ); |
| | setProducts(uniqueData); |
| | setSharedData({ ...sharedData, Leaderboard: uniqueData }) |
| | } |
| |
|
| | fetchData(); |
| | } else { |
| | setProducts(sharedData.Leaderboard); |
| | } |
| |
|
| |
|
| | }, [sharedData, setSharedData, baseUrl]); |
| |
|
| |
|
| | const exportCSV = (selectionOnly) => { |
| | dt.current.exportCSV({ selectionOnly }); |
| | }; |
| |
|
| | const exportPdf = () => { |
| | |
| | const doc = new jsPDF({ orientation: 'landscape' }); |
| |
|
| | |
| | |
| | doc.setFontSize(16); |
| | const pageWidth = doc.internal.pageSize.width; |
| | const text = 'Leaderboard Report'; |
| | const textWidth = doc.getTextWidth(text); |
| | const xPosition = (pageWidth - textWidth) / 2; |
| |
|
| | |
| | doc.text(text, xPosition, 15); |
| |
|
| | |
| | const columns = [ |
| | { header: 'Model Name', dataKey: 'Model' }, |
| | { header: 'Fairness Adjusted ASR Score', dataKey: 'FAAS' }, |
| | { header: 'Average WER', dataKey: 'WER' }, |
| | { header: 'Average RTFX', dataKey: 'RTFX' }, |
| | { header: 'Overall Fairness Score', dataKey: 'FS' }, |
| | { header: 'Fairness Score (Gender)', dataKey: 'FS_G' }, |
| | { header: 'Fairness Score (First Language)', dataKey: 'FS_L' }, |
| | { header: 'Fairness Score (Socioeconomic Background)', dataKey: 'FS_SEG' }, |
| | { header: 'Fairness Score (Ethnicity)', dataKey: 'FS_E' } |
| | ]; |
| |
|
| | |
| | const rows = products.map(row => columns.map(col => row[col.dataKey])); |
| |
|
| | |
| | autoTable(doc, { |
| | theme: 'grid', |
| | head: [columns.map(col => col.header)], |
| | body: rows, |
| | startY: 20, |
| | styles: { lineWidth: 0.15 }, |
| | headStyles: { textColor: 255, lineWidth: 0.15 } |
| | }); |
| |
|
| | doc.save('Leaderboard.pdf'); |
| | }; |
| |
|
| |
|
| | const header = ( |
| | <div className="flex align-items-center justify-content-end gap-2"> |
| | <Tooltip target=".tooltip-btn" /> |
| | <Button type="button" icon="pi pi-file" rounded onClick={() => exportCSV(false)} className="tooltip-btn" data-pr-tooltip="Export CSV" /> |
| | {/* <Button type="button" icon="pi pi-file-excel" severity="success" rounded onClick={exportExcel} data-pr-tooltip="XLS" /> */} |
| | <Button type="button" icon="pi pi-file-pdf" severity="warning" rounded onClick={exportPdf} className="tooltip-btn" data-pr-tooltip="Export PDF" /> |
| | </div> |
| | ); |
| | |
| | const [selectedCell, setSelectedCell] = useState(null); |
| | const onCellClick = (event) => { |
| | if(event.field!="Model") return ; |
| | const url = `https://huggingface.co/${event.value}`; |
| | window.open(url, "_blank", "noopener,noreferrer"); |
| | }; |
| |
|
| | return (<> |
| | {/* <h1>Leaderboard</h1> */} |
| | {/* <h3>Track Top performing models</h3> */} |
| | <H3>Leaderboard of the ASR models audited on this platform :</H3> |
| | {products ? (<div className="card border-round-3xl overflow-hidden shadow-2"> |
| | <Tooltip target=".export-buttons>button" position="bottom" /> |
| | <DataTable ref={dt} header={header} value={products} removableSort showGridlines |
| | sortField="FAAS" |
| | sortOrder={-1} |
| | tableStyle={{ minWidth: '20rem' }} |
| | cellSelection selectionMode="single" selection={selectedCell} |
| | onSelectionChange={(e) => setSelectedCell(e.value)} metaKeySelection={false} |
| | onCellClick={onCellClick} |
| | > |
| | <Column field="Model" header="Model Name" sortable filter></Column> |
| | <Column field="FAAS" header="Fairness Adjusted ASR Score" sortable></Column> |
| | <Column field="WER" header="Average WER" sortable></Column> |
| | <Column field="RTFX" header="Average RTFX" sortable></Column> |
| | <Column field="FS" header="Overall Fairness Score" sortable></Column> |
| | <Column field="FS_G" header="Fairness Score (Gender)" sortable></Column> |
| | <Column field="FS_L" header="Fairness Score (First Language)" sortable></Column> |
| | <Column field="FS_SEG" header="Fairness Score (Socioeconomic Background)" sortable></Column> |
| | <Column field="FS_E" header="Fairness Score (Ethnicity)" sortable></Column> |
| | </DataTable> |
| | </div>) |
| | : |
| | (<ProgressSpinner style={{ width: '200px', height: '200px' }} strokeWidth="3" />)} |
| | |
| | |
| | <br></br> |
| | </>) |
| | } |
| |
|
| | const H3 = styled.h3` |
| | color: #515458 !important |
| | ` |
| |
|
| |
|