import torch import json import hashlib from collections import Counter from pathlib import Path LEADERBOARD_PATH = Path("leaderboard.json") def cargar_etiquetas(): with open("etiquetas.txt", "r") as f: etiquetas = f.read().splitlines()[1:] num_clases = len(etiquetas) codigo = {etiqueta.lower(): i for i, etiqueta in enumerate(etiquetas)} return etiquetas, num_clases, codigo def multiclass_accuracy(predictions, labels): # Obtén las clases predichas (la clase con la mayor probabilidad) _, predicted_classes = torch.max(predictions, 1) # Compara las clases predichas con las etiquetas verdaderas correct_predictions = (predicted_classes == labels).sum().item() # Calcula la precisión accuracy = correct_predictions / labels.size(0) return accuracy def obtener_sha256(ruta_archivo): sha256 = hashlib.sha256() with open(ruta_archivo, "rb") as archivo: for bloque in iter(lambda: archivo.read(8192), b""): sha256.update(bloque) return sha256.hexdigest() def calcular_puntaje(accuracy): accuracy_pct = accuracy * 100 base = max(0, min(accuracy_pct - 55, 20)) extra = 10 if accuracy_pct > 95 else 0 return int(base + extra) def cargar_leaderboard(): if not LEADERBOARD_PATH.exists(): return [] with LEADERBOARD_PATH.open("r", encoding="utf-8") as f: return json.load(f) def _marcar_duplicados(registros): conteo = Counter(entry["sha256"] for entry in registros) for entry in registros: entry["duplicado"] = conteo[entry["sha256"]] > 1 return registros def guardar_registro_leaderboard(entry, max_entries=500): registros = cargar_leaderboard() registros.append(entry) registros = registros[-max_entries:] registros = _marcar_duplicados(registros) LEADERBOARD_PATH.write_text( json.dumps(registros, indent=2, ensure_ascii=False), encoding="utf-8", ) return registros def limpiar_leaderboard(): LEADERBOARD_PATH.write_text("[]", encoding="utf-8")