CompactAI commited on
Commit
9c6c7cb
·
verified ·
1 Parent(s): 8d77d01

Upload leaderboard (2).html

Browse files
Files changed (1) hide show
  1. leaderboard (2).html +2261 -0
leaderboard (2).html ADDED
@@ -0,0 +1,2261 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Tiny-ML Leaderboard</title>
7
+ <script src="https://cdn.jsdelivr.net/npm/chart.js@4"></script>
8
+ <script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-date-fns@3"></script>
9
+ <style>
10
+ :root {
11
+ --bg: #0d1117;
12
+ --bg-warm: #161b22;
13
+ --card: #161b22;
14
+ --card-hover: #1c2129;
15
+ --border: #30363d;
16
+ --border-light: #21262d;
17
+ --text: #c9d1d9;
18
+ --text-secondary: #8b949e;
19
+ --text-muted: #484f58;
20
+ --accent: #58a6ff;
21
+ --green: #3fb950;
22
+ --orange: #d29922;
23
+ --shadow-sm: 0 1px 3px rgba(0,0,0,0.3);
24
+ --shadow-md: 0 4px 12px rgba(0,0,0,0.35);
25
+ --radius: 12px;
26
+ --radius-sm: 8px;
27
+ --radius-xs: 6px;
28
+ --transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
29
+ --glintresearch: #3fb950;
30
+ --supralabs: #58a6ff;
31
+ --axiomiclabs: #c2b6ff;
32
+ --mihaipopa: #93c6aa;
33
+ --cromia: #ffffff;
34
+ --wop: #ff9b50;
35
+ --GODELEV: #1a56db;
36
+ --finnianx: #06b6d4;
37
+ --ivmelabs: #ff0000;
38
+ --rtc: #e8a87c;
39
+ --huggingface: #ffcc00;
40
+ --facebook: #1877f2;
41
+ --openai: #10a37f;
42
+ --eleutherai: #ef4444;
43
+ --stentor: #ff6bcb;
44
+ --eclipsesenpai: #06b6d4;
45
+ --minimalabs: #4961e6;
46
+ --sandroeth: #84cc16;
47
+ --thingai: #b45309;
48
+ --veyraai: #d45672;
49
+ --fromzero: #d2b48c;
50
+ --joelhenwang: #e5e7eb;
51
+ --jhuclsp: #2563eb;
52
+ --liodonai: #6366f1;
53
+ --smalldoge: #ec4899;
54
+ --quazim0t0: #0ea5e9;
55
+ --small56ai: #22c55e;
56
+ --lhtechai: #f97316;
57
+ --56m: #a855f7;
58
+ }
59
+ * { margin: 0; padding: 0; box-sizing: border-box; }
60
+ html { scroll-behavior: smooth; }
61
+ body {
62
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;
63
+ background: var(--bg);
64
+ color: var(--text);
65
+ line-height: 1.5;
66
+ -webkit-font-smoothing: antialiased;
67
+ }
68
+ .shell {
69
+ max-width: 100%;
70
+ margin: 0 auto;
71
+ padding: 1.25rem 1.75rem;
72
+ }
73
+ .welcome { padding: 1rem 0 1.5rem; }
74
+ .welcome h1 {
75
+ font-size: 1.8rem;
76
+ font-weight: 700;
77
+ letter-spacing: -0.02em;
78
+ margin-bottom: 4px;
79
+ }
80
+ .welcome p { color: var(--text-secondary); font-size: 0.95rem; }
81
+ .stat-row {
82
+ display: grid;
83
+ grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
84
+ gap: 12px;
85
+ margin-bottom: 1.5rem;
86
+ }
87
+ .stat-pill {
88
+ background: var(--card);
89
+ border: 1px solid var(--border);
90
+ border-radius: var(--radius-sm);
91
+ padding: 1rem 1.15rem;
92
+ transition: box-shadow var(--transition), transform var(--transition);
93
+ }
94
+ .stat-pill:hover { box-shadow: var(--shadow-md); transform: translateY(-1px); }
95
+ .stat-pill .label {
96
+ font-size: 0.72rem; font-weight: 600; text-transform: uppercase;
97
+ letter-spacing: 0.06em; color: var(--text-muted); margin-bottom: 3px;
98
+ }
99
+ .stat-pill .value { font-size: 1.4rem; font-weight: 700; letter-spacing: -0.02em; }
100
+ .stat-pill .sub { font-size: 0.75rem; color: var(--text-secondary); margin-top: 1px; }
101
+ .info-banner {
102
+ background: var(--card); border: 1px solid var(--border); border-radius: var(--radius-sm);
103
+ padding: 1rem 1.15rem; margin-bottom: 1.5rem; font-size: 0.88rem; line-height: 1.6;
104
+ display: flex; align-items: flex-start; gap: 10px;
105
+ }
106
+ .info-banner svg { width: 18px; height: 18px; flex-shrink: 0; margin-top: 2px; color: var(--accent); }
107
+ .info-banner a { color: var(--accent); text-decoration: none; }
108
+ .info-banner a:hover { text-decoration: underline; }
109
+ .info-banner.clickable { cursor: pointer; user-select: none; }
110
+ .info-banner.clickable:hover { border-color: var(--accent); }
111
+ .banner-expand {
112
+ max-height: 0; overflow: hidden;
113
+ transition: max-height 0.35s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s ease, margin 0.3s ease;
114
+ opacity: 0; margin-top: 0;
115
+ }
116
+ .banner-expand.open {
117
+ max-height: 300px; opacity: 1; margin-top: 10px;
118
+ }
119
+ .banner-expand-inner {
120
+ padding: 0.85rem 1rem; background: var(--bg); border-radius: var(--radius-xs);
121
+ border: 1px solid var(--border-light); font-size: 0.84rem; color: var(--text-secondary); line-height: 1.65;
122
+ }
123
+ .banner-expand-inner code {
124
+ background: rgba(88,166,255,0.1); padding: 1px 5px; border-radius: 3px;
125
+ font-family: 'SF Mono', 'Fira Code', monospace; font-size: 0.82rem; color: var(--accent);
126
+ }
127
+ .banner-hint {
128
+ font-size: 0.75rem; color: var(--text-muted); margin-left: 6px;
129
+ transition: transform 0.25s ease; display: inline-block;
130
+ }
131
+ .banner-hint.rotated { transform: rotate(180deg); }
132
+ .section { margin-bottom: 1.1rem; }
133
+ .timeline-toolbar {
134
+ display: flex; align-items: center; gap: 6px;
135
+ margin-bottom: 10px;
136
+ overflow-x: auto; -webkit-overflow-scrolling: touch;
137
+ scrollbar-width: none;
138
+ padding-bottom: 2px;
139
+ }
140
+ .timeline-toolbar::-webkit-scrollbar { display: none; }
141
+ .tl-sep {
142
+ width: 1px; height: 18px; background: var(--border);
143
+ margin: 0 4px; flex-shrink: 0;
144
+ }
145
+ .timeline {
146
+ background: var(--card);
147
+ border: 1px solid var(--border);
148
+ border-radius: var(--radius);
149
+ overflow: hidden;
150
+ }
151
+ .tl-month {
152
+ display: flex;
153
+ align-items: center;
154
+ gap: 12px;
155
+ padding: 10px 16px;
156
+ background: var(--bg-warm);
157
+ border-bottom: 1px solid var(--border);
158
+ font-size: 0.78rem;
159
+ font-weight: 700;
160
+ text-transform: uppercase;
161
+ letter-spacing: 0.08em;
162
+ color: var(--text-secondary);
163
+ position: sticky;
164
+ top: 0;
165
+ z-index: 1;
166
+ }
167
+ .tl-month .tl-month-count {
168
+ margin-left: auto;
169
+ font-weight: 500;
170
+ text-transform: none;
171
+ letter-spacing: 0;
172
+ color: var(--text-muted);
173
+ font-size: 0.74rem;
174
+ }
175
+ .tl-row {
176
+ display: grid;
177
+ grid-template-columns: 92px 1fr auto auto;
178
+ align-items: center;
179
+ gap: 14px;
180
+ padding: 11px 16px;
181
+ border-bottom: 1px solid var(--border-light);
182
+ transition: background var(--transition);
183
+ }
184
+ .tl-row:last-child { border-bottom: none; }
185
+ .tl-row:hover { background: var(--card-hover); }
186
+ .tl-date {
187
+ font-variant-numeric: tabular-nums;
188
+ font-size: 0.8rem;
189
+ color: var(--text-muted);
190
+ display: flex;
191
+ align-items: center;
192
+ gap: 8px;
193
+ }
194
+ .tl-date::before {
195
+ content: '';
196
+ width: 8px;
197
+ height: 8px;
198
+ border-radius: 50%;
199
+ background: var(--org-color, var(--text-muted));
200
+ flex-shrink: 0;
201
+ box-shadow: 0 0 0 3px rgba(255,255,255,0.04);
202
+ }
203
+ .tl-name {
204
+ display: flex;
205
+ align-items: center;
206
+ gap: 8px;
207
+ min-width: 0;
208
+ }
209
+ .tl-name a {
210
+ color: var(--text);
211
+ text-decoration: none;
212
+ font-weight: 600;
213
+ font-size: 0.88rem;
214
+ letter-spacing: -0.01em;
215
+ overflow: hidden;
216
+ text-overflow: ellipsis;
217
+ white-space: nowrap;
218
+ }
219
+ .tl-name a:hover { color: var(--accent); }
220
+ .tl-params {
221
+ font-size: 0.75rem;
222
+ color: var(--text-muted);
223
+ font-variant-numeric: tabular-nums;
224
+ white-space: nowrap;
225
+ }
226
+ .tl-org {
227
+ display: inline-flex;
228
+ align-items: center;
229
+ gap: 5px;
230
+ padding: 2px 9px;
231
+ border-radius: 4px;
232
+ font-size: 0.72rem;
233
+ font-weight: 600;
234
+ white-space: nowrap;
235
+ }
236
+ @media (max-width: 640px) {
237
+ .tl-row {
238
+ grid-template-columns: 78px 1fr;
239
+ grid-template-areas: "date name" "date extras";
240
+ row-gap: 4px;
241
+ }
242
+ .tl-date { grid-area: date; }
243
+ .tl-name { grid-area: name; }
244
+ .tl-params { grid-area: extras; justify-self: end; }
245
+ .tl-org { grid-area: extras; justify-self: end; }
246
+ }
247
+ .tl-empty {
248
+ padding: 24px 16px;
249
+ text-align: center;
250
+ color: var(--text-muted);
251
+ font-size: 0.84rem;
252
+ }
253
+ .section-head {
254
+ display: flex; align-items: center; justify-content: space-between; margin-bottom: 0.75rem;
255
+ }
256
+ .section-head h2 { font-size: 1.15rem; font-weight: 700; letter-spacing: -0.02em; }
257
+ .section-head .badge {
258
+ font-size: 0.72rem; font-weight: 600; padding: 3px 10px; border-radius: 100px;
259
+ background: var(--bg-warm); color: var(--text-secondary); border: 1px solid var(--border);
260
+ }
261
+ .section-head .head-right { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
262
+ .sort-control {
263
+ display: inline-flex; align-items: center; gap: 6px;
264
+ background: var(--bg-warm); border: 1px solid var(--border);
265
+ border-radius: 100px; padding: 2px 4px 2px 12px;
266
+ font-size: 0.68rem; font-weight: 600; color: var(--text-muted);
267
+ text-transform: uppercase; letter-spacing: 0.05em;
268
+ }
269
+ .sort-control select {
270
+ background: transparent; border: none; color: var(--text);
271
+ font-size: 0.76rem; font-weight: 600; text-transform: none; letter-spacing: 0;
272
+ padding: 4px 26px 4px 8px; border-radius: 100px; cursor: pointer; outline: none;
273
+ appearance: none; -webkit-appearance: none; -moz-appearance: none;
274
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%238b949e' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
275
+ background-repeat: no-repeat; background-position: right 8px center;
276
+ transition: background-color var(--transition);
277
+ }
278
+ .sort-control select:hover { background-color: var(--bg); }
279
+ .sort-control select:focus { box-shadow: 0 0 0 2px rgba(88, 166, 255, 0.3); }
280
+ .sort-control select option { background: var(--bg-warm); color: var(--text); }
281
+ .eff-callout {
282
+ display: flex; align-items: flex-start; gap: 12px;
283
+ background: linear-gradient(135deg, rgba(88,166,255,0.14), rgba(63,185,80,0.08));
284
+ border: 1px solid var(--accent);
285
+ border-radius: var(--radius-sm);
286
+ padding: 0.95rem 1.15rem;
287
+ margin-bottom: 12px;
288
+ font-size: 0.85rem;
289
+ line-height: 1.6;
290
+ color: var(--text);
291
+ box-shadow: 0 0 0 1px rgba(88,166,255,0.08), var(--shadow-sm);
292
+ }
293
+ .eff-callout .eff-callout-icon {
294
+ font-size: 1.4rem;
295
+ line-height: 1;
296
+ flex-shrink: 0;
297
+ margin-top: 1px;
298
+ }
299
+ .eff-callout strong { color: var(--accent); }
300
+ .eff-callout code {
301
+ background: rgba(88,166,255,0.14); padding: 1px 6px; border-radius: 4px;
302
+ font-family: 'SF Mono', 'Fira Code', monospace; font-size: 0.82rem; color: var(--accent);
303
+ }
304
+ .table-wrap {
305
+ background: var(--card); border: 1px solid var(--border);
306
+ border-radius: var(--radius); overflow: hidden;
307
+ }
308
+ .table-toolbar {
309
+ display: flex; align-items: center; gap: 6px; padding: 8px 12px;
310
+ border-bottom: 1px solid var(--border-light); overflow-x: auto; -webkit-overflow-scrolling: touch;
311
+ }
312
+ .filter-chip {
313
+ display: inline-flex; align-items: center; gap: 5px; padding: 3px 10px;
314
+ border-radius: 100px; font-size: 0.74rem; font-weight: 500; color: var(--text-secondary);
315
+ background: var(--bg); border: 1px solid var(--border); cursor: pointer;
316
+ transition: all var(--transition); white-space: nowrap; user-select: none;
317
+ }
318
+ .filter-chip:hover { border-color: var(--accent); color: var(--text); }
319
+ .filter-chip.active { background: var(--accent); border-color: var(--accent); color: #fff; }
320
+ .filter-chip .dot { width: 7px; height: 7px; border-radius: 50%; }
321
+ .table-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; max-height: 78vh; }
322
+ table { width: 100%; border-collapse: collapse; font-size: 0.8rem; }
323
+ thead { position: sticky; top: 0; z-index: 2; }
324
+ th {
325
+ background: #1c2129; padding: 6px 10px; text-align: left; font-weight: 600;
326
+ font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.05em;
327
+ color: var(--text-muted); border-bottom: 1px solid var(--border); white-space: nowrap;
328
+ }
329
+ td {
330
+ padding: 5px 10px; border-bottom: 1px solid var(--border-light);
331
+ transition: background var(--transition);
332
+ line-height: 1.3;
333
+ }
334
+ tr:last-child td { border-bottom: none; }
335
+ tbody tr { transition: background var(--transition); }
336
+ .lb-row.hover td { background: var(--bg-warm); }
337
+ .cell-rank { width: 38px; text-align: center; font-weight: 700; color: var(--text-muted); font-size: 0.78rem; }
338
+ .cell-rank .medal { font-size: 1rem; }
339
+ .cell-rank.rank-1 { color: #ffd700; }
340
+ .cell-rank.rank-2 { color: #c0c0c0; }
341
+ .cell-rank.rank-3 { color: #cd7f32; }
342
+ .cell-model { min-width: 140px; }
343
+ .model-name { font-weight: 600; letter-spacing: -0.01em; font-size: 0.82rem; }
344
+ .model-params { font-size: 0.7rem; color: var(--text-muted); margin-top: 1px; }
345
+ .org-tag {
346
+ display: inline-flex; align-items: center; gap: 4px; padding: 1px 7px;
347
+ border-radius: 4px; font-size: 0.7rem; font-weight: 600; white-space: nowrap;
348
+ }
349
+ .org-tag .org-dot { width: 6px; height: 6px; border-radius: 50%; }
350
+ .cell-metric { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; min-width: 68px; font-size: 0.78rem; }
351
+ .info-icon { cursor: help; opacity: 0.5; font-size: 0.85em; vertical-align: middle; }
352
+ .info-icon:hover { opacity: 1; }
353
+ .metric-val { font-weight: 600; font-size: 0.8rem; }
354
+ .metric-na { color: var(--text-muted); font-style: italic; font-weight: 400; font-size: 0.72rem; }
355
+ .best { color: var(--green); font-weight: 700; }
356
+ .cell-links { white-space: nowrap; }
357
+ .cell-links a {
358
+ display: inline-flex; align-items: center; gap: 3px; padding: 1px 6px;
359
+ border-radius: var(--radius-xs); font-size: 0.7rem; font-weight: 500;
360
+ color: var(--accent); text-decoration: none; transition: all var(--transition);
361
+ }
362
+ .cell-links a:hover { background: rgba(88,166,255,0.1); }
363
+ .cell-tokens { font-size: 0.76rem; color: var(--text-secondary); white-space: nowrap; }
364
+ .cell-date { font-size: 0.74rem; color: var(--text-muted); white-space: nowrap; }
365
+ .chart-grid {
366
+ display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 1.25rem;
367
+ }
368
+ .chart-card {
369
+ background: var(--card); border: 1px solid var(--border); border-radius: var(--radius);
370
+ padding: 1rem; transition: box-shadow var(--transition);
371
+ }
372
+ .chart-card:hover { box-shadow: var(--shadow-sm); }
373
+ .chart-card.full { grid-column: 1 / -1; }
374
+ .chart-card h3 { font-size: 0.85rem; font-weight: 600; margin-bottom: 3px; }
375
+ .chart-card .chart-sub { font-size: 0.72rem; color: var(--text-muted); margin-bottom: 8px; }
376
+ .chart-card canvas { max-height: 420px; }
377
+ .legend-bar { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 12px; }
378
+ .legend-bar .legend-item { display: flex; align-items: center; gap: 6px; font-size: 0.76rem; color: var(--text-secondary); }
379
+ .legend-bar .ldot { width: 8px; height: 8px; border-radius: 50%; }
380
+ .eff-note { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 6px; font-size: 0.7rem; color: var(--text-muted); }
381
+ .eff-note span { display: flex; align-items: center; gap: 5px; }
382
+ .eff-note .line-sample { width: 18px; height: 2px; border-radius: 1px; }
383
+ .timeline-bubble-wrap { position: relative; }
384
+ .timeline-custom-tooltip {
385
+ position: absolute; pointer-events: none; background: #1c2129;
386
+ border: 1px solid var(--border); border-radius: 8px; padding: 8px 12px;
387
+ font-size: 0.78rem; color: var(--text); box-shadow: var(--shadow-md);
388
+ opacity: 0; transition: opacity 0.15s ease; z-index: 10; white-space: nowrap;
389
+ }
390
+ .timeline-custom-tooltip.visible { opacity: 1; }
391
+ .timeline-custom-tooltip .tt-name { font-weight: 600; margin-bottom: 2px; }
392
+ .timeline-custom-tooltip .tt-val { color: var(--text-secondary); }
393
+ .wiki-bubble-wrap { position: relative; }
394
+ .wiki-custom-tooltip {
395
+ position: absolute; pointer-events: none; background: #1c2129;
396
+ border: 1px solid var(--border); border-radius: 8px; padding: 8px 12px;
397
+ font-size: 0.78rem; color: var(--text); box-shadow: var(--shadow-md);
398
+ opacity: 0; transition: opacity 0.15s ease; z-index: 10; white-space: nowrap;
399
+ }
400
+ .wiki-custom-tooltip.visible { opacity: 1; }
401
+ .wiki-custom-tooltip .tt-name { font-weight: 600; margin-bottom: 2px; }
402
+ .wiki-custom-tooltip .tt-val { color: var(--text-secondary); }
403
+ .cta-card {
404
+ background: var(--card); border: 1px solid var(--border); border-radius: var(--radius);
405
+ padding: 1.25rem; display: flex; align-items: center; justify-content: space-between;
406
+ gap: 1rem; margin-bottom: 1.5rem; flex-wrap: wrap;
407
+ }
408
+ .cta-card h3 { font-size: 1rem; font-weight: 700; margin-bottom: 3px; }
409
+ .cta-card p { font-size: 0.84rem; color: var(--text-secondary); max-width: 520px; line-height: 1.55; }
410
+ .cta-btn {
411
+ display: inline-flex; align-items: center; gap: 6px; padding: 9px 18px;
412
+ border-radius: var(--radius-sm); background: var(--accent); color: #fff;
413
+ font-size: 0.84rem; font-weight: 600; text-decoration: none; border: none;
414
+ cursor: pointer; transition: all var(--transition); flex-shrink: 0;
415
+ }
416
+ .cta-btn:hover { opacity: 0.88; transform: translateY(-1px); box-shadow: var(--shadow-md); }
417
+ footer {
418
+ margin-top: 1rem; padding: 1.25rem 0; border-top: 1px solid var(--border);
419
+ font-size: 0.78rem; color: var(--text-muted); text-align: center; line-height: 1.6;
420
+ }
421
+ footer a { color: var(--accent); text-decoration: none; }
422
+ footer a:hover { text-decoration: underline; }
423
+ @keyframes fadeUp {
424
+ from { opacity: 0; transform: translateY(10px); }
425
+ to { opacity: 1; transform: translateY(0); }
426
+ }
427
+ .anim { animation: fadeUp 0.45s cubic-bezier(0.4,0,0.2,1) both; }
428
+ .d1 { animation-delay: .04s; }
429
+ .d2 { animation-delay: .08s; }
430
+ .d3 { animation-delay: .12s; }
431
+ .d4 { animation-delay: .16s; }
432
+ .d5 { animation-delay: .20s; }
433
+ .d6 { animation-delay: .24s; }
434
+ ::-webkit-scrollbar { width: 6px; height: 6px; }
435
+ ::-webkit-scrollbar-track { background: transparent; }
436
+ ::-webkit-scrollbar-thumb { background: var(--border); border-radius: 100px; }
437
+ ::-webkit-scrollbar-thumb:hover { background: var(--text-muted); }
438
+ @media (max-width: 1024px) {
439
+ .chart-grid { grid-template-columns: 1fr; }
440
+ .chart-card.full { grid-column: 1; }
441
+ }
442
+ @media (max-width: 768px) {
443
+ .shell { padding: 1rem; }
444
+ .stat-row { grid-template-columns: repeat(2, 1fr); }
445
+ .welcome h1 { font-size: 1.4rem; }
446
+ table { font-size: 0.76rem; }
447
+ th, td { padding: 7px 8px; }
448
+ .cta-card { flex-direction: column; align-items: flex-start; }
449
+ }
450
+ @media (max-width: 480px) {
451
+ .stat-row { grid-template-columns: 1fr; }
452
+ }
453
+ </style>
454
+ </head>
455
+ <body>
456
+ <div id="main-content">
457
+ <div class="shell">
458
+
459
+ <div class="welcome anim">
460
+ <h1>Tiny-ML Leaderboard</h1>
461
+ <p>Sub-150M parameter language models, same eval harness, transparent methodology.</p>
462
+ </div>
463
+ <div class="stat-row anim d1" id="stat-row"></div>
464
+ <div class="info-banner anim d2">
465
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/></svg>
466
+ <div>
467
+ <strong>Why this exists.</strong> The community deserves a single place to compare tiny LMs fairly.
468
+ We include every model with verifiable benchmarks — ours, our competitors', yours.
469
+ <a href="https://huggingface.co/spaces/Glint-Research/Tiny-ML-Leaderboard/discussions" target="_blank">Submit a model via PR.</a>
470
+ </div>
471
+ </div>
472
+ <div class="info-banner anim d2 clickable" id="unknown-banner" onclick="toggleUnknownBanner()">
473
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M12 2L2 7l10 5 10-5-10-5z"/><path d="M2 17l10 5 10-5"/><path d="M2 12l10 5 10-5"/></svg>
474
+ <div style="flex:1">
475
+ <div style="display:flex;align-items:center;gap:4px;flex-wrap:wrap">
476
+ <strong>Unknown org?</strong>
477
+ <span>The "Unknown" tag is for model makers submitting their model ahead of official release.</span>
478
+ <span>If that's you — DM <strong>glintresearch</strong> on Discord.</span>
479
+ <span class="banner-hint" id="banner-hint">▼</span>
480
+ </div>
481
+ <div class="banner-expand" id="banner-expand">
482
+ <div class="banner-expand-inner">
483
+ Model makers can submit their model's benchmarks before the official release so it appears on the leaderboard immediately when announced. The <strong>Unknown</strong> tag is temporary — once you DM <strong>glintresearch</strong> on Discord we can update it to your organization name and color.
484
+ </div>
485
+ </div>
486
+ </div>
487
+ </div>
488
+
489
+ <div class="section anim d3" id="table-section">
490
+ <div class="section-head">
491
+ <h2>Detailed Results</h2>
492
+ <div class="head-right">
493
+ <span class="badge" id="model-count-badge"></span>
494
+ <div class="sort-control">
495
+ <span>Sort</span>
496
+ <select id="sort-select" aria-label="Sort leaderboard by">
497
+ <option value="efficiency">Efficiency ⚡</option>
498
+ <option value="score">Overall Score</option>
499
+ <option value="wiki">WikiText-2 byte_ppl</option>
500
+ <option value="blimp">BLiMP</option>
501
+ <option value="arc">ARC-Easy</option>
502
+ <option value="params">Parameters</option>
503
+ <option value="date">Release Date</option>
504
+ </select>
505
+ </div>
506
+ </div>
507
+ </div>
508
+ <div class="eff-callout">
509
+ <span class="eff-callout-icon">⚡</span>
510
+ <div>
511
+ <strong>How Efficiency (⚡) is calculated:</strong> overall benchmark score (avg of BLiMP, ARC-Easy, and normalized WikiText-2) &times; a size bonus for smaller models.
512
+ The size bonus is capped on a log scale &mdash; the smallest model on the board tops out at <code>1.5&times;</code>, the largest gets <code>1.0&times;</code> (no bonus) &mdash;
513
+ so a tiny model can't out-rank a much larger, better-performing one purely from an inflated size multiplier.
514
+ </div>
515
+ </div>
516
+ <div class="table-wrap">
517
+ <div class="table-toolbar" id="org-filters"></div>
518
+ <div class="table-scroll">
519
+ <table>
520
+ <thead>
521
+ <tr>
522
+ <th>#</th>
523
+ <th>Model</th>
524
+ <th>Org</th>
525
+ <th>Params</th>
526
+ <th class="cell-metric">Eff. ⚡</th>
527
+ <th class="cell-metric">WikiText-2 byte_ppl ↓</th>
528
+ <th class="cell-metric">BLiMP ↑</th>
529
+ <th class="cell-metric">ARC-Easy ↑</th>
530
+ <th>Training Tokens</th>
531
+ <th>Released</th>
532
+ <th>Links</th>
533
+ </tr>
534
+ </thead>
535
+ <tbody id="leaderboard-body"></tbody>
536
+ </table>
537
+ </div>
538
+ </div>
539
+ </div>
540
+ <div class="section anim d4" id="timeline-section">
541
+ <div class="section-head">
542
+ <h2>Model Release Timeline</h2>
543
+ <span class="badge">Most recent first</span>
544
+ </div>
545
+ <div class="timeline" id="timeline-list"></div>
546
+ </div>
547
+ <div class="section anim d5" id="charts-section">
548
+ <div class="section-head"><h2>Benchmark Overview</h2></div>
549
+ <div class="legend-bar" id="legend-bar"></div>
550
+ <div class="chart-grid">
551
+ <div class="chart-card">
552
+ <h3>BLiMP ↑</h3>
553
+ <p class="chart-sub">Higher is better</p>
554
+ <canvas id="blimpChart"></canvas>
555
+ </div>
556
+ <div class="chart-card">
557
+ <h3>ARC-Easy ↑</h3>
558
+ <p class="chart-sub">Higher is better</p>
559
+ <canvas id="arcChart"></canvas>
560
+ </div>
561
+ <div class="chart-card full wiki-bubble-wrap">
562
+ <h3>WikiText-2 Byte-Level Perplexity ↓</h3>
563
+ <p class="chart-sub">Lower is better · byte_ppl = exp(−loglik / total_bytes) · bubble size = perplexity (smaller bubble = better)</p>
564
+ <canvas id="wikiChart"></canvas>
565
+ <div class="wiki-custom-tooltip" id="wikiTooltip">
566
+ <div class="tt-name"></div>
567
+ <div class="tt-val"></div>
568
+ </div>
569
+ </div>
570
+ </div>
571
+ </div>
572
+ <div class="section anim d6">
573
+ <div class="section-head">
574
+ <h2>Model Efficiency</h2>
575
+ <span class="badge">Leaderboard Score vs Params</span>
576
+ </div>
577
+ <div class="chart-grid">
578
+ <div class="chart-card full">
579
+ <h3>Parameters vs Leaderboard Score</h3>
580
+ <p class="chart-sub">Scatter of each model's overall score vs its parameter count. Points above the dashed threshold line are &ge;1&sigma; above the trend. Top 3 marked.</p>
581
+ <p class="chart-sub" style="margin-top:-4px">
582
+ <strong>How Efficiency (⚡) is calculated:</strong> Efficiency score = overall benchmark score (avg of BLiMP, ARC-Easy, and normalized WikiText-2) &times; a size bonus.
583
+ The size bonus rewards smaller models but is capped &mdash; using a log scale across the full parameter range on this board, the smallest model can score at most <strong>1.5&times;</strong> its raw benchmark score, and the largest gets no bonus (1.0&times;).
584
+ This keeps small models competitive without letting a tiny parameter count alone produce an unrealistic (e.g. 100&times;) score gap over a larger, higher-performing model.
585
+ </p>
586
+ <canvas id="efficiencyChart" style="max-height:400px"></canvas>
587
+ <div class="eff-note">
588
+ <span><span class="line-sample" style="border-top:2px dashed rgba(255,200,0,0.4)"></span> Avg trend</span>
589
+ <span><span class="line-sample" style="border-top:2px dashed rgba(255,200,0,0.8)"></span> High-efficiency threshold</span>
590
+ <span><span class="line-sample" style="background:rgba(255,230,0,0.1);height:8px"></span> Outperforming zone</span>
591
+ </div>
592
+ </div>
593
+ <div class="chart-card full">
594
+ <h3>Models Released by Org</h3>
595
+ <canvas id="orgCountChart" style="max-height:260px"></canvas>
596
+ </div>
597
+ </div>
598
+ </div>
599
+ <footer>
600
+ Tiny-ML Leaderboard by <a href="https://huggingface.co/Glint-Research">Glint Research</a>.
601
+ Not affiliated with SupraLabs or LH-Tech-AI.
602
+ All benchmark data is self-reported by model authors unless otherwise noted.
603
+ </footer>
604
+ </div>
605
+ </div>
606
+ <script>
607
+ const models = [
608
+ {
609
+ name: "Unknown",
610
+ org: "unknown",
611
+ params: "1M",
612
+ blimp: 73.96,
613
+ arc: 36.80,
614
+ wiki: 3.09,
615
+ tokens: "~300B",
616
+ releaseDate: "",
617
+ },
618
+ {
619
+ name: "MicroSupra-1k",
620
+ org: "supralabs",
621
+ params: "1K",
622
+ blimp: 58.61,
623
+ arc: 26.39,
624
+ wiki: 11.27,
625
+ tokens: "—",
626
+ releaseDate: "2026-05-13",
627
+ links: {
628
+ card: "https://huggingface.co/SupraLabs/MicroSupra-1k"
629
+ }
630
+ },
631
+ {
632
+ name: "Glint-0.1",
633
+ org: "glintresearch",
634
+ params: "1M",
635
+ blimp: 46.7,
636
+ arc: 21,
637
+ wiki: 4106963.13,
638
+ tokens: "~100M",
639
+ releaseDate: "2026-03-09",
640
+ links: {
641
+ card: "https://huggingface.co/Glint-Research/Glint-0.1"
642
+ }
643
+ },
644
+ {
645
+ name: "Supra-Mini-v2",
646
+ org: "supralabs",
647
+ params: "168K",
648
+ blimp: 53.5,
649
+ arc: 26.8,
650
+ wiki: 7.79,
651
+ tokens: "—",
652
+ releaseDate: "2026-05-12",
653
+ links: {
654
+ card: "https://huggingface.co/SupraLabs/Supra-Mini-v2-0.1M"
655
+ }
656
+ },
657
+ {
658
+ name: "Glint-0.2",
659
+ org: "glintresearch",
660
+ params: "1M",
661
+ blimp: 49.8,
662
+ arc: 27,
663
+ wiki: 636.4,
664
+ tokens: "~100M",
665
+ releaseDate: "2026-03-22",
666
+ links: {
667
+ card: "https://huggingface.co/Glint-Research/Glint-0.2"
668
+ }
669
+ },
670
+ {
671
+ name: "Glint-0.3",
672
+ org: "glintresearch",
673
+ params: "1M",
674
+ blimp: 47.3,
675
+ arc: 25.5,
676
+ wiki: 7.87,
677
+ tokens: "~100M",
678
+ releaseDate: "2026-04-04",
679
+ links: {
680
+ card: "https://huggingface.co/Glint-Research/Glint-0.3"
681
+ }
682
+ },
683
+ {
684
+ name: "CinnabarLM 1.4M",
685
+ org: "mihaipopa",
686
+ params: "1.51M",
687
+ blimp: 60.7,
688
+ arc: 24.58,
689
+ wiki: 4.09,
690
+ tokens: "~30M",
691
+ releaseDate: "2026-05-19",
692
+ links: {
693
+ card: "https://huggingface.co/MihaiPopa-1/CinnabarLM-1.4M-Base"
694
+ }
695
+ },
696
+ {
697
+ name: "Glint-0.4",
698
+ org: "glintresearch",
699
+ params: "1M",
700
+ blimp: 58.5,
701
+ arc: 31,
702
+ wiki: 5.01,
703
+ tokens: "10B",
704
+ releaseDate: "2026-04-19",
705
+ links: {
706
+ card: "https://huggingface.co/Glint-Research/Glint-0.4"
707
+ }
708
+ },
709
+ {
710
+ name: "CinnabarLM 1.5M",
711
+ org: "mihaipopa",
712
+ params: "1.71M",
713
+ blimp: 60.51,
714
+ arc: 26.68,
715
+ wiki: 4.23,
716
+ tokens: "~50M",
717
+ releaseDate: "2026-05-19",
718
+ links: {
719
+ card: "https://huggingface.co/MihaiPopa-1/CinnabarLM-1.5M-Base"
720
+ }
721
+ },
722
+ {
723
+ name: "PotentSulfurLM 500K",
724
+ org: "mihaipopa",
725
+ params: "587K",
726
+ blimp: 59.01,
727
+ arc: 27.06,
728
+ wiki: 4.52,
729
+ tokens: "~200M",
730
+ releaseDate: "2026-05-27",
731
+ links: {
732
+ card: "https://huggingface.co/MihaiPopa-1/PotentSulfurLM-500K-Base"
733
+ }
734
+ },
735
+ {
736
+ name: "MicroLM2-1M",
737
+ org: "cromia",
738
+ params: "1.71M",
739
+ blimp: 54.2,
740
+ arc: 27.4,
741
+ wiki: 4.82,
742
+ tokens: "~4.5B",
743
+ releaseDate: "2026-05-22",
744
+ links: {
745
+ card: "https://huggingface.co/CromIA/MicroLM2-1M"
746
+ }
747
+ },
748
+ {
749
+ name: "Glint-1",
750
+ org: "glintresearch",
751
+ params: "1M",
752
+ blimp: 61.2,
753
+ arc: 32,
754
+ wiki: 4.45,
755
+ tokens: "100B",
756
+ releaseDate: "2026-05-02",
757
+ links: {
758
+ card: "https://huggingface.co/Glint-Research/Glint-1"
759
+ }
760
+ },
761
+ {
762
+ name: "Supra-Mini-v3",
763
+ org: "supralabs",
764
+ params: "468K",
765
+ blimp: 55.3,
766
+ arc: 27.3,
767
+ wiki: 4.49,
768
+ tokens: "—",
769
+ releaseDate: "2026-05-14",
770
+ links: {
771
+ card: "https://huggingface.co/SupraLabs/Supra-Mini-v3-0.5M"
772
+ }
773
+ },
774
+ {
775
+ name: "Cosmos-T-80M",
776
+ org: "wop",
777
+ params: "79.7M",
778
+ blimp: 50.47,
779
+ arc: 27.82,
780
+ wiki: 12.42,
781
+ tokens: "~21M",
782
+ releaseDate: "2026-05-30",
783
+ links: {
784
+ card: "https://huggingface.co/wop/Cosmos-T-80M"
785
+ }
786
+ },
787
+ {
788
+ name: "Cosmos-T2-80M-Test",
789
+ org: "wop",
790
+ params: "87.60M",
791
+ blimp: 57.61,
792
+ arc: 25,
793
+ wiki: 11.24,
794
+ tokens: "~18M",
795
+ releaseDate: "2026-05-31",
796
+ links: {
797
+ card: "https://huggingface.co/wop/Cosmos-T2-80M-Test"
798
+ }
799
+ },
800
+ {
801
+ name: "Supra-Mini-v4",
802
+ org: "supralabs",
803
+ params: "2.62M",
804
+ blimp: 60.7,
805
+ arc: 31.5,
806
+ wiki: 3.17,
807
+ tokens: "—",
808
+ releaseDate: "2026-05-14",
809
+ links: {
810
+ card: "https://huggingface.co/SupraLabs/Supra-Mini-v4-2M"
811
+ }
812
+ },
813
+ {
814
+ name: "CinnabarLM 4M",
815
+ org: "mihaipopa",
816
+ params: "4.23M",
817
+ blimp: 62.87,
818
+ arc: 27.36,
819
+ wiki: 3.77,
820
+ tokens: "~80M",
821
+ releaseDate: "2026-05-05",
822
+ links: {
823
+ card: "https://huggingface.co/MihaiPopa-1/CinnabarLM-4M-Base"
824
+ }
825
+ },
826
+ {
827
+ name: "Cosmos-T2-Accelerate-beta",
828
+ org: "wop",
829
+ params: "5.03M",
830
+ blimp: 54.3,
831
+ arc: 26.3,
832
+ wiki: 6.26,
833
+ tokens: "~22M",
834
+ releaseDate: "2026-06-02",
835
+ links: {
836
+ card: "https://huggingface.co/wop/Cosmos-T2-Accelerate-beta"
837
+ }
838
+ },
839
+ {
840
+ name: "Cosmos-T2A-low",
841
+ org: "wop",
842
+ params: "9.96M",
843
+ blimp: 47.8,
844
+ arc: 31,
845
+ wiki: 5.31,
846
+ tokens: "~46.7M",
847
+ releaseDate: "2026-06-04",
848
+ links: {
849
+ card: "https://huggingface.co/wop/Cosmos-T2A-low"
850
+ }
851
+ },
852
+ {
853
+ name: "Cosmos-T2-Accelerate-Beta2",
854
+ org: "wop",
855
+ params: "9.96M",
856
+ blimp: 69,
857
+ arc: 28,
858
+ wiki: 6.72,
859
+ tokens: "~10M",
860
+ releaseDate: "2026-06-03",
861
+ links: {
862
+ card: "https://huggingface.co/wop/Cosmos-T2-Accelerate-Beta2"
863
+ }
864
+ },
865
+ {
866
+ name: "StorySupra-10M",
867
+ org: "supralabs",
868
+ params: "12.6M",
869
+ blimp: 61.47,
870
+ arc: 28.45,
871
+ wiki: 8.76,
872
+ tokens: "—",
873
+ releaseDate: "2026-05-15",
874
+ links: {
875
+ card: "https://huggingface.co/SupraLabs/StorySupra-10M"
876
+ }
877
+ },
878
+ {
879
+ name: "Supra-Mini-v5",
880
+ org: "supralabs",
881
+ params: "7.87M",
882
+ blimp: 63.5,
883
+ arc: 34.4,
884
+ wiki: 2.73,
885
+ tokens: "—",
886
+ releaseDate: "2026-05-16",
887
+ links: {
888
+ card: "https://huggingface.co/SupraLabs/Supra-Mini-v5-8M"
889
+ }
890
+ },
891
+ {
892
+ name: "Cosmos-T2-Accelerate-Preview",
893
+ org: "wop",
894
+ params: "9.96M",
895
+ blimp: 56.95,
896
+ arc: 26.8,
897
+ wiki: 6.73,
898
+ tokens: "462M",
899
+ releaseDate: "2026-06-01",
900
+ links: {
901
+ card: "https://huggingface.co/wop/Cosmos-T2-Accelerate-Preview",
902
+ demo: "https://huggingface.co/spaces/wop/Cosmos-T2-Chat"
903
+ }
904
+ },
905
+ {
906
+ name: "Glint-1.3 (merged)",
907
+ org: "glintresearch",
908
+ params: "982K",
909
+ blimp: 68.7,
910
+ arc: 32.5,
911
+ wiki: 3.08,
912
+ tokens: "100B",
913
+ releaseDate: "2026-05-13",
914
+ links: {
915
+ card: "https://huggingface.co/Glint-Research/Glint-1.3"
916
+ }
917
+ },
918
+ {
919
+ name: "Supra-Mini-v6",
920
+ org: "supralabs",
921
+ params: "1.41M",
922
+ blimp: 61.86,
923
+ arc: 30.26,
924
+ wiki: 3,
925
+ tokens: "—",
926
+ releaseDate: "2026-05-30",
927
+ links: {
928
+ card: "https://huggingface.co/SupraLabs/Supra-Mini-v6-1M"
929
+ }
930
+ },
931
+ {
932
+ name: "GPT-S-5M",
933
+ org: "axiomiclabs",
934
+ params: "5.16M",
935
+ blimp: 72.27,
936
+ arc: 35.69,
937
+ wiki: 2.57,
938
+ tokens: "25B",
939
+ releaseDate: "2026-05-19",
940
+ links: {
941
+ card: "https://huggingface.co/AxiomicLabs/GPT-S-5M"
942
+ }
943
+ },
944
+ {
945
+ name: "Archaea-74M",
946
+ org: "GODELEV",
947
+ params: "74M",
948
+ blimp: 74.91,
949
+ arc: 39.06,
950
+ wiki: 2.2,
951
+ tokens: "~1.2B",
952
+ releaseDate: "2026-06-01",
953
+ links: {
954
+ card: "https://huggingface.co/GODELEV/Archaea-74M"
955
+ }
956
+ },
957
+ {
958
+ name: "Supra-50M-Instruct",
959
+ org: "supralabs",
960
+ params: "51.8M",
961
+ blimp: 76.3,
962
+ arc: 52.2,
963
+ wiki: 2.56,
964
+ tokens: "20B",
965
+ releaseDate: "2026-05-21",
966
+ links: {
967
+ card: "https://huggingface.co/SupraLabs/Supra-50M-Instruct",
968
+ base: "https://huggingface.co/SupraLabs/Supra-50M-Base"
969
+ }
970
+ },
971
+ {
972
+ name: "Michel-Tiny",
973
+ org: "finnianx",
974
+ params: "55.7M",
975
+ blimp: 74.08,
976
+ arc: 37.33,
977
+ wiki: 2.29,
978
+ tokens: "1.3B",
979
+ releaseDate: "2026-06-05",
980
+ links: {
981
+ card: "https://huggingface.co/finnianx/michel-tiny"
982
+ }
983
+ },
984
+ {
985
+ name: "Gros-Michel-90m-Base",
986
+ org: "finnianx",
987
+ params: "91.1M",
988
+ blimp: 78.35,
989
+ arc: 41.5,
990
+ wiki: 2.07,
991
+ tokens: "6.5B",
992
+ releaseDate: "2026-06-28",
993
+ links: {
994
+ card: "https://huggingface.co/finnianx/Gros-Michel-90m-Base"
995
+ }
996
+ },
997
+ {
998
+ name: "Michel-Nano-v2",
999
+ org: "finnianx",
1000
+ params: "9.94M",
1001
+ blimp: 72.52,
1002
+ arc: 35.9,
1003
+ wiki: 2.46,
1004
+ tokens: "6.5B",
1005
+ releaseDate: "2026-06-13",
1006
+ links: {
1007
+ card: "https://huggingface.co/finnianx/michel-nano-v2"
1008
+ }
1009
+ },
1010
+ {
1011
+ name: "Michel-Nano",
1012
+ org: "finnianx",
1013
+ params: "5.96M",
1014
+ blimp: 65.23,
1015
+ arc: 33.38,
1016
+ wiki: 3.25,
1017
+ tokens: "1.1B",
1018
+ releaseDate: "2026-06-10",
1019
+ links: {
1020
+ card: "https://huggingface.co/finnianx/michel-nano"
1021
+ }
1022
+ },
1023
+ {
1024
+ name: "Gros-Michel-90m-Base-v2",
1025
+ org: "finnianx",
1026
+ params: "95M",
1027
+ blimp: 80.20,
1028
+ arc: 43.18,
1029
+ wiki: 2.08,
1030
+ tokens: "9B",
1031
+ releaseDate: "2026-07-06",
1032
+ links: {
1033
+ card: "https://huggingface.co/finnianx/Gros-Michel-90m-Base-v2"
1034
+ }
1035
+ },
1036
+ {
1037
+ name: "Michel-Micro",
1038
+ org: "finnianx",
1039
+ params: "28.4M",
1040
+ blimp: 69.75,
1041
+ arc: 38.59,
1042
+ wiki: 2.3,
1043
+ tokens: "2.6B",
1044
+ releaseDate: "2026-06-09",
1045
+ links: {
1046
+ card: "https://huggingface.co/finnianx/michel-micro"
1047
+ }
1048
+ },
1049
+ {
1050
+ name: "Ivme-Conversate-v1-Base",
1051
+ org: "ivmelabs",
1052
+ params: "22.03M",
1053
+ blimp: 61.4,
1054
+ arc: 30.85,
1055
+ wiki: 3.14,
1056
+ tokens: "~1.57B",
1057
+ releaseDate: "2026-06-05",
1058
+ links: {
1059
+ card: "https://huggingface.co/IvmeLabs/Ivme-Conversate-22M-Base"
1060
+ }
1061
+ },
1062
+ {
1063
+ name: "kirk-tung",
1064
+ org: "rtc",
1065
+ params: "53.1M",
1066
+ blimp: 72.81,
1067
+ arc: 30.3,
1068
+ wiki: 2.38,
1069
+ tokens: "1.1B",
1070
+ releaseDate: "2026-06-09",
1071
+ links: {
1072
+ card: "https://huggingface.co/rtc2022/kirk-tung"
1073
+ }
1074
+ },
1075
+ {
1076
+ name: "Supra-Mini-0.1M",
1077
+ org: "supralabs",
1078
+ params: "117K",
1079
+ blimp: 51.77,
1080
+ arc: 26.39,
1081
+ wiki: 25.17,
1082
+ tokens: "500M",
1083
+ releaseDate: "2026-05-18",
1084
+ links: {
1085
+ card: "https://huggingface.co/SupraLabs/Supra-Mini-0.1M"
1086
+ }
1087
+ },
1088
+ {
1089
+ name: "Supra-50M-Base",
1090
+ org: "supralabs",
1091
+ params: "51.8M",
1092
+ blimp: 76.3,
1093
+ arc: 46.0,
1094
+ wiki: 2.04,
1095
+ tokens: "20B",
1096
+ releaseDate: "2026-05-27",
1097
+ links: {
1098
+ card: "https://huggingface.co/SupraLabs/Supra-50M-Base"
1099
+ }
1100
+ },
1101
+ {
1102
+ name: "Supra-50M-Reasoning",
1103
+ org: "supralabs",
1104
+ params: "51.8M",
1105
+ blimp: 64.14,
1106
+ arc: 45.16,
1107
+ wiki: 2.6,
1108
+ tokens: "20B",
1109
+ releaseDate: "2026-06-04",
1110
+ links: {
1111
+ card: "https://huggingface.co/SupraLabs/Supra-50M-Reasoning",
1112
+ demo: "https://huggingface.co/spaces/SupraLabs/Supra-50M-Reasoning-Demo"
1113
+ }
1114
+ },
1115
+ {
1116
+ name: "Escarda-86M-Base",
1117
+ org: "quazim0t0",
1118
+ params: "85.7M",
1119
+ blimp: 71.44,
1120
+ arc: 38.01,
1121
+ wiki: 2.2228,
1122
+ tokens: "~20B",
1123
+ releaseDate: "2026-05-22",
1124
+ links: {
1125
+ card: "https://huggingface.co/Quazim0t0/Escarda-86M-Base",
1126
+ discussion: "https://huggingface.co/spaces/Glint-Research/Tiny-ML-Leaderboard/discussions/21"
1127
+ }
1128
+ },
1129
+ {
1130
+ name: "KeyLM-75M",
1131
+ org: "minimalabs",
1132
+ params: "75M",
1133
+ blimp: 76.10,
1134
+ arc: 35.65,
1135
+ wiki: 2.08,
1136
+ tokens: "~18B",
1137
+ releaseDate: "2026-05-29",
1138
+ links: {
1139
+ card: "https://huggingface.co/MinimaLabs/KeyLM-75M"
1140
+ }
1141
+
1142
+ },
1143
+ {
1144
+ name: "KeyLM-75M-Instruct",
1145
+ org: "minimalabs",
1146
+ params: "75M",
1147
+ blimp: 76.02,
1148
+ arc: 39.10,
1149
+ wiki: 2.17,
1150
+ tokens: "~18B",
1151
+ releaseDate: "2026-05-29",
1152
+ links: {
1153
+ card: "https://huggingface.co/MinimaLabs/KeyLM-75M-Instruct",
1154
+ base: "https://huggingface.co/MinimaLabs/KeyLM-75M"
1155
+ }
1156
+ },
1157
+ {
1158
+ name: "Glimmer 1",
1159
+ org: "glintresearch",
1160
+ params: "11.9K",
1161
+ blimp: 52.43,
1162
+ arc: 25.46,
1163
+ wiki: 14.73,
1164
+ tokens: "500K",
1165
+ releaseDate: "2026-06-16",
1166
+ links: {
1167
+ card: "https://huggingface.co/Glint-Research/Glimmer-1-Base"
1168
+ }
1169
+ },
1170
+ {
1171
+ name: "Echo88-150M-Instruct",
1172
+ org: "exnivo",
1173
+ params: "150M",
1174
+ blimp: 72.67,
1175
+ arc: 31.40,
1176
+ wiki: 2.45,
1177
+ tokens: "~1.47B",
1178
+ releaseDate: "2026-05-05",
1179
+ links: {
1180
+ card: "https://huggingface.co/exnivo/Echo88-150M-Instruct"
1181
+ }
1182
+ },
1183
+ {
1184
+ name: "Byrne-86M-Base",
1185
+ org: "quazim0t0",
1186
+ params: "86M",
1187
+ blimp: 73.56,
1188
+ arc: 39.31,
1189
+ wiki: 2.3753,
1190
+ tokens: "—",
1191
+ releaseDate: "2026-06-18",
1192
+ links: {
1193
+ card: "https://huggingface.co/Quazim0t0/Byrne-86M-Base",
1194
+ base: "https://huggingface.co/Quazim0t0/Byrne-86M"
1195
+ }
1196
+ },
1197
+ {
1198
+ name: "Byrne-86M",
1199
+ org: "quazim0t0",
1200
+ params: "86M",
1201
+ blimp: 70.33,
1202
+ arc: 34.68,
1203
+ wiki: 2.6839,
1204
+ tokens: "—",
1205
+ releaseDate: "2026-06-18",
1206
+ links: {
1207
+ card: "https://huggingface.co/Quazim0t0/Byrne-86M",
1208
+ base: "https://huggingface.co/Quazim0t0/Byrne-86M-Base"
1209
+ }
1210
+ },
1211
+ {
1212
+ name: "Blink-1-Base",
1213
+ org: "glintresearch",
1214
+ params: "1.09K",
1215
+ blimp: 52.84,
1216
+ arc: 26.60,
1217
+ wiki: 71.35,
1218
+ tokens: "100B",
1219
+ releaseDate: "2026-06-21",
1220
+ links: {
1221
+ card: "https://huggingface.co/Glint-Research/Blink-1-Base"
1222
+ }
1223
+ },
1224
+ {
1225
+ name: "Blink-1-Instruct",
1226
+ org: "glintresearch",
1227
+ params: "1.09K",
1228
+ blimp: 52.46,
1229
+ arc: 26.80,
1230
+ wiki: 70.44,
1231
+ tokens: "100B",
1232
+ releaseDate: "2026-06-21",
1233
+ links: {
1234
+ card: "https://huggingface.co/Glint-Research/Blink-1-Base",
1235
+ base: "https://huggingface.co/Glint-Research/Blink-1-Base"
1236
+ }
1237
+ },
1238
+ {
1239
+ name: "Dumb-1.2-Preview-0625",
1240
+ org: "56m",
1241
+ params: "34.6M",
1242
+ blimp: 64.05,
1243
+ arc: 32.79,
1244
+ wiki: 2.875,
1245
+ tokens: "~115~165M",
1246
+ releaseDate: "2026-06-25",
1247
+ links: {
1248
+ card: "https://huggingface.co/56m/Dumb-1.2-Preview-0625"
1249
+ }
1250
+ },
1251
+ {
1252
+ name: "Dumb-1.2-RC1",
1253
+ org: "56m",
1254
+ params: "34.6M",
1255
+ blimp: 64.87,
1256
+ arc: 34.13,
1257
+ wiki: 2.838,
1258
+ tokens: "210M",
1259
+ releaseDate: "2026-06-28",
1260
+ links: {
1261
+ card: "https://huggingface.co/56m/Dumb-1.2-RC1"
1262
+ }
1263
+ },
1264
+ {
1265
+ name: "GPT-X2-125M",
1266
+ org: "axiomiclabs",
1267
+ params: "125M",
1268
+ blimp: 81.28,
1269
+ arc: 57.07,
1270
+ wiki: 1.86,
1271
+ tokens: "75B",
1272
+ releaseDate: "2026-04-22",
1273
+ links: {
1274
+ card: "https://huggingface.co/AxiomicLabs/GPT-X2-125M"
1275
+ }
1276
+ },
1277
+ {
1278
+ name: "Unknown-2026-0628",
1279
+ org: "unknown",
1280
+ params: "34.6M",
1281
+ blimp: 64.28,
1282
+ arc: 32.09,
1283
+ wiki: 2.872,
1284
+ tokens: "—",
1285
+ links: {}
1286
+ },
1287
+ {
1288
+ name: "TinyMoE-100m-2x8",
1289
+ org: "flamef0x",
1290
+ params: "99.8M",
1291
+ blimp: 61.13,
1292
+ arc: 25.88,
1293
+ wiki: 3.878,
1294
+ tokens: "~625M",
1295
+ releaseDate: "2026-06-15",
1296
+ links: {
1297
+ card: "https://huggingface.co/FlameF0X/TinyMoE-100m-2x8"
1298
+ }
1299
+ },
1300
+ {
1301
+ name: "TinyMoE-100m-2x8-retrained",
1302
+ org: "flamef0x",
1303
+ params: "99.8M",
1304
+ blimp: 66.01,
1305
+ arc: 33.88,
1306
+ wiki: 2.879,
1307
+ tokens: "—",
1308
+ releaseDate: "2026-07-05",
1309
+ links: {
1310
+ card: "https://huggingface.co/FlameF0X/TinyMoE-100m-2x8-retrained"
1311
+ }
1312
+ },
1313
+ {
1314
+ name: "SRLM-1M",
1315
+ org: "martico2432",
1316
+ params: "904k",
1317
+ blimp: 53.1,
1318
+ arc: 28.66,
1319
+ wiki: 4.455,
1320
+ tokens: "~16M",
1321
+ releaseDate: "2026-07-04",
1322
+ links: {
1323
+ card: "https://huggingface.co/Martico2432/srlm-1m"
1324
+ }
1325
+ },
1326
+ {
1327
+ name: "CreekwardGoat-500K",
1328
+ org: "wonderfulmonkey",
1329
+ params: "500k",
1330
+ blimp: 60.61,
1331
+ arc: 30.35,
1332
+ wiki: 4.1228,
1333
+ tokens: "300M",
1334
+ releaseDate: "2026-07-16",
1335
+ links: {
1336
+ card: "https://huggingface.co/wonderfulmonkey/CreekwardGoat-500K"
1337
+ }
1338
+ },
1339
+ {
1340
+ name: "Ivme-Conversate-v2-Base",
1341
+ org: "ivmelabs",
1342
+ params: "23.85M",
1343
+ blimp: 75.09,
1344
+ arc: 39.98,
1345
+ wiki: 2.2250,
1346
+ tokens: "~12.85B",
1347
+ releaseDate: "2026-07-07",
1348
+ links: {
1349
+ card: "https://huggingface.co/IvmeLabs/Ivme-Conversate-v2-Base",
1350
+ demo: "https://huggingface.co/spaces/IvmeLabs/Ivme-Conversate-Demo"
1351
+ }
1352
+ },
1353
+
1354
+ ];
1355
+
1356
+ models.forEach(m => { if (!m.links) m.links = {}; });
1357
+
1358
+ const orgNameMap = {
1359
+ glintresearch: 'Glint Research',
1360
+ supralabs: 'SupraLabs',
1361
+ axiomiclabs: 'Axiomic Labs',
1362
+ mihaipopa: 'Mihai Popa',
1363
+ cromia: 'CromIA',
1364
+ wop: 'wop',
1365
+ GODELEV: 'GODELEV',
1366
+ finnianx: 'finnianx',
1367
+ ivmelabs: 'IvmeLabs',
1368
+ rtc: 'RTC',
1369
+ huggingface: 'HuggingFace',
1370
+ facebook: 'Meta',
1371
+ openai: 'OpenAI',
1372
+ eleutherai: 'EleutherAI',
1373
+ stentor: 'StentorLabs',
1374
+ eclipsesenpai: 'Eclipse-Senpai',
1375
+ minimalabs: 'Minima Labs',
1376
+ sandroeth: 'Sandroeth',
1377
+ thingai: 'ThingAI',
1378
+ veyraai: 'veyra-ai',
1379
+ fromzero: 'FromZero',
1380
+ joelhenwang: 'joelhenwang',
1381
+ jhuclsp: 'JHU CLSP',
1382
+ liodonai: 'Liodon AI',
1383
+ smalldoge: 'SmallDoge',
1384
+ quazim0t0: 'Quazim0t0',
1385
+ small56ai: 'Small56.AI',
1386
+ lhtechai: 'LH-Tech-AI',
1387
+ harleyml: 'Harley ML',
1388
+ exnivo: 'Exnivo',
1389
+ '56m': '56m',
1390
+ unknown: 'Unknown',
1391
+ flamef0x: 'FlameF0X',
1392
+ martico2432: 'Martico2432',
1393
+ wonderfulmonkey: 'Wonderful Monkey'
1394
+ };
1395
+
1396
+ const colorMap = {
1397
+ glintresearch: '#3fb950',
1398
+ supralabs: '#58a6ff',
1399
+ axiomiclabs: '#c2b6ff',
1400
+ mihaipopa: '#93c6aa',
1401
+ cromia: '#d0d7de',
1402
+ wop: '#ff9b50',
1403
+ GODELEV: '#1a56db',
1404
+ finnianx: '#06b6d4',
1405
+ ivmelabs: '#ff0000',
1406
+ rtc: '#e8a87c',
1407
+ huggingface: '#ffcc00',
1408
+ facebook: '#1877f2',
1409
+ openai: '#10a37f',
1410
+ eleutherai: '#ef4444',
1411
+ stentor: '#ff6bcb',
1412
+ eclipsesenpai: '#06b6d4',
1413
+ minimalabs: '#4961e6',
1414
+ sandroeth: '#84cc16',
1415
+ thingai: '#b45309',
1416
+ veyraai: '#d45672',
1417
+ fromzero: '#d2b48c',
1418
+ joelhenwang: '#9ca3af',
1419
+ jhuclsp: '#2563eb',
1420
+ liodonai: '#6366f1',
1421
+ smalldoge: '#ec4899',
1422
+ quazim0t0: '#0ea5e9',
1423
+ small56ai: '#22c55e',
1424
+ lhtechai: '#f97316',
1425
+ exnivo: '#8B4513',
1426
+ unknown: '#fbbf24',
1427
+ '56m': '#a855f7',
1428
+ flamef0x: '#cc5218',
1429
+ martico2432: '#6cf01a',
1430
+ wonderfulmonkey: '#f0f8ff'
1431
+ };
1432
+
1433
+ const bgMap = {};
1434
+ Object.keys(colorMap).forEach(k => {
1435
+ const c = colorMap[k];
1436
+ const r = parseInt(c.slice(1, 3), 16);
1437
+ const g = parseInt(c.slice(3, 5), 16);
1438
+ const b = parseInt(c.slice(5, 7), 16);
1439
+ bgMap[k] = `rgba(${r},${g},${b},0.7)`;
1440
+ });
1441
+
1442
+ function parseParams(s) {
1443
+ if (!s || typeof s !== 'string') return NaN;
1444
+ const u = s.toUpperCase().replace(/,/g, '');
1445
+ if (u.endsWith('B')) return parseFloat(u) * 1e9;
1446
+ if (u.endsWith('M')) return parseFloat(u) * 1e6;
1447
+ if (u.endsWith('K')) return parseFloat(u) * 1e3;
1448
+ return parseFloat(u) || NaN;
1449
+ }
1450
+
1451
+ // Size-fairness: reward smaller models, but cap the bonus so a 1K model
1452
+ // can't score wildly higher (e.g. 100x) than a 1M model for similar performance.
1453
+ // We work in log-parameter space (since params span 1K to 150M+) and cap the
1454
+ // smallest model's bonus at MAX_SIZE_BONUS relative to the largest model.
1455
+ const paramLogs = models
1456
+ .map(m => parseParams(m.params))
1457
+ .filter(p => !isNaN(p) && p > 0)
1458
+ .map(p => Math.log10(p));
1459
+ const paramLogMin = Math.min(...paramLogs);
1460
+ const paramLogMax = Math.max(...paramLogs);
1461
+ const MAX_SIZE_BONUS = 0.5; // smallest model on the board tops out at +50%, not +9900%
1462
+
1463
+ function getSizeMultiplier(m) {
1464
+ const p = parseParams(m.params);
1465
+ if (isNaN(p) || p <= 0 || paramLogMin === paramLogMax) return 1;
1466
+ // t = 1 for the smallest model on the board, 0 for the largest
1467
+ const t = (paramLogMax - Math.log10(p)) / (paramLogMax - paramLogMin);
1468
+ return 1 + MAX_SIZE_BONUS * Math.max(0, Math.min(1, t));
1469
+ }
1470
+
1471
+ const WIKI_PPL_CAP = 500;
1472
+ const wikiScoreLogs = models
1473
+ .filter(m => m.wiki !== null && typeof m.wiki === 'number' && m.wiki > 0)
1474
+ .map(m => Math.log(Math.min(m.wiki, WIKI_PPL_CAP)));
1475
+ const wikiMinLog = Math.min(...wikiScoreLogs);
1476
+ const wikiMaxLog = Math.max(...wikiScoreLogs);
1477
+
1478
+ function getWikiScore(m) {
1479
+ if (m.wiki === null || typeof m.wiki !== 'number' || m.wiki <= 0 || wikiMinLog === wikiMaxLog) return null;
1480
+ const cappedLog = Math.log(Math.min(m.wiki, WIKI_PPL_CAP));
1481
+ const normalized = 1 - ((cappedLog - wikiMinLog) / (wikiMaxLog - wikiMinLog));
1482
+ return Math.max(0, Math.min(1, normalized)) * 100;
1483
+ }
1484
+
1485
+ function getScore(m) {
1486
+ const wikiScore = getWikiScore(m);
1487
+ const hasBlimp = typeof m.blimp === 'number';
1488
+ const hasArc = typeof m.arc === 'number';
1489
+ const hasWiki = wikiScore !== null;
1490
+ if (!hasBlimp && !hasArc && !hasWiki) return -1;
1491
+ const blimpScore = hasBlimp ? m.blimp : 0;
1492
+ const arcScore = hasArc ? m.arc : 0;
1493
+ const wikiVal = hasWiki ? wikiScore : 0;
1494
+ return (blimpScore + arcScore + wikiVal) / 3;
1495
+ }
1496
+
1497
+ function getEfficiencyScore(m) {
1498
+ const score = getScore(m);
1499
+ if (score <= 0) return -1;
1500
+ return score * getSizeMultiplier(m);
1501
+ }
1502
+
1503
+ function orgTint(orgKey, alpha) {
1504
+ const c = colorMap[orgKey];
1505
+ const r = parseInt(c.slice(1, 3), 16);
1506
+ const g = parseInt(c.slice(3, 5), 16);
1507
+ const b = parseInt(c.slice(5, 7), 16);
1508
+ return `rgba(${r},${g},${b},${alpha})`;
1509
+ }
1510
+
1511
+ const worstGreen = [255, 255, 255];
1512
+ const bestGreen = [63, 185, 80];
1513
+
1514
+ function getColor(value, min, max, lowerIsBetter, useLog = false) {
1515
+ if (value === null || isNaN(value) || min === max) return '';
1516
+ let v = value, mn = min, mx = max;
1517
+ if (useLog) { v = Math.log(v); mn = Math.log(mn); mx = Math.log(mx); }
1518
+ let p = (v - mn) / (mx - mn);
1519
+ if (lowerIsBetter) p = 1 - p;
1520
+ const a = Math.pow(Math.max(0, Math.min(1, p)), 2.5);
1521
+ const r = Math.round(worstGreen[0] + (bestGreen[0] - worstGreen[0]) * a);
1522
+ const g = Math.round(worstGreen[1] + (bestGreen[1] - worstGreen[1]) * a);
1523
+ const b = Math.round(worstGreen[2] + (bestGreen[2] - worstGreen[2]) * a);
1524
+ return `color:rgb(${r},${g},${b})`;
1525
+ }
1526
+
1527
+ /* ─── Stats ─── */
1528
+
1529
+ function renderStats() {
1530
+ const orgs = new Set(models.map(m => m.org));
1531
+ const blimps = models.filter(m => m.blimp).map(m => m.blimp);
1532
+ const arcs = models.filter(m => m.arc).map(m => m.arc);
1533
+ const bestB = Math.max(...blimps);
1534
+ const bestA = Math.max(...arcs);
1535
+ document.getElementById('stat-row').innerHTML = `
1536
+ <div class="stat-pill"><div class="label">Models</div><div class="value">${models.length}</div><div class="sub">On leaderboard</div></div>
1537
+ <div class="stat-pill"><div class="label">Organizations</div><div class="value">${orgs.size}</div><div class="sub">Contributing</div></div>
1538
+ <div class="stat-pill"><div class="label">Best BLiMP</div><div class="value" style="color:var(--green)">${bestB}%</div><div class="sub">${models.find(m => m.blimp === bestB).name}</div></div>
1539
+ <div class="stat-pill"><div class="label">Best ARC-E</div><div class="value" style="color:var(--green)">${bestA}%</div><div class="sub">${models.find(m => m.arc === bestA).name}</div></div>
1540
+ `;
1541
+ document.getElementById('model-count-badge').textContent = `${models.length} models`;
1542
+ }
1543
+
1544
+ /* ─── Filters ─── */
1545
+
1546
+ let activeFilter = 'all';
1547
+ let activeSort = 'efficiency';
1548
+
1549
+ const sortComparators = {
1550
+ score: (a, b) => getScore(b) - getScore(a),
1551
+ wiki: (a, b) => {
1552
+ if (a.wiki == null) return 1;
1553
+ if (b.wiki == null) return -1;
1554
+ return a.wiki - b.wiki;
1555
+ },
1556
+ blimp: (a, b) => {
1557
+ if (a.blimp == null) return 1;
1558
+ if (b.blimp == null) return -1;
1559
+ return b.blimp - a.blimp;
1560
+ },
1561
+ arc: (a, b) => {
1562
+ if (a.arc == null) return 1;
1563
+ if (b.arc == null) return -1;
1564
+ return b.arc - a.arc;
1565
+ },
1566
+ efficiency: (a, b) => getEfficiencyScore(b) - getEfficiencyScore(a),
1567
+ params: (a, b) => parseParams(a.params) - parseParams(b.params),
1568
+ date: (a, b) => {
1569
+ if (!a.releaseDate) return 1;
1570
+ if (!b.releaseDate) return -1;
1571
+ return new Date(b.releaseDate) - new Date(a.releaseDate);
1572
+ }
1573
+ };
1574
+
1575
+ function sizeBucket(params) {
1576
+ const n = parseParams(params);
1577
+ if (isNaN(n) || n < 1e6) return 'small';
1578
+ if (n < 1e7) return 'medium';
1579
+ return 'large';
1580
+ }
1581
+
1582
+ function matchesFilter(m) {
1583
+ if (activeFilter === 'all') return true;
1584
+ if (activeFilter === 'small' || activeFilter === 'medium' || activeFilter === 'large') {
1585
+ return sizeBucket(m.params) === activeFilter;
1586
+ }
1587
+ return m.org === activeFilter;
1588
+ }
1589
+
1590
+ function getFilteredModels() {
1591
+ return models.filter(matchesFilter);
1592
+ }
1593
+
1594
+ function setupSortControl() {
1595
+ const sel = document.getElementById('sort-select');
1596
+ if (!sel) return;
1597
+ sel.value = activeSort;
1598
+ sel.addEventListener('change', e => {
1599
+ activeSort = e.target.value;
1600
+ renderTable();
1601
+ });
1602
+ }
1603
+
1604
+ function renderFilteredViews() {
1605
+ renderTable();
1606
+ buildLegend();
1607
+ renderTimeline();
1608
+ buildBarChart('blimpChart', 'blimp', false);
1609
+ buildBarChart('arcChart', 'arc', false);
1610
+ buildWikiChart();
1611
+ buildEfficiencyChart();
1612
+ buildOrgCountChart();
1613
+ }
1614
+
1615
+ function buildFilters() {
1616
+ const tb = document.getElementById('org-filters');
1617
+ if (!tb) return;
1618
+
1619
+ const sizeChips = [
1620
+ { key: 'all', label: 'All' },
1621
+ { key: 'small', label: '< 1M' },
1622
+ { key: 'medium', label: '1–10M' },
1623
+ { key: 'large', label: '10M+' }
1624
+ ];
1625
+ sizeChips.forEach(({ key, label }) => {
1626
+ const c = document.createElement('div');
1627
+ c.className = 'filter-chip' + (key === 'all' ? ' active' : '');
1628
+ c.dataset.filter = key;
1629
+ c.textContent = label;
1630
+ tb.appendChild(c);
1631
+ });
1632
+
1633
+ const sep = document.createElement('div');
1634
+ sep.className = 'tl-sep';
1635
+ tb.appendChild(sep);
1636
+
1637
+ const orgs = [...new Set(models.map(m => m.org))];
1638
+ orgs.forEach(org => {
1639
+ const c = document.createElement('div');
1640
+ c.className = 'filter-chip';
1641
+ c.dataset.filter = org;
1642
+ c.innerHTML = `<span class="dot" style="background:${colorMap[org]}"></span>${orgNameMap[org]}`;
1643
+ tb.appendChild(c);
1644
+ });
1645
+
1646
+ tb.addEventListener('click', e => {
1647
+ const chip = e.target.closest('.filter-chip');
1648
+ if (!chip) return;
1649
+ tb.querySelectorAll('.filter-chip').forEach(c => c.classList.remove('active'));
1650
+ chip.classList.add('active');
1651
+ activeFilter = chip.dataset.filter;
1652
+ renderFilteredViews();
1653
+ });
1654
+ }
1655
+
1656
+ /* ─── Table ─── */
1657
+
1658
+ function formatDate(dateStr) {
1659
+ if (!dateStr) return '—';
1660
+ const date = new Date(dateStr);
1661
+ return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });
1662
+ }
1663
+
1664
+ function renderTable() {
1665
+ const tbody = document.getElementById('leaderboard-body');
1666
+ const cmp = sortComparators[activeSort] || sortComparators.score;
1667
+ const filtered = getFilteredModels().sort(cmp);
1668
+ document.getElementById('model-count-badge').textContent = activeFilter === 'all'
1669
+ ? `${models.length} models`
1670
+ : `${filtered.length} of ${models.length} models`;
1671
+ const blimps = models.filter(m => m.blimp).map(m => m.blimp);
1672
+ const arcs = models.filter(m => m.arc).map(m => m.arc);
1673
+ const wikis = models.filter(m => m.wiki).map(m => m.wiki);
1674
+ const effs = models.filter(m => getEfficiencyScore(m) >= 0).map(m => getEfficiencyScore(m));
1675
+ const bMin = Math.min(...blimps), bMax = Math.max(...blimps);
1676
+ const aMin = Math.min(...arcs), aMax = Math.max(...arcs);
1677
+ const wMin = Math.min(...wikis), wMax = Math.max(...wikis);
1678
+ const eMin = Math.min(...effs), eMax = Math.max(...effs);
1679
+
1680
+ tbody.innerHTML = filtered.map((m, idx) => {
1681
+ const oc = colorMap[m.org];
1682
+ const orgBg = orgTint(m.org, 0.15);
1683
+ const isBestBlimp = m.blimp && m.blimp === bMax;
1684
+ const isBestArc = m.arc && m.arc === aMax;
1685
+ const isBestWiki = m.wiki && m.wiki === wMin;
1686
+ const rank = idx + 1;
1687
+ const rankClass = rank <= 3 ? ` rank-${rank}` : '';
1688
+ return `<tr class="lb-row" onmouseenter="this.classList.add('hover')" onmouseleave="this.classList.remove('hover')">
1689
+ <td class="cell-rank${rankClass}">#${rank}</td>
1690
+ <td class="cell-model">
1691
+ <div class="model-name">${m.name}</div>
1692
+ </td>
1693
+ <td><span class="org-tag" style="background:${orgBg};color:${oc}"><span class="org-dot" style="background:${oc}"></span>${orgNameMap[m.org]}</span></td>
1694
+ <td>${m.params}</td>
1695
+ <td class="cell-metric" style="${getColor(getEfficiencyScore(m), eMin, eMax, false)}">
1696
+ ${getEfficiencyScore(m) >= 0
1697
+ ? `<span class="metric-val${getEfficiencyScore(m) >= eMax ? ' best' : ''}">${getEfficiencyScore(m).toFixed(2)}</span>`
1698
+ : '<span class="metric-na">TBD</span>'}
1699
+ </td>
1700
+ <td class="cell-metric ${m.wiki === null ? '' : ''}" style="${getColor(m.wiki, wMin, wMax, true, true)}">
1701
+ ${m.wiki !== null
1702
+ ? `<span class="metric-val${isBestWiki ? ' best' : ''}">${m.wiki}</span>`
1703
+ : '<span class="metric-na">TBD</span>'}
1704
+ </td>
1705
+ <td class="cell-metric" style="${getColor(m.blimp, bMin, bMax, false)}">
1706
+ ${m.blimp !== null
1707
+ ? `<span class="metric-val${isBestBlimp ? ' best' : ''}">${m.blimp}%</span>`
1708
+ : '<span class="metric-na">TBD</span>'}
1709
+ </td>
1710
+ <td class="cell-metric" style="${getColor(m.arc, aMin, aMax, false)}">
1711
+ ${m.arc !== null
1712
+ ? `<span class="metric-val${isBestArc ? ' best' : ''}">${m.arc}%</span>`
1713
+ : '<span class="metric-na">TBD</span>'}
1714
+ </td>
1715
+ <td class="cell-tokens">${m.tokens}</td>
1716
+ <td class="cell-date">${formatDate(m.releaseDate)}</td>
1717
+ <td class="cell-links">
1718
+ ${m.links.card ? `<a href="${m.links.card}" target="_blank">card</a>` : '<span class="metric-na">—</span>'}
1719
+ ${m.links.base ? `<a href="${m.links.base}" target="_blank">base</a>` : ''}
1720
+ ${m.links.demo ? `<a href="${m.links.demo}" target="_blank">demo</a>` : ''}
1721
+ </td>
1722
+ </tr>`;
1723
+ }).join('');
1724
+ }
1725
+
1726
+ /* ─── Legend ─── */
1727
+
1728
+ function buildLegend() {
1729
+ const bar = document.getElementById('legend-bar');
1730
+ const orgs = [...new Set(getFilteredModels().map(m => m.org))];
1731
+ bar.innerHTML = orgs.map(org =>
1732
+ `<span class="legend-item"><span class="ldot" style="background:${colorMap[org]}"></span>${orgNameMap[org]}</span>`
1733
+ ).join('');
1734
+ }
1735
+
1736
+ /* ─── Chart defaults ─── */
1737
+
1738
+ Chart.defaults.color = '#8b949e';
1739
+ Chart.defaults.borderColor = 'rgba(255,255,255,0.06)';
1740
+ Chart.defaults.font.family = "-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif";
1741
+ Chart.defaults.font.size = 11;
1742
+ Chart.defaults.plugins.legend.display = false;
1743
+
1744
+ const tooltipStyle = {
1745
+ backgroundColor: '#1c2129',
1746
+ titleColor: '#c9d1d9',
1747
+ bodyColor: '#8b949e',
1748
+ borderColor: '#30363d',
1749
+ borderWidth: 1,
1750
+ cornerRadius: 8,
1751
+ padding: 10,
1752
+ displayColors: false
1753
+ };
1754
+
1755
+ /* ─── Timeline ─── */
1756
+
1757
+ function renderTimeline() {
1758
+ const container = document.getElementById('timeline-list');
1759
+ if (!container) return;
1760
+
1761
+ const sorted = getFilteredModels()
1762
+ .filter(m => m.releaseDate)
1763
+ .sort((a, b) => new Date(b.releaseDate) - new Date(a.releaseDate));
1764
+
1765
+ const monthKey = d => {
1766
+ const [y, m] = d.split('-');
1767
+ return `${y}-${m}`;
1768
+ };
1769
+ const monthLabel = key => {
1770
+ const [y, m] = key.split('-');
1771
+ const dt = new Date(parseInt(y), parseInt(m) - 1, 1);
1772
+ return dt.toLocaleDateString('en-US', { month: 'long', year: 'numeric' });
1773
+ };
1774
+ const dayLabel = d => {
1775
+ const [y, m, day] = d.split('-').map(Number);
1776
+ const dt = new Date(y, m - 1, day);
1777
+ return dt.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });
1778
+ };
1779
+
1780
+ if (sorted.length === 0) {
1781
+ container.innerHTML = '<div class="tl-empty">No models match this filter.</div>';
1782
+ return;
1783
+ }
1784
+
1785
+ const groups = {};
1786
+ sorted.forEach(m => {
1787
+ const k = monthKey(m.releaseDate);
1788
+ (groups[k] = groups[k] || []).push(m);
1789
+ });
1790
+
1791
+ container.innerHTML = Object.keys(groups).map(key => {
1792
+ const items = groups[key];
1793
+ const rows = items.map(m => {
1794
+ const oc = colorMap[m.org];
1795
+ const orgBg = orgTint(m.org, 0.15);
1796
+ return `<div class="tl-row" style="--org-color:${oc}">
1797
+ <div class="tl-date">${dayLabel(m.releaseDate)}</div>
1798
+ <div class="tl-name">
1799
+ <a href="${m.links.card}" target="_blank" rel="noopener">${m.name}</a>
1800
+ </div>
1801
+ <div class="tl-params">${m.params} params</div>
1802
+ <div class="tl-org" style="background:${orgBg};color:${oc}">${orgNameMap[m.org]}</div>
1803
+ </div>`;
1804
+ }).join('');
1805
+ return `<div class="tl-month">
1806
+ <span>${monthLabel(key)}</span>
1807
+ <span class="tl-month-count">${items.length} model${items.length === 1 ? '' : 's'}</span>
1808
+ </div>${rows}`;
1809
+ }).join('');
1810
+ }
1811
+
1812
+ /* ─── Bar charts ─── */
1813
+
1814
+ function buildBarChart(canvasId, metric, reverse) {
1815
+ const canvas = document.getElementById(canvasId);
1816
+ const existing = Chart.getChart(canvas);
1817
+ if (existing) existing.destroy();
1818
+
1819
+ const fmt = v => v.toFixed(1) + '%';
1820
+ const sorted = getFilteredModels()
1821
+ .filter(d => d[metric] !== null && typeof d[metric] === 'number')
1822
+ .sort((a, b) => reverse ? a[metric] - b[metric] : b[metric] - a[metric]);
1823
+
1824
+ new Chart(canvas, {
1825
+ type: 'bar',
1826
+ data: {
1827
+ labels: sorted.map(d => d.name),
1828
+ datasets: [{
1829
+ data: sorted.map(d => d[metric]),
1830
+ backgroundColor: sorted.map(d => bgMap[d.org]),
1831
+ borderColor: sorted.map(d => colorMap[d.org]),
1832
+ borderWidth: 1,
1833
+ borderRadius: 3,
1834
+ borderSkipped: false
1835
+ }]
1836
+ },
1837
+ options: {
1838
+ indexAxis: 'y',
1839
+ responsive: true,
1840
+ maintainAspectRatio: false,
1841
+ animation: { duration: 600, easing: 'easeOutQuart' },
1842
+ plugins: {
1843
+ tooltip: {
1844
+ callbacks: { label: ctx => fmt(ctx.parsed.x) },
1845
+ ...tooltipStyle
1846
+ }
1847
+ },
1848
+ scales: {
1849
+ x: {
1850
+ beginAtZero: true,
1851
+ grid: { drawBorder: false },
1852
+ ticks: { callback: v => v + '%' }
1853
+ },
1854
+ y: {
1855
+ grid: { display: false },
1856
+ ticks: {
1857
+ font: { size: 9 },
1858
+ autoSkip: false,
1859
+ callback: function(v) {
1860
+ const l = this.getLabelForValue(v);
1861
+ return l.length > 18 ? l.slice(0, 17) + '…' : l;
1862
+ }
1863
+ }
1864
+ }
1865
+ }
1866
+ }
1867
+ });
1868
+ }
1869
+
1870
+ /* ─── WikiText-2 Bubble ─── */
1871
+
1872
+ function buildWikiChart() {
1873
+ const canvas = document.getElementById('wikiChart');
1874
+ const existing = Chart.getChart(canvas);
1875
+ if (existing) existing.destroy();
1876
+
1877
+ const data = getFilteredModels()
1878
+ .filter(d => d.wiki !== null && typeof d.wiki === 'number')
1879
+ .filter(d => d.name !== 'Glint-0.1' && d.name !== 'Glint-0.2')
1880
+ .map(d => ({
1881
+ name: d.name,
1882
+ org: d.org,
1883
+ wiki: d.wiki,
1884
+ logWiki: Math.log10(Math.max(d.wiki, 0.1)),
1885
+ params: d.params
1886
+ }))
1887
+ .sort((a, b) => a.wiki - b.wiki);
1888
+
1889
+ const ySpread = [];
1890
+ const used = [];
1891
+ data.forEach(d => {
1892
+ let y = 0.5;
1893
+ const logX = d.logWiki;
1894
+ for (let attempt = 0; attempt < 40; attempt++) {
1895
+ const candidateY = 0.15 + (attempt % 8) * 0.1 + Math.floor(attempt / 8) * 0.02;
1896
+ let overlap = false;
1897
+ for (const u of used) {
1898
+ const dx = Math.abs(logX - u.logX);
1899
+ const dy = Math.abs(candidateY - u.y);
1900
+ if (dx < 0.15 && dy < 0.08) { overlap = true; break; }
1901
+ }
1902
+ if (!overlap) { y = candidateY; break; }
1903
+ }
1904
+ used.push({ logX, y });
1905
+ ySpread.push(y);
1906
+ });
1907
+
1908
+ const logVals = data.map(d => d.logWiki);
1909
+ const logMin = Math.min(...logVals);
1910
+ const logMax = Math.max(...logVals);
1911
+
1912
+ function getRadius(logW) {
1913
+ if (logMax === logMin) return 12;
1914
+ const t = (logW - logMin) / (logMax - logMin);
1915
+ return 6 + t * 26;
1916
+ }
1917
+
1918
+ const tooltip = document.getElementById('wikiTooltip');
1919
+ tooltip.classList.remove('visible');
1920
+
1921
+ new Chart(canvas, {
1922
+ type: 'bubble',
1923
+ data: {
1924
+ datasets: [{
1925
+ data: data.map((d, i) => ({
1926
+ x: d.wiki,
1927
+ y: ySpread[i],
1928
+ r: getRadius(d.logWiki),
1929
+ _name: d.name,
1930
+ _org: d.org,
1931
+ _wiki: d.wiki,
1932
+ _params: d.params
1933
+ })),
1934
+ backgroundColor: data.map(d => orgTint(d.org, 0.5)),
1935
+ borderColor: data.map(d => colorMap[d.org]),
1936
+ borderWidth: 1.5,
1937
+ hoverBorderWidth: 2.5,
1938
+ hoverBackgroundColor: data.map(d => orgTint(d.org, 0.75))
1939
+ }]
1940
+ },
1941
+ options: {
1942
+ responsive: true,
1943
+ maintainAspectRatio: true,
1944
+ animation: { duration: 700, easing: 'easeOutQuart' },
1945
+ layout: { padding: { top: 10, bottom: 10, left: 10, right: 10 } },
1946
+ scales: {
1947
+ x: {
1948
+ type: 'logarithmic',
1949
+ title: { display: true, text: 'byte_ppl (log scale)', color: '#8b949e', font: { size: 11 } },
1950
+ grid: { drawBorder: false, color: 'rgba(255,255,255,0.04)' },
1951
+ ticks: {
1952
+ color: '#8b949e',
1953
+ callback: function(v) {
1954
+ if (v >= 1000) return (v / 1000).toFixed(v >= 10000 ? 0 : 1) + 'K';
1955
+ if (v >= 1) return v.toFixed(v >= 100 ? 0 : v >= 10 ? 1 : 2);
1956
+ return v.toString();
1957
+ }
1958
+ }
1959
+ },
1960
+ y: { display: false, min: 0, max: 1 }
1961
+ },
1962
+ plugins: {
1963
+ legend: { display: false },
1964
+ tooltip: { enabled: false }
1965
+ }
1966
+ },
1967
+ plugins: [
1968
+ {
1969
+ id: 'customLabels',
1970
+ afterDraw(chart) {
1971
+ const ctx = chart.ctx;
1972
+ const meta = chart.getDatasetMeta(0);
1973
+ meta.data.forEach((point, i) => {
1974
+ const d = chart.data.datasets[0].data[i];
1975
+ if (d.r >= 12) {
1976
+ ctx.save();
1977
+ ctx.font = `500 ${Math.min(d.r * 0.55, 11)}px -apple-system,BlinkMacSystemFont,sans-serif`;
1978
+ ctx.fillStyle = 'rgba(255,255,255,0.85)';
1979
+ ctx.textAlign = 'center';
1980
+ ctx.textBaseline = 'middle';
1981
+ let label = d._name;
1982
+ const maxW = d.r * 1.6;
1983
+ if (ctx.measureText(label).width > maxW) {
1984
+ label = label.slice(0, Math.floor(maxW / ctx.measureText('A').width)) + '…';
1985
+ }
1986
+ ctx.fillText(label, point.x, point.y);
1987
+ ctx.restore();
1988
+ }
1989
+ });
1990
+ }
1991
+ },
1992
+ {
1993
+ id: 'customTooltip',
1994
+ afterEvent(chart, args) {
1995
+ const evt = args.event;
1996
+ if (evt.type === 'mouseout') {
1997
+ tooltip.classList.remove('visible');
1998
+ return;
1999
+ }
2000
+ const elements = chart.getElementsAtEventForMode(evt, 'nearest', { intersect: true }, false);
2001
+ if (elements.length > 0) {
2002
+ const el = elements[0];
2003
+ const d = chart.data.datasets[0].data[el.index];
2004
+ const point = chart.getDatasetMeta(0).data[el.index];
2005
+ tooltip.querySelector('.tt-name').textContent = d._name;
2006
+ tooltip.querySelector('.tt-val').innerHTML =
2007
+ `byte_ppl: <strong>${d._wiki.toLocaleString()}</strong> · ${d._params} params`;
2008
+ let left = point.x + 14;
2009
+ let top = point.y - 20;
2010
+ const ttW = 250;
2011
+ if (left + ttW > canvas.width) left = point.x - ttW - 10;
2012
+ if (top < 0) top = 10;
2013
+ tooltip.style.left = left + 'px';
2014
+ tooltip.style.top = top + 'px';
2015
+ tooltip.classList.add('visible');
2016
+ } else {
2017
+ tooltip.classList.remove('visible');
2018
+ }
2019
+ }
2020
+ }
2021
+ ]
2022
+ });
2023
+ }
2024
+
2025
+ /* ─── Efficiency ─── */
2026
+
2027
+ function buildEfficiencyChart() {
2028
+ const canvas = document.getElementById('efficiencyChart');
2029
+ const existing = Chart.getChart(canvas);
2030
+ if (existing) existing.destroy();
2031
+
2032
+ const valid = getFilteredModels()
2033
+ .filter(d => getScore(d) >= 0)
2034
+ .filter(d => d.name !== 'MicroSupra-1k')
2035
+ .map(d => ({ ...d, paramsNum: parseParams(d.params), avgScore: getScore(d) }))
2036
+ .filter(d => !isNaN(d.paramsNum) && d.paramsNum > 0);
2037
+
2038
+ if (valid.length < 2) return;
2039
+
2040
+ const ranked = [...valid].sort((a, b) => b.avgScore - a.avgScore);
2041
+ const rankMap = new Map();
2042
+ ranked.forEach((m, i) => rankMap.set(m.name, i + 1));
2043
+ valid.forEach(m => m.rank = rankMap.get(m.name));
2044
+
2045
+ const logP = valid.map(d => Math.log10(d.paramsNum));
2046
+ const scores = valid.map(d => d.avgScore);
2047
+ const n = valid.length;
2048
+ const sx = logP.reduce((a, v) => a + v, 0);
2049
+ const sy = scores.reduce((a, v) => a + v, 0);
2050
+ const sxy = logP.reduce((a, v, i) => a + v * scores[i], 0);
2051
+ const sx2 = logP.reduce((a, v) => a + v * v, 0);
2052
+ const slope = (n * sxy - sx * sy) / (n * sx2 - sx * sx);
2053
+ const intercept = (sy - slope * sx) / n;
2054
+ const res = valid.map(d => d.avgScore - (intercept + slope * Math.log10(d.paramsNum)));
2055
+ const resStd = Math.sqrt(res.reduce((a, v) => a + v * v, 0) / n);
2056
+ const shift = Math.max(resStd, 3);
2057
+ const sorted = [...valid].sort((a, b) => a.paramsNum - b.paramsNum);
2058
+
2059
+ const axMin = 500, axMax = 1.5e8;
2060
+ const regData = [], threshData = [];
2061
+ for (let i = 0; i <= 80; i++) {
2062
+ const lx = Math.log10(axMin) + (Math.log10(axMax) - Math.log10(axMin)) * (i / 80);
2063
+ const x = Math.pow(10, lx);
2064
+ regData.push({ x, y: intercept + slope * lx });
2065
+ threshData.push({ x, y: intercept + slope * lx + shift });
2066
+ }
2067
+
2068
+ new Chart(canvas, {
2069
+ type: 'line',
2070
+ data: {
2071
+ datasets: [
2072
+ {
2073
+ label: 'Models',
2074
+ data: sorted.map(d => ({ x: d.paramsNum, y: d.avgScore })),
2075
+ showLine: false,
2076
+ backgroundColor: sorted.map(d => colorMap[d.org]),
2077
+ borderColor: sorted.map(d => colorMap[d.org]),
2078
+ pointRadius: 6,
2079
+ pointHoverRadius: 9
2080
+ },
2081
+ {
2082
+ label: 'Trend',
2083
+ data: regData,
2084
+ showLine: true,
2085
+ borderColor: 'rgba(255,200,0,0.5)',
2086
+ borderWidth: 1.5,
2087
+ borderDash: [4, 4],
2088
+ pointRadius: 0,
2089
+ fill: false
2090
+ },
2091
+ {
2092
+ label: 'Threshold',
2093
+ data: threshData,
2094
+ showLine: true,
2095
+ borderColor: 'rgba(255,200,0,0.8)',
2096
+ borderWidth: 2,
2097
+ borderDash: [6, 4],
2098
+ pointRadius: 0,
2099
+ fill: false
2100
+ }
2101
+ ]
2102
+ },
2103
+ options: {
2104
+ parsing: false,
2105
+ responsive: true,
2106
+ maintainAspectRatio: true,
2107
+ animation: { duration: 700, easing: 'easeOutQuart' },
2108
+ scales: {
2109
+ x: {
2110
+ type: 'logarithmic',
2111
+ min: axMin,
2112
+ max: axMax,
2113
+ title: { display: true, text: 'Parameters', color: '#8b949e' },
2114
+ grid: { drawBorder: false },
2115
+ ticks: {
2116
+ color: '#8b949e',
2117
+ callback: v => v >= 1e6
2118
+ ? (v / 1e6).toFixed(v >= 1e7 ? 0 : 1) + 'M'
2119
+ : v >= 1e3
2120
+ ? (v / 1e3).toFixed(v >= 1e4 ? 0 : 1) + 'K'
2121
+ : v.toString()
2122
+ }
2123
+ },
2124
+ y: {
2125
+ title: { display: true, text: 'Leaderboard Score (avg of available benchmarks)', color: '#8b949e' },
2126
+ min: 20,
2127
+ max: 80,
2128
+ grid: { drawBorder: false },
2129
+ ticks: { color: '#8b949e', callback: v => v + '%' }
2130
+ }
2131
+ },
2132
+ plugins: {
2133
+ legend: { display: false },
2134
+ tooltip: {
2135
+ callbacks: {
2136
+ label: ctx => {
2137
+ if (ctx.dataset.label !== 'Models') return '';
2138
+ const d = sorted[ctx.dataIndex];
2139
+ return `#${d.rank} ${d.name}: ${d.params}, ${d.avgScore.toFixed(1)}%`;
2140
+ }
2141
+ },
2142
+ ...tooltipStyle
2143
+ }
2144
+ }
2145
+ },
2146
+ plugins: [
2147
+ {
2148
+ id: 'zone',
2149
+ beforeDraw(chart) {
2150
+ const ctx = chart.ctx, xs = chart.scales.x, ys = chart.scales.y;
2151
+ const { left, right, top, bottom } = chart.chartArea;
2152
+ const lY = intercept + slope * Math.log10(Math.max(xs.min, 1)) + shift;
2153
+ const rY = intercept + slope * Math.log10(Math.max(xs.max, 1)) + shift;
2154
+ ctx.save();
2155
+ ctx.beginPath();
2156
+ ctx.rect(left, top, right - left, bottom - top);
2157
+ ctx.clip();
2158
+ ctx.beginPath();
2159
+ ctx.moveTo(left, ys.getPixelForValue(lY));
2160
+ ctx.lineTo(left, top);
2161
+ ctx.lineTo(right, top);
2162
+ ctx.lineTo(right, ys.getPixelForValue(rY));
2163
+ ctx.closePath();
2164
+ ctx.fillStyle = 'rgba(255,230,0,0.06)';
2165
+ ctx.fill();
2166
+ ctx.restore();
2167
+ }
2168
+ },
2169
+ {
2170
+ id: 'rankLabels',
2171
+ afterDatasetsDraw(chart) {
2172
+ const ctx = chart.ctx;
2173
+ const meta = chart.getDatasetMeta(0);
2174
+ const medalColors = { 1: '#ffd700', 2: '#c0c0c0', 3: '#cd7f32' };
2175
+ meta.data.forEach((point, i) => {
2176
+ const d = sorted[i];
2177
+ if (d.rank <= 3) {
2178
+ ctx.save();
2179
+ ctx.font = '700 10px -apple-system,BlinkMacSystemFont,sans-serif';
2180
+ ctx.fillStyle = medalColors[d.rank];
2181
+ ctx.textAlign = 'left';
2182
+ ctx.textBaseline = 'middle';
2183
+ ctx.fillText(`#${d.rank}`, point.x + 11, point.y - 1);
2184
+ ctx.restore();
2185
+ }
2186
+ });
2187
+ }
2188
+ }
2189
+ ]
2190
+ });
2191
+ }
2192
+
2193
+ /* ─── Org Count ─── */
2194
+
2195
+ function buildOrgCountChart() {
2196
+ const canvas = document.getElementById('orgCountChart');
2197
+ const existing = Chart.getChart(canvas);
2198
+ if (existing) existing.destroy();
2199
+
2200
+ const counts = {};
2201
+ getFilteredModels().forEach(m => counts[m.org] = (counts[m.org] || 0) + 1);
2202
+ const orgs = Object.keys(counts).sort((a, b) => counts[b] - counts[a]);
2203
+
2204
+ new Chart(canvas, {
2205
+ type: 'doughnut',
2206
+ data: {
2207
+ labels: orgs.map(o => orgNameMap[o]),
2208
+ datasets: [{
2209
+ data: orgs.map(o => counts[o]),
2210
+ backgroundColor: orgs.map(o => colorMap[o]),
2211
+ borderColor: '#161b22',
2212
+ borderWidth: 2,
2213
+ hoverOffset: 6
2214
+ }]
2215
+ },
2216
+ options: {
2217
+ responsive: true,
2218
+ maintainAspectRatio: true,
2219
+ cutout: '58%',
2220
+ animation: { duration: 700, easing: 'easeOutQuart' },
2221
+ plugins: {
2222
+ legend: {
2223
+ display: true,
2224
+ position: 'bottom',
2225
+ labels: {
2226
+ color: '#c9d1d9',
2227
+ padding: 14,
2228
+ usePointStyle: true,
2229
+ pointStyle: 'circle',
2230
+ font: { size: 11 }
2231
+ }
2232
+ }
2233
+ }
2234
+ }
2235
+ });
2236
+ }
2237
+
2238
+ /* ─── Toggle Banner ─── */
2239
+
2240
+ function toggleUnknownBanner() {
2241
+ const expand = document.getElementById('banner-expand');
2242
+ const hint = document.getElementById('banner-hint');
2243
+ if (!expand) return;
2244
+ const isOpen = expand.classList.contains('open');
2245
+ expand.classList.toggle('open');
2246
+ if (hint) hint.classList.toggle('rotated');
2247
+ }
2248
+
2249
+ /* ─── Init ─── */
2250
+
2251
+ window.addEventListener('DOMContentLoaded', () => {
2252
+ renderStats();
2253
+ buildFilters();
2254
+ setupSortControl();
2255
+ renderFilteredViews();
2256
+ });
2257
+
2258
+
2259
+ </script>
2260
+ </body>
2261
+ </html>