k-mktr commited on
Commit
7f79669
·
verified ·
1 Parent(s): e6dc9b1

Update leaderboard.py

Browse files
Files changed (1) hide show
  1. leaderboard.py +102 -16
leaderboard.py CHANGED
@@ -7,7 +7,6 @@ import config
7
  import math
8
  from nc_py_api import Nextcloud
9
 
10
-
11
  # Dictionary to store ELO ratings
12
  elo_ratings = {}
13
 
@@ -28,6 +27,37 @@ def load_leaderboard() -> Dict[str, Any]:
28
  print(f"Error loading leaderboard: {str(e)}")
29
  return {}
30
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  def save_leaderboard(leaderboard_data: Dict[str, Any]) -> bool:
32
  try:
33
  nc = Nextcloud(
@@ -112,21 +142,27 @@ def update_elo_ratings(winner, loser):
112
 
113
  def initialize_elo_ratings():
114
  leaderboard = load_leaderboard()
 
 
 
115
  for model, _ in config.get_approved_models():
116
- size = get_model_size(model)
117
- elo_ratings[model] = 1000 + (size * 100)
 
118
 
119
- # Replay all battles to update ELO ratings
120
  for model, data in leaderboard.items():
121
- if model not in elo_ratings:
122
- elo_ratings[model] = 1000 + (get_model_size(model) * 100)
123
- for opponent, results in data['opponents'].items():
124
- if opponent not in elo_ratings:
125
- elo_ratings[opponent] = 1000 + (get_model_size(opponent) * 100)
126
- for _ in range(results['wins']):
127
- update_elo_ratings(model, opponent)
128
- for _ in range(results['losses']):
129
- update_elo_ratings(opponent, model)
 
 
130
 
131
  def ensure_elo_ratings_initialized():
132
  if not elo_ratings:
@@ -134,6 +170,7 @@ def ensure_elo_ratings_initialized():
134
 
135
  def update_leaderboard(winner: str, loser: str) -> Dict[str, Any]:
136
  leaderboard = load_leaderboard()
 
137
 
138
  if winner not in leaderboard:
139
  leaderboard[winner] = {"wins": 0, "losses": 0, "opponents": {}}
@@ -149,16 +186,59 @@ def update_leaderboard(winner: str, loser: str) -> Dict[str, Any]:
149
  # Update ELO ratings
150
  update_elo_ratings(winner, loser)
151
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  save_leaderboard(leaderboard)
 
153
  return leaderboard
154
 
155
  def get_current_leaderboard() -> Dict[str, Any]:
156
- return load_leaderboard()
 
 
 
 
 
157
 
158
  def get_human_readable_name(model_name: str) -> str:
159
  model_dict = dict(config.get_approved_models())
160
  return model_dict.get(model_name, model_name)
161
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
162
  def get_leaderboard():
163
  leaderboard = load_leaderboard()
164
 
@@ -231,9 +311,15 @@ def get_elo_leaderboard():
231
  headers = ["#", "Model", "ELO Rating", "Wins", "Losses", "Total Battles", "Win Rate"]
232
 
233
  leaderboard = load_leaderboard()
234
- all_models = set(dict(config.get_approved_models()).keys()) | set(leaderboard.keys())
235
 
236
- for model in all_models:
 
 
 
 
 
 
 
237
  # Get ELO rating
238
  rating = elo_ratings.get(model, 1000 + (get_model_size(model) * 100))
239
 
 
7
  import math
8
  from nc_py_api import Nextcloud
9
 
 
10
  # Dictionary to store ELO ratings
11
  elo_ratings = {}
12
 
 
27
  print(f"Error loading leaderboard: {str(e)}")
28
  return {}
29
 
30
+ def load_archived_models() -> Dict[str, Any]:
31
+ try:
32
+ nc = Nextcloud(
33
+ nextcloud_url=config.NEXTCLOUD_URL,
34
+ nc_auth_user=config.NEXTCLOUD_USERNAME,
35
+ nc_auth_pass=config.NEXTCLOUD_PASSWORD
36
+ )
37
+ file_content = nc.files.download(config.ARCHIVED_MODELS_PATH)
38
+ if file_content:
39
+ return json.loads(file_content.decode('utf-8'))
40
+ else:
41
+ print(f"Error loading archived models: Received empty content from Nextcloud at {config.ARCHIVED_MODELS_PATH}")
42
+ return {}
43
+ except Exception as e:
44
+ print(f"Error loading archived models: {str(e)}")
45
+ return {}
46
+
47
+ def save_archived_models(archived_data: Dict[str, Any]) -> bool:
48
+ try:
49
+ nc = Nextcloud(
50
+ nextcloud_url=config.NEXTCLOUD_URL,
51
+ nc_auth_user=config.NEXTCLOUD_USERNAME,
52
+ nc_auth_pass=config.NEXTCLOUD_PASSWORD
53
+ )
54
+ json_data = json.dumps(archived_data, indent=2)
55
+ nc.files.upload(config.ARCHIVED_MODELS_PATH, json_data.encode('utf-8'))
56
+ return True
57
+ except Exception as e:
58
+ print(f"Error saving archived models: {str(e)}")
59
+ return False
60
+
61
  def save_leaderboard(leaderboard_data: Dict[str, Any]) -> bool:
62
  try:
63
  nc = Nextcloud(
 
142
 
143
  def initialize_elo_ratings():
144
  leaderboard = load_leaderboard()
145
+ archived_models = load_archived_models()
146
+
147
+ # Initialize ELO for active models
148
  for model, _ in config.get_approved_models():
149
+ if model not in archived_models:
150
+ size = get_model_size(model)
151
+ elo_ratings[model] = 1000 + (size * 100)
152
 
153
+ # Replay all battles to update ELO ratings for active models
154
  for model, data in leaderboard.items():
155
+ if model not in archived_models: # Only process active models
156
+ if model not in elo_ratings:
157
+ elo_ratings[model] = 1000 + (get_model_size(model) * 100)
158
+ for opponent, results in data['opponents'].items():
159
+ if opponent not in archived_models: # Only consider active opponents
160
+ if opponent not in elo_ratings:
161
+ elo_ratings[opponent] = 1000 + (get_model_size(opponent) * 100)
162
+ for _ in range(results['wins']):
163
+ update_elo_ratings(model, opponent)
164
+ for _ in range(results['losses']):
165
+ update_elo_ratings(opponent, model)
166
 
167
  def ensure_elo_ratings_initialized():
168
  if not elo_ratings:
 
170
 
171
  def update_leaderboard(winner: str, loser: str) -> Dict[str, Any]:
172
  leaderboard = load_leaderboard()
173
+ archived_models = load_archived_models()
174
 
175
  if winner not in leaderboard:
176
  leaderboard[winner] = {"wins": 0, "losses": 0, "opponents": {}}
 
186
  # Update ELO ratings
187
  update_elo_ratings(winner, loser)
188
 
189
+ # Check if any model needs to be archived
190
+ for model_name in list(leaderboard.keys()):
191
+ wins = leaderboard[model_name].get('wins', 0)
192
+ losses = leaderboard[model_name].get('losses', 0)
193
+ total_battles = wins + losses
194
+
195
+ if total_battles >= config.ARCHIVE_BATTLE_THRESHOLD:
196
+ print(f"Archiving model: {model_name} with {total_battles} battles")
197
+ archived_models[model_name] = leaderboard.pop(model_name)
198
+ if model_name in elo_ratings:
199
+ del elo_ratings[model_name] # Remove from active ELO ratings
200
+
201
  save_leaderboard(leaderboard)
202
+ save_archived_models(archived_models)
203
  return leaderboard
204
 
205
  def get_current_leaderboard() -> Dict[str, Any]:
206
+ leaderboard = load_leaderboard()
207
+ archived_models = load_archived_models()
208
+
209
+ # Filter out archived models
210
+ active_leaderboard = {model: data for model, data in leaderboard.items() if model not in archived_models}
211
+ return active_leaderboard
212
 
213
  def get_human_readable_name(model_name: str) -> str:
214
  model_dict = dict(config.get_approved_models())
215
  return model_dict.get(model_name, model_name)
216
 
217
+ def get_archived_models_list():
218
+ archived_data = load_archived_models()
219
+ table_data = []
220
+ headers = ["Model", "Wins", "Losses", "Total Battles", "Win Rate"]
221
+
222
+ for model, results in archived_data.items():
223
+ wins = results.get('wins', 0)
224
+ losses = results.get('losses', 0)
225
+ total_battles = wins + losses
226
+ win_rate = wins / total_battles if total_battles > 0 else 0
227
+
228
+ human_readable = get_human_readable_name(model)
229
+
230
+ row = [
231
+ human_readable,
232
+ wins,
233
+ losses,
234
+ total_battles,
235
+ f"{win_rate:.1%}"
236
+ ]
237
+ table_data.append(row)
238
+
239
+ table_data.sort(key=lambda x: x[3], reverse=True) # Sort by total battles
240
+ return table_data
241
+
242
  def get_leaderboard():
243
  leaderboard = load_leaderboard()
244
 
 
311
  headers = ["#", "Model", "ELO Rating", "Wins", "Losses", "Total Battles", "Win Rate"]
312
 
313
  leaderboard = load_leaderboard()
 
314
 
315
+ # Filter out archived models from the active list
316
+ archived_models = load_archived_models()
317
+
318
+ # Combine approved models and models from the leaderboard, then filter out archived ones
319
+ all_models = set(dict(config.get_approved_models()).keys()) | set(leaderboard.keys())
320
+ active_models = [model for model in all_models if model not in archived_models]
321
+
322
+ for model in active_models:
323
  # Get ELO rating
324
  rating = elo_ratings.get(model, 1000 + (get_model_size(model) * 100))
325