GuardRateLeaderboard / src /lib /helpers /leaderboard.ts
Anton Malykhin
feat: integrate bucket-backed leaderboard data
c6afb12
Raw
History Blame Contribute Delete
1.27 kB
import type { GuardModel } from '$lib/types/leaderboard';
export function isNumber(value: unknown): value is number {
return typeof value === 'number' && Number.isFinite(value);
}
export function average(values: (number | null)[]) {
const present = values.filter(isNumber);
if (!present.length) return null;
return present.reduce((total, value) => total + value, 0) / present.length;
}
export function geometricMean(values: number[]) {
const present = values.filter((value) => value > 0);
if (!present.length) return null;
const logSum = present.reduce((total, value) => total + Math.log(value), 0);
return Math.exp(logSum / present.length);
}
export function sizeNumber(size: string) {
const parsed = Number.parseFloat(size);
return Number.isFinite(parsed) ? parsed : Number.NaN;
}
export function formatIsoDate(value: string, locale: string) {
const date = new Date(`${value}T00:00:00.000Z`);
if (Number.isNaN(date.getTime()) || date.toISOString().slice(0, 10) !== value) return value;
return new Intl.DateTimeFormat(locale, {
day: 'numeric',
month: 'short',
year: 'numeric',
timeZone: 'UTC'
}).format(date);
}
export function modelRepositoryUrl(model: GuardModel) {
return model.hfUrl ?? `https://huggingface.co/${model.name}`;
}