File size: 3,727 Bytes
0380c4f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import os
import json
import datetime
from pathlib import Path
import numpy as np

class Database:
    def __init__(self, submission_dir="submissions"):
        self.submission_dir = submission_dir
        os.makedirs(submission_dir, exist_ok=True)
        
    def add_submission(self, submission):
        """Add a new submission to the database"""
        # Generate a timestamp and ID for the submission
        timestamp = datetime.datetime.now().isoformat()
        submission_id = f"{submission['model_name'].replace(' ', '_')}_{timestamp.replace(':', '-')}"
        
        # Add timestamp and ID to submission
        submission['timestamp'] = timestamp
        submission['id'] = submission_id
        
        # Save submission to a JSON file
        file_path = os.path.join(self.submission_dir, f"{submission_id}.json")
        with open(file_path, 'w') as f:
            json.dump(submission, f, indent=2)
            
        return submission_id
    
    def get_submission(self, submission_id):
        """Get a specific submission by ID"""
        file_path = os.path.join(self.submission_dir, f"{submission_id}.json")
        if os.path.exists(file_path):
            with open(file_path, 'r') as f:
                return json.load(f)
        return None
    
    def get_all_submissions(self):
        """Get all submissions"""
        submissions = []
        for file_name in os.listdir(self.submission_dir):
            if file_name.endswith('.json'):
                file_path = os.path.join(self.submission_dir, file_name)
                with open(file_path, 'r') as f:
                    submissions.append(json.load(f))
        return submissions
    
    def get_leaderboard(self, sort_by="score", ascending=False):
        """Get submissions sorted for leaderboard display"""
        submissions = self.get_all_submissions()
        
        # Make sure we have submissions to sort
        if not submissions:
            return []
            
        # Sort submissions
        if sort_by in submissions[0]:
            submissions.sort(key=lambda x: x.get(sort_by, 0), reverse=not ascending)
        
        return submissions
    
    def delete_submission(self, submission_id):
        """Delete a submission by ID"""
        file_path = os.path.join(self.submission_dir, f"{submission_id}.json")
        if os.path.exists(file_path):
            os.remove(file_path)
            return True
        return False

# Load leaderboard configuration
def load_config():
    try:
        if os.path.exists("models.json") and os.path.getsize("models.json") > 0:
            with open("models.json", "r") as f:
                return json.load(f)
        else:
            print("models.json file is empty or missing. Creating with default configuration.")
            # Default configuration
            config = {
                "title": "TRAIL Model Leaderboard",
                "description": "Submit and compare model performances",
                "metrics": ["Cat. F1", "Loc. Acc", "Joint F1"],
                "main_metric": "Cat. F1"
            }
            with open("models.json", "w") as f:
                json.dump(config, f, indent=2)
            return config
    except json.JSONDecodeError:
        print("Error parsing models.json. Creating with default configuration.")
        # Default configuration if JSON is invalid
        config = {
            "title": "TRAIL Model Leaderboard",
            "description": "Submit and compare model performances",
            "metrics": ["Cat. F1", "Loc. Acc", "Joint F1"],
            "main_metric": "Cat. F1"
        }
        with open("models.json", "w") as f:
            json.dump(config, f, indent=2)
        return config