Spaces:
Running
Running
feat: remove radar plot and improve layout
Browse files- Dockerfile +1 -0
- data/bed_dataset.csv +322 -247
- data/bigwig_dataset.csv +0 -0
- src/streamlit_app.py +188 -90
Dockerfile
CHANGED
|
@@ -1,5 +1,6 @@
|
|
| 1 |
FROM python:3.13.5-slim
|
| 2 |
|
|
|
|
| 3 |
WORKDIR /app
|
| 4 |
|
| 5 |
RUN apt-get update && apt-get install -y \
|
|
|
|
| 1 |
FROM python:3.13.5-slim
|
| 2 |
|
| 3 |
+
|
| 4 |
WORKDIR /app
|
| 5 |
|
| 6 |
RUN apt-get update && apt-get install -y \
|
data/bed_dataset.csv
CHANGED
|
@@ -1,247 +1,322 @@
|
|
| 1 |
-
MCC,model_name,species,datasets
|
| 2 |
-
0.334637850522995,NTv2 500M,cattle,intron
|
| 3 |
-
0.1238768473267555,BPNet arch. 6M,cattle,intron
|
| 4 |
-
0.383470207452774,Residual CNN 44M,cattle,intron
|
| 5 |
-
0.3828243613243103,HyenaDNA 7M,cattle,intron
|
| 6 |
-
0.4733810424804687,Caduceus 7M,cattle,intron
|
| 7 |
-
0.4315277338027954,Evo2 1B,cattle,intron
|
| 8 |
-
0.5455867648124695,NTv3 8M (pre),cattle,intron
|
| 9 |
-
0.5453664064407349,NTv3 100M (pre),cattle,intron
|
| 10 |
-
0.5628412365913391,NTv3 650M (pre),cattle,intron
|
| 11 |
-
0.5682631134986877,NTv3 650M (post),cattle,intron
|
| 12 |
-
0.3689357042312622,NTv2 500M,cattle,exon
|
| 13 |
-
0.3250860869884491,BPNet arch. 6M,cattle,exon
|
| 14 |
-
0.4674676060676574,Residual CNN 44M,cattle,exon
|
| 15 |
-
0.2207767516374588,HyenaDNA 7M,cattle,exon
|
| 16 |
-
0.4960922300815582,Caduceus 7M,cattle,exon
|
| 17 |
-
0.4969632029533386,Evo2 1B,cattle,exon
|
| 18 |
-
0.5432836413383484,NTv3 8M (pre),cattle,exon
|
| 19 |
-
0.5531933307647705,NTv3 100M (pre),cattle,exon
|
| 20 |
-
0.591151773929596,NTv3 650M (pre),cattle,exon
|
| 21 |
-
0.6253225207328796,NTv3 650M (post),cattle,exon
|
| 22 |
-
0.118808165192604,NTv2 500M,cattle,splice acceptor
|
| 23 |
-
0.4715546369552612,BPNet arch. 6M,cattle,splice acceptor
|
| 24 |
-
0.6620649099349976,Residual CNN 44M,cattle,splice acceptor
|
| 25 |
-
0.104436807334423,HyenaDNA 7M,cattle,splice acceptor
|
| 26 |
-
0.7064619660377502,Caduceus 7M,cattle,splice acceptor
|
| 27 |
-
0.2085049450397491,Evo2 1B,cattle,splice acceptor
|
| 28 |
-
0.7254849076271057,NTv3 8M (pre),cattle,splice acceptor
|
| 29 |
-
0.7404072880744934,NTv3 100M (pre),cattle,splice acceptor
|
| 30 |
-
0.7732946872711182,NTv3 650M (pre),cattle,splice acceptor
|
| 31 |
-
0.7679624557495117,NTv3 650M (post),cattle,splice acceptor
|
| 32 |
-
0.1412438601255417,NTv2 500M,cattle,start codon
|
| 33 |
-
0.1490814685821533,BPNet arch. 6M,cattle,start codon
|
| 34 |
-
0.3243320286273956,Residual CNN 44M,cattle,start codon
|
| 35 |
-
0.056509330868721,HyenaDNA 7M,cattle,start codon
|
| 36 |
-
0.3455557227134704,Caduceus 7M,cattle,start codon
|
| 37 |
-
0.1030694246292114,Evo2 1B,cattle,start codon
|
| 38 |
-
0.5275959968566895,NTv3 8M (pre),cattle,start codon
|
| 39 |
-
0.4962065815925598,NTv3 100M (pre),cattle,start codon
|
| 40 |
-
0.5591813921928406,NTv3 650M (pre),cattle,start codon
|
| 41 |
-
0.5492052435874939,NTv3 650M (post),cattle,start codon
|
| 42 |
-
0.
|
| 43 |
-
0.1015273928642273,BPNet arch. 6M,cattle,intron
|
| 44 |
-
0.3299930691719055,Residual CNN 44M,cattle,intron
|
| 45 |
-
0.3826011121273041,HyenaDNA 7M,cattle,intron
|
| 46 |
-
0.5564854741096497,Caduceus 7M,cattle,intron
|
| 47 |
-
0.
|
| 48 |
-
0.
|
| 49 |
-
0.
|
| 50 |
-
0.
|
| 51 |
-
0.
|
| 52 |
-
0.
|
| 53 |
-
0.
|
| 54 |
-
0.
|
| 55 |
-
0.
|
| 56 |
-
0.
|
| 57 |
-
0.
|
| 58 |
-
0.
|
| 59 |
-
0.
|
| 60 |
-
0.
|
| 61 |
-
0.
|
| 62 |
-
0.
|
| 63 |
-
0.
|
| 64 |
-
0.
|
| 65 |
-
0.
|
| 66 |
-
0.
|
| 67 |
-
0.
|
| 68 |
-
0.
|
| 69 |
-
0.
|
| 70 |
-
0.
|
| 71 |
-
0.
|
| 72 |
-
0.
|
| 73 |
-
0.
|
| 74 |
-
0.
|
| 75 |
-
0.
|
| 76 |
-
0.
|
| 77 |
-
0.
|
| 78 |
-
0.
|
| 79 |
-
0.
|
| 80 |
-
0.
|
| 81 |
-
0.
|
| 82 |
-
0.
|
| 83 |
-
0.
|
| 84 |
-
0.
|
| 85 |
-
0.
|
| 86 |
-
0.
|
| 87 |
-
0.
|
| 88 |
-
0.
|
| 89 |
-
0.
|
| 90 |
-
0.
|
| 91 |
-
0.
|
| 92 |
-
0.
|
| 93 |
-
0.
|
| 94 |
-
0.
|
| 95 |
-
0.
|
| 96 |
-
0.
|
| 97 |
-
0.
|
| 98 |
-
0.
|
| 99 |
-
0.
|
| 100 |
-
0.
|
| 101 |
-
0.
|
| 102 |
-
0.
|
| 103 |
-
0.
|
| 104 |
-
0.
|
| 105 |
-
0.
|
| 106 |
-
0.
|
| 107 |
-
0.
|
| 108 |
-
0.
|
| 109 |
-
0.
|
| 110 |
-
0.
|
| 111 |
-
0.
|
| 112 |
-
0.
|
| 113 |
-
0.
|
| 114 |
-
0.
|
| 115 |
-
0.
|
| 116 |
-
0.
|
| 117 |
-
0.
|
| 118 |
-
0.
|
| 119 |
-
0.
|
| 120 |
-
0.
|
| 121 |
-
0.
|
| 122 |
-
0.
|
| 123 |
-
0.
|
| 124 |
-
0.
|
| 125 |
-
0.
|
| 126 |
-
0.
|
| 127 |
-
0.
|
| 128 |
-
0.
|
| 129 |
-
0.
|
| 130 |
-
0.
|
| 131 |
-
0.
|
| 132 |
-
0.
|
| 133 |
-
0.
|
| 134 |
-
0.
|
| 135 |
-
0.
|
| 136 |
-
0.
|
| 137 |
-
0.
|
| 138 |
-
0.
|
| 139 |
-
0.
|
| 140 |
-
0.
|
| 141 |
-
0.
|
| 142 |
-
0.
|
| 143 |
-
0.
|
| 144 |
-
0.
|
| 145 |
-
0.
|
| 146 |
-
0.
|
| 147 |
-
0.
|
| 148 |
-
0.
|
| 149 |
-
0.
|
| 150 |
-
0.
|
| 151 |
-
0.
|
| 152 |
-
0.
|
| 153 |
-
0.
|
| 154 |
-
0.
|
| 155 |
-
0.
|
| 156 |
-
0.
|
| 157 |
-
0.
|
| 158 |
-
0.
|
| 159 |
-
0.
|
| 160 |
-
0.
|
| 161 |
-
0.
|
| 162 |
-
0.
|
| 163 |
-
0.
|
| 164 |
-
0.
|
| 165 |
-
0.
|
| 166 |
-
0.
|
| 167 |
-
0.
|
| 168 |
-
0.
|
| 169 |
-
0.
|
| 170 |
-
0.
|
| 171 |
-
0.
|
| 172 |
-
0.
|
| 173 |
-
0.
|
| 174 |
-
0.
|
| 175 |
-
0.
|
| 176 |
-
0.
|
| 177 |
-
0.
|
| 178 |
-
0.
|
| 179 |
-
0.
|
| 180 |
-
0.
|
| 181 |
-
0.
|
| 182 |
-
0.
|
| 183 |
-
0.
|
| 184 |
-
0.
|
| 185 |
-
0.
|
| 186 |
-
0.
|
| 187 |
-
0.
|
| 188 |
-
0.
|
| 189 |
-
0.
|
| 190 |
-
0.
|
| 191 |
-
0.
|
| 192 |
-
0.
|
| 193 |
-
0.
|
| 194 |
-
0.
|
| 195 |
-
0.
|
| 196 |
-
0.
|
| 197 |
-
0.
|
| 198 |
-
0.
|
| 199 |
-
0.
|
| 200 |
-
0.
|
| 201 |
-
0.
|
| 202 |
-
0.
|
| 203 |
-
0.
|
| 204 |
-
0.
|
| 205 |
-
0.
|
| 206 |
-
0.
|
| 207 |
-
0.
|
| 208 |
-
0.
|
| 209 |
-
0.
|
| 210 |
-
0.
|
| 211 |
-
0.
|
| 212 |
-
0.
|
| 213 |
-
0.
|
| 214 |
-
0.
|
| 215 |
-
0.
|
| 216 |
-
0.
|
| 217 |
-
0.
|
| 218 |
-
0.
|
| 219 |
-
0.
|
| 220 |
-
0.
|
| 221 |
-
0.
|
| 222 |
-
0.
|
| 223 |
-
0.
|
| 224 |
-
0.
|
| 225 |
-
0.
|
| 226 |
-
0.
|
| 227 |
-
0.
|
| 228 |
-
0.
|
| 229 |
-
0.
|
| 230 |
-
0.
|
| 231 |
-
0.
|
| 232 |
-
0.
|
| 233 |
-
0.
|
| 234 |
-
0.
|
| 235 |
-
0.
|
| 236 |
-
0.
|
| 237 |
-
0.
|
| 238 |
-
0.
|
| 239 |
-
0.
|
| 240 |
-
0.
|
| 241 |
-
0.
|
| 242 |
-
0.
|
| 243 |
-
0.
|
| 244 |
-
0.
|
| 245 |
-
0.
|
| 246 |
-
0.
|
| 247 |
-
0.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
MCC,model_name,running_time_hours,species,datasets
|
| 2 |
+
0.334637850522995,NTv2 500M,88.0,cattle,intron
|
| 3 |
+
0.1238768473267555,BPNet arch. 6M,4.0,cattle,intron
|
| 4 |
+
0.383470207452774,Residual CNN 44M,19.0,cattle,intron
|
| 5 |
+
0.3828243613243103,HyenaDNA 7M,23.0,cattle,intron
|
| 6 |
+
0.4733810424804687,Caduceus 7M,32.0,cattle,intron
|
| 7 |
+
0.4315277338027954,Evo2 1B,43.0,cattle,intron
|
| 8 |
+
0.5455867648124695,NTv3 8M (pre),1.0,cattle,intron
|
| 9 |
+
0.5453664064407349,NTv3 100M (pre),2.0,cattle,intron
|
| 10 |
+
0.5628412365913391,NTv3 650M (pre),5.0,cattle,intron
|
| 11 |
+
0.5682631134986877,NTv3 650M (post),7.0,cattle,intron
|
| 12 |
+
0.3689357042312622,NTv2 500M,87.0,cattle,exon
|
| 13 |
+
0.3250860869884491,BPNet arch. 6M,4.0,cattle,exon
|
| 14 |
+
0.4674676060676574,Residual CNN 44M,19.0,cattle,exon
|
| 15 |
+
0.2207767516374588,HyenaDNA 7M,21.0,cattle,exon
|
| 16 |
+
0.4960922300815582,Caduceus 7M,32.0,cattle,exon
|
| 17 |
+
0.4969632029533386,Evo2 1B,44.0,cattle,exon
|
| 18 |
+
0.5432836413383484,NTv3 8M (pre),1.0,cattle,exon
|
| 19 |
+
0.5531933307647705,NTv3 100M (pre),2.0,cattle,exon
|
| 20 |
+
0.591151773929596,NTv3 650M (pre),5.0,cattle,exon
|
| 21 |
+
0.6253225207328796,NTv3 650M (post),7.0,cattle,exon
|
| 22 |
+
0.118808165192604,NTv2 500M,86.0,cattle,splice acceptor
|
| 23 |
+
0.4715546369552612,BPNet arch. 6M,4.0,cattle,splice acceptor
|
| 24 |
+
0.6620649099349976,Residual CNN 44M,19.0,cattle,splice acceptor
|
| 25 |
+
0.104436807334423,HyenaDNA 7M,22.0,cattle,splice acceptor
|
| 26 |
+
0.7064619660377502,Caduceus 7M,30.0,cattle,splice acceptor
|
| 27 |
+
0.2085049450397491,Evo2 1B,43.0,cattle,splice acceptor
|
| 28 |
+
0.7254849076271057,NTv3 8M (pre),1.0,cattle,splice acceptor
|
| 29 |
+
0.7404072880744934,NTv3 100M (pre),2.0,cattle,splice acceptor
|
| 30 |
+
0.7732946872711182,NTv3 650M (pre),5.0,cattle,splice acceptor
|
| 31 |
+
0.7679624557495117,NTv3 650M (post),7.0,cattle,splice acceptor
|
| 32 |
+
0.1412438601255417,NTv2 500M,88.0,cattle,start codon
|
| 33 |
+
0.1490814685821533,BPNet arch. 6M,4.0,cattle,start codon
|
| 34 |
+
0.3243320286273956,Residual CNN 44M,19.0,cattle,start codon
|
| 35 |
+
0.056509330868721,HyenaDNA 7M,23.0,cattle,start codon
|
| 36 |
+
0.3455557227134704,Caduceus 7M,33.0,cattle,start codon
|
| 37 |
+
0.1030694246292114,Evo2 1B,43.0,cattle,start codon
|
| 38 |
+
0.5275959968566895,NTv3 8M (pre),1.0,cattle,start codon
|
| 39 |
+
0.4962065815925598,NTv3 100M (pre),2.0,cattle,start codon
|
| 40 |
+
0.5591813921928406,NTv3 650M (pre),5.0,cattle,start codon
|
| 41 |
+
0.5492052435874939,NTv3 650M (post),7.0,cattle,start codon
|
| 42 |
+
0.0383123345673084,NTv2 500M,90.0,cattle,intron
|
| 43 |
+
0.1015273928642273,BPNet arch. 6M,7.0,cattle,intron
|
| 44 |
+
0.3299930691719055,Residual CNN 44M,23.0,cattle,intron
|
| 45 |
+
0.3826011121273041,HyenaDNA 7M,20.0,cattle,intron
|
| 46 |
+
0.5564854741096497,Caduceus 7M,36.0,cattle,intron
|
| 47 |
+
0.5645747780799866,NTv3 8M (pre),2.0,cattle,intron
|
| 48 |
+
0.5765650272369385,NTv3 100M (pre),2.0,cattle,intron
|
| 49 |
+
0.6140890121459961,NTv3 650M (pre),7.0,cattle,intron
|
| 50 |
+
0.6709504723548889,NTv3 650M (post),10.0,cattle,intron
|
| 51 |
+
0.3665516376495361,NTv2 500M,88.0,cattle,exon
|
| 52 |
+
0.323502242565155,BPNet arch. 6M,7.0,cattle,exon
|
| 53 |
+
0.519285261631012,Residual CNN 44M,23.0,cattle,exon
|
| 54 |
+
0.1038060635328292,HyenaDNA 7M,21.0,cattle,splice acceptor
|
| 55 |
+
0.5072187781333923,Caduceus 7M,39.0,cattle,exon
|
| 56 |
+
0.593974232673645,NTv3 8M (pre),1.0,cattle,exon
|
| 57 |
+
0.6014777421951294,NTv3 100M (pre),2.0,cattle,exon
|
| 58 |
+
0.6433462500572205,NTv3 650M (pre),7.0,cattle,exon
|
| 59 |
+
0.6648420095443726,NTv3 650M (post),9.0,cattle,exon
|
| 60 |
+
0.0937248468399047,NTv2 500M,89.0,cattle,splice acceptor
|
| 61 |
+
0.4435675740242004,BPNet arch. 6M,7.0,cattle,splice acceptor
|
| 62 |
+
0.6590774655342102,Residual CNN 44M,23.0,cattle,splice acceptor
|
| 63 |
+
0.1038060635328292,HyenaDNA 7M,21.0,cattle,splice acceptor
|
| 64 |
+
0.6937510371208191,Caduceus 7M,38.0,cattle,splice acceptor
|
| 65 |
+
0.7248824238777161,NTv3 8M (pre),1.0,cattle,splice acceptor
|
| 66 |
+
0.7345820069313049,NTv3 100M (pre),2.0,cattle,splice acceptor
|
| 67 |
+
0.7439091801643372,NTv3 650M (pre),7.0,cattle,splice acceptor
|
| 68 |
+
0.758992075920105,NTv3 650M (post),9.0,cattle,splice acceptor
|
| 69 |
+
0.1127461418509483,NTv2 500M,88.0,cattle,start codon
|
| 70 |
+
0.0901669710874557,BPNet arch. 6M,7.0,cattle,start codon
|
| 71 |
+
0.3548502624034881,Residual CNN 44M,23.0,cattle,start codon
|
| 72 |
+
0.0545537285506725,HyenaDNA 7M,24.0,cattle,start codon
|
| 73 |
+
0.4038819670677185,Caduceus 7M,38.0,cattle,start codon
|
| 74 |
+
0.5045616030693054,NTv3 8M (pre),1.0,cattle,start codon
|
| 75 |
+
0.4762806594371795,NTv3 100M (pre),3.0,cattle,start codon
|
| 76 |
+
0.5610686540603638,NTv3 650M (pre),7.0,cattle,start codon
|
| 77 |
+
0.5782408118247986,NTv3 650M (post),9.0,cattle,start codon
|
| 78 |
+
0.1547228246927261,NTv2 500M,85.0,cattle,intron
|
| 79 |
+
0.0639578104019165,BPNet arch. 6M,2.0,cattle,start codon
|
| 80 |
+
0.3266464471817016,Residual CNN 44M,23.0,cattle,intron
|
| 81 |
+
0.4240079522132873,HyenaDNA 7M,23.0,cattle,intron
|
| 82 |
+
0.4552704095840454,Caduceus 7M,37.0,cattle,intron
|
| 83 |
+
0.5063548684120178,NTv3 8M (pre),1.0,cattle,intron
|
| 84 |
+
0.5619235038757324,NTv3 100M (pre),3.0,cattle,intron
|
| 85 |
+
0.531277596950531,NTv3 650M (pre),7.0,cattle,intron
|
| 86 |
+
0.6205132603645325,NTv3 650M (post),9.0,cattle,intron
|
| 87 |
+
0.3413117229938507,NTv2 500M,87.0,cattle,exon
|
| 88 |
+
0.1383400112390518,BPNet arch. 6M,6.0,cattle,intron
|
| 89 |
+
0.4856111407279968,Residual CNN 44M,23.0,cattle,exon
|
| 90 |
+
0.2246854901313781,HyenaDNA 7M,70.0,cattle,exon
|
| 91 |
+
0.5370016098022461,Caduceus 7M,35.0,cattle,exon
|
| 92 |
+
0.5721412897109985,NTv3 8M (pre),2.0,cattle,exon
|
| 93 |
+
0.5819903612136841,NTv3 100M (pre),2.0,cattle,exon
|
| 94 |
+
0.6183731555938721,NTv3 650M (pre),7.0,cattle,exon
|
| 95 |
+
0.6233119964599609,NTv3 650M (post),9.0,cattle,exon
|
| 96 |
+
0.4220209121704101,BPNet arch. 6M,7.0,cattle,splice acceptor
|
| 97 |
+
0.689546525478363,Residual CNN 44M,23.0,cattle,splice acceptor
|
| 98 |
+
0.1121769621968269,HyenaDNA 7M,69.0,cattle,splice acceptor
|
| 99 |
+
0.7314619421958923,Caduceus 7M,37.0,cattle,splice acceptor
|
| 100 |
+
0.74350905418396,NTv3 8M (pre),2.0,cattle,splice acceptor
|
| 101 |
+
0.746654748916626,NTv3 100M (pre),2.0,cattle,splice acceptor
|
| 102 |
+
0.7714020609855652,NTv3 650M (pre),7.0,cattle,splice acceptor
|
| 103 |
+
0.7809271812438965,NTv3 650M (post),9.0,cattle,splice acceptor
|
| 104 |
+
0.0930091217160224,BPNet arch. 6M,6.0,cattle,start codon
|
| 105 |
+
0.423166275024414,Residual CNN 44M,23.0,cattle,start codon
|
| 106 |
+
0.1253955662250518,HyenaDNA 7M,72.0,cattle,start codon
|
| 107 |
+
0.33419930934906,Caduceus 7M,37.0,cattle,start codon
|
| 108 |
+
0.4639334082603454,NTv3 8M (pre),1.0,cattle,start codon
|
| 109 |
+
0.5102551579475403,NTv3 100M (pre),2.0,cattle,start codon
|
| 110 |
+
0.5866840481758118,NTv3 650M (pre),7.0,cattle,start codon
|
| 111 |
+
0.588148832321167,NTv3 650M (post),9.0,cattle,start codon
|
| 112 |
+
0.4777896404266357,NTv2 500M,33.0,tomato,intron
|
| 113 |
+
0.3216900527477264,BPNet arch. 6M,1.0,tomato,intron
|
| 114 |
+
0.46840900182724,Residual CNN 44M,6.0,tomato,intron
|
| 115 |
+
0.5251263380050659,PlantCAD2 88M,38.0,tomato,intron
|
| 116 |
+
0.747674286365509,Evo2 1B,13.0,tomato,intron
|
| 117 |
+
0.6858112812042236,NTv3 8M (pre),0.0,tomato,intron
|
| 118 |
+
0.7038365006446838,NTv3 100M (pre),0.0,tomato,intron
|
| 119 |
+
0.7481895685195923,NTv3 650M (pre),1.0,tomato,intron
|
| 120 |
+
0.7458349466323853,NTv3 650M (post),2.0,tomato,intron
|
| 121 |
+
0.6147475838661194,NTv2 500M,33.0,tomato,exon
|
| 122 |
+
0.4551227986812591,BPNet arch. 6M,1.0,tomato,exon
|
| 123 |
+
0.5068296194076538,Residual CNN 44M,6.0,tomato,exon
|
| 124 |
+
0.7256030440330505,PlantCAD2 88M,37.0,tomato,exon
|
| 125 |
+
0.7006198763847351,Evo2 1B,14.0,tomato,exon
|
| 126 |
+
0.7537696361541748,NTv3 8M (pre),0.0,tomato,exon
|
| 127 |
+
0.7484462857246399,NTv3 100M (pre),0.0,tomato,exon
|
| 128 |
+
0.764011561870575,NTv3 650M (pre),1.0,tomato,exon
|
| 129 |
+
0.7750575542449951,NTv3 650M (post),2.0,tomato,exon
|
| 130 |
+
0.1691933125257492,NTv2 500M,33.0,tomato,splice acceptor
|
| 131 |
+
0.125656172633171,BPNet arch. 6M,1.0,tomato,splice acceptor
|
| 132 |
+
0.4359458982944488,Residual CNN 44M,6.0,tomato,splice acceptor
|
| 133 |
+
0.744257926940918,PlantCAD2 88M,38.0,tomato,splice acceptor
|
| 134 |
+
0.3791649639606476,Evo2 1B,13.0,tomato,splice acceptor
|
| 135 |
+
0.6623862385749817,NTv3 8M (pre),0.0,tomato,splice acceptor
|
| 136 |
+
0.6843105554580688,NTv3 100M (pre),0.0,tomato,splice acceptor
|
| 137 |
+
0.7641868591308594,NTv3 650M (pre),1.0,tomato,splice acceptor
|
| 138 |
+
0.7584431767463684,NTv3 650M (post),2.0,tomato,splice acceptor
|
| 139 |
+
0.132934883236885,NTv2 500M,34.0,tomato,start codon
|
| 140 |
+
0.0,BPNet arch. 6M,1.0,tomato,start codon
|
| 141 |
+
0.088478960096836,Residual CNN 44M,6.0,tomato,start codon
|
| 142 |
+
0.2019559442996978,PlantCAD2 88M,38.0,tomato,start codon
|
| 143 |
+
0.1622217148542404,Evo2 1B,13.0,tomato,start codon
|
| 144 |
+
0.2966536581516266,NTv3 8M (pre),0.0,tomato,start codon
|
| 145 |
+
0.3968957066535949,NTv3 100M (pre),0.0,tomato,start codon
|
| 146 |
+
0.4830105900764465,NTv3 650M (pre),1.0,tomato,start codon
|
| 147 |
+
0.5007501244544983,NTv3 650M (post),2.0,tomato,start codon
|
| 148 |
+
0.6770024299621582,NTv2 500M,33.0,tomato,intron
|
| 149 |
+
0.2927957773208618,BPNet arch. 6M,2.0,tomato,intron
|
| 150 |
+
0.1383400112390518,Residual CNN 44M,6.0,tomato,intron
|
| 151 |
+
0.7252154350280762,PlantCAD2 88M,46.0,tomato,intron
|
| 152 |
+
0.712181031703949,NTv3 8M (pre),1.0,tomato,intron
|
| 153 |
+
0.7515084147453308,NTv3 100M (pre),1.0,tomato,intron
|
| 154 |
+
0.7400797009468079,NTv3 650M (pre),3.0,tomato,intron
|
| 155 |
+
0.7532288432121277,NTv3 650M (post),4.0,tomato,intron
|
| 156 |
+
0.5751976370811462,NTv2 500M,33.0,tomato,exon
|
| 157 |
+
0.3057552278041839,BPNet arch. 6M,3.0,tomato,exon
|
| 158 |
+
0.7699167728424072,PlantCAD2 88M,50.0,tomato,exon
|
| 159 |
+
0.748009443283081,NTv3 8M (pre),1.0,tomato,exon
|
| 160 |
+
0.7629056572914124,NTv3 100M (pre),1.0,tomato,exon
|
| 161 |
+
0.7755228877067566,NTv3 650M (pre),3.0,tomato,exon
|
| 162 |
+
0.782516598701477,NTv3 650M (post),4.0,tomato,exon
|
| 163 |
+
0.168193981051445,NTv2 500M,33.0,tomato,splice acceptor
|
| 164 |
+
0.0,BPNet arch. 6M,2.0,tomato,splice acceptor
|
| 165 |
+
0.4833243191242218,Residual CNN 44M,8.0,tomato,splice acceptor
|
| 166 |
+
0.7335307598114014,PlantCAD2 88M,46.0,tomato,splice acceptor
|
| 167 |
+
0.6908777952194214,NTv3 8M (pre),1.0,tomato,splice acceptor
|
| 168 |
+
0.7348777055740356,NTv3 100M (pre),1.0,tomato,splice acceptor
|
| 169 |
+
0.7484620809555054,NTv3 650M (pre),3.0,tomato,splice acceptor
|
| 170 |
+
0.7539154291152954,NTv3 650M (post),4.0,tomato,splice acceptor
|
| 171 |
+
0.1586925536394119,NTv2 500M,33.0,tomato,start codon
|
| 172 |
+
0.0,BPNet arch. 6M,2.0,tomato,start codon
|
| 173 |
+
0.1107296794652938,Residual CNN 44M,8.0,tomato,start codon
|
| 174 |
+
0.3756755590438843,PlantCAD2 88M,48.0,tomato,start codon
|
| 175 |
+
0.4113904237747192,NTv3 8M (pre),1.0,tomato,start codon
|
| 176 |
+
0.4541433155536651,NTv3 100M (pre),1.0,tomato,start codon
|
| 177 |
+
0.5002310872077942,NTv3 650M (pre),3.0,tomato,start codon
|
| 178 |
+
0.5470007658004761,NTv3 650M (post),4.0,tomato,start codon
|
| 179 |
+
0.6712294220924377,NTv2 500M,33.0,tomato,intron
|
| 180 |
+
0.3502058088779449,BPNet arch. 6M,2.0,tomato,intron
|
| 181 |
+
0.5514466166496277,Residual CNN 44M,8.0,tomato,intron
|
| 182 |
+
0.722817599773407,PlantCAD2 88M,88.0,tomato,intron
|
| 183 |
+
0.7013162970542908,NTv3 8M (pre),1.0,tomato,intron
|
| 184 |
+
0.747364342212677,NTv3 100M (pre),1.0,tomato,intron
|
| 185 |
+
0.752423107624054,NTv3 650M (pre),3.0,tomato,intron
|
| 186 |
+
0.7750566005706787,NTv3 650M (post),4.0,tomato,intron
|
| 187 |
+
0.6022632718086243,NTv2 500M,33.0,tomato,exon
|
| 188 |
+
0.3020758032798767,BPNet arch. 6M,2.0,tomato,exon
|
| 189 |
+
0.4746756553649902,Residual CNN 44M,8.0,tomato,exon
|
| 190 |
+
0.7354215979576111,PlantCAD2 88M,45.0,tomato,exon
|
| 191 |
+
0.7157281041145325,NTv3 8M (pre),1.0,tomato,exon
|
| 192 |
+
0.7326820492744446,NTv3 100M (pre),1.0,tomato,exon
|
| 193 |
+
0.7308483123779297,NTv3 650M (pre),3.0,tomato,exon
|
| 194 |
+
0.7417197823524475,NTv3 650M (post),4.0,tomato,exon
|
| 195 |
+
0.1558358669281005,NTv2 500M,33.0,tomato,splice acceptor
|
| 196 |
+
0.0,BPNet arch. 6M,2.0,tomato,splice acceptor
|
| 197 |
+
0.3391502797603607,Residual CNN 44M,8.0,tomato,splice acceptor
|
| 198 |
+
0.7305923700332642,PlantCAD2 88M,85.0,tomato,splice acceptor
|
| 199 |
+
0.6977006196975708,NTv3 8M (pre),1.0,tomato,splice acceptor
|
| 200 |
+
0.6770275831222534,NTv3 100M (pre),1.0,tomato,splice acceptor
|
| 201 |
+
0.6770390272140503,NTv3 650M (pre),3.0,tomato,splice acceptor
|
| 202 |
+
0.7287323474884033,NTv3 650M (post),4.0,tomato,splice acceptor
|
| 203 |
+
0.1887903958559036,NTv2 500M,33.0,tomato,start codon
|
| 204 |
+
0.0639578104019165,BPNet arch. 6M,2.0,tomato,start codon
|
| 205 |
+
0.0914037525653839,Residual CNN 44M,8.0,tomato,start codon
|
| 206 |
+
0.4881043434143066,PlantCAD2 88M,88.0,tomato,start codon
|
| 207 |
+
0.4309621453285217,NTv3 8M (pre),1.0,tomato,start codon
|
| 208 |
+
0.4028272926807403,NTv3 100M (pre),1.0,tomato,start codon
|
| 209 |
+
0.4060510396957397,NTv3 650M (pre),3.0,tomato,start codon
|
| 210 |
+
0.472331553697586,NTv3 650M (post),4.0,tomato,start codon
|
| 211 |
+
0.1995969861745834,NTv2 500M,72.0,human,intron
|
| 212 |
+
0.0296161584556102,BPNet arch. 6M,3.0,human,intron
|
| 213 |
+
0.2347834408283233,Residual CNN 44M,15.0,human,intron
|
| 214 |
+
0.33451908826828,HyenaDNA 7M,17.0,human,intron
|
| 215 |
+
0.4144788980484009,Caduceus 7M,27.0,human,intron
|
| 216 |
+
0.0,Evo2 1B,34.0,human,intron
|
| 217 |
+
0.4695742726325989,NTv3 8M (pre),1.0,human,intron
|
| 218 |
+
0.475054919719696,NTv3 100M (pre),2.0,human,intron
|
| 219 |
+
0.5504136681556702,NTv3 650M (pre),5.0,human,intron
|
| 220 |
+
0.5643875002861023,NTv3 650M (post),6.0,human,intron
|
| 221 |
+
0.1995969861745834,NTv2 500M,72.0,human,intron
|
| 222 |
+
0.2706590592861175,BPNet arch. 6M,3.0,human,exon
|
| 223 |
+
0.2678671479225158,Residual CNN 44M,15.0,human,exon
|
| 224 |
+
0.179698497056961,HyenaDNA 7M,19.0,human,exon
|
| 225 |
+
0.5098947286605835,Caduceus 7M,26.0,human,exon
|
| 226 |
+
0.4510694444179535,Evo2 1B,34.0,human,exon
|
| 227 |
+
0.6089931726455688,NTv3 8M (pre),1.0,human,exon
|
| 228 |
+
0.6492856740951538,NTv3 100M (pre),2.0,human,exon
|
| 229 |
+
0.6975767016410828,NTv3 650M (pre),5.0,human,exon
|
| 230 |
+
0.6822624206542969,NTv3 650M (post),8.0,human,exon
|
| 231 |
+
0.1493269056081771,NTv2 500M,73.0,human,splice acceptor
|
| 232 |
+
0.3807527124881744,BPNet arch. 6M,3.0,human,splice acceptor
|
| 233 |
+
0.6632664203643799,Residual CNN 44M,15.0,human,splice acceptor
|
| 234 |
+
0.1002769619226455,HyenaDNA 7M,17.0,human,splice acceptor
|
| 235 |
+
0.7357247471809387,Caduceus 7M,24.0,human,splice acceptor
|
| 236 |
+
0.1821079105138778,Evo2 1B,34.0,human,splice acceptor
|
| 237 |
+
0.7726271748542786,NTv3 8M (pre),1.0,human,splice acceptor
|
| 238 |
+
0.77947598695755,NTv3 100M (pre),2.0,human,splice acceptor
|
| 239 |
+
0.8028115034103394,NTv3 650M (pre),5.0,human,splice acceptor
|
| 240 |
+
0.7979229092597961,NTv3 650M (post),7.0,human,splice acceptor
|
| 241 |
+
0.139576569199562,NTv2 500M,73.0,human,start codon
|
| 242 |
+
0.1334401220083236,BPNet arch. 6M,3.0,human,start codon
|
| 243 |
+
0.3876807987689972,Residual CNN 44M,15.0,human,start codon
|
| 244 |
+
0.1003016158938407,HyenaDNA 7M,18.0,human,start codon
|
| 245 |
+
0.3958532512187958,Caduceus 7M,24.0,human,start codon
|
| 246 |
+
0.1399599611759185,Evo2 1B,34.0,human,start codon
|
| 247 |
+
0.540923535823822,NTv3 8M (pre),1.0,human,start codon
|
| 248 |
+
0.5464004278182983,NTv3 100M (pre),2.0,human,start codon
|
| 249 |
+
0.6803378462791443,NTv3 650M (pre),5.0,human,start codon
|
| 250 |
+
0.7310947179794312,NTv3 650M (post),7.0,human,start codon
|
| 251 |
+
0.0814515128731727,NTv2 500M,72.0,human,intron
|
| 252 |
+
0.0172978900372982,BPNet arch. 6M,5.0,human,intron
|
| 253 |
+
0.2740728259086609,Residual CNN 44M,19.0,human,intron
|
| 254 |
+
0.3312098085880279,HyenaDNA 7M,21.0,human,intron
|
| 255 |
+
0.5108950138092041,Caduceus 7M,33.0,human,intron
|
| 256 |
+
0.5034915208816528,NTv3 8M (pre),1.0,human,intron
|
| 257 |
+
0.5154411792755127,NTv3 100M (pre),2.0,human,intron
|
| 258 |
+
0.5814740061759949,NTv3 650M (pre),6.0,human,intron
|
| 259 |
+
0.5920455455780029,NTv3 650M (post),8.0,human,intron
|
| 260 |
+
0.3505669236183166,NTv2 500M,72.0,human,exon
|
| 261 |
+
0.2252149283885955,BPNet arch. 6M,5.0,human,exon
|
| 262 |
+
0.4010578095912933,Residual CNN 44M,18.0,human,exon
|
| 263 |
+
0.1851459741592407,HyenaDNA 7M,18.0,human,exon
|
| 264 |
+
0.4599409103393554,Caduceus 7M,33.0,human,exon
|
| 265 |
+
0.5931490063667297,NTv3 8M (pre),1.0,human,exon
|
| 266 |
+
0.6058318018913269,NTv3 100M (pre),2.0,human,exon
|
| 267 |
+
0.6738048791885376,NTv3 650M (pre),6.0,human,exon
|
| 268 |
+
0.6738048791885376,NTv3 650M (post),6.0,human,exon
|
| 269 |
+
0.1533636748790741,NTv2 500M,72.0,human,splice acceptor
|
| 270 |
+
0.3751010596752167,BPNet arch. 6M,5.0,human,splice acceptor
|
| 271 |
+
0.681228756904602,Residual CNN 44M,19.0,human,splice acceptor
|
| 272 |
+
0.0252278540283441,HyenaDNA 7M,22.0,human,splice acceptor
|
| 273 |
+
0.7485092878341675,Caduceus 7M,35.0,human,splice acceptor
|
| 274 |
+
0.7772909998893738,NTv3 8M (pre),1.0,human,splice acceptor
|
| 275 |
+
0.794090747833252,NTv3 100M (pre),2.0,human,splice acceptor
|
| 276 |
+
0.8239933252334595,NTv3 650M (pre),6.0,human,splice acceptor
|
| 277 |
+
0.804115891456604,NTv3 650M (post),8.0,human,splice acceptor
|
| 278 |
+
0.0851806029677391,NTv2 500M,72.0,human,start codon
|
| 279 |
+
0.0,BPNet arch. 6M,5.0,human,start codon
|
| 280 |
+
0.3292546272277832,Residual CNN 44M,19.0,human,start codon
|
| 281 |
+
0.0647941380739212,HyenaDNA 7M,20.0,human,start codon
|
| 282 |
+
0.4505241215229034,Caduceus 7M,33.0,human,start codon
|
| 283 |
+
0.60422682762146,NTv3 8M (pre),1.0,human,start codon
|
| 284 |
+
0.6015576124191284,NTv3 100M (pre),2.0,human,start codon
|
| 285 |
+
0.6452956795692444,NTv3 650M (pre),6.0,human,start codon
|
| 286 |
+
0.6761345267295837,NTv3 650M (post),8.0,human,start codon
|
| 287 |
+
0.0558800511062145,NTv2 500M,70.0,human,intron
|
| 288 |
+
0.0185965970158576,BPNet arch. 6M,5.0,human,intron
|
| 289 |
+
0.2623045742511749,Residual CNN 44M,18.0,human,intron
|
| 290 |
+
0.3633092641830444,HyenaDNA 7M,68.0,human,intron
|
| 291 |
+
0.4261827170848846,Caduceus 7M,29.0,human,intron
|
| 292 |
+
0.4804849028587341,NTv3 8M (pre),1.0,human,intron
|
| 293 |
+
0.482195496559143,NTv3 100M (pre),2.0,human,intron
|
| 294 |
+
0.5425574779510498,NTv3 650M (pre),6.0,human,intron
|
| 295 |
+
0.5443048477172852,NTv3 650M (post),8.0,human,intron
|
| 296 |
+
0.3958893716335296,NTv2 500M,71.0,human,exon
|
| 297 |
+
0.2360571771860122,BPNet arch. 6M,5.0,human,exon
|
| 298 |
+
0.2360571771860122,Residual CNN 44M,5.0,human,exon
|
| 299 |
+
0.1936572045087814,HyenaDNA 7M,68.0,human,exon
|
| 300 |
+
0.5046994090080261,Caduceus 7M,29.0,human,exon
|
| 301 |
+
0.6339762210845947,NTv3 8M (pre),1.0,human,exon
|
| 302 |
+
0.6433913111686707,NTv3 100M (pre),2.0,human,exon
|
| 303 |
+
0.6518793702125549,NTv3 650M (pre),6.0,human,exon
|
| 304 |
+
0.6812491416931152,NTv3 650M (post),8.0,human,exon
|
| 305 |
+
0.1248077526688575,NTv2 500M,70.0,human,splice acceptor
|
| 306 |
+
0.3842235207557678,BPNet arch. 6M,5.0,human,splice acceptor
|
| 307 |
+
0.6810190081596375,Residual CNN 44M,18.0,human,splice acceptor
|
| 308 |
+
0.0527583621442317,HyenaDNA 7M,17.0,human,splice acceptor
|
| 309 |
+
0.7072214484214783,Caduceus 7M,29.0,human,splice acceptor
|
| 310 |
+
0.7796080708503723,NTv3 8M (pre),1.0,human,splice acceptor
|
| 311 |
+
0.7596970200538635,NTv3 100M (pre),2.0,human,splice acceptor
|
| 312 |
+
0.7915040850639343,NTv3 650M (pre),6.0,human,splice acceptor
|
| 313 |
+
0.7957100868225098,NTv3 650M (post),8.0,human,splice acceptor
|
| 314 |
+
0.1267423331737518,NTv2 500M,70.0,human,start codon
|
| 315 |
+
0.1114460304379463,BPNet arch. 6M,5.0,human,start codon
|
| 316 |
+
0.3342535495758056,Residual CNN 44M,18.0,human,start codon
|
| 317 |
+
0.1215013489127159,HyenaDNA 7M,18.0,human,start codon
|
| 318 |
+
0.4082835018634796,Caduceus 7M,29.0,human,start codon
|
| 319 |
+
0.5167152881622314,NTv3 8M (pre),1.0,human,start codon
|
| 320 |
+
0.5340564250946045,NTv3 100M (pre),2.0,human,start codon
|
| 321 |
+
0.6148532032966614,NTv3 650M (pre),6.0,human,start codon
|
| 322 |
+
0.6582212448120117,NTv3 650M (post),8.0,human,start codon
|
data/bigwig_dataset.csv
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
src/streamlit_app.py
CHANGED
|
@@ -6,6 +6,7 @@ import streamlit as st
|
|
| 6 |
import plotly.express as px
|
| 7 |
from plotly.subplots import make_subplots
|
| 8 |
import plotly.graph_objects as go
|
|
|
|
| 9 |
|
| 10 |
# ---------------------------------------------------------------------
|
| 11 |
# Page config (must be the first Streamlit command)
|
|
@@ -68,6 +69,24 @@ MODEL_COLORS = {
|
|
| 68 |
"Caduceus 7M": COLORS["purple_2"]
|
| 69 |
}
|
| 70 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 71 |
MODEL_NAMES = list(MODEL_COLORS.keys())
|
| 72 |
|
| 73 |
PLANT_SPECIES = ["tomato", "rice", "maize", "arabidopsis"]
|
|
@@ -81,12 +100,25 @@ SPECIES_GROUPS = {
|
|
| 81 |
|
| 82 |
_LAST_UPDATED = "Dec 10, 2025"
|
| 83 |
_INTRO = """
|
| 84 |
-
Benchmark
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 88 |
|
| 89 |
-
These tasks measure the model's ability the generalize to unseen tracks, species and assay types.
|
| 90 |
"""
|
| 91 |
|
| 92 |
HERE = os.path.dirname(os.path.abspath(__file__)) # /app/src
|
|
@@ -111,6 +143,9 @@ def load_raw_data():
|
|
| 111 |
|
| 112 |
return pearson_df, mcc_df
|
| 113 |
|
|
|
|
|
|
|
|
|
|
| 114 |
|
| 115 |
@st.cache_data
|
| 116 |
def load_expanded_data():
|
|
@@ -129,6 +164,12 @@ def load_expanded_data():
|
|
| 129 |
we average their Score.
|
| 130 |
"""
|
| 131 |
pearson_df, mcc_df = load_raw_data()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 132 |
|
| 133 |
# --- Pearson correlations ---
|
| 134 |
# Expect columns: species, assay_type, datasets, model_name, pearson correlation
|
|
@@ -143,10 +184,14 @@ def load_expanded_data():
|
|
| 143 |
if "assay_type" in pearson_df.columns:
|
| 144 |
pearson_group_cols.append("assay_type")
|
| 145 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 146 |
pearson_df = (
|
| 147 |
pearson_df
|
| 148 |
-
.groupby(pearson_group_cols, as_index=False, dropna=False)
|
| 149 |
-
.
|
| 150 |
)
|
| 151 |
|
| 152 |
# --- MCC (bed tracks) ---
|
|
@@ -160,10 +205,14 @@ def load_expanded_data():
|
|
| 160 |
|
| 161 |
# Collapse duplicates with same (species, datasets, Model)
|
| 162 |
mcc_group_cols = ["species", "datasets", "Model"]
|
|
|
|
|
|
|
|
|
|
|
|
|
| 163 |
mcc_df = (
|
| 164 |
mcc_df
|
| 165 |
-
.groupby(mcc_group_cols, as_index=False, dropna=False)
|
| 166 |
-
.
|
| 167 |
)
|
| 168 |
|
| 169 |
# Optional sanity checks
|
|
@@ -255,7 +304,7 @@ def build_leaderboard(
|
|
| 255 |
)
|
| 256 |
|
| 257 |
if df.empty:
|
| 258 |
-
return pd.DataFrame(columns=["Model", "Num entries", "Mean score"])
|
| 259 |
|
| 260 |
agg = (
|
| 261 |
df.groupby("Model")["Score"]
|
|
@@ -269,15 +318,22 @@ def build_leaderboard(
|
|
| 269 |
df.groupby("Model")["Score"].count().reindex(agg["Model"]).values
|
| 270 |
)
|
| 271 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 272 |
agg = agg.sort_values("Mean score", ascending=False).reset_index(drop=True)
|
| 273 |
-
|
| 274 |
-
|
|
|
|
|
|
|
| 275 |
# Ensure the index starts with 1
|
| 276 |
agg.index += 1
|
| 277 |
|
| 278 |
return agg
|
| 279 |
|
| 280 |
|
|
|
|
| 281 |
def build_bar_df(
|
| 282 |
benchmark_name: str,
|
| 283 |
selected_species: List[str],
|
|
@@ -587,6 +643,39 @@ def plot_radar(
|
|
| 587 |
return fig
|
| 588 |
|
| 589 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 590 |
|
| 591 |
# ---------------------------------------------------------------------
|
| 592 |
# UI helpers
|
|
@@ -604,12 +693,9 @@ def sidebar_toggle(label: str, value: bool = False, key: str | None = None) -> b
|
|
| 604 |
# Fallback for older Streamlit versions
|
| 605 |
return st.sidebar.checkbox(label, value=value, key=key)
|
| 606 |
|
| 607 |
-
|
| 608 |
# ---------------------------------------------------------------------
|
| 609 |
# Streamlit UI
|
| 610 |
# ---------------------------------------------------------------------
|
| 611 |
-
|
| 612 |
-
|
| 613 |
def main():
|
| 614 |
st.title("🧬 NTv3 Benchmark")
|
| 615 |
st.markdown(_INTRO)
|
|
@@ -653,7 +739,6 @@ def main():
|
|
| 653 |
if not available_species:
|
| 654 |
st.sidebar.info(f"No {species_group.lower()} species available for this benchmark.")
|
| 655 |
|
| 656 |
-
|
| 657 |
# Assay toggles (Pearson only), based on filtered species
|
| 658 |
if cfg.get("has_assay_type", False):
|
| 659 |
st.sidebar.subheader("Assay types")
|
|
@@ -673,7 +758,6 @@ def main():
|
|
| 673 |
else:
|
| 674 |
selected_assays = []
|
| 675 |
|
| 676 |
-
|
| 677 |
# Bed track / dataset toggles (MCC only), based on species selection
|
| 678 |
selected_datasets: List[str] = []
|
| 679 |
if benchmark_name == "Genome Annotation":
|
|
@@ -707,8 +791,8 @@ def main():
|
|
| 707 |
col1, col2 = st.columns([1, 1])
|
| 708 |
|
| 709 |
with col1:
|
| 710 |
-
st.subheader("🏅 Leaderboard
|
| 711 |
-
st.write("\n")
|
| 712 |
st.write("\n")
|
| 713 |
st.write("\n")
|
| 714 |
if leaderboard_df.empty:
|
|
@@ -716,7 +800,6 @@ def main():
|
|
| 716 |
else:
|
| 717 |
st.dataframe(leaderboard_df, use_container_width=True)
|
| 718 |
|
| 719 |
-
|
| 720 |
with col2:
|
| 721 |
st.subheader("📈 Mean score per model")
|
| 722 |
if bar_df.empty:
|
|
@@ -724,7 +807,6 @@ def main():
|
|
| 724 |
else:
|
| 725 |
# Order models by performance (least -> most)
|
| 726 |
bar_df = bar_df.sort_values("Mean score", ascending=True)
|
| 727 |
-
|
| 728 |
model_order = bar_df["Model"].tolist()
|
| 729 |
|
| 730 |
fig = px.bar(
|
|
@@ -733,30 +815,28 @@ def main():
|
|
| 733 |
y="Mean score",
|
| 734 |
color="Model",
|
| 735 |
color_discrete_map=MODEL_COLORS,
|
| 736 |
-
category_orders={"Model": model_order},
|
| 737 |
)
|
| 738 |
fig.update_layout(
|
| 739 |
barmode="group",
|
| 740 |
-
height=
|
| 741 |
xaxis_title="",
|
| 742 |
-
yaxis_title="
|
| 743 |
plot_bgcolor="rgba(0,0,0,0)",
|
| 744 |
paper_bgcolor="rgba(0,0,0,0)",
|
| 745 |
bargap=0.08,
|
| 746 |
)
|
| 747 |
-
|
| 748 |
-
# Hide x-axis model names (same style as the panels)
|
| 749 |
fig.update_xaxes(showticklabels=False)
|
| 750 |
-
|
| 751 |
st.plotly_chart(fig, use_container_width=True)
|
| 752 |
|
| 753 |
-
|
| 754 |
# --- Breakdown plot: assay_type (Functional Tracks) OR datasets (Genome Annotation) ---
|
| 755 |
breakdown_df = build_category_model_df(
|
| 756 |
benchmark_name, selected_species, selected_assays, selected_models, selected_datasets
|
| 757 |
)
|
| 758 |
|
| 759 |
-
|
|
|
|
|
|
|
| 760 |
if breakdown_df.empty:
|
| 761 |
st.info("No data for the selected filters.")
|
| 762 |
else:
|
|
@@ -767,30 +847,13 @@ def main():
|
|
| 767 |
)
|
| 768 |
st.plotly_chart(fig_breakdown, use_container_width=True)
|
| 769 |
|
| 770 |
-
|
| 771 |
-
|
| 772 |
-
|
| 773 |
-
selected_species,
|
| 774 |
-
selected_assays,
|
| 775 |
-
selected_models,
|
| 776 |
-
selected_datasets,
|
| 777 |
-
)
|
| 778 |
-
|
| 779 |
-
if radar_df.empty:
|
| 780 |
-
st.info("No data for the selected filters.")
|
| 781 |
-
else:
|
| 782 |
-
fig_radar = plot_radar(
|
| 783 |
-
radar_df,
|
| 784 |
-
metric_label=cfg["metric_label"],
|
| 785 |
-
)
|
| 786 |
-
st.plotly_chart(fig_radar, use_container_width=True)
|
| 787 |
-
|
| 788 |
-
st.subheader("⚖️ Model comparison")
|
| 789 |
-
|
| 790 |
left, right = st.columns([1, 1], gap="large")
|
| 791 |
|
| 792 |
with left:
|
| 793 |
-
st.markdown("#### Head-to-head (per track)")
|
| 794 |
|
| 795 |
model_picker_options = selected_models if selected_models else _ALL_MODELS
|
| 796 |
default_a = model_picker_options[0] if model_picker_options else _ALL_MODELS[0]
|
|
@@ -839,7 +902,6 @@ def main():
|
|
| 839 |
if c in scatter_df.columns:
|
| 840 |
hover_cols.append(c)
|
| 841 |
|
| 842 |
-
# Model A on Y, Model B on X
|
| 843 |
fig_scatter = px.scatter(
|
| 844 |
scatter_df,
|
| 845 |
x="Model B",
|
|
@@ -848,7 +910,6 @@ def main():
|
|
| 848 |
hover_data=hover_cols,
|
| 849 |
)
|
| 850 |
|
| 851 |
-
# Red diagonal y=x
|
| 852 |
fig_scatter.add_shape(
|
| 853 |
type="line",
|
| 854 |
x0=axis_range[0], y0=axis_range[0],
|
|
@@ -857,7 +918,6 @@ def main():
|
|
| 857 |
line=dict(color="red", dash="dot", width=2),
|
| 858 |
)
|
| 859 |
|
| 860 |
-
# Square + identical scale/ticks (works even with use_container_width=True)
|
| 861 |
fig_scatter.update_layout(
|
| 862 |
height=550,
|
| 863 |
margin=dict(l=60, r=20, t=20, b=60),
|
|
@@ -871,7 +931,7 @@ def main():
|
|
| 871 |
title=f"{model_a} — {cfg['metric_label']}",
|
| 872 |
range=axis_range,
|
| 873 |
dtick=tick_step,
|
| 874 |
-
scaleanchor="x",
|
| 875 |
scaleratio=1,
|
| 876 |
constrain="domain",
|
| 877 |
),
|
|
@@ -882,9 +942,9 @@ def main():
|
|
| 882 |
st.plotly_chart(fig_scatter, use_container_width=True)
|
| 883 |
|
| 884 |
with right:
|
| 885 |
-
st.markdown("####
|
| 886 |
|
| 887 |
-
|
| 888 |
benchmark_name,
|
| 889 |
selected_species,
|
| 890 |
selected_assays,
|
|
@@ -892,49 +952,87 @@ def main():
|
|
| 892 |
selected_datasets,
|
| 893 |
)
|
| 894 |
|
| 895 |
-
if
|
| 896 |
-
st.info("No data for the selected filters.")
|
| 897 |
else:
|
| 898 |
-
|
| 899 |
-
|
| 900 |
-
|
| 901 |
-
|
| 902 |
-
|
| 903 |
-
|
| 904 |
-
.index
|
| 905 |
-
.tolist()
|
| 906 |
-
)
|
| 907 |
-
|
| 908 |
-
fig_violin = px.violin(
|
| 909 |
-
violin_df,
|
| 910 |
-
x="Model",
|
| 911 |
-
y="Score",
|
| 912 |
-
color="Model",
|
| 913 |
-
color_discrete_map=MODEL_COLORS,
|
| 914 |
-
box=True, # keep inner boxplot
|
| 915 |
-
points=False, # 👈 remove all dots
|
| 916 |
-
category_orders={"Model": model_order}, # 👈 enforce ordering
|
| 917 |
)
|
| 918 |
-
|
| 919 |
-
|
| 920 |
-
height=
|
| 921 |
-
|
| 922 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 923 |
plot_bgcolor="rgba(0,0,0,0)",
|
| 924 |
paper_bgcolor="rgba(0,0,0,0)",
|
| 925 |
-
showlegend=False,
|
| 926 |
)
|
| 927 |
-
|
| 928 |
-
|
| 929 |
-
|
| 930 |
-
|
| 931 |
)
|
|
|
|
| 932 |
|
| 933 |
-
|
| 934 |
-
|
|
|
|
|
|
|
| 935 |
|
| 936 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 937 |
|
|
|
|
| 938 |
|
| 939 |
|
| 940 |
if __name__ == "__main__":
|
|
|
|
| 6 |
import plotly.express as px
|
| 7 |
from plotly.subplots import make_subplots
|
| 8 |
import plotly.graph_objects as go
|
| 9 |
+
import numpy as np
|
| 10 |
|
| 11 |
# ---------------------------------------------------------------------
|
| 12 |
# Page config (must be the first Streamlit command)
|
|
|
|
| 69 |
"Caduceus 7M": COLORS["purple_2"]
|
| 70 |
}
|
| 71 |
|
| 72 |
+
MODEL_TRAINING_STATUS = {
|
| 73 |
+
"NTv3 650M (post)": "POST",
|
| 74 |
+
"NTv3 650M (pre)": "PRE",
|
| 75 |
+
"NTv3 100M (pre)": "PRE",
|
| 76 |
+
"NTv3 8M (pre)": "PRE",
|
| 77 |
+
"Residual CNN 44M": "SCRATCH",
|
| 78 |
+
"Caduceus 7M": "PRE",
|
| 79 |
+
"Evo2 1B": "PRE",
|
| 80 |
+
"NTv2 500M": "PRE",
|
| 81 |
+
"BPNet arch. 6M": "SCRATCH",
|
| 82 |
+
"PlantCAD2 88M": "PRE",
|
| 83 |
+
}
|
| 84 |
+
|
| 85 |
+
MODEL_GPU_MULTIPLIER = {
|
| 86 |
+
"Evo2 1B": 8, # trained on 8 GPUs
|
| 87 |
+
}
|
| 88 |
+
|
| 89 |
+
|
| 90 |
MODEL_NAMES = list(MODEL_COLORS.keys())
|
| 91 |
|
| 92 |
PLANT_SPECIES = ["tomato", "rice", "maize", "arabidopsis"]
|
|
|
|
| 100 |
|
| 101 |
_LAST_UPDATED = "Dec 10, 2025"
|
| 102 |
_INTRO = """
|
| 103 |
+
The **NTv3 Benchmark** is a curated benchmark of 106 long-range genomic datasets
|
| 104 |
+
designed to evaluate models under realistic 32 kb input, single-base-pair output settings.
|
| 105 |
+
The dataset spans two complementary task families: genome annotation (exon, intron, splice acceptor, start codon)
|
| 106 |
+
and functional-regulatory prediction, which includes diverse experimental tracks such as chromatin accessibility,
|
| 107 |
+
histone modifications, transcription initiation (PRO-cap), RNA binding (eCLIP), gene expression (RNA-seq),
|
| 108 |
+
and translation (Ribo-seq).
|
| 109 |
+
|
| 110 |
+
Data are drawn from a phylogenetically diverse set of species, including organisms seen during post-training
|
| 111 |
+
(human, chicken, Arabidopsis, rice, maize) and entirely unseen species (cattle, tomato), with careful curation
|
| 112 |
+
to avoid data leakage. This design allows the dataset to probe long-range sequence-to-function mapping,
|
| 113 |
+
cross-species generalization, and transfer across heterogeneous regulatory modalities,
|
| 114 |
+
including assays not present in prior multispecies training corpora. By standardizing sequence length,
|
| 115 |
+
resolution, and evaluation metrics across all tracks, \brandbenchmark provides a controlled dataset
|
| 116 |
+
for comparing representation quality across genomic foundation models.
|
| 117 |
+
|
| 118 |
+
The metrics used are:
|
| 119 |
+
- **Pearson correlations (multi-assay)**: per-dataset scores across species and models for functional tracks.
|
| 120 |
+
- **MCC (bed tracks)**: per-track MCC values across species and models for gene annotation tracks.
|
| 121 |
|
|
|
|
| 122 |
"""
|
| 123 |
|
| 124 |
HERE = os.path.dirname(os.path.abspath(__file__)) # /app/src
|
|
|
|
| 143 |
|
| 144 |
return pearson_df, mcc_df
|
| 145 |
|
| 146 |
+
def _normalize_training_hours(df: pd.DataFrame) -> pd.DataFrame:
|
| 147 |
+
return df.rename(columns={"running_time_hours": "GPU hours"})
|
| 148 |
+
|
| 149 |
|
| 150 |
@st.cache_data
|
| 151 |
def load_expanded_data():
|
|
|
|
| 164 |
we average their Score.
|
| 165 |
"""
|
| 166 |
pearson_df, mcc_df = load_raw_data()
|
| 167 |
+
pearson_df = _normalize_training_hours(pearson_df)
|
| 168 |
+
mcc_df = _normalize_training_hours(mcc_df)
|
| 169 |
+
|
| 170 |
+
if "track_name_clean" in pearson_df.columns:
|
| 171 |
+
pearson_df = pearson_df.drop(columns=["datasets"], errors="ignore")
|
| 172 |
+
pearson_df = pearson_df.rename(columns={"track_name_clean": "datasets"})
|
| 173 |
|
| 174 |
# --- Pearson correlations ---
|
| 175 |
# Expect columns: species, assay_type, datasets, model_name, pearson correlation
|
|
|
|
| 184 |
if "assay_type" in pearson_df.columns:
|
| 185 |
pearson_group_cols.append("assay_type")
|
| 186 |
|
| 187 |
+
agg_cols = {"Score": "mean"}
|
| 188 |
+
if "GPU hours" in pearson_df.columns:
|
| 189 |
+
agg_cols["GPU hours"] = "mean"
|
| 190 |
+
|
| 191 |
pearson_df = (
|
| 192 |
pearson_df
|
| 193 |
+
.groupby(pearson_group_cols, as_index=False, dropna=False)
|
| 194 |
+
.agg(agg_cols)
|
| 195 |
)
|
| 196 |
|
| 197 |
# --- MCC (bed tracks) ---
|
|
|
|
| 205 |
|
| 206 |
# Collapse duplicates with same (species, datasets, Model)
|
| 207 |
mcc_group_cols = ["species", "datasets", "Model"]
|
| 208 |
+
agg_cols = {"Score": "mean"}
|
| 209 |
+
if "GPU hours" in mcc_df.columns:
|
| 210 |
+
agg_cols["GPU hours"] = "mean"
|
| 211 |
+
|
| 212 |
mcc_df = (
|
| 213 |
mcc_df
|
| 214 |
+
.groupby(mcc_group_cols, as_index=False, dropna=False)
|
| 215 |
+
.agg(agg_cols)
|
| 216 |
)
|
| 217 |
|
| 218 |
# Optional sanity checks
|
|
|
|
| 304 |
)
|
| 305 |
|
| 306 |
if df.empty:
|
| 307 |
+
return pd.DataFrame(columns=["Model", "Model Type", "Num entries", "Mean score"])
|
| 308 |
|
| 309 |
agg = (
|
| 310 |
df.groupby("Model")["Score"]
|
|
|
|
| 318 |
df.groupby("Model")["Score"].count().reindex(agg["Model"]).values
|
| 319 |
)
|
| 320 |
|
| 321 |
+
# 👇 Add training regime column
|
| 322 |
+
agg["Training"] = agg["Model"].map(MODEL_TRAINING_STATUS).fillna("UNKNOWN")
|
| 323 |
+
|
| 324 |
+
# Sort by performance
|
| 325 |
agg = agg.sort_values("Mean score", ascending=False).reset_index(drop=True)
|
| 326 |
+
|
| 327 |
+
# Column order
|
| 328 |
+
agg = agg[["Model", "Training", "Num entries", "Mean score"]]
|
| 329 |
+
|
| 330 |
# Ensure the index starts with 1
|
| 331 |
agg.index += 1
|
| 332 |
|
| 333 |
return agg
|
| 334 |
|
| 335 |
|
| 336 |
+
|
| 337 |
def build_bar_df(
|
| 338 |
benchmark_name: str,
|
| 339 |
selected_species: List[str],
|
|
|
|
| 643 |
return fig
|
| 644 |
|
| 645 |
|
| 646 |
+
def build_convergence_df(
|
| 647 |
+
benchmark_name: str,
|
| 648 |
+
selected_species: List[str],
|
| 649 |
+
selected_assays: List[str],
|
| 650 |
+
selected_models: List[str],
|
| 651 |
+
selected_datasets: List[str],
|
| 652 |
+
) -> pd.DataFrame:
|
| 653 |
+
df = filter_base_df(
|
| 654 |
+
benchmark_name,
|
| 655 |
+
selected_species,
|
| 656 |
+
selected_assays,
|
| 657 |
+
selected_models,
|
| 658 |
+
selected_datasets,
|
| 659 |
+
)
|
| 660 |
+
|
| 661 |
+
if df.empty or "GPU hours" not in df.columns:
|
| 662 |
+
return pd.DataFrame(columns=["Model", "GPU hours", "Performance"])
|
| 663 |
+
|
| 664 |
+
out = (
|
| 665 |
+
df.groupby("Model", as_index=False)
|
| 666 |
+
.agg({"Score": "mean", "GPU hours": "mean"})
|
| 667 |
+
.rename(columns={"Score": "Performance"})
|
| 668 |
+
)
|
| 669 |
+
|
| 670 |
+
# Apply per-model multiplier (default 1)
|
| 671 |
+
out["GPU multiplier"] = out["Model"].map(MODEL_GPU_MULTIPLIER).fillna(1).astype(float)
|
| 672 |
+
out["GPU hours"] = out["GPU hours"] * out["GPU multiplier"]
|
| 673 |
+
|
| 674 |
+
out = out.dropna(subset=["GPU hours", "Performance"])
|
| 675 |
+
out["Performance"] = out["Performance"].round(3)
|
| 676 |
+
out["GPU hours"] = out["GPU hours"].round(1)
|
| 677 |
+
|
| 678 |
+
return out
|
| 679 |
|
| 680 |
# ---------------------------------------------------------------------
|
| 681 |
# UI helpers
|
|
|
|
| 693 |
# Fallback for older Streamlit versions
|
| 694 |
return st.sidebar.checkbox(label, value=value, key=key)
|
| 695 |
|
|
|
|
| 696 |
# ---------------------------------------------------------------------
|
| 697 |
# Streamlit UI
|
| 698 |
# ---------------------------------------------------------------------
|
|
|
|
|
|
|
| 699 |
def main():
|
| 700 |
st.title("🧬 NTv3 Benchmark")
|
| 701 |
st.markdown(_INTRO)
|
|
|
|
| 739 |
if not available_species:
|
| 740 |
st.sidebar.info(f"No {species_group.lower()} species available for this benchmark.")
|
| 741 |
|
|
|
|
| 742 |
# Assay toggles (Pearson only), based on filtered species
|
| 743 |
if cfg.get("has_assay_type", False):
|
| 744 |
st.sidebar.subheader("Assay types")
|
|
|
|
| 758 |
else:
|
| 759 |
selected_assays = []
|
| 760 |
|
|
|
|
| 761 |
# Bed track / dataset toggles (MCC only), based on species selection
|
| 762 |
selected_datasets: List[str] = []
|
| 763 |
if benchmark_name == "Genome Annotation":
|
|
|
|
| 791 |
col1, col2 = st.columns([1, 1])
|
| 792 |
|
| 793 |
with col1:
|
| 794 |
+
st.subheader("🏅 Leaderboard")
|
| 795 |
+
st.write("\n") # spacer to match plotly padding
|
| 796 |
st.write("\n")
|
| 797 |
st.write("\n")
|
| 798 |
if leaderboard_df.empty:
|
|
|
|
| 800 |
else:
|
| 801 |
st.dataframe(leaderboard_df, use_container_width=True)
|
| 802 |
|
|
|
|
| 803 |
with col2:
|
| 804 |
st.subheader("📈 Mean score per model")
|
| 805 |
if bar_df.empty:
|
|
|
|
| 807 |
else:
|
| 808 |
# Order models by performance (least -> most)
|
| 809 |
bar_df = bar_df.sort_values("Mean score", ascending=True)
|
|
|
|
| 810 |
model_order = bar_df["Model"].tolist()
|
| 811 |
|
| 812 |
fig = px.bar(
|
|
|
|
| 815 |
y="Mean score",
|
| 816 |
color="Model",
|
| 817 |
color_discrete_map=MODEL_COLORS,
|
| 818 |
+
category_orders={"Model": model_order},
|
| 819 |
)
|
| 820 |
fig.update_layout(
|
| 821 |
barmode="group",
|
| 822 |
+
height=480,
|
| 823 |
xaxis_title="",
|
| 824 |
+
yaxis_title=cfg["metric_label"],
|
| 825 |
plot_bgcolor="rgba(0,0,0,0)",
|
| 826 |
paper_bgcolor="rgba(0,0,0,0)",
|
| 827 |
bargap=0.08,
|
| 828 |
)
|
|
|
|
|
|
|
| 829 |
fig.update_xaxes(showticklabels=False)
|
|
|
|
| 830 |
st.plotly_chart(fig, use_container_width=True)
|
| 831 |
|
|
|
|
| 832 |
# --- Breakdown plot: assay_type (Functional Tracks) OR datasets (Genome Annotation) ---
|
| 833 |
breakdown_df = build_category_model_df(
|
| 834 |
benchmark_name, selected_species, selected_assays, selected_models, selected_datasets
|
| 835 |
)
|
| 836 |
|
| 837 |
+
type_of_data = "assay type" if benchmark_name == "Functional Tracks" else "gene annotation"
|
| 838 |
+
|
| 839 |
+
st.subheader(f"🧪 Mean score by {type_of_data}")
|
| 840 |
if breakdown_df.empty:
|
| 841 |
st.info("No data for the selected filters.")
|
| 842 |
else:
|
|
|
|
| 847 |
)
|
| 848 |
st.plotly_chart(fig_breakdown, use_container_width=True)
|
| 849 |
|
| 850 |
+
# ------------------------------------------------------------------
|
| 851 |
+
# Model comparison: Head-to-head (left) + Convergence (right)
|
| 852 |
+
# ------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 853 |
left, right = st.columns([1, 1], gap="large")
|
| 854 |
|
| 855 |
with left:
|
| 856 |
+
st.markdown("#### ⚖️ Head-to-head (per track)")
|
| 857 |
|
| 858 |
model_picker_options = selected_models if selected_models else _ALL_MODELS
|
| 859 |
default_a = model_picker_options[0] if model_picker_options else _ALL_MODELS[0]
|
|
|
|
| 902 |
if c in scatter_df.columns:
|
| 903 |
hover_cols.append(c)
|
| 904 |
|
|
|
|
| 905 |
fig_scatter = px.scatter(
|
| 906 |
scatter_df,
|
| 907 |
x="Model B",
|
|
|
|
| 910 |
hover_data=hover_cols,
|
| 911 |
)
|
| 912 |
|
|
|
|
| 913 |
fig_scatter.add_shape(
|
| 914 |
type="line",
|
| 915 |
x0=axis_range[0], y0=axis_range[0],
|
|
|
|
| 918 |
line=dict(color="red", dash="dot", width=2),
|
| 919 |
)
|
| 920 |
|
|
|
|
| 921 |
fig_scatter.update_layout(
|
| 922 |
height=550,
|
| 923 |
margin=dict(l=60, r=20, t=20, b=60),
|
|
|
|
| 931 |
title=f"{model_a} — {cfg['metric_label']}",
|
| 932 |
range=axis_range,
|
| 933 |
dtick=tick_step,
|
| 934 |
+
scaleanchor="x",
|
| 935 |
scaleratio=1,
|
| 936 |
constrain="domain",
|
| 937 |
),
|
|
|
|
| 942 |
st.plotly_chart(fig_scatter, use_container_width=True)
|
| 943 |
|
| 944 |
with right:
|
| 945 |
+
st.markdown("#### ⏱️ Time to convergence")
|
| 946 |
|
| 947 |
+
conv_df = build_convergence_df(
|
| 948 |
benchmark_name,
|
| 949 |
selected_species,
|
| 950 |
selected_assays,
|
|
|
|
| 952 |
selected_datasets,
|
| 953 |
)
|
| 954 |
|
| 955 |
+
if conv_df.empty:
|
| 956 |
+
st.info("No training-time data found for the selected filters (missing 'GPU hours').")
|
| 957 |
else:
|
| 958 |
+
fig_conv = px.scatter(
|
| 959 |
+
conv_df,
|
| 960 |
+
x="GPU hours",
|
| 961 |
+
y="Performance",
|
| 962 |
+
text="Model",
|
| 963 |
+
hover_data=["Model", "GPU hours", "Performance"],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 964 |
)
|
| 965 |
+
fig_conv.update_traces(textposition="top center")
|
| 966 |
+
fig_conv.update_layout(
|
| 967 |
+
height=630, # match left panel height
|
| 968 |
+
xaxis=dict(
|
| 969 |
+
title="GPU hours",
|
| 970 |
+
type="log", # 👈 log scale
|
| 971 |
+
),
|
| 972 |
+
yaxis=dict(
|
| 973 |
+
title=cfg["metric_label"],
|
| 974 |
+
),
|
| 975 |
plot_bgcolor="rgba(0,0,0,0)",
|
| 976 |
paper_bgcolor="rgba(0,0,0,0)",
|
|
|
|
| 977 |
)
|
| 978 |
+
fig_conv.update_xaxes(
|
| 979 |
+
type="log",
|
| 980 |
+
range=[0, np.log10(conv_df["GPU hours"].max())], # log10(1) = 0
|
| 981 |
+
title="GPU hours (log scale)",
|
| 982 |
)
|
| 983 |
+
st.plotly_chart(fig_conv, use_container_width=True)
|
| 984 |
|
| 985 |
+
# ------------------------------------------------------------------
|
| 986 |
+
# Violin (full width, below)
|
| 987 |
+
# ------------------------------------------------------------------
|
| 988 |
+
st.subheader("🎻 Performance comparaison across tracks")
|
| 989 |
|
| 990 |
+
violin_df = build_violin_df(
|
| 991 |
+
benchmark_name,
|
| 992 |
+
selected_species,
|
| 993 |
+
selected_assays,
|
| 994 |
+
selected_models,
|
| 995 |
+
selected_datasets,
|
| 996 |
+
)
|
| 997 |
+
|
| 998 |
+
if violin_df.empty:
|
| 999 |
+
st.info("No data for the selected filters.")
|
| 1000 |
+
else:
|
| 1001 |
+
model_order = (
|
| 1002 |
+
violin_df
|
| 1003 |
+
.groupby("Model")["Score"]
|
| 1004 |
+
.median()
|
| 1005 |
+
.sort_values(ascending=True)
|
| 1006 |
+
.index
|
| 1007 |
+
.tolist()
|
| 1008 |
+
)
|
| 1009 |
+
|
| 1010 |
+
fig_violin = px.violin(
|
| 1011 |
+
violin_df,
|
| 1012 |
+
x="Model",
|
| 1013 |
+
y="Score",
|
| 1014 |
+
color="Model",
|
| 1015 |
+
color_discrete_map=MODEL_COLORS,
|
| 1016 |
+
box=True,
|
| 1017 |
+
points=False,
|
| 1018 |
+
category_orders={"Model": model_order},
|
| 1019 |
+
)
|
| 1020 |
+
|
| 1021 |
+
fig_violin.update_layout(
|
| 1022 |
+
height=650,
|
| 1023 |
+
xaxis_title="",
|
| 1024 |
+
yaxis_title=cfg["metric_label"],
|
| 1025 |
+
plot_bgcolor="rgba(0,0,0,0)",
|
| 1026 |
+
paper_bgcolor="rgba(0,0,0,0)",
|
| 1027 |
+
showlegend=False,
|
| 1028 |
+
)
|
| 1029 |
+
|
| 1030 |
+
fig_violin.update_traces(
|
| 1031 |
+
box_visible=True,
|
| 1032 |
+
meanline_visible=False,
|
| 1033 |
+
)
|
| 1034 |
|
| 1035 |
+
st.plotly_chart(fig_violin, use_container_width=True)
|
| 1036 |
|
| 1037 |
|
| 1038 |
if __name__ == "__main__":
|