File size: 2,059 Bytes
237774d
a2dd494
 
 
 
 
 
237774d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a2dd494
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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")