Yoobit commited on
Commit
d17ebe3
·
1 Parent(s): 7cf57d5

feat(docs): 更新 README 文档内容与使用说明

Browse files

新增关于数据处理脚本的详细使用说明,包括合并 CSV、统计类别和筛选处理流程。
更新配置参数及字典映射示例,完善模型类型与数据集名称显示映射。

fix(gitignore): 忽略 data 和 outdata 目录

将生成的数据目录 `data` 与输出目录 `outdata` 添加至 `.gitignore` 文件中,
避免误提交临时数据文件。

chore(config): 重命名配置文件

将 `tsconfig.app.json` 重命名为 `config.app.json`,便于统一管理非 TypeScript 配置。

.gitignore CHANGED
@@ -28,3 +28,6 @@ coverage
28
  *.sw?
29
 
30
  *.tsbuildinfo
 
 
 
 
28
  *.sw?
29
 
30
  *.tsbuildinfo
31
+
32
+ data
33
+ outdata
README.md CHANGED
@@ -1,50 +1,77 @@
1
- ---
2
- title: Test
3
- emoji: 🐢
4
- colorFrom: purple
5
- colorTo: indigo
6
- sdk: static
7
- pinned: false
8
- app_build_command: npm run build
9
- app_file: dist/index.html
10
- ---
11
-
12
- # vue
13
-
14
- This template should help get you started developing with Vue 3 in Vite.
15
-
16
- ## Recommended IDE Setup
17
-
18
- [VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur).
19
-
20
- ## Type Support for `.vue` Imports in TS
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
 
22
- TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) to make the TypeScript language service aware of `.vue` types.
23
 
24
- ## Customize configuration
25
 
26
- See [Vite Configuration Reference](https://vite.dev/config/).
27
 
28
- ## Project Setup
29
 
30
  ```sh
31
- npm install
32
- ```
33
-
34
- ### Compile and Hot-Reload for Development
35
 
36
- ```sh
37
- npm run dev
38
  ```
39
 
40
- ### Type-Check, Compile and Minify for Production
41
 
 
42
  ```sh
43
- npm run build
44
  ```
 
 
45
 
46
- ### Lint with [ESLint](https://eslint.org/)
 
47
 
48
- ```sh
49
- npm run lint
50
- ```
 
 
 
1
+ # 使用
2
+ 1. 配置参数及字典映射: `src/composables/useLeaderboardData.js`
3
+ ```js
4
+ DEFAULT_HIDDEN: new Set(['seq_len', 'uniform_entropy', 'entropy_gain', 'information_capacity', 'data_name']) // 默认隐藏的列
5
+
6
+ // 模型类型映射对象:键为模型类型,值为包含的 model_series 数组
7
+ const modelTypeMapping = {
8
+ 'Qwen1.5':['Qwen1.5'],
9
+ 'Qwen2.5':['Qwen2.5'],
10
+ 'Gemma-3': ['gemma-3'],
11
+ 'Qwen2': ['Qwen2'],
12
+ 'Hunyuan': ['Hunyuan'],
13
+ 'Qwen3': ['Qwen3'],
14
+ 'InternLM2.5': ['internlm2.5'],
15
+ 'Llama-3': ['Llama-3.1','Llama-3.2'],
16
+ 'DeepSeek-V2': ['DeepSeek-V2'],
17
+ 'DeepSeek-V3.1': ['DeepSeek-V3.1-Base'],
18
+ 'GLM-4': ['glm-4','GLM-4'],
19
+ 'GLM-4.5': ['GLM-4.5-Air-Base','GLM-4.5-Base'],
20
+ 'Llama-4': ['Llama-4'],
21
+ 'Seed-OSS': ['Seed-OSS'],
22
+ }
23
+
24
+ const autoShowSeries = ['Qwen3','Llama-3','InternLM2.5','GLM-4','Seed-OSS','Gemma-3','Hunyuan','DeepSeek-V3.1','DeepSeek-V2','GLM-4.5']
25
+
26
+ // 表头显示名称映射(raw header -> 显示名),可以在此添加或由用户修改
27
+ const headerDisplayMap = reactive({
28
+ 'model_name': 'MODEL NAME',
29
+ 'model_series': 'MODEL SERIES',
30
+ 'model_size (B)': 'MODEL SIZE (B)',
31
+ 'BF16_TFLOPs': 'BF16 TFLOPs',
32
+ 'ic': 'IC',
33
+ })
34
+
35
+ // 数据集名称显示映射(raw data_name -> 显示名)
36
+ const dataNameDisplayMap = reactive({
37
+ 'data_part_0000': 'Data Part 0000',
38
+ 'NextCoderDataset_v1_lo': 'NextCoder v1',
39
+ 'IndustryCorpus_batch_aa_long': 'Industry Corpus AA',
40
+ 'CC-MAIN-2013-20_train-00000-of-00014_long': 'CC-MAIN (2013-20)',
41
+ 'NextCoderDataset_v1_long': 'NextCoder v1',
42
+ })
43
+ ```
44
 
45
+ # 安装
46
 
47
+ ## 1 合并 CSV(脚本)
48
 
49
+ 仓库包含一个小脚本 `scripts/merge_csv.js`,用于把多个 CSV 合并为一个文件(简单合并,保留首次出现的列顺序)。
50
 
51
+ 示例:
52
 
53
  ```sh
54
+ # 使用目录
55
+ npm run merge-csv -- --inputDir ./data --out ./merged.csv
 
 
56
 
57
+ # 或直接传文件
58
+ npm run merge-csv -- file1.csv file2.csv --out merged.csv
59
  ```
60
 
61
+ 说明:`npm run merge-csv` 后面的参数会传递给脚本(注意 `--`),脚本会把所有 CSV 的表头合并成最终输出的表头,行数按各文件合并。该实现为轻量版,能处理普通带引号字段的 CSV,但不保证支持所有复杂嵌套换行场景。
62
 
63
+ ## 2 统计类别
64
  ```sh
65
+ node .\scripts\count_column.js --file .\data\entropy_calc4_part3.csv --column model_series --out .\p3_model_series.csv
66
  ```
67
+ 统计后需要手动合并类目,如Llama-3.2 Llama-3.1合并为Llama-3
68
+ 删除TingLLama
69
 
70
+ ## 3. 筛选处理
71
+ 因为在步骤`2`中我们删除了TinyLlama,执行此脚本从merged.csv中提取出最终表
72
 
73
+ 使用默认路径(merged.csv 在 outdata):
74
+ `node .\scripts\filter_by_series.js`
75
+
76
+ 指定输入文件与 series 列表并输出到自定义文件:
77
+ `node .\scripts\filter_by_series.js --file .\outdata\merged.csv --series .\outdata\p3_model_series.csv --out .\outdata\filtered.csv`
tsconfig.app.json → config.app.json RENAMED
File without changes
finalData/filtered.csv ADDED
@@ -0,0 +1,244 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ model_name,model_series,model_size (B),data_name,seq_len,uniform_entropy,constant,conditional_entropy,entropy_gain,BF16_TFLOPs,information_capacity,ic
2
+ DeepSeek-V2-236B-A21B,DeepSeek-V2,236.0,data_part_0000,1024,16.643856189774723,32.12,2.251732349395752,29.868267650604245,37.7957122048,0.8508680957071698,0.16717145364366684
3
+ DeepSeek-V3.1-Base-671B-A37B,DeepSeek-V3.1-Base,671.0,data_part_0000,1024,16.980139577639157,34.94,2.2772045135498047,32.66279548645019,78.006806642688,0.9035685069448164,0.2396435781777227
4
+ GLM-4-32B-Base-0414,GLM-4,32.0,data_part_0000,1024,17.20945336562895,34.82,2.760892629623413,32.05910737037659,65.5704981504,0.8930583115634292,0.22449947647473625
5
+ GLM-4.5-Air-Base-106B-A12B,GLM-4.5-Air-Base,106.0,data_part_0000,1024,17.20945336562895,34.82,2.5816900730133057,32.238309926986695,17.749377810432,0.9478278177014319,0.2422118075460074
6
+ GLM-4.5-Base-355B-A32B,GLM-4.5-Base,355.0,data_part_0000,1024,17.20945336562895,34.82,2.2813751697540283,32.53862483024597,48.828658745344,0.9172839724996397,0.2407091186192849
7
+ Hunyuan-0.5B-Pretrain,Hunyuan,0.5,data_part_0000,1024,16.882475884200698,34.95,3.9885313510894775,30.961468648910525,1.000647688192,1.0367464096541894,0.23310514464022852
8
+ Hunyuan-1.8B-Pretrain,Hunyuan,1.8,data_part_0000,1024,16.882475884200698,34.95,3.584585189819336,31.365414810180667,3.805148086272,0.9866102441707987,0.23168173442848555
9
+ Hunyuan-4B-Pretrain,Hunyuan,4.0,data_part_0000,1024,16.882475884200698,34.95,3.2984426021575928,31.65155739784241,8.297562243072,0.961590897404844,0.23245832273762004
10
+ Hunyuan-7B-Pretrain,Hunyuan,7.0,data_part_0000,1024,16.967654067617747,34.95,2.9976937770843506,31.952306222915652,15.643394965504,0.9444789153560366,0.23506239279253738
11
+ Llama-3.1-8B,Llama-3.1,8.0,data_part_0000,1024,16.968666793195208,32.84,2.821995973587036,30.018004026412967,15.644149940224,0.8873010085049908,0.177885945951797
12
+ Llama-3.1-70B,Llama-3.1,70.0,data_part_0000,1024,16.968666793195208,32.84,2.4085302352905273,30.431469764709476,143.712558514176,0.8218018438545803,0.1736818416001239
13
+ Llama-3.2-1B,Llama-3.2,1.0,data_part_0000,1024,16.968666793195208,32.84,3.366785764694214,29.47321423530579,2.59946184704,0.9434039861539558,0.1751913478264881
14
+ Llama-3.2-3B,Llama-3.2,3.0,data_part_0000,1024,16.968666793195208,32.84,3.0805253982543945,29.75947460174561,6.759565492224,0.91230572910113,0.17656231321626759
15
+ Llama-4-109B-A17B,Llama-4,109.0,data_part_0000,1024,17.624338545312984,34.45,3.977431058883667,30.472568941116336,41.80362133504,0.8645020910276588,0.18362578470913662
16
+ Qwen1.5-0.5B,Qwen1.5,0.5,data_part_0000,1024,17.213104219641906,33.8,3.7239813804626465,30.07601861953735,1.001482354688,1.0070565057479184,0.20344760911524865
17
+ Qwen1.5-1.8B,Qwen1.5,1.8,data_part_0000,1024,17.213104219641906,33.8,3.41902232170105,30.380977678298947,3.227030388736,0.9628449329246426,0.20222825248457876
18
+ Qwen1.5-4B,Qwen1.5,4.0,data_part_0000,1024,17.213104219641906,33.8,3.1751632690429688,30.62483673095703,7.50725890048,0.9344982175271936,0.20215285295643626
19
+ Qwen1.5-7B,Qwen1.5,7.0,data_part_0000,1024,17.213104219641906,33.8,3.0355875492095947,30.764412450790402,14.812000026624,0.9114886780861936,0.2004161585293765
20
+ Qwen1.5-14B,Qwen1.5,14.0,data_part_0000,1024,17.214319120800766,33.8,2.944247007369995,30.855752992630002,27.84707477504,0.8901744527733408,0.1977853585365842
21
+ Qwen1.5-14.3B-A2.7B,Qwen1.5,14.3,data_part_0000,1024,17.213104219641906,33.8,2.895214319229126,30.90478568077087,4.966492143616,0.960510822111029,0.2145985233239858
22
+ Qwen1.5-32B,Qwen1.5,32.0,data_part_0000,1024,17.214319120800766,33.8,2.716146230697632,31.083853769302365,65.67474757632,0.865835765616715,0.19731961157010755
23
+ Qwen1.5-72B,Qwen1.5,72.0,data_part_0000,1024,17.214319120800766,33.8,2.5710153579711914,31.228984642028806,146.860769542144,0.8426273405857749,0.19505405551515287
24
+ Qwen2-0.5B,Qwen2,0.5,data_part_0000,1024,17.213104219641906,33.8,3.6743340492248535,30.125665950775144,1.056685686784,1.0061110923598948,0.2045797251830582
25
+ Qwen2-1.5B,Qwen2,1.5,data_part_0000,1024,17.213104219641906,33.8,3.2716164588928223,30.528383541107175,3.251336380416,0.9671847407204981,0.2068289313132992
26
+ Qwen2-7B,Qwen2,7.0,data_part_0000,1024,17.214319120800766,33.8,2.885551691055298,30.9144483089447,14.69019324416,0.9162573469250713,0.20493375782388282
27
+ Qwen2-57B-A14B,Qwen2,57.0,data_part_0000,1024,17.213104219641906,33.8,2.667733907699585,31.132266092300412,27.316457570304,0.8988714835216332,0.20592752818731272
28
+ Qwen2-72B,Qwen2,72.0,data_part_0000,1024,17.214319120800766,33.8,2.5179216861724854,31.282078313827512,147.719763001344,0.8438683484691111,0.19644204385857722
29
+ Qwen2.5-0.5B,Qwen2.5,0.5,data_part_0000,1024,17.213104219641906,33.8,3.647934675216675,30.152065324783322,1.056685686784,1.0069927559574525,0.20546138878061604
30
+ Qwen2.5-1.5B,Qwen2.5,1.5,data_part_0000,1024,17.213104219641906,33.8,3.237604856491089,30.56239514350891,3.251336380416,0.96826227903189,0.20790646962469111
31
+ Qwen2.5-3B,Qwen2.5,3.0,data_part_0000,1024,17.213104219641906,33.8,3.0671043395996094,30.732895660400388,6.473975332864,0.943949100891232,0.20679830743116587
32
+ Qwen2.5-7B,Qwen2.5,7.0,data_part_0000,1024,17.214319120800766,33.8,2.9005396366119385,30.89946036338806,14.69019324416,0.9158131269572962,0.20448953785610768
33
+ Qwen2.5-14B,Qwen2.5,14.0,data_part_0000,1024,17.214319120800766,33.8,2.7024266719818115,31.097573328018186,29.16769333248,0.8954240676966669,0.20436764994853804
34
+ Qwen2.5-32B,Qwen2.5,32.0,data_part_0000,1024,17.214319120800766,33.8,2.6616430282592773,31.13835697174072,66.19014365184,0.8670815610326332,0.19877534681365405
35
+ Qwen2.5-72B,Qwen2.5,72.0,data_part_0000,1024,17.214319120800766,33.8,2.5070900917053223,31.292909908294675,147.719763001344,0.8441605426015659,0.19673423799103204
36
+ Qwen3-0.6B-Base,Qwen3,0.6,data_part_0000,1024,17.213104219641906,33.8,3.590059757232666,30.20994024276733,1.100258213888,1.0069651380399516,0.2069912513406959
37
+ Qwen3-1.7B-Base,Qwen3,1.7,data_part_0000,1024,17.213104219641906,33.8,3.2383148670196533,30.561685132980344,3.643625439232,0.9632246645425145,0.20680721411621455
38
+ Qwen3-4B-Base,Qwen3,4.0,data_part_0000,1024,17.213104219641906,33.8,3.0264272689819336,30.773572731018064,7.70592210944,0.9379583189755558,0.2064540554902994
39
+ Qwen3-8B-Base,Qwen3,8.0,data_part_0000,1024,17.213104219641906,33.8,2.868133306503296,30.9318666934967,15.808398884864,0.9139067907596993,0.20480755676991014
40
+ Seed-OSS-36B-Base,Seed-OSS,36.0,data_part_0000,1024,17.24317398347295,32.94,2.6119723320007324,30.328027667999265,65.5351611392,0.8448545883860521,0.17628126923611978
41
+ gemma-3-0.27b-pt,gemma-3,0.27,data_part_0000,1024,18.0,32.35,4.019983768463135,28.330016231536867,0.550436864,0.9768369471156615,0.14930170890150166
42
+ gemma-3-1b-pt,gemma-3,1.0,data_part_0000,1024,18.0,32.35,3.4504594802856445,28.899540519714357,2.129873338368,0.9336314991259737,0.15828505499348264
43
+ gemma-3-4b-pt,gemma-3,4.0,data_part_0000,1024,18.000352177480302,32.35,3.0016162395477295,29.348383760452272,8.4021870592,0.8911298673762733,0.16239751224568966
44
+ gemma-3-12b-pt,gemma-3,12.0,data_part_0000,1024,18.000352177480302,32.35,2.7593374252319336,29.590662574768068,24.19152912384,0.8587067389873845,0.1622383282641156
45
+ gemma-3-27b-pt,gemma-3,27.0,data_part_0000,1024,18.000352177480302,32.35,2.646754026412964,29.703245973587038,58.631962755072,0.8311680223788541,0.15959049328217387
46
+ glm-4-9b-hf,glm-4,9.0,data_part_0000,1024,17.20945336562895,34.82,3.027162790298462,31.79283720970154,18.321994940416,0.9334734300010908,0.2288064582471567
47
+ internlm2.5-1.8b,internlm2.5,1.8,data_part_0000,1024,16.497851836951117,33.59,3.6355276107788086,29.954472389221195,3.583512674304,0.944801571812738,0.18781151607517943
48
+ internlm2.5-7b,internlm2.5,7.0,data_part_0000,1024,16.497851836951117,33.59,3.1548197269439697,30.435180273056034,15.344575971328,0.9003746927416127,0.1903742119845155
49
+ internlm2.5-20b,internlm2.5,20.0,data_part_0000,1024,16.497851836951117,33.59,2.840322256088257,30.749677743911747,40.127812337664,0.8738268849599932,0.19180851020833786
50
+ DeepSeek-V2-236B-A21B,DeepSeek-V2,236.0,eng_Latn_000_00027_long,1024,16.643856189774723,33.77,2.3624660968780518,31.40753390312195,37.7957122048,0.8947177277108376,0.1255590053893968
51
+ DeepSeek-V3.1-Base-671B-A37B,DeepSeek-V3.1-Base,671.0,eng_Latn_000_00027_long,1024,16.980139577639157,37.28,2.3429439067840576,34.93705609321594,78.006806642688,0.9664826032508479,0.21956705838786758
52
+ GLM-4-32B-Base-0414,GLM-4,32.0,eng_Latn_000_00027_long,1024,17.20945336562895,36.64,2.7358038425445557,33.904196157455445,65.5704981504,0.9444562453186229,0.19232755584384342
53
+ GLM-4.5-Air-Base-106B-A12B,GLM-4.5-Air-Base,106.0,eng_Latn_000_00027_long,1024,17.20945336562895,36.64,2.6314516067504883,34.00854839324951,17.749377810432,0.9998740095175996,0.20605599809274716
54
+ GLM-4.5-Base-355B-A32B,GLM-4.5-Base,355.0,eng_Latn_000_00027_long,1024,17.20945336562895,36.64,2.410081386566162,34.22991861343384,48.828658745344,0.9649625910091848,0.20381588039378568
55
+ Hunyuan-0.5B-Pretrain,Hunyuan,0.5,eng_Latn_000_00027_long,1024,16.882475884200698,36.61,3.9755191802978516,32.63448081970215,1.000647688192,1.0927673103758033,0.18867088723509726
56
+ Hunyuan-1.8B-Pretrain,Hunyuan,1.8,eng_Latn_000_00027_long,1024,16.882475884200698,36.61,3.5614101886749268,33.04858981132507,3.805148086272,1.0395551106395262,0.190260537179424
57
+ Hunyuan-4B-Pretrain,Hunyuan,4.0,eng_Latn_000_00027_long,1024,16.882475884200698,36.61,3.2879159450531006,33.3220840549469,8.297562243072,1.0123423725108784,0.1920682260102515
58
+ Hunyuan-7B-Pretrain,Hunyuan,7.0,eng_Latn_000_00027_long,1024,16.967654067617747,36.61,3.0015690326690674,33.60843096733093,15.643394965504,0.9934323427358054,0.19533875485186877
59
+ Llama-3.1-8B,Llama-3.1,8.0,eng_Latn_000_00027_long,1024,16.968666793195208,36.74,2.777745246887207,33.962254753112795,15.644149940224,1.003888961671959,0.20579701629961603
60
+ Llama-3.1-70B,Llama-3.1,70.0,eng_Latn_000_00027_long,1024,16.968666793195208,36.74,2.4633891582489014,34.2766108417511,143.712558514176,0.9256398790012853,0.19650487646502188
61
+ Llama-3.2-1B,Llama-3.2,1.0,eng_Latn_000_00027_long,1024,16.968666793195208,36.74,3.2581868171691895,33.48181318283081,2.59946184704,1.071714668382077,0.2074754502636758
62
+ Llama-3.2-3B,Llama-3.2,3.0,eng_Latn_000_00027_long,1024,16.968666793195208,36.74,3.0010647773742676,33.738935222625734,6.759565492224,1.0342999770421983,0.20658863417172807
63
+ Llama-4-109B-A17B,Llama-4,109.0,eng_Latn_000_00027_long,1024,17.624338545312984,37.49,3.8621890544891357,33.627810945510866,41.80362133504,0.9540158210898754,0.18802997648153794
64
+ Qwen1.5-0.5B,Qwen1.5,0.5,eng_Latn_000_00027_long,1024,17.213104219641906,35.46,3.7834298610687256,31.676570138931275,1.001482354688,1.0606488991022474,0.15658889039049387
65
+ Qwen1.5-1.8B,Qwen1.5,1.8,eng_Latn_000_00027_long,1024,17.213104219641906,35.46,3.4750893115997314,31.98491068840027,3.227030388736,1.0136773579992886,0.15798359250421692
66
+ Qwen1.5-4B,Qwen1.5,4.0,eng_Latn_000_00027_long,1024,17.213104219641906,35.46,3.1637372970581055,32.296262702941895,7.50725890048,0.9855007618107892,0.161612226668687
67
+ Qwen1.5-7B,Qwen1.5,7.0,eng_Latn_000_00027_long,1024,17.213104219641906,35.46,3.029648780822754,32.43035121917725,14.812000026624,0.9608471479805359,0.16089056347911662
68
+ Qwen1.5-14B,Qwen1.5,14.0,eng_Latn_000_00027_long,1024,17.214319120800766,35.46,2.9397261142730713,32.52027388572693,27.84707477504,0.9381951241695716,0.1592573931532204
69
+ Qwen1.5-14.3B-A2.7B,Qwen1.5,14.3,eng_Latn_000_00027_long,1024,17.213104219641906,35.46,2.9040884971618652,32.555911502838136,4.966492143616,1.0118272828412307,0.17267594670580705
70
+ Qwen1.5-32B,Qwen1.5,32.0,eng_Latn_000_00027_long,1024,17.214319120800766,35.46,2.746184825897217,32.713815174102784,65.67474757632,0.9112380793492809,0.1591574060468475
71
+ Qwen1.5-72B,Qwen1.5,72.0,eng_Latn_000_00027_long,1024,17.214319120800766,35.46,2.643311023712158,32.81668897628784,146.860769542144,0.8854671285631495,0.15694718285869966
72
+ Qwen2-0.5B,Qwen2,0.5,eng_Latn_000_00027_long,1024,17.213104219641906,35.46,3.685828685760498,31.774171314239503,1.056685686784,1.0611664572672252,0.1594436691932843
73
+ Qwen2-1.5B,Qwen2,1.5,eng_Latn_000_00027_long,1024,17.213104219641906,35.46,3.272855758666992,32.18714424133301,3.251336380416,1.0197367546718759,0.16433646908877708
74
+ Qwen2-7B,Qwen2,7.0,eng_Latn_000_00027_long,1024,17.214319120800766,35.46,2.875864267349243,32.58413573265076,14.69019324416,0.965744349046226,0.16550531130738882
75
+ Qwen2-57B-A14B,Qwen2,57.0,eng_Latn_000_00027_long,1024,17.213104219641906,35.46,2.706306219100952,32.75369378089905,27.316457570304,0.945686421681055,0.16612447192994448
76
+ Qwen2-72B,Qwen2,72.0,eng_Latn_000_00027_long,1024,17.214319120800766,35.46,2.5860800743103027,32.8739199256897,147.719763001344,0.8868100206479949,0.15845542796114429
77
+ Qwen2.5-0.5B,Qwen2.5,0.5,eng_Latn_000_00027_long,1024,17.213104219641906,35.46,3.5750572681427,31.8849427318573,1.056685686784,1.06486590584253,0.16314311776858886
78
+ Qwen2.5-1.5B,Qwen2.5,1.5,eng_Latn_000_00027_long,1024,17.213104219641906,35.46,3.1653454303741455,32.294654569625855,3.251336380416,1.0231428422839066,0.16774255670080795
79
+ Qwen2.5-3B,Qwen2.5,3.0,eng_Latn_000_00027_long,1024,17.213104219641906,35.46,3.0068860054016113,32.45311399459839,6.473975332864,0.9967849471403407,0.1674903044977664
80
+ Qwen2.5-7B,Qwen2.5,7.0,eng_Latn_000_00027_long,1024,17.214319120800766,35.46,2.85302734375,32.60697265625,14.69019324416,0.9664212008153361,0.16618216307649897
81
+ Qwen2.5-14B,Qwen2.5,14.0,eng_Latn_000_00027_long,1024,17.214319120800766,35.46,2.686429977416992,32.77357002258301,29.16769333248,0.9436827456926532,0.16624427572600822
82
+ Qwen2.5-32B,Qwen2.5,32.0,eng_Latn_000_00027_long,1024,17.214319120800766,35.46,2.6482460498809814,32.81175395011902,66.19014365184,0.913679127678695,0.16183463668234332
83
+ Qwen2.5-72B,Qwen2.5,72.0,eng_Latn_000_00027_long,1024,17.214319120800766,35.46,2.540452718734741,32.91954728126526,147.719763001344,0.888040868573388,0.15968627588653747
84
+ Qwen3-0.6B-Base,Qwen3,0.6,eng_Latn_000_00027_long,1024,17.213104219641906,35.46,3.4984476566314697,31.96155234336853,1.100258213888,1.0653503022110928,0.16537967967443015
85
+ Qwen3-1.7B-Base,Qwen3,1.7,eng_Latn_000_00027_long,1024,17.213104219641906,35.46,3.1593053340911865,32.300694665908814,3.643625439232,1.018033712757714,0.1670640810281264
86
+ Qwen3-4B-Base,Qwen3,4.0,eng_Latn_000_00027_long,1024,17.213104219641906,35.46,2.9608263969421387,32.49917360305786,7.70592210944,0.9905535020993471,0.16761120567843357
87
+ Qwen3-8B-Base,Qwen3,8.0,eng_Latn_000_00027_long,1024,17.213104219641906,35.46,2.8185057640075684,32.64149423599243,15.808398884864,0.9644191066260146,0.16668246838750186
88
+ Seed-OSS-36B-Base,Seed-OSS,36.0,eng_Latn_000_00027_long,1024,17.24317398347295,34.98,2.6390929222106934,32.3409070777893,65.5351611392,0.9009278162215472,0.14878283217787336
89
+ gemma-3-0.27b-pt,gemma-3,0.27,eng_Latn_000_00027_long,1024,18.0,35.77,3.8199846744537354,31.950015325546268,0.550436864,1.101656814307166,0.17067967131623638
90
+ gemma-3-1b-pt,gemma-3,1.0,eng_Latn_000_00027_long,1024,18.0,35.77,3.2813682556152344,32.48863174438477,2.129873338368,1.0495810457391124,0.17731629609006008
91
+ gemma-3-4b-pt,gemma-3,4.0,eng_Latn_000_00027_long,1024,18.000352177480302,35.77,2.840498447418213,32.92950155258179,8.4021870592,0.9998663841537142,0.18004248463180753
92
+ gemma-3-12b-pt,gemma-3,12.0,eng_Latn_000_00027_long,1024,18.000352177480302,35.77,2.6129720211029053,33.1570279788971,24.19152912384,0.9622009408653925,0.17867397880171507
93
+ gemma-3-27b-pt,gemma-3,27.0,eng_Latn_000_00027_long,1024,18.000352177480302,35.77,2.5094683170318604,33.26053168296814,58.631962755072,0.9307094035037331,0.17518468326996775
94
+ glm-4-9b-hf,glm-4,9.0,eng_Latn_000_00027_long,1024,17.20945336562895,36.64,2.98236083984375,33.65763916015625,18.321994940416,0.9882261109739138,0.19547576775073794
95
+ internlm2.5-1.8b,internlm2.5,1.8,eng_Latn_000_00027_long,1024,16.497851836951117,35.25,3.5973238945007324,31.652676105499268,3.583512674304,0.9983650437226992,0.14675123101794574
96
+ internlm2.5-7b,internlm2.5,7.0,eng_Latn_000_00027_long,1024,16.497851836951117,35.25,3.087465524673462,32.16253447532654,15.344575971328,0.9514756224936899,0.15272508164195545
97
+ internlm2.5-20b,internlm2.5,20.0,eng_Latn_000_00027_long,1024,16.497851836951117,35.25,2.8226184844970703,32.42738151550293,40.127812337664,0.921502918277299,0.15423224668168684
98
+ DeepSeek-V2-236B-A21B,DeepSeek-V2,236.0,IndustryCorpus_batch_aa_long,1024,16.643856189774723,30.81,2.1160805225372314,28.693919477462767,37.7957122048,0.8174140164325766,0.28470038282476384
99
+ DeepSeek-V3.1-Base-671B-A37B,DeepSeek-V3.1-Base,671.0,IndustryCorpus_batch_aa_long,1024,16.980139577639157,33.98,2.5056979656219482,31.47430203437805,78.006806642688,0.8706905723403515,0.3533823986759911
100
+ GLM-4-32B-Base-0414,GLM-4,32.0,IndustryCorpus_batch_aa_long,1024,17.20945336562895,33.23,3.1385788917541504,30.091421108245846,65.5704981504,0.8382452267621728,0.3173264677555663
101
+ GLM-4.5-Air-Base-106B-A12B,GLM-4.5-Air-Base,106.0,IndustryCorpus_batch_aa_long,1024,17.20945336562895,33.23,2.8672702312469482,30.36272976875305,17.749377810432,0.8926845098689524,0.3428920352895176
102
+ GLM-4.5-Base-355B-A32B,GLM-4.5-Base,355.0,IndustryCorpus_batch_aa_long,1024,17.20945336562895,33.23,2.4935522079467773,30.73644779205322,48.828658745344,0.866479486404565,0.3393149127561219
103
+ Hunyuan-0.5B-Pretrain,Hunyuan,0.5,IndustryCorpus_batch_aa_long,1024,16.882475884200698,35.12,4.691961765289307,30.42803823471069,1.000647688192,1.0188844641181696,0.39271397846145845
104
+ Hunyuan-1.8B-Pretrain,Hunyuan,1.8,IndustryCorpus_batch_aa_long,1024,16.882475884200698,35.12,4.18785285949707,30.932147140502927,3.805148086272,0.9729816559962429,0.3847665254886905
105
+ Hunyuan-4B-Pretrain,Hunyuan,4.0,IndustryCorpus_batch_aa_long,1024,16.882475884200698,35.12,3.870864152908325,31.249135847091672,8.297562243072,0.9493651198464914,0.3812493220849461
106
+ Hunyuan-7B-Pretrain,Hunyuan,7.0,IndustryCorpus_batch_aa_long,1024,16.967654067617747,35.12,3.29822039604187,31.821779603958127,15.643394965504,0.9406206761842525,0.3878669690201927
107
+ Llama-3.1-8B,Llama-3.1,8.0,IndustryCorpus_batch_aa_long,1024,16.968666793195208,23.9,3.213531494140625,20.686468505859374,15.644149940224,0.6114705145453709,0.05871794497267406
108
+ Llama-3.1-70B,Llama-3.1,70.0,IndustryCorpus_batch_aa_long,1024,16.968666793195208,23.9,2.785083770751953,21.114916229248045,143.712558514176,0.5702083147542876,0.06521481299769029
109
+ Llama-3.2-1B,Llama-3.2,1.0,IndustryCorpus_batch_aa_long,1024,16.968666793195208,23.9,3.962632656097412,19.937367343902586,2.59946184704,0.6381723986901376,0.039606717993319066
110
+ Llama-3.2-3B,Llama-3.2,3.0,IndustryCorpus_batch_aa_long,1024,16.968666793195208,23.9,3.5783565044403076,20.32164349555969,6.759565492224,0.6229798084090618,0.04971306353210651
111
+ Llama-4-109B-A17B,Llama-4,109.0,IndustryCorpus_batch_aa_long,1024,17.624338545312984,29.49,4.475708484649658,25.01429151535034,41.80362133504,0.7096516005061037,0.17913547849958852
112
+ Qwen1.5-0.5B,Qwen1.5,0.5,IndustryCorpus_batch_aa_long,1024,17.213104219641906,31.16,4.202773571014404,26.957226428985596,1.001482354688,0.9026277911197566,0.27648252582680144
113
+ Qwen1.5-1.8B,Qwen1.5,1.8,IndustryCorpus_batch_aa_long,1024,17.213104219641906,31.16,3.8544676303863525,27.305532369613648,3.227030388736,0.8653768078593433,0.27272964434979374
114
+ Qwen1.5-4B,Qwen1.5,4.0,IndustryCorpus_batch_aa_long,1024,17.213104219641906,31.16,3.698274850845337,27.461725149154663,7.50725890048,0.8379777965041504,0.2673586999427686
115
+ Qwen1.5-7B,Qwen1.5,7.0,IndustryCorpus_batch_aa_long,1024,17.213104219641906,31.16,3.5112204551696777,27.648779544830322,14.812000026624,0.8191786389005619,0.26513463407920856
116
+ Qwen1.5-14B,Qwen1.5,14.0,IndustryCorpus_batch_aa_long,1024,17.214319120800766,31.16,3.409911870956421,27.75008812904358,27.84707477504,0.8005774326941106,0.26109093010130446
117
+ Qwen1.5-14.3B-A2.7B,Qwen1.5,14.3,IndustryCorpus_batch_aa_long,1024,17.213104219641906,31.16,3.3413312435150146,27.818668756484985,4.966492143616,0.8645952983893754,0.28340529891780436
118
+ Qwen1.5-32B,Qwen1.5,32.0,IndustryCorpus_batch_aa_long,1024,17.214319120800766,31.16,3.0849609375,28.0750390625,65.67474757632,0.7820257141154489,0.2611402107541339
119
+ Qwen1.5-72B,Qwen1.5,72.0,IndustryCorpus_batch_aa_long,1024,17.214319120800766,31.16,2.940380811691284,28.219619188308716,146.860769542144,0.7614279792172932,0.2568604612664335
120
+ Qwen2-0.5B,Qwen2,0.5,IndustryCorpus_batch_aa_long,1024,17.213104219641906,31.16,4.184194564819336,26.975805435180664,1.056685686784,0.9009147587981956,0.27638823520624384
121
+ Qwen2-1.5B,Qwen2,1.5,IndustryCorpus_batch_aa_long,1024,17.213104219641906,31.16,3.7292630672454834,27.430736932754517,3.251336380416,0.8690466742975209,0.2766027728010786
122
+ Qwen2-7B,Qwen2,7.0,IndustryCorpus_batch_aa_long,1024,17.214319120800766,31.16,3.2501893043518066,27.909810695648194,14.69019324416,0.8272044464651339,0.27296481662379113
123
+ Qwen2-57B-A14B,Qwen2,57.0,IndustryCorpus_batch_aa_long,1024,17.213104219641906,31.16,3.0333728790283203,28.12662712097168,27.316457570304,0.8120906769758203,0.27217184511116227
124
+ Qwen2-72B,Qwen2,72.0,IndustryCorpus_batch_aa_long,1024,17.214319120800766,31.16,2.81121826171875,28.34878173828125,147.719763001344,0.764739458376084,0.2602864627003764
125
+ Qwen2.5-0.5B,Qwen2.5,0.5,IndustryCorpus_batch_aa_long,1024,17.213104219641906,31.16,4.130499839782715,27.029500160217285,1.056685686784,0.9027080090635617,0.27818148547161
126
+ Qwen2.5-1.5B,Qwen2.5,1.5,IndustryCorpus_batch_aa_long,1024,17.213104219641906,31.16,3.6513099670410156,27.508690032958985,3.251336380416,0.8715163448225947,0.2790724433261523
127
+ Qwen2.5-3B,Qwen2.5,3.0,IndustryCorpus_batch_aa_long,1024,17.213104219641906,31.16,3.4603397846221924,27.699660215377808,6.473975332864,0.8507844377641656,0.2764211111931975
128
+ Qwen2.5-7B,Qwen2.5,7.0,IndustryCorpus_batch_aa_long,1024,17.214319120800766,31.16,3.2639808654785156,27.896019134521485,14.69019324416,0.8267956855168023,0.27255605567545954
129
+ Qwen2.5-14B,Qwen2.5,14.0,IndustryCorpus_batch_aa_long,1024,17.214319120800766,31.16,3.025247812271118,28.134752187728882,29.16769333248,0.8101125442118022,0.27166441871638514
130
+ Qwen2.5-32B,Qwen2.5,32.0,IndustryCorpus_batch_aa_long,1024,17.214319120800766,31.16,2.9765195846557617,28.18348041534424,66.19014365184,0.7847997958288938,0.26407787058327253
131
+ Qwen2.5-72B,Qwen2.5,72.0,IndustryCorpus_batch_aa_long,1024,17.214319120800766,31.16,2.777780532836914,28.382219467163086,147.719763001344,0.765641477761273,0.2611884820855654
132
+ Qwen3-0.6B-Base,Qwen3,0.6,IndustryCorpus_batch_aa_long,1024,17.213104219641906,31.16,3.992006778717041,27.16799322128296,1.100258213888,0.9055702137936984,0.28225722707386164
133
+ Qwen3-1.7B-Base,Qwen3,1.7,IndustryCorpus_batch_aa_long,1024,17.213104219641906,31.16,3.562650203704834,27.597349796295166,3.643625439232,0.869796540476515,0.28042127701935626
134
+ Qwen3-4B-Base,Qwen3,4.0,IndustryCorpus_batch_aa_long,1024,17.213104219641906,31.16,3.315218687057495,27.844781312942505,7.70592210944,0.8486906769263349,0.2787269382940727
135
+ Qwen3-8B-Base,Qwen3,8.0,IndustryCorpus_batch_aa_long,1024,17.213104219641906,31.16,3.1017580032348633,28.058241996765137,15.808398884864,0.8290032461252621,0.2764967596415514
136
+ Qwen3-14B-Base,Qwen3,14.0,IndustryCorpus_batch_aa_long,1024,17.213104219641906,31.16,2.942368745803833,28.217631254196167,29.08053569536,0.8125999853290552,0.2740849133598717
137
+ Seed-OSS-36B-Base,Seed-OSS,36.0,IndustryCorpus_batch_aa_long,1024,17.24317398347295,31.93,2.844463586807251,29.08553641319275,65.5351611392,0.8102422341260206,0.2893121896216983
138
+ gemma-3-0.27b-pt,gemma-3,0.27,IndustryCorpus_batch_aa_long,1024,18.0,28.58,5.01190185546875,23.56809814453125,0.550436864,0.8126429880120569,0.16785511490352403
139
+ gemma-3-1b-pt,gemma-3,1.0,IndustryCorpus_batch_aa_long,1024,18.0,28.58,4.134049415588379,24.44595058441162,2.129873338368,0.7897533691275891,0.18562926474102326
140
+ gemma-3-4b-pt,gemma-3,4.0,IndustryCorpus_batch_aa_long,1024,18.000352177480302,28.58,3.670428991317749,24.90957100868225,8.4021870592,0.7563504311020635,0.18854647106281708
141
+ gemma-3-12b-pt,gemma-3,12.0,IndustryCorpus_batch_aa_long,1024,18.000352177480302,28.58,3.340955972671509,25.23904402732849,24.19152912384,0.7324248700786702,0.18975990005678986
142
+ gemma-3-27b-pt,gemma-3,27.0,IndustryCorpus_batch_aa_long,1024,18.000352177480302,28.58,3.1846868991851807,25.395313100814818,58.631962755072,0.7106217342867404,0.18735090953224365
143
+ glm-4-9b-hf,glm-4,9.0,IndustryCorpus_batch_aa_long,1024,17.20945336562895,33.23,3.481240749359131,29.748759250640866,18.321994940416,0.8734570039410805,0.3244039884494736
144
+ internlm2.5-1.8b,internlm2.5,1.8,IndustryCorpus_batch_aa_long,1024,16.497851836951117,32.52,4.206731796264648,28.313268203735355,3.583512674304,0.893035936485753,0.3032145180569053
145
+ internlm2.5-7b,internlm2.5,7.0,IndustryCorpus_batch_aa_long,1024,16.497851836951117,32.52,3.602144718170166,28.917855281829837,15.344575971328,0.8554871313568062,0.3022784234335679
146
+ internlm2.5-20b,internlm2.5,20.0,IndustryCorpus_batch_aa_long,1024,16.497851836951117,32.52,3.216423988342285,29.303576011657718,40.127812337664,0.8327323869117662,0.3013264032511015
147
+ DeepSeek-V2-236B-A21B,DeepSeek-V2,236.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,16.643856189774723,36.61,2.476067304611206,34.13393269538879,37.7957122048,0.9723856318441222,0.20322690952268135
148
+ DeepSeek-V3.1-Base-671B-A37B,DeepSeek-V3.1-Base,671.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,16.980139577639157,38.51,2.215646266937256,36.29435373306274,78.006806642688,1.0040302590363075,0.25711471417332715
149
+ GLM-4-32B-Base-0414,GLM-4,32.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.20945336562895,37.99,2.6497623920440674,35.340237607955935,65.5704981504,0.984459503622193,0.23233081414741358
150
+ GLM-4.5-Air-Base-106B-A12B,GLM-4.5-Air-Base,106.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.20945336562895,37.99,2.375840187072754,35.61415981292725,17.749377810432,1.0470800563431408,0.2532620449182884
151
+ GLM-4.5-Base-355B-A32B,GLM-4.5-Base,355.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.20945336562895,37.99,1.9201092720031738,36.06989072799683,48.828658745344,1.0168325436989507,0.2556858330835516
152
+ Hunyuan-0.5B-Pretrain,Hunyuan,0.5,CC-MAIN-2013-20_train-00000-of-00014_long,1024,16.882475884200698,38.16,4.17264461517334,33.98735538482666,1.000647688192,1.138068386497548,0.23397196335684195
153
+ Hunyuan-1.8B-Pretrain,Hunyuan,1.8,CC-MAIN-2013-20_train-00000-of-00014_long,1024,16.882475884200698,38.16,3.7287282943725586,34.43127170562744,3.805148086272,1.0830478598859163,0.23375328642581414
154
+ Hunyuan-4B-Pretrain,Hunyuan,4.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,16.882475884200698,38.16,3.449779510498047,34.71022048950195,8.297562243072,1.054514684699066,0.23424053819843918
155
+ Hunyuan-7B-Pretrain,Hunyuan,7.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,16.967654067617747,38.16,3.1347908973693848,35.02520910263061,15.643394965504,1.0353109184853178,0.23721733060138117
156
+ Llama-3.1-8B,Llama-3.1,8.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,16.968666793195208,38.02,2.9178566932678223,35.10214330673218,15.644149940224,1.0375828829040243,0.2394909375316813
157
+ Llama-3.1-70B,Llama-3.1,70.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,16.968666793195208,38.02,2.35628604888916,35.66371395111084,143.712558514176,0.9630985985998436,0.2339635960635802
158
+ Llama-3.2-1B,Llama-3.2,1.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,16.968666793195208,38.02,3.465826988220215,34.55417301177979,2.59946184704,1.1060396839417972,0.241800465823396
159
+ Llama-3.2-3B,Llama-3.2,3.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,16.968666793195208,38.02,3.1911160945892334,34.82888390541077,6.759565492224,1.0677134173343428,0.2400020744638726
160
+ Llama-4-109B-A17B,Llama-4,109.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.624338545312984,38.38,4.081301689147949,34.29869831085205,41.80362133504,0.9730487923927618,0.2070629477844243
161
+ Qwen1.5-0.5B,Qwen1.5,0.5,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.213104219641906,37.29,4.016155242919922,33.27384475708008,1.001482354688,1.114131569665161,0.21007156095340754
162
+ Qwen1.5-1.8B,Qwen1.5,1.8,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.213104219641906,37.29,3.6896677017211914,33.60033229827881,3.227030388736,1.0648738839333285,0.20918011843825682
163
+ Qwen1.5-4B,Qwen1.5,4.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.213104219641906,37.29,3.4003915786743164,33.88960842132568,7.50725890048,1.034120734769832,0.2102321996277299
164
+ Qwen1.5-7B,Qwen1.5,7.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.213104219641906,37.29,3.2589685916900635,34.031031408309936,14.812000026624,1.0082721352760053,0.20831555077458594
165
+ Qwen1.5-14B,Qwen1.5,14.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.214319120800766,37.29,3.168458938598633,34.121541061401366,27.84707477504,0.9843909545610829,0.20545322354473175
166
+ Qwen1.5-14.3B-A2.7B,Qwen1.5,14.3,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.213104219641906,37.29,3.10791015625,34.18208984375,4.966492143616,1.0623683838623668,0.22321704772694323
167
+ Qwen1.5-32B,Qwen1.5,32.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.214319120800766,37.29,2.9246299266815186,34.36537007331848,65.67474757632,0.9572418764084689,0.20516120310603542
168
+ Qwen1.5-72B,Qwen1.5,72.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.214319120800766,37.29,2.7939274311065674,34.49607256889343,146.860769542144,0.9307806264780372,0.20226068077358736
169
+ Qwen2-0.5B,Qwen2,0.5,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.213104219641906,37.29,3.9345626831054688,33.35543731689453,1.056685686784,1.1139762198079894,0.21225343173404826
170
+ Qwen2-1.5B,Qwen2,1.5,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.213104219641906,37.29,3.5078747272491455,33.782125272750854,3.251336380416,1.070268133552411,0.21486784796931227
171
+ Qwen2-7B,Qwen2,7.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.214319120800766,37.29,3.1015849113464355,34.188415088653564,14.69019324416,1.0132927552725952,0.21305371753375799
172
+ Qwen2-57B-A14B,Qwen2,57.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.213104219641906,37.29,2.859682321548462,34.43031767845154,27.316457570304,0.9940950214801411,0.21453307172903058
173
+ Qwen2-72B,Qwen2,72.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.214319120800766,37.29,2.7257165908813477,34.56428340911865,147.719763001344,0.9324094282948697,0.20405483560801915
174
+ Qwen2.5-0.5B,Qwen2.5,0.5,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.213104219641906,37.29,3.751422166824341,33.53857783317566,1.056685686784,1.1200925893246678,0.21836980125072677
175
+ Qwen2.5-1.5B,Qwen2.5,1.5,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.213104219641906,37.29,3.292654037475586,33.99734596252441,3.251336380416,1.0770866461263255,0.22168636054322688
176
+ Qwen2.5-3B,Qwen2.5,3.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.213104219641906,37.29,3.1040964126586914,34.18590358734131,6.473975332864,1.0500069147732485,0.22071227213067415
177
+ Qwen2.5-7B,Qwen2.5,7.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.214319120800766,37.29,2.892796277999878,34.39720372200012,14.69019324416,1.019480933607412,0.21924189586857487
178
+ Qwen2.5-14B,Qwen2.5,14.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.214319120800766,37.29,2.553492784500122,34.73650721549988,29.16769333248,1.000203593392724,0.22276512342607901
179
+ Qwen2.5-32B,Qwen2.5,32.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.214319120800766,37.29,2.436856508255005,34.853143491744994,66.19014365184,0.9705238491916229,0.21867935819527135
180
+ Qwen2.5-72B,Qwen2.5,72.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.214319120800766,37.29,2.0375590324401855,35.252440967559814,147.719763001344,0.9509732326720101,0.22261863998515952
181
+ Qwen3-0.6B-Base,Qwen3,0.6,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.213104219641906,37.29,3.7444427013397217,33.54555729866028,1.100258213888,1.1181487439042437,0.21817812136758097
182
+ Qwen3-1.7B-Base,Qwen3,1.7,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.213104219641906,37.29,3.383861541748047,33.90613845825195,3.643625439232,1.0686331169330026,0.217663485203415
183
+ Qwen3-4B-Base,Qwen3,4.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.213104219641906,37.29,3.1635825634002686,34.12641743659973,7.70592210944,1.0401508271812625,0.21720853076034896
184
+ Qwen3-8B-Base,Qwen3,8.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.213104219641906,37.29,2.99318528175354,34.29681471824646,15.808398884864,1.0133268768749288,0.21559023863641597
185
+ Qwen3-14B-Base,Qwen3,14.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.213104219641906,37.29,2.8621976375579834,34.427802362442016,29.08053569536,0.9914379928850957,0.21390286223440289
186
+ Seed-OSS-36B-Base,Seed-OSS,36.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.24317398347295,36.91,2.808408737182617,34.10159126281738,65.5351611392,0.9499755857865061,0.1978306017428323
187
+ gemma-3-0.27b-pt,gemma-3,0.27,CC-MAIN-2013-20_train-00000-of-00014_long,1024,18.0,37.53,4.112582206726074,33.41741779327393,0.550436864,1.1522537830857935,0.22127664009486364
188
+ gemma-3-1b-pt,gemma-3,1.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,18.0,37.53,3.5602779388427734,33.96972206115723,2.129873338368,1.0974293003453037,0.22516455069625135
189
+ gemma-3-4b-pt,gemma-3,4.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,18.000352177480302,37.53,3.136937379837036,34.393062620162965,8.4021870592,1.044305730139375,0.22448183061746838
190
+ gemma-3-12b-pt,gemma-3,12.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,18.000352177480302,37.53,2.879539966583252,34.65046003341675,24.19152912384,1.0055396179293294,0.22201265586565205
191
+ gemma-3-27b-pt,gemma-3,27.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,18.000352177480302,37.53,2.744044065475464,34.78595593452454,58.631962755072,0.9733944305739163,0.2178697103401509
192
+ glm-4-9b-hf,glm-4,9.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,17.20945336562895,37.99,3.060659170150757,34.929340829849245,18.321994940416,1.025564701163788,0.23281435794061228
193
+ internlm2.5-1.8b,internlm2.5,1.8,CC-MAIN-2013-20_train-00000-of-00014_long,1024,16.497851836951117,36.59,3.7362446784973145,32.85375532150269,3.583512674304,1.0362485863338513,0.18463477362909794
194
+ internlm2.5-7b,internlm2.5,7.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,16.497851836951117,36.59,3.211712121963501,33.3782878780365,15.344575971328,0.9874416850106128,0.18869114415887844
195
+ internlm2.5-20b,internlm2.5,20.0,CC-MAIN-2013-20_train-00000-of-00014_long,1024,16.497851836951117,36.59,2.9276952743530273,33.662304725646976,40.127812337664,0.9565962649741965,0.1893255933785843
196
+ DeepSeek-V2-236B-A21B,DeepSeek-V2,236.0,NextCoderDataset_v1_long,1024,16.643856189774723,28.37,0.4581535756587982,27.911846424341203,37.7957122048,0.7951348197547613,0.025976097433320515
197
+ DeepSeek-V3.1-Base-671B-A37B,DeepSeek-V3.1-Base,671.0,NextCoderDataset_v1_long,1024,16.980139577639157,32.97,0.41526371240615845,32.55473628759384,78.006806642688,0.9005792071155108,0.15366366225253045
198
+ GLM-4-32B-Base-0414,GLM-4,32.0,NextCoderDataset_v1_long,1024,17.20945336562895,35.01,0.47286882996559143,34.53713117003441,65.5704981504,0.9620876742643162,0.20995898478953665
199
+ GLM-4.5-Air-Base-106B-A12B,GLM-4.5-Air-Base,106.0,NextCoderDataset_v1_long,1024,17.20945336562895,35.01,0.5217994451522827,34.488200554847715,17.749377810432,1.013976103039656,0.22015809161480335
200
+ GLM-4.5-Base-355B-A32B,GLM-4.5-Base,355.0,NextCoderDataset_v1_long,1024,17.20945336562895,35.01,0.47699496150016785,34.53300503849983,48.828658745344,0.9735067849155241,0.21236007430012496
201
+ Hunyuan-0.5B-Pretrain,Hunyuan,0.5,NextCoderDataset_v1_long,1024,16.882475884200698,33.73,0.8001349568367004,32.929865043163296,1.000647688192,1.1026582666677818,0.19856184352707576
202
+ Hunyuan-1.8B-Pretrain,Hunyuan,1.8,NextCoderDataset_v1_long,1024,16.882475884200698,33.73,0.6687179803848267,33.06128201961517,3.805148086272,1.0399543485516005,0.19065977509149828
203
+ Hunyuan-4B-Pretrain,Hunyuan,4.0,NextCoderDataset_v1_long,1024,16.882475884200698,33.73,0.5728369951248169,33.15716300487518,8.297562243072,1.0073319846002278,0.1870578380996009
204
+ Hunyuan-7B-Pretrain,Hunyuan,7.0,NextCoderDataset_v1_long,1024,16.967654067617747,33.73,0.5430698990821838,33.18693010091781,15.643394965504,0.9809731894479596,0.18287960156402308
205
+ Llama-3.1-8B,Llama-3.1,8.0,NextCoderDataset_v1_long,1024,16.968666793195208,34.97,0.5863305926322937,34.383669407367705,15.644149940224,1.016345540976504,0.21825359560416102
206
+ Llama-3.1-70B,Llama-3.1,70.0,NextCoderDataset_v1_long,1024,16.968666793195208,34.97,0.5053007006645203,34.46469929933548,143.712558514176,0.9307192078160197,0.20158420527975623
207
+ Llama-3.2-1B,Llama-3.2,1.0,NextCoderDataset_v1_long,1024,16.968666793195208,34.97,0.7732560038566589,34.19674399614334,2.59946184704,1.0945987886452613,0.23035957052685993
208
+ Llama-3.2-3B,Llama-3.2,3.0,NextCoderDataset_v1_long,1024,16.968666793195208,34.97,0.658105731010437,34.31189426898956,6.759565492224,1.0518645956227757,0.22415325275230538
209
+ Llama-4-109B-A17B,Llama-4,109.0,NextCoderDataset_v1_long,1024,17.624338545312984,34.67,0.6906706690788269,33.979329330921175,41.80362133504,0.9639883435840929,0.1980024989757555
210
+ Qwen1.5-0.5B,Qwen1.5,0.5,NextCoderDataset_v1_long,1024,17.213104219641906,34.73,1.0023809671401978,33.7276190328598,1.001482354688,1.1293256132101457,0.22526560449839214
211
+ Qwen1.5-1.8B,Qwen1.5,1.8,NextCoderDataset_v1_long,1024,17.213104219641906,34.73,0.8330395221710205,33.896960477828976,3.227030388736,1.0742747314855965,0.21858096599052468
212
+ Qwen1.5-4B,Qwen1.5,4.0,NextCoderDataset_v1_long,1024,17.213104219641906,34.73,0.7091187834739685,34.02088121652603,7.50725890048,1.0381264440639661,0.21423790892186406
213
+ Qwen1.5-7B,Qwen1.5,7.0,NextCoderDataset_v1_long,1024,17.213104219641906,34.73,0.6437075138092041,34.08629248619079,14.812000026624,1.0099094116877623,0.20995282718634287
214
+ Qwen1.5-14B,Qwen1.5,14.0,NextCoderDataset_v1_long,1024,17.214319120800766,34.73,0.6092844605445862,34.12071553945541,27.84707477504,0.9843671386280649,0.20542940761171372
215
+ Qwen1.5-14.3B-A2.7B,Qwen1.5,14.3,NextCoderDataset_v1_long,1024,17.213104219641906,34.73,0.6294852495193481,34.10051475048065,4.966492143616,1.0598330561396874,0.2206817200042637
216
+ Qwen1.5-32B,Qwen1.5,32.0,NextCoderDataset_v1_long,1024,17.214319120800766,34.73,0.5840258002281189,34.14597419977188,65.67474757632,0.9511306395085909,0.19904996620615747
217
+ Qwen1.5-72B,Qwen1.5,72.0,NextCoderDataset_v1_long,1024,17.214319120800766,34.73,0.5431849360466003,34.1868150639534,146.860769542144,0.9224361723777554,0.19391622667330558
218
+ Qwen2-0.5B,Qwen2,0.5,NextCoderDataset_v1_long,1024,17.213104219641906,34.73,0.8169111013412476,33.91308889865875,1.056685686784,1.1326001879221477,0.2308773998482066
219
+ Qwen2-1.5B,Qwen2,1.5,NextCoderDataset_v1_long,1024,17.213104219641906,34.73,0.6744095087051392,34.05559049129486,3.251336380416,1.0789319197020253,0.22353163411892654
220
+ Qwen2-7B,Qwen2,7.0,NextCoderDataset_v1_long,1024,17.214319120800766,34.73,0.5678777694702148,34.16212223052978,14.69019324416,1.0125134748472477,0.21227443710841062
221
+ Qwen2-57B-A14B,Qwen2,57.0,NextCoderDataset_v1_long,1024,17.213104219641906,34.73,0.5394113063812256,34.19058869361877,27.316457570304,0.9871734068568786,0.20761145710576814
222
+ Qwen2-72B,Qwen2,72.0,NextCoderDataset_v1_long,1024,17.214319120800766,34.73,0.498881459236145,34.23111854076385,147.719763001344,0.9234219408138279,0.19506734812697735
223
+ Qwen2.5-0.5B,Qwen2.5,0.5,NextCoderDataset_v1_long,1024,17.213104219641906,34.73,0.7577647566795349,33.97223524332046,1.056685686784,1.13457550669299,0.23285271861904888
224
+ Qwen2.5-1.5B,Qwen2.5,1.5,NextCoderDataset_v1_long,1024,17.213104219641906,34.73,0.6171697378158569,34.11283026218414,3.251336380416,1.080745361048892,0.22534507546579333
225
+ Qwen2.5-3B,Qwen2.5,3.0,NextCoderDataset_v1_long,1024,17.213104219641906,34.73,0.5702103972434998,34.1597896027565,6.473975332864,1.0492048337542028,0.21991019111162846
226
+ Qwen2.5-7B,Qwen2.5,7.0,NextCoderDataset_v1_long,1024,17.214319120800766,34.73,0.518409252166748,34.21159074783325,14.69019324416,1.0139796466504067,0.21374060891156962
227
+ Qwen2.5-14B,Qwen2.5,14.0,NextCoderDataset_v1_long,1024,17.214319120800766,34.73,0.4861307442188263,34.24386925578117,29.16769333248,0.9860185674056425,0.2085800974389975
228
+ Qwen2.5-32B,Qwen2.5,32.0,NextCoderDataset_v1_long,1024,17.214319120800766,34.73,0.46853765845298767,34.26146234154701,66.19014365184,0.9540478412952252,0.20220335029887357
229
+ Qwen2.5-72B,Qwen2.5,72.0,NextCoderDataset_v1_long,1024,17.214319120800766,34.73,0.4511546492576599,34.27884535074234,147.719763001344,0.9247094238227954,0.19635483113594485
230
+ Qwen3-0.6B-Base,Qwen3,0.6,NextCoderDataset_v1_long,1024,17.213104219641906,34.73,0.7059367895126343,34.02406321048736,1.100258213888,1.1340984203247806,0.23412779778811782
231
+ Qwen3-1.7B-Base,Qwen3,1.7,NextCoderDataset_v1_long,1024,17.213104219641906,34.73,0.5859696269035339,34.14403037309646,3.643625439232,1.076130850087324,0.22516121835773648
232
+ Qwen3-4B-Base,Qwen3,4.0,NextCoderDataset_v1_long,1024,17.213104219641906,34.73,0.5191898941993713,34.210810105800626,7.70592210944,1.0427230604032356,0.2197807639823221
233
+ Qwen3-8B-Base,Qwen3,8.0,NextCoderDataset_v1_long,1024,17.213104219641906,34.73,0.4935953617095947,34.2364046382904,15.808398884864,1.0115420126490078,0.21380537441049505
234
+ Qwen3-14B-Base,Qwen3,14.0,NextCoderDataset_v1_long,1024,17.213104219641906,34.73,0.47131988406181335,34.25868011593818,29.08053569536,0.9865676785135663,0.2090325478628734
235
+ Seed-OSS-36B-Base,Seed-OSS,36.0,NextCoderDataset_v1_long,1024,17.24317398347295,30.29,0.4337354302406311,29.856264569759368,65.5351611392,0.8317125792009394,0.0795675951572656
236
+ gemma-3-0.27b-pt,gemma-3,0.27,NextCoderDataset_v1_long,1024,18.0,29.05,1.393586277961731,27.65641372203827,0.550436864,0.9536107049006791,0.022633561909749286
237
+ gemma-3-1b-pt,gemma-3,1.0,NextCoderDataset_v1_long,1024,18.0,29.05,0.951468288898468,28.098531711101533,2.129873338368,0.9077540269811087,0.035489277332056424
238
+ gemma-3-4b-pt,gemma-3,4.0,NextCoderDataset_v1_long,1024,18.000352177480302,29.05,0.5508195757865906,28.49918042421341,8.4021870592,0.8653447862428527,0.04552088672094608
239
+ gemma-3-12b-pt,gemma-3,12.0,NextCoderDataset_v1_long,1024,18.000352177480302,29.05,0.48889875411987305,28.561101245880128,24.19152912384,0.8288293663843544,0.045302404320676976
240
+ gemma-3-27b-pt,gemma-3,27.0,NextCoderDataset_v1_long,1024,18.000352177480302,29.05,0.4688594937324524,28.58114050626755,58.631962755072,0.799768821665175,0.04424410143140975
241
+ glm-4-9b-hf,glm-4,9.0,NextCoderDataset_v1_long,1024,17.20945336562895,35.01,0.6237372159957886,34.38626278400421,18.321994940416,1.0096193194141354,0.21686897619095954
242
+ internlm2.5-1.8b,internlm2.5,1.8,NextCoderDataset_v1_long,1024,16.497851836951117,34.28,0.9094681143760681,33.37053188562393,3.583512674304,1.0525483663371016,0.20093455363234813
243
+ internlm2.5-7b,internlm2.5,7.0,NextCoderDataset_v1_long,1024,16.497851836951117,34.28,0.6683759689331055,33.611624031066896,15.344575971328,0.9943445508785125,0.19559401002677804
244
+ internlm2.5-20b,internlm2.5,20.0,NextCoderDataset_v1_long,1024,16.497851836951117,34.28,0.5986665487289429,33.68133345127106,40.127812337664,0.9571370124960186,0.18986634090040644
package-lock.json CHANGED
@@ -8,6 +8,7 @@
8
  "name": "vue",
9
  "version": "0.0.0",
10
  "dependencies": {
 
11
  "pinia": "^3.0.1",
12
  "vue": "^3.5.13",
13
  "vue-router": "^4.5.0"
@@ -2905,6 +2906,16 @@
2905
  "dev": true,
2906
  "license": "MIT"
2907
  },
 
 
 
 
 
 
 
 
 
 
2908
  "node_modules/electron-to-chromium": {
2909
  "version": "1.5.249",
2910
  "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.249.tgz",
@@ -5512,6 +5523,12 @@
5512
  "dev": true,
5513
  "license": "Apache-2.0"
5514
  },
 
 
 
 
 
 
5515
  "node_modules/type-check": {
5516
  "version": "0.4.0",
5517
  "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@@ -6130,6 +6147,15 @@
6130
  "funding": {
6131
  "url": "https://github.com/sponsors/sindresorhus"
6132
  }
 
 
 
 
 
 
 
 
 
6133
  }
6134
  }
6135
  }
 
8
  "name": "vue",
9
  "version": "0.0.0",
10
  "dependencies": {
11
+ "echarts": "^6.0.0",
12
  "pinia": "^3.0.1",
13
  "vue": "^3.5.13",
14
  "vue-router": "^4.5.0"
 
2906
  "dev": true,
2907
  "license": "MIT"
2908
  },
2909
+ "node_modules/echarts": {
2910
+ "version": "6.0.0",
2911
+ "resolved": "https://registry.npmjs.org/echarts/-/echarts-6.0.0.tgz",
2912
+ "integrity": "sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==",
2913
+ "license": "Apache-2.0",
2914
+ "dependencies": {
2915
+ "tslib": "2.3.0",
2916
+ "zrender": "6.0.0"
2917
+ }
2918
+ },
2919
  "node_modules/electron-to-chromium": {
2920
  "version": "1.5.249",
2921
  "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.249.tgz",
 
5523
  "dev": true,
5524
  "license": "Apache-2.0"
5525
  },
5526
+ "node_modules/tslib": {
5527
+ "version": "2.3.0",
5528
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
5529
+ "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==",
5530
+ "license": "0BSD"
5531
+ },
5532
  "node_modules/type-check": {
5533
  "version": "0.4.0",
5534
  "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
 
6147
  "funding": {
6148
  "url": "https://github.com/sponsors/sindresorhus"
6149
  }
6150
+ },
6151
+ "node_modules/zrender": {
6152
+ "version": "6.0.0",
6153
+ "resolved": "https://registry.npmjs.org/zrender/-/zrender-6.0.0.tgz",
6154
+ "integrity": "sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==",
6155
+ "license": "BSD-3-Clause",
6156
+ "dependencies": {
6157
+ "tslib": "2.3.0"
6158
+ }
6159
  }
6160
  }
6161
  }
package.json CHANGED
@@ -13,6 +13,7 @@
13
  "format": "prettier --write src/"
14
  },
15
  "dependencies": {
 
16
  "pinia": "^3.0.1",
17
  "vue": "^3.5.13",
18
  "vue-router": "^4.5.0"
 
13
  "format": "prettier --write src/"
14
  },
15
  "dependencies": {
16
+ "echarts": "^6.0.0",
17
  "pinia": "^3.0.1",
18
  "vue": "^3.5.13",
19
  "vue-router": "^4.5.0"
scripts/count_column.js ADDED
@@ -0,0 +1,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env node
2
+ import fs from 'fs/promises'
3
+ import path from 'path'
4
+
5
+ function usage() {
6
+ console.log(`Usage:
7
+ node scripts/count_column.js --file <file.csv> --column <columnName|index> [--out <out.txt>]
8
+
9
+ Options:
10
+ --file CSV 文件路径(必需)。
11
+ --column 指定列名或列序号(1 表示第一列)。如果为数字则按 1-based 处理。
12
+ --out 可选,将统计结果写入指定文件(默认:打印到控制台)。
13
+ --help 显示帮助。
14
+ `)
15
+ }
16
+
17
+ function parseArgs(argv) {
18
+ const args = argv.slice(2)
19
+ const opts = { file: null, column: null, out: null }
20
+ for (let i = 0; i < args.length; i++) {
21
+ const a = args[i]
22
+ if (a === '--help' || a === '-h') { opts.help = true; break }
23
+ if (a === '--file') { opts.file = args[++i]; continue }
24
+ if (a === '--column') { opts.column = args[++i]; continue }
25
+ if (a === '--out') { opts.out = args[++i]; continue }
26
+ // positional file
27
+ if (!opts.file) opts.file = a
28
+ }
29
+ return opts
30
+ }
31
+
32
+ // 重用一个简单的 CSV 单行解析(支持双引号与双引号转义)
33
+ function parseCSVLine(line) {
34
+ const res = []
35
+ let cur = ''
36
+ let inQuotes = false
37
+ for (let i = 0; i < line.length; i++) {
38
+ const ch = line[i]
39
+ if (inQuotes) {
40
+ if (ch === '"') {
41
+ if (i + 1 < line.length && line[i + 1] === '"') { cur += '"'; i++ } else { inQuotes = false }
42
+ } else { cur += ch }
43
+ } else {
44
+ if (ch === ',') { res.push(cur); cur = '' }
45
+ else if (ch === '"') { inQuotes = true }
46
+ else { cur += ch }
47
+ }
48
+ }
49
+ res.push(cur)
50
+ return res
51
+ }
52
+
53
+ async function readCSV(filePath) {
54
+ const txt = await fs.readFile(filePath, 'utf8')
55
+ const lines = txt.split(/\r?\n/)
56
+ let headerLineIndex = null
57
+ for (let i = 0; i < lines.length; i++) { if (lines[i].trim().length > 0) { headerLineIndex = i; break } }
58
+ if (headerLineIndex === null) return { headers: [], rows: [] }
59
+ const headers = parseCSVLine(lines[headerLineIndex])
60
+ const rows = []
61
+ for (let i = headerLineIndex + 1; i < lines.length; i++) {
62
+ const l = lines[i]
63
+ if (l == null || l.trim() === '') continue
64
+ const vals = parseCSVLine(l)
65
+ rows.push(vals)
66
+ }
67
+ return { headers, rows }
68
+ }
69
+
70
+ function normalizeKey(k) {
71
+ if (k == null) return ''
72
+ return String(k).trim()
73
+ }
74
+
75
+ async function main() {
76
+ const opts = parseArgs(process.argv)
77
+ if (opts.help) { usage(); return }
78
+ if (!opts.file || !opts.column) { console.error('Missing --file or --column'); usage(); process.exit(1) }
79
+
80
+ const filePath = path.isAbsolute(opts.file) ? opts.file : path.join(process.cwd(), opts.file)
81
+ let stat
82
+ try { stat = await fs.stat(filePath) } catch (e) { console.error('File not found:', filePath); process.exit(2) }
83
+ if (!stat.isFile()) { console.error('Not a file:', filePath); process.exit(3) }
84
+
85
+ const { headers, rows } = await readCSV(filePath)
86
+ if (!headers || headers.length === 0) { console.error('No header found in CSV'); process.exit(4) }
87
+
88
+ // 决定列索引:如果 opts.column 是纯数字则按 1-based 处理,否则按列名匹配(优先精确匹配,其次大小写忽略)
89
+ let colIndex = -1
90
+ if (/^\d+$/.test(opts.column)) {
91
+ const idx = parseInt(opts.column, 10)
92
+ colIndex = idx - 1
93
+ if (colIndex < 0 || colIndex >= headers.length) { console.error('Column index out of range'); process.exit(5) }
94
+ } else {
95
+ // 尝试精确匹配
96
+ colIndex = headers.indexOf(opts.column)
97
+ if (colIndex === -1) {
98
+ // 尝试不区分大小写匹配
99
+ const lower = opts.column.toLowerCase()
100
+ colIndex = headers.findIndex(h => String(h).toLowerCase() === lower)
101
+ if (colIndex === -1) { console.error(`Column name not found: ${opts.column}`); process.exit(6) }
102
+ }
103
+ }
104
+
105
+ const counts = new Map()
106
+ for (const vals of rows) {
107
+ const v = normalizeKey(vals[colIndex])
108
+ counts.set(v, (counts.get(v) || 0) + 1)
109
+ }
110
+
111
+ // 排序:按计数降序,再按值字母升序
112
+ const items = Array.from(counts.entries()).sort((a, b) => {
113
+ if (b[1] !== a[1]) return b[1] - a[1]
114
+ return String(a[0]).localeCompare(String(b[0]))
115
+ })
116
+
117
+ const outLines = []
118
+ outLines.push(`File: ${filePath}`)
119
+ outLines.push(`Column: ${headers[colIndex]} (index ${colIndex + 1})`)
120
+ outLines.push(`Total distinct classes: ${items.length}`)
121
+ outLines.push('')
122
+ outLines.push('Value,Count')
123
+ for (const [val, cnt] of items) outLines.push(`${val},${cnt}`)
124
+
125
+ if (opts.out) {
126
+ const outPath = path.isAbsolute(opts.out) ? opts.out : path.join(process.cwd(), opts.out)
127
+ await fs.mkdir(path.dirname(outPath), { recursive: true })
128
+ await fs.writeFile(outPath, outLines.join('\n'), 'utf8')
129
+ console.log(`Wrote counts to ${outPath} (${items.length} distinct)`)
130
+ } else {
131
+ console.log(outLines.join('\n'))
132
+ }
133
+ }
134
+
135
+ main().catch(err => { console.error('Error:', err && err.stack ? err.stack : err); process.exit(10) })
scripts/encrypt_csv.js ADDED
File without changes
scripts/filter_by_series.js ADDED
@@ -0,0 +1,143 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env node
2
+ import fs from 'fs/promises'
3
+ import path from 'path'
4
+
5
+ function usage() {
6
+ console.log(`Usage:
7
+ node scripts/filter_by_series.js --file <merged.csv> --series <p3_list.txt> --out <out.csv>
8
+
9
+ Options:
10
+ --file 合并后的 CSV 文件(默认: outdata/merged.csv)
11
+ --series 包含待匹配 series 列表的文件(每行一个值,默认: outdata/p3_model_series.csv)
12
+ --out 输出筛选后的 CSV(默认: outdata/filtered.csv)
13
+ --help 显示帮助
14
+ `)
15
+ }
16
+
17
+ function parseArgs(argv) {
18
+ const args = argv.slice(2)
19
+ const opts = { file: null, series: null, out: null }
20
+ for (let i = 0; i < args.length; i++) {
21
+ const a = args[i]
22
+ if (a === '--help' || a === '-h') { opts.help = true; break }
23
+ if (a === '--file') { opts.file = args[++i]; continue }
24
+ if (a === '--series') { opts.series = args[++i]; continue }
25
+ if (a === '--out') { opts.out = args[++i]; continue }
26
+ if (!opts.file) opts.file = a
27
+ }
28
+ return opts
29
+ }
30
+
31
+ function parseCSVLine(line) {
32
+ const res = []
33
+ let cur = ''
34
+ let inQuotes = false
35
+ for (let i = 0; i < line.length; i++) {
36
+ const ch = line[i]
37
+ if (inQuotes) {
38
+ if (ch === '"') {
39
+ if (i + 1 < line.length && line[i + 1] === '"') { cur += '"'; i++ } else { inQuotes = false }
40
+ } else { cur += ch }
41
+ } else {
42
+ if (ch === ',') { res.push(cur); cur = '' }
43
+ else if (ch === '"') { inQuotes = true }
44
+ else { cur += ch }
45
+ }
46
+ }
47
+ res.push(cur)
48
+ return res
49
+ }
50
+
51
+ function csvEscape(val) {
52
+ if (val == null) return ''
53
+ const s = String(val)
54
+ if (s.includes('"')) return '"' + s.replace(/"/g, '""') + '"'
55
+ if (s.includes(',') || s.includes('\n') || s.includes('\r')) return '"' + s + '"'
56
+ return s
57
+ }
58
+
59
+ async function readLinesTrim(filePath) {
60
+ const txt = await fs.readFile(filePath, 'utf8')
61
+ return txt.split(/\r?\n/).map(l => l.trim()).filter(l => l.length > 0)
62
+ }
63
+
64
+ async function readCSV(filePath) {
65
+ const txt = await fs.readFile(filePath, 'utf8')
66
+ const lines = txt.split(/\r?\n/)
67
+ let headerIdx = null
68
+ for (let i = 0; i < lines.length; i++) if (lines[i].trim().length > 0) { headerIdx = i; break }
69
+ if (headerIdx === null) return { headers: [], rows: [] }
70
+ const headers = parseCSVLine(lines[headerIdx])
71
+ const rows = []
72
+ for (let i = headerIdx + 1; i < lines.length; i++) {
73
+ const l = lines[i]
74
+ if (!l || l.trim() === '') continue
75
+ rows.push(parseCSVLine(l))
76
+ }
77
+ return { headers, rows }
78
+ }
79
+
80
+ async function main() {
81
+ const opts = parseArgs(process.argv)
82
+ if (opts.help) { usage(); return }
83
+ const cwd = process.cwd()
84
+ const file = opts.file ? (path.isAbsolute(opts.file) ? opts.file : path.join(cwd, opts.file)) : path.join(cwd, 'outdata', 'merged.csv')
85
+ const seriesFile = opts.series ? (path.isAbsolute(opts.series) ? opts.series : path.join(cwd, opts.series)) : path.join(cwd, 'outdata', 'p3_model_series.csv')
86
+ const outPath = opts.out ? (path.isAbsolute(opts.out) ? opts.out : path.join(cwd, opts.out)) : path.join(cwd, 'outdata', 'filtered.csv')
87
+
88
+ // read series list
89
+ let seriesList
90
+ try { seriesList = await readLinesTrim(seriesFile) } catch (e) { console.error('Failed to read series list:', seriesFile); process.exit(2) }
91
+ // normalize to lowercase for case-insensitive contains
92
+ const seriesLower = seriesList.map(s => s.toLowerCase())
93
+
94
+ // read CSV
95
+ let headers, rows
96
+ try { ({ headers, rows } = await readCSV(file)) } catch (e) { console.error('Failed to read CSV:', file); process.exit(3) }
97
+ if (!headers || headers.length === 0) { console.error('No header found in CSV'); process.exit(4) }
98
+
99
+ // find model_series column index (case-insensitive)
100
+ let colIndex = headers.indexOf('model_series')
101
+ if (colIndex === -1) {
102
+ colIndex = headers.findIndex(h => String(h).toLowerCase() === 'model_series')
103
+ }
104
+ if (colIndex === -1) {
105
+ console.error('Could not find column "model_series" in CSV headers:', headers)
106
+ process.exit(5)
107
+ }
108
+
109
+ const kept = []
110
+ const removed = []
111
+ for (let i = 0; i < rows.length; i++) {
112
+ const row = rows[i]
113
+ const cell = (row[colIndex] || '').toString()
114
+ const cellLower = cell.toLowerCase()
115
+ const matched = seriesLower.some(s => cellLower.includes(s))
116
+ if (matched) kept.push(row)
117
+ else removed.push({ index: i + 1, row, value: cell })
118
+ }
119
+
120
+ // write out CSV: header then kept rows
121
+ const outLines = []
122
+ outLines.push(headers.map(csvEscape).join(','))
123
+ for (const r of kept) outLines.push(r.map(csvEscape).join(','))
124
+ await fs.mkdir(path.dirname(outPath), { recursive: true })
125
+ await fs.writeFile(outPath, outLines.join('\n'), 'utf8')
126
+ console.log(`Wrote filtered CSV to ${outPath} (${kept.length} rows kept, ${removed.length} removed)`)
127
+
128
+ // write removed rows log
129
+ if (removed.length > 0) {
130
+ const logPath = path.join(path.dirname(outPath), 'filtered_removed_rows.log')
131
+ const logLines = []
132
+ logLines.push(`Removed ${removed.length} rows from ${file} by series filtering:`)
133
+ for (const it of removed) {
134
+ logLines.push(`row=${it.index} value="${it.value}" csv=${JSON.stringify(it.row)}`)
135
+ }
136
+ await fs.writeFile(logPath, logLines.join('\n'), 'utf8')
137
+ console.log(`Wrote removal log to ${logPath}`)
138
+ } else {
139
+ console.log('No rows were removed by series filtering.')
140
+ }
141
+ }
142
+
143
+ main().catch(err => { console.error('Error:', err && err.stack ? err.stack : err); process.exit(10) })
scripts/merge_csv.js ADDED
@@ -0,0 +1,248 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env node
2
+ /*
3
+ scripts/merge_csv.js
4
+ 简单的 Node 脚本:合并指定目录或指定多个 CSV 文件为一个 CSV 文件(基本合并,处理不同表头)
5
+
6
+ 用法示例:
7
+ node scripts/merge_csv.js --inputDir ./data --out merged.csv
8
+ node scripts/merge_csv.js file1.csv file2.csv --out merged.csv
9
+
10
+ 限制说明:这是一个轻量实现,处理常见 CSV(含双引号字段)。不保证对包含任意换行的复杂嵌套引用字段 100% 兼容。
11
+ */
12
+
13
+ import fs from 'fs/promises'
14
+ import path from 'path'
15
+
16
+ function usage() {
17
+ console.log(`Usage:\n node scripts/merge_csv.js --inputDir <dir> --out <out.csv>\n node scripts/merge_csv.js <file1.csv> <file2.csv> --out <out.csv>\n\nOptions:\n --inputDir 读取指定目录下的所有 .csv 文件(非递归)\n --out 输出文件路径(默认: merged.csv)\n --help 显示帮助\n`)
18
+ }
19
+
20
+ function parseArgs(argv) {
21
+ const args = argv.slice(2)
22
+ const opts = { files: [], inputDir: null, out: 'merged.csv' }
23
+ for (let i = 0; i < args.length; i++) {
24
+ const a = args[i]
25
+ if (a === '--help' || a === '-h') { opts.help = true; break }
26
+ if (a === '--inputDir') { opts.inputDir = args[++i]; continue }
27
+ if (a === '--out') { opts.out = args[++i]; continue }
28
+ if (a.startsWith('--')) {
29
+ console.warn('Unknown option', a)
30
+ continue
31
+ }
32
+ opts.files.push(a)
33
+ }
34
+ return opts
35
+ }
36
+
37
+ // 基本的单行 CSV 字段解析,支持双引号包含和双引号转义("")
38
+ function parseCSVLine(line) {
39
+ const res = []
40
+ let cur = ''
41
+ let inQuotes = false
42
+ for (let i = 0; i < line.length; i++) {
43
+ const ch = line[i]
44
+ if (inQuotes) {
45
+ if (ch === '"') {
46
+ if (i + 1 < line.length && line[i + 1] === '"') {
47
+ cur += '"'
48
+ i++
49
+ } else {
50
+ inQuotes = false
51
+ }
52
+ } else {
53
+ cur += ch
54
+ }
55
+ } else {
56
+ if (ch === ',') {
57
+ res.push(cur)
58
+ cur = ''
59
+ } else if (ch === '"') {
60
+ inQuotes = true
61
+ } else {
62
+ cur += ch
63
+ }
64
+ }
65
+ }
66
+ res.push(cur)
67
+ return res
68
+ }
69
+
70
+ function csvEscape(value) {
71
+ if (value == null) return ''
72
+ const s = String(value)
73
+ if (s.includes('"')) return '"' + s.replace(/"/g, '""') + '"'
74
+ if (s.includes(',') || s.includes('\n') || s.includes('\r')) return '"' + s + '"'
75
+ return s
76
+ }
77
+
78
+ async function readCSVFile(filePath) {
79
+ const txt = await fs.readFile(filePath, 'utf8')
80
+ // 兼容 CRLF
81
+ const lines = txt.split(/\r?\n/)
82
+ // 找到第一行非空作为 header
83
+ let headerLineIndex = null
84
+ for (let i = 0; i < lines.length; i++) {
85
+ if (lines[i].trim().length > 0) { headerLineIndex = i; break }
86
+ }
87
+ if (headerLineIndex === null) return { headers: [], rows: [] }
88
+ const headers = parseCSVLine(lines[headerLineIndex])
89
+ const rows = []
90
+ for (let i = headerLineIndex + 1; i < lines.length; i++) {
91
+ const l = lines[i]
92
+ if (l == null || l.trim() === '') continue
93
+ const vals = parseCSVLine(l)
94
+ const obj = {}
95
+ for (let j = 0; j < headers.length; j++) {
96
+ obj[headers[j]] = vals[j] ?? ''
97
+ }
98
+ rows.push(obj)
99
+ }
100
+ return { headers, rows }
101
+ }
102
+
103
+ async function main() {
104
+ const opts = parseArgs(process.argv)
105
+ if (opts.help) { usage(); return }
106
+
107
+ const cwd = process.cwd()
108
+ let files = []
109
+ if (opts.inputDir) {
110
+ const dir = path.isAbsolute(opts.inputDir) ? opts.inputDir : path.join(cwd, opts.inputDir)
111
+ try {
112
+ const names = await fs.readdir(dir)
113
+ files = names.filter(n => n.toLowerCase().endsWith('.csv')).map(n => path.join(dir, n))
114
+ } catch (e) {
115
+ console.error('Failed to read inputDir', e.message)
116
+ process.exit(2)
117
+ }
118
+ }
119
+ if (opts.files && opts.files.length) {
120
+ const explicit = opts.files.map(f => path.isAbsolute(f) ? f : path.join(cwd, f))
121
+ files = files.concat(explicit)
122
+ }
123
+ // 去重并保持顺序
124
+ files = [...new Set(files)]
125
+ if (files.length === 0) {
126
+ console.error('No CSV files specified. Use --inputDir or pass file paths.')
127
+ usage();
128
+ process.exit(1)
129
+ }
130
+
131
+ const allRows = []
132
+ const headerOrder = []
133
+ const headerSet = new Set()
134
+
135
+ // 先读取所有文件内容到内存,标记文件名最后字符
136
+ const fileDatas = []
137
+ for (const f of files) {
138
+ try {
139
+ const stat = await fs.stat(f)
140
+ if (!stat.isFile()) { console.warn('Skipping (not a file):', f); continue }
141
+ } catch (e) { console.warn('Skipping (not found):', f); continue }
142
+ const { headers, rows } = await readCSVFile(f)
143
+ const base = path.basename(f)
144
+ const nameNoExt = base.replace(/\.[^/.]+$/, '')
145
+ const lastChar = nameNoExt.slice(-1)
146
+ fileDatas.push({ path: f, headers, rows, nameNoExt, lastChar })
147
+ }
148
+
149
+ // 找到文件3(末尾字符为 '3')并创建第一列值的集合
150
+ let file3Set = null
151
+ const file3 = fileDatas.find(d => d.lastChar === '3')
152
+ if (file3) {
153
+ const firstHdr = file3.headers && file3.headers.length > 0 ? file3.headers[0] : null
154
+ file3Set = new Set()
155
+ if (firstHdr) {
156
+ for (const r of file3.rows) {
157
+ const v = r[firstHdr]
158
+ if (v != null) file3Set.add(String(v))
159
+ }
160
+ }
161
+ }
162
+
163
+ // 现在按原顺序合并表头并收集行。对文件0(末尾字符为 '0')如果存在 file3Set,进行过滤:
164
+ const removedRows = []
165
+ for (const d of fileDatas) {
166
+ const { headers, rows, lastChar } = d
167
+ for (const h of headers) {
168
+ if (!headerSet.has(h)) {
169
+ headerSet.add(h)
170
+ headerOrder.push(h)
171
+ }
172
+ }
173
+ if (lastChar === '0' && file3Set) {
174
+ // 使用此文件自身的第一列作为 model_name 字段
175
+ const firstHdr = headers && headers.length > 0 ? headers[0] : null
176
+ if (!firstHdr) continue
177
+ for (const r of rows) {
178
+ const val = r[firstHdr]
179
+ if (val != null && file3Set.has(String(val))) {
180
+ allRows.push(r)
181
+ } else {
182
+ // 记录被删除的行信息,便于日志输出
183
+ removedRows.push({ source: d.path, key: firstHdr, value: val, row: r })
184
+ }
185
+ }
186
+ } else {
187
+ for (const r of rows) allRows.push(r)
188
+ }
189
+ }
190
+
191
+ // 另外一遍,确保所有行都有 headerOrder 中的字段(填空)
192
+ const outRows = allRows.map(r => {
193
+ const o = {}
194
+ for (const h of headerOrder) o[h] = (h in r) ? r[h] : ''
195
+ // 也把那些在 headerOrder 之后才出现的字段加上(理论上我们已把所有文件头收集到 headerOrder)
196
+ for (const k of Object.keys(r)) if (!headerSet.has(k)) { headerSet.add(k); headerOrder.push(k); o[k] = r[k] }
197
+ return o
198
+ })
199
+
200
+ // 写出 CSV
201
+ let outPath = path.isAbsolute(opts.out) ? opts.out : path.join(cwd, opts.out)
202
+ // 如果用户传入的 out 以路径分隔符结尾或显式是目录,写入该目录下的 merged.csv
203
+ const looksLikeDir = opts.out.endsWith('/') || opts.out.endsWith('\\')
204
+ if (looksLikeDir) {
205
+ outPath = path.join(outPath, 'merged.csv')
206
+ }
207
+
208
+ try {
209
+ const st = await fs.stat(outPath)
210
+ if (st.isDirectory()) {
211
+ outPath = path.join(outPath, 'merged.csv')
212
+ }
213
+ } catch (e) {
214
+ // not exists -> will create parent directory below
215
+ }
216
+
217
+ const headerLine = headerOrder.map(csvEscape).join(',')
218
+ const lines = [headerLine]
219
+ for (const r of outRows) {
220
+ const vals = headerOrder.map(h => csvEscape(r[h]))
221
+ lines.push(vals.join(','))
222
+ }
223
+ await fs.mkdir(path.dirname(outPath), { recursive: true })
224
+ await fs.writeFile(outPath, lines.join('\n'), 'utf8')
225
+ console.log(`Wrote merged CSV to ${outPath} (${outRows.length} rows, ${headerOrder.length} columns)`)
226
+
227
+ // 如果有被删除的行,打印并写日志
228
+ if (removedRows.length > 0) {
229
+ console.log(`Removed ${removedRows.length} rows from files (not present in file3). Logging to removed_rows.log`)
230
+ const logLines = []
231
+ logLines.push(`Removed ${removedRows.length} rows - details:`)
232
+ for (const it of removedRows) {
233
+ logLines.push(`source=${it.source} ${it.key}=${it.value} row=${JSON.stringify(it.row)}`)
234
+ }
235
+ // 写入到输出目录下的 removed_rows.log
236
+ const logPath = path.join(path.dirname(outPath), 'removed_rows.log')
237
+ await fs.writeFile(logPath, logLines.join('\n'), 'utf8')
238
+ for (let i = 0; i < Math.min(50, logLines.length); i++) console.log(logLines[i])
239
+ if (logLines.length > 50) console.log(`... see ${logPath} for full log`)
240
+ } else {
241
+ console.log('No rows were removed by file3 filtering.')
242
+ }
243
+ }
244
+
245
+ main().catch(err => {
246
+ console.error('Error:', err && err.stack ? err.stack : err)
247
+ process.exit(3)
248
+ })
src/App.vue CHANGED
@@ -1,114 +1,13 @@
1
- <script setup lang="js">
2
- import { ref, onMounted, watch } from 'vue'
3
-
4
- // Mock data for LLM leaderboard
5
- const leaderboard = [
6
- { rank: 1, name: 'GPT-5', score: 95.2, provider: 'OpenAI' },
7
- { rank: 2, name: 'Claude sonnect 4.5', score: 94.8, provider: 'Anthropic' },
8
- { rank: 3, name: 'Gemini-2.5', score: 94.1, provider: 'Google' },
9
- { rank: 4, name: 'Llama-4', score: 93.5, provider: 'Meta' },
10
- { rank: 5, name: 'Mistral-7B', score: 92.9, provider: 'Mistral AI' },
11
- { rank: 6, name: 'PaLM-2', score: 92.3, provider: 'Google' },
12
- { rank: 7, name: 'Falcon-180B', score: 91.7, provider: 'Technology Innovation Institute' },
13
- { rank: 8, name: 'Qwen3', score: 91.2, provider: 'Alibaba' },
14
- { rank: 9, name: 'Vicuna-13B', score: 90.8, provider: 'LMSYS' },
15
- { rank: 10, name: 'ChatGLM-6B', score: 90.3, provider: 'Tsinghua University' },
16
- ]
17
-
18
- // theme (dark mode) support: sync with document root class and localStorage
19
- const isDark = ref(false)
20
-
21
- onMounted(() => {
22
- const stored = localStorage.getItem('theme')
23
- if (stored === 'dark') {
24
- isDark.value = true
25
- } else if (stored === 'light') {
26
- isDark.value = false
27
- } else {
28
- // follow system preference when no stored preference
29
- isDark.value = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
30
- }
31
- })
32
-
33
- watch(isDark, (val) => {
34
- try {
35
- if (val) document.documentElement.classList.add('dark')
36
- else document.documentElement.classList.remove('dark')
37
- localStorage.setItem('theme', val ? 'dark' : 'light')
38
- } catch (e) {
39
- // ignore if SSR or unavailable
40
- }
41
- })
42
-
43
- function toggleTheme() {
44
- isDark.value = !isDark.value
45
- }
46
  </script>
47
 
48
  <template>
49
- <div class="min-h-screen bg-gray-50 dark:bg-gradient-to-b dark:from-gray-900 dark:via-gray-800 dark:to-gray-800 py-12 px-4 sm:px-6 lg:px-8">
50
- <div class="max-w-4xl mx-auto">
51
- <header class="mb-6 flex items-start justify-between">
52
- <div>
53
- <h1 class="text-3xl font-extrabold text-gray-900 dark:text-gray-100">LLM Leaderboard</h1>
54
- <p class="mt-1 text-sm text-gray-600 dark:text-gray-300">按分数排序的顶级大模型(演示数据)</p>
55
- </div>
56
- </header>
57
-
58
- <div class="bg-white dark:bg-gray-900/60 shadow rounded-lg overflow-hidden">
59
- <div
60
- class="px-6 py-4 border-b bg-gradient-to-r from-indigo-50 via-white to-white dark:bg-gradient-to-r dark:from-gray-800 dark:via-gray-900 dark:to-gray-900">
61
- <div class="flex items-center justify-between">
62
- <h2 class="text-lg font-medium text-gray-800 dark:text-gray-50">排行榜</h2>
63
- <div class="text-sm text-gray-500 dark:text-gray-300">更新于模拟数据</div>
64
- </div>
65
- </div>
66
-
67
- <div class="p-4 overflow-x-auto">
68
- <table class="min-w-full divide-y divide-gray-200 dark:divide-gray-700">
69
- <thead class="bg-gray-50 dark:bg-gradient-to-r dark:from-gray-800 dark:to-gray-900">
70
- <tr>
71
- <th
72
- class="px-4 py-2 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider">
73
- 排名</th>
74
- <th
75
- class="px-4 py-2 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider">
76
- 模型名称</th>
77
- <th
78
- class="px-4 py-2 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider">
79
- 分数</th>
80
- <th
81
- class="px-4 py-2 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider">
82
- 提供商</th>
83
- </tr>
84
- </thead>
85
- <tbody class="bg-white dark:bg-transparent divide-y divide-gray-100 dark:divide-gray-700">
86
- <tr v-for="model in leaderboard" :key="model.rank" :class="{
87
- 'bg-yellow-50 dark:bg-yellow-700/25': model.rank === 1,
88
- 'bg-gray-50 dark:bg-gray-800/60': model.rank === 2,
89
- 'bg-indigo-50 dark:bg-indigo-700/25': model.rank === 3
90
- }" class="hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors duration-150">
91
- <td class="px-4 py-3 whitespace-nowrap font-medium text-gray-800 dark:text-gray-50">#{{ model.rank }}
92
- </td>
93
- <td class="px-4 py-3 whitespace-nowrap">
94
- <div class="text-sm font-semibold text-gray-900 dark:text-gray-50">{{ model.name }}</div>
95
- </td>
96
- <td class="px-4 py-3 whitespace-nowrap">
97
- <div class="text-sm text-gray-800 dark:text-gray-50">{{ model.score.toFixed(1) }}</div>
98
- </td>
99
- <td class="px-4 py-3 whitespace-nowrap">
100
- <span
101
- class="inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-gray-100 dark:bg-gray-700/60 dark:border dark:border-gray-600 text-gray-800 dark:text-gray-100">
102
- {{ model.provider }}
103
- </span>
104
- </td>
105
- </tr>
106
- </tbody>
107
- </table>
108
- </div>
109
- </div>
110
- </div>
111
  </div>
112
  </template>
113
 
114
- <style scoped></style>
 
 
 
1
+ <script setup>
2
+ // 这里可以添加全局的逻辑,比如主题切换等,如果需要的话
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  </script>
4
 
5
  <template>
6
+ <div id="app">
7
+ <router-view />
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  </div>
9
  </template>
10
 
11
+ <style>
12
+ /* 全局样式 */
13
+ </style>
src/components/Chart.vue ADDED
@@ -0,0 +1,230 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script setup>
2
+ import { ref, onMounted, onBeforeUnmount, watch } from 'vue'
3
+ import { useLeaderboardData } from '@/composables/useLeaderboardData.js'
4
+ import * as echarts from 'echarts'
5
+
6
+ const chartRef = ref(null)
7
+ let chart = null
8
+
9
+ const { leaderboard, selectedDataName } = useLeaderboardData()
10
+
11
+ // 接受一个可选 prop:autoShowSeries(数组),用于指定哪些模型类型在图表加载时自动显示。
12
+ // 例如:<Chart :autoShowSeries="['gemma-3','Hunyuan']" />
13
+ const props = defineProps({
14
+ autoShowSeries: { type: Array, default: () => [] }
15
+ })
16
+
17
+ // 把 leaderboard 转成 ECharts 所需的 series 数组(每个 model_series 一条线)
18
+ function buildSeriesFromLeaderboard(rows = []) {
19
+ const groups = {}
20
+ rows.forEach(r => {
21
+ // 按 model_type 分组;如果 model_type 未填则标记为 未知
22
+ const seriesName = r.model_type || '未知'
23
+ if (!groups[seriesName]) groups[seriesName] = []
24
+ // 数据原本单位为 TFLOPs,转换为 FLOPs(1 TFLOP = 1e12 FLOPs)用于对数尺度显示
25
+ const xRaw = parseFloat(r.BF16_TFLOPs) || 0
26
+ const x = xRaw > 0 ? xRaw * 1e12 : 0
27
+ const y = parseFloat(r.information_capacity ?? r.ic) || 0
28
+ const rank = Number(r.rank) || 0
29
+ groups[seriesName].push({ x, y, rank })
30
+ })
31
+
32
+ return Object.keys(groups).map(name => {
33
+ // 过滤掉 x<=0 的点(对数坐标轴不能显示 0 或负值),并按 rank 排序
34
+ const data = groups[name]
35
+ .filter(p => Number.isFinite(p.x) && p.x > 0 && Number.isFinite(p.y))
36
+ .sort((a, b) => a.rank - b.rank)
37
+ .map(d => [d.x, d.y])
38
+ return { name, rawCount: groups[name].length, type: 'line', showSymbol: true, symbolSize: 6, data }
39
+ })
40
+ }
41
+
42
+ function getChartOption(series) {
43
+ // 计算数据范围以自动缩放坐标轴,避免留太多空白
44
+ const allX = []
45
+ const allY = []
46
+ series.forEach(s => {
47
+ if (Array.isArray(s.data)) {
48
+ s.data.forEach(d => {
49
+ const x = Number(d[0])
50
+ const y = Number(d[1])
51
+ if (Number.isFinite(x)) allX.push(x)
52
+ if (Number.isFinite(y)) allY.push(y)
53
+ })
54
+ }
55
+ })
56
+ let xMin = allX.length ? Math.min(...allX) : undefined
57
+ let xMax = allX.length ? Math.max(...allX) : undefined
58
+ let yMin = allY.length ? Math.min(...allY) : undefined
59
+ let yMax = allY.length ? Math.max(...allY) : undefined
60
+
61
+ // 对数轴不能为 0 或负值,确保 min>0;并添加一些 padding
62
+ if (xMin !== undefined && xMax !== undefined) {
63
+ // 防止极值过于接近或相等
64
+ if (xMin <= 0) xMin = Math.min(...allX.filter(v => v > 0)) || xMax
65
+ if (xMin === xMax) {
66
+ xMin = xMin / 10
67
+ xMax = xMax * 10
68
+ } else {
69
+ xMin = xMin * 0.8
70
+ xMax = xMax * 1.15
71
+ }
72
+ }
73
+
74
+ if (yMin !== undefined && yMax !== undefined) {
75
+ if (yMin === yMax) {
76
+ // small symmetric padding
77
+ const v = yMin || 1
78
+ yMin = v - Math.abs(v) * 0.05
79
+ yMax = v + Math.abs(v) * 0.05
80
+ } else {
81
+ const pad = (yMax - yMin) * 0.08
82
+ yMin = yMin - pad
83
+ yMax = yMax + pad
84
+ }
85
+ // 如果 yMin 变为负但原数据全为正,可以下限为 0
86
+ if (yMin < 0 && Math.min(...allY) >= 0) yMin = 0
87
+ }
88
+
89
+ // helper: 将整数指数转换为 Unicode 上标字符,例如 9 -> '⁹', -3 -> '⁻³'
90
+ function toSuperscript(n) {
91
+ const map = { '0': '⁰', '1': '¹', '2': '²', '3': '³', '4': '⁴', '5': '⁵', '6': '⁶', '7': '⁷', '8': '⁸', '9': '⁹', '-': '⁻' }
92
+ const s = String(n)
93
+ return s.split('').map(ch => map[ch] || ch).join('')
94
+ }
95
+ // 可循环使用的视觉样式(颜色/符号/线型)
96
+ const colors = ['#1f77b4','#ff7f0e','#2ca02c','#d62728','#9467bd','#8c564b','#e377c2','#7f7f7f','#bcbd22','#17becf']
97
+ const symbols = ['circle','rect','triangle','diamond','pin','arrow','star','roundRect','triangle','circle']
98
+ const lineStyles = ['solid','solid','solid','solid','dash','solid','solid','dash','solid','dash']
99
+
100
+ // 给每个 series 注入视觉样式
101
+ const styledSeries = series.map((s, idx) => {
102
+ const color = colors[idx % colors.length]
103
+ return Object.assign({}, s, {
104
+ lineStyle: { width: 2, type: lineStyles[idx % lineStyles.length], color },
105
+ itemStyle: { color },
106
+ symbol: symbols[idx % symbols.length],
107
+ emphasis: { focus: 'series' }
108
+ })
109
+ })
110
+
111
+ // 构建 legend.selected 映射:只有 props.autoShowSeries 中的系列会默认显示,其他需手动点击 legend 打开
112
+ const legendSelected = {}
113
+ styledSeries.forEach(s => {
114
+ const name = String(s.name)
115
+ legendSelected[name] = Array.isArray(props.autoShowSeries) && props.autoShowSeries.includes(name)
116
+ })
117
+
118
+ return {
119
+ color: colors,
120
+ title: { text: 'BF16_TFLOPs vs IC', left: '6%', textStyle: { color: '#cfd8dc' } },
121
+ tooltip: {
122
+ trigger: 'item',
123
+ formatter: params => {
124
+ if (!params) return ''
125
+ const x = params.data && Array.isArray(params.data) ? params.data[0] : ''
126
+ const y = params.data && Array.isArray(params.data) ? params.data[1] : ''
127
+ // 显示 X 为 mantissa×10^n,并把指数用上标显示
128
+ let xStr = ''
129
+ if (typeof x === 'number' && Number.isFinite(x) && x > 0) {
130
+ const exp = Math.floor(Math.log10(x))
131
+ const mant = x / Math.pow(10, exp)
132
+ const mantStr = mant >= 10 ? mant.toFixed(0) : mant.toFixed(2)
133
+ xStr = `${mantStr}×10${toSuperscript(exp)}`
134
+ } else {
135
+ xStr = String(x)
136
+ }
137
+ const yStr = (typeof y === 'number' && Number.isFinite(y)) ? Number(y).toFixed(2) : String(y)
138
+ return `${params.seriesName}<br/>FLOPs: ${xStr}<br/>IC: ${yStr}`
139
+ }
140
+ },
141
+ legend: Object.assign({
142
+ orient: 'vertical',
143
+ right: 10,
144
+ top: '10%',
145
+ align: 'left',
146
+ itemWidth: 14,
147
+ itemHeight: 10,
148
+ textStyle: { color: '#cfd8dc' },
149
+ tooltip: { show: true }
150
+ }, { selected: legendSelected }),
151
+ grid: { left: '6%', right: '20%', bottom: '8%', containLabel: true },
152
+ xAxis: {
153
+ type: 'log',
154
+ name: 'FLOPs',
155
+ nameLocation: 'middle',
156
+ nameGap: 30,
157
+ axisLine: { lineStyle: { color: '#78909c' } },
158
+ axisLabel: {
159
+ color: '#b0bec5',
160
+ formatter: value => {
161
+ if (!Number.isFinite(value) || value <= 0) return String(value)
162
+ const exp = Math.floor(Math.log10(value))
163
+ const mant = value / Math.pow(10, exp)
164
+ if (Math.abs(mant - 1) < 1e-6) return `10${toSuperscript(exp)}`
165
+ return `${mant.toFixed(2)}×10${toSuperscript(exp)}`
166
+ }
167
+ },
168
+ splitLine: { show: true, lineStyle: { type: 'dashed', color: '#37474f' } },
169
+ min: xMin,
170
+ max: xMax
171
+ },
172
+ yAxis: {
173
+ type: 'value',
174
+ name: 'Information capacity',
175
+ axisLine: { lineStyle: { color: '#78909c' } },
176
+ axisLabel: { color: '#b0bec5', formatter: v => (Number.isFinite(v) ? Number(v).toFixed(2) : String(v)) },
177
+ splitLine: { show: true, lineStyle: { type: 'dashed', color: '#37474f' } },
178
+ min: yMin,
179
+ max: yMax
180
+ },
181
+ series: styledSeries
182
+ }
183
+ }
184
+
185
+ let resizeHandler = null
186
+
187
+ function renderChart() {
188
+ if (!chart) return
189
+ let rows = leaderboard.value || []
190
+ // 根据 selectedDataName 过滤数据集(如果未选择或为 'all' 则使用全部)
191
+ const sel = selectedDataName && selectedDataName.value ? String(selectedDataName.value) : ''
192
+ if (sel && sel !== 'all') {
193
+ rows = rows.filter(r => String(r.data_name ?? '') === sel)
194
+ }
195
+ const series = buildSeriesFromLeaderboard(rows)
196
+ const option = getChartOption(series)
197
+ chart.setOption(option, { notMerge: true })
198
+ }
199
+
200
+ onMounted(() => {
201
+ if (!chartRef.value) return
202
+ chart = echarts.init(chartRef.value)
203
+ // 首次渲染(如果数据尚未加载,后续会由 watcher 更新)
204
+ renderChart()
205
+
206
+ resizeHandler = () => chart && chart.resize()
207
+ window.addEventListener('resize', resizeHandler)
208
+ })
209
+
210
+ // 当 leaderboard 变化时重新渲染(不受 visibleColumns 影响)
211
+ watch(leaderboard, () => {
212
+ renderChart()
213
+ }, { deep: true })
214
+
215
+ // 当所选数据集变化时也要重新渲染图表
216
+ watch(selectedDataName, () => {
217
+ renderChart()
218
+ })
219
+
220
+ onBeforeUnmount(() => {
221
+ if (resizeHandler) window.removeEventListener('resize', resizeHandler)
222
+ if (chart) { chart.dispose(); chart = null }
223
+ })
224
+ </script>
225
+
226
+ <template>
227
+ <div ref="chartRef" style="width: 100%; height: 480px;"></div>
228
+ </template>
229
+
230
+ <style scoped></style>
src/composables/useLeaderboardData.js ADDED
@@ -0,0 +1,254 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { ref, computed, reactive } from 'vue'
2
+ import { parseCsvContent } from '@/utils/csvUtils.js'
3
+
4
+ // 全局状态对象,用于在多个组件间共享
5
+ const globalState = reactive({
6
+ leaderboard: [],
7
+ csvHeaders: [],
8
+ loading: true,
9
+ error: null,
10
+ visibleColumns: [],
11
+ dataGroups: [],
12
+ selectedDataName: '',
13
+ modelTypeGroups: [],
14
+ selectedModelType: '',
15
+ DEFAULT_CSV_PATH: '/finalData/filtered.csv',
16
+ DEFAULT_HIDDEN: new Set(['seq_len', 'uniform_entropy', 'entropy_gain', 'information_capacity', 'data_name']) // 默认隐藏的列
17
+ })
18
+
19
+ // 模型类型映射对象:键为模型类型,值为包含的 model_series 数组
20
+ const modelTypeMapping = {
21
+ 'Qwen1.5':['Qwen1.5'],
22
+ 'Qwen2.5':['Qwen2.5'],
23
+ 'Gemma-3': ['gemma-3'],
24
+ 'Qwen2': ['Qwen2'],
25
+ 'Hunyuan': ['Hunyuan'],
26
+ 'Qwen3': ['Qwen3'],
27
+ 'InternLM2.5': ['internlm2.5'],
28
+ 'Llama-3': ['Llama-3.1','Llama-3.2'],
29
+ 'DeepSeek-V2': ['DeepSeek-V2'],
30
+ 'DeepSeek-V3.1': ['DeepSeek-V3.1-Base'],
31
+ 'GLM-4': ['glm-4','GLM-4'],
32
+ 'GLM-4.5': ['GLM-4.5-Air-Base','GLM-4.5-Base'],
33
+ 'Llama-4': ['Llama-4'],
34
+ 'Seed-OSS': ['Seed-OSS'],
35
+ }
36
+
37
+ const autoShowSeries = ['Qwen3','Llama-3','InternLM2.5','GLM-4','Seed-OSS','Gemma-3','Hunyuan','DeepSeek-V3.1','DeepSeek-V2','GLM-4.5']
38
+
39
+ // 表头显示名称映射(raw header -> 显示名),可以在此添加或由用户修改
40
+ const headerDisplayMap = reactive({
41
+ 'model_name': 'MODEL NAME',
42
+ 'model_series': 'MODEL SERIES',
43
+ 'model_size (B)': 'MODEL SIZE (B)',
44
+ 'BF16_TFLOPs': 'BF16 TFLOPs',
45
+ 'ic': 'IC',
46
+ })
47
+
48
+ // 数据集名称显示映射(raw data_name -> 显示名)
49
+ const dataNameDisplayMap = reactive({
50
+ 'data_part_0000': 'Data Part 0000',
51
+ 'NextCoderDataset_v1_lo': 'NextCoder v1',
52
+ 'IndustryCorpus_batch_aa_long': 'Industry Corpus AA',
53
+ 'CC-MAIN-2013-20_train-00000-of-00014_long': 'CC-MAIN (2013-20)',
54
+ 'NextCoderDataset_v1_long': 'NextCoder v1',
55
+ })
56
+
57
+
58
+ // 可选择的列(不包含 rank,也不包含被默认隐藏的列)
59
+ const selectableColumns = computed(() => {
60
+ if (!globalState.csvHeaders || globalState.csvHeaders.length === 0) return []
61
+ return globalState.csvHeaders.slice(1).filter(h => !globalState.DEFAULT_HIDDEN.has(h))
62
+ })
63
+
64
+ // 模型类型分组(从映射对象中获取)
65
+ const modelTypeGroups = computed(() => {
66
+ return Object.keys(modelTypeMapping)
67
+ })
68
+
69
+ // 根据 selectedDataName 和 selectedModelType 过滤 leaderboard,用于表格渲染
70
+ const filteredLeaderboard = computed(() => {
71
+ if (!globalState.leaderboard || globalState.leaderboard.length === 0) return []
72
+ let filtered = globalState.leaderboard
73
+
74
+ // 过滤数据集
75
+ if (globalState.selectedDataName && globalState.selectedDataName !== 'all') {
76
+ filtered = filtered.filter(r => String(r['data_name'] ?? '') === String(globalState.selectedDataName))
77
+ }
78
+
79
+ // 过滤模型类型
80
+ if (globalState.selectedModelType && globalState.selectedModelType !== 'all') {
81
+ filtered = filtered.filter(r => String(r['model_type'] ?? '') === String(globalState.selectedModelType))
82
+ }
83
+
84
+ return filtered
85
+ })
86
+
87
+ // 计算当前应该显示的列(不含 rank)
88
+ const displayedColumns = computed(() => {
89
+ if (!globalState.csvHeaders || globalState.csvHeaders.length === 0) return []
90
+ // csvHeaders includes 'rank' at idx 0
91
+ const all = globalState.csvHeaders.slice(1)
92
+ return all.filter(h => globalState.visibleColumns.includes(h))
93
+ })
94
+
95
+ async function fetchAndLoadCsv(path = globalState.DEFAULT_CSV_PATH) {
96
+ globalState.loading = true
97
+ globalState.error = null
98
+ try {
99
+ const res = await fetch(path)
100
+ if (!res.ok) throw new Error(`Failed to fetch CSV (${res.status})`)
101
+ const txt = await res.text()
102
+ const { headers, rows } = parseCsvContent(txt)
103
+ if (!headers || headers.length === 0) { globalState.leaderboard = []; globalState.loading = false; return }
104
+
105
+ // 选择用于排序/显示的分数字段(优先 information_capacity, ic, 然后尝试 numeric-like fields)
106
+ const scoreKey = headers.find(h => ['information_capacity', 'ic', 'score'].includes(h)) || headers.find(h => /capacity|score|ic/i.test(h)) || headers[0]
107
+
108
+ // 按 scoreKey 排序(保持所有字段),然后把每行写入 leaderboard,同时记录 headers
109
+ rows.sort((a, b) => (Number(b[scoreKey]) || 0) - (Number(a[scoreKey]) || 0))
110
+
111
+ // 我们希望确保一些关键列按顺序显示
112
+ const preferred = ['model_name', 'model_series', 'model_size (B)', 'seq_len', 'uniform_entropy', 'constant', 'conditional_entropy', 'entropy_gain', 'BF16_TFLOPs', 'information_capacity', 'ic']
113
+ const ordered = []
114
+ for (const p of preferred) if (headers.includes(p) && !ordered.includes(p)) ordered.push(p)
115
+ for (const h of headers) if (!ordered.includes(h)) ordered.push(h)
116
+ globalState.csvHeaders = ['rank', ...ordered]
117
+ globalState.leaderboard = rows.map((r, idx) => {
118
+ // 根据 model_series 推断 model_type
119
+ let modelType = ''
120
+ for (const [type, series] of Object.entries(modelTypeMapping)) {
121
+ if (series.includes(r['model_series'])) {
122
+ modelType = type
123
+ break
124
+ }
125
+ }
126
+ return { rank: idx + 1, model_type: modelType, ...r }
127
+ })
128
+
129
+ // 构建 data_name 分组(保持出现顺序,不包含空)
130
+ const seen = new Set()
131
+ const groups = []
132
+ for (const r of rows) {
133
+ const dn = r['data_name']
134
+ if (dn == null) continue
135
+ const s = String(dn)
136
+ if (s.trim() === '') continue
137
+ if (!seen.has(s)) { seen.add(s); groups.push(s) }
138
+ }
139
+ globalState.dataGroups = groups
140
+
141
+ // 构建 model_type 分组
142
+ globalState.modelTypeGroups = Object.keys(modelTypeMapping)
143
+
144
+ // 默认显示第一个数据集
145
+ if (globalState.dataGroups.length > 0) {
146
+ globalState.selectedDataName = globalState.dataGroups[0]
147
+ }
148
+
149
+ // 默认显示第一个模型类型
150
+ if (globalState.modelTypeGroups.length > 0) {
151
+ globalState.selectedModelType = 'all'
152
+ }
153
+
154
+ // 初始化可见列:优先使用 localStorage,否则默认显示所有列(除了 rank)
155
+ try {
156
+ const saved = localStorage.getItem('visible_columns')
157
+ if (saved) {
158
+ const parsed = JSON.parse(saved)
159
+ if (Array.isArray(parsed)) {
160
+ // 仅保留当前 CSV 中存在且不是默认隐藏的列
161
+ globalState.visibleColumns = parsed.filter(h => ordered.includes(h) && !globalState.DEFAULT_HIDDEN.has(h))
162
+ }
163
+ }
164
+ } catch (e) {
165
+ // ignore malformed localStorage
166
+ }
167
+ if (!globalState.visibleColumns || globalState.visibleColumns.length === 0) {
168
+ // 默认显示所有可选列(不包含默认隐藏列)
169
+ globalState.visibleColumns = ordered.filter(h => !globalState.DEFAULT_HIDDEN.has(h))
170
+ }
171
+
172
+ // 格式化 helper
173
+ const numericFloatCols = new Set(['uniform_entropy','conditional_entropy','entropy_gain','information_capacity','ic','constant','BF16_TFLOPs'])
174
+ const numericIntCols = new Set(['seq_len'])
175
+ // attach formatter per row for rendering convenience (non-reactive simple values)
176
+ for (const row of globalState.leaderboard) {
177
+ row._formatted = {}
178
+ for (const h of ordered) {
179
+ const raw = row[h]
180
+ if (raw == null || raw === '') { row._formatted[h] = '' ; continue }
181
+ if (numericIntCols.has(h)) {
182
+ const n = Number(raw)
183
+ row._formatted[h] = Number.isFinite(n) ? String(Math.round(n)) : raw
184
+ } else if (numericFloatCols.has(h)) {
185
+ const n = Number(raw)
186
+ row._formatted[h] = Number.isFinite(n) ? n.toFixed(3) : raw
187
+ } else {
188
+ row._formatted[h] = raw
189
+ }
190
+ }
191
+ }
192
+ } catch (e) {
193
+ console.error(e)
194
+ globalState.error = e && e.message ? e.message : String(e)
195
+ } finally {
196
+ globalState.loading = false
197
+ }
198
+ }
199
+
200
+ function selectAll() {
201
+ // 复制一份可选列到 visibleColumns
202
+ globalState.visibleColumns = [...selectableColumns.value]
203
+ }
204
+
205
+ function clearAll() {
206
+ globalState.visibleColumns = []
207
+ }
208
+
209
+ function formatCell(h, model) {
210
+ if (!model) return ''
211
+ if (model._formatted && model._formatted[h] !== undefined) return model._formatted[h]
212
+ return model[h]
213
+ }
214
+
215
+ // 初始化函数,在组件挂载时调用
216
+ function init() {
217
+ fetchAndLoadCsv()
218
+ }
219
+
220
+ export function useLeaderboardData() {
221
+ return {
222
+ // 状态
223
+ leaderboard: computed(() => globalState.leaderboard),
224
+ csvHeaders: computed(() => globalState.csvHeaders),
225
+ loading: computed(() => globalState.loading),
226
+ error: computed(() => globalState.error),
227
+ visibleColumns: computed({
228
+ get: () => globalState.visibleColumns,
229
+ set: (v) => globalState.visibleColumns = v
230
+ }),
231
+ selectableColumns,
232
+ autoShowSeries,
233
+ headerDisplayMap: computed(() => headerDisplayMap),
234
+ dataNameDisplayMap: computed(() => dataNameDisplayMap),
235
+ dataGroups: computed(() => globalState.dataGroups),
236
+ selectedDataName: computed({
237
+ get: () => globalState.selectedDataName,
238
+ set: (v) => globalState.selectedDataName = v
239
+ }),
240
+ modelTypeGroups: computed(() => globalState.modelTypeGroups),
241
+ selectedModelType: computed({
242
+ get: () => globalState.selectedModelType,
243
+ set: (v) => globalState.selectedModelType = v
244
+ }),
245
+ filteredLeaderboard,
246
+ displayedColumns,
247
+ // 函数
248
+ fetchAndLoadCsv,
249
+ selectAll,
250
+ clearAll,
251
+ formatCell,
252
+ init
253
+ }
254
+ }
src/main.js CHANGED
@@ -1,6 +1,8 @@
1
  import { createApp } from 'vue'
2
  import './main.css'
3
  import App from './App.vue'
 
4
 
5
  const app = createApp(App)
 
6
  app.mount('#app')
 
1
  import { createApp } from 'vue'
2
  import './main.css'
3
  import App from './App.vue'
4
+ import router from './router'
5
 
6
  const app = createApp(App)
7
+ app.use(router)
8
  app.mount('#app')
src/router/index.js ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { createRouter, createWebHistory } from 'vue-router'
2
+ import Leaderboard from '@/views/Leaderboard.vue'
3
+
4
+ const routes = [
5
+ {
6
+ path: '/',
7
+ name: 'Leaderboard',
8
+ component: Leaderboard
9
+ }
10
+ ]
11
+
12
+ const router = createRouter({
13
+ history: createWebHistory(),
14
+ routes
15
+ })
16
+
17
+ export default router
src/utils/csvUtils.js ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Lightweight CSV parsing helpers used by the app.
2
+ // Exports:
3
+ // - parseCSVLine(line): parse a single CSV line into array of values (handles quoted fields)
4
+ // - parseCsvContent(text): parse CSV text into { headers: string[], rows: Array<object> }
5
+
6
+ export function parseCSVLine(line) {
7
+ const res = []
8
+ let cur = ''
9
+ let inQuotes = false
10
+ for (let i = 0; i < line.length; i++) {
11
+ const ch = line[i]
12
+ if (inQuotes) {
13
+ if (ch === '"') {
14
+ if (i + 1 < line.length && line[i + 1] === '"') { cur += '"'; i++ } else { inQuotes = false }
15
+ } else { cur += ch }
16
+ } else {
17
+ if (ch === ',') { res.push(cur); cur = '' }
18
+ else if (ch === '"') { inQuotes = true }
19
+ else { cur += ch }
20
+ }
21
+ }
22
+ res.push(cur)
23
+ return res
24
+ }
25
+
26
+ export function parseCsvContent(txt) {
27
+ const lines = txt.split(/\r?\n/)
28
+ let headerIdx = null
29
+ for (let i = 0; i < lines.length; i++) if (lines[i].trim().length > 0) { headerIdx = i; break }
30
+ if (headerIdx === null) return { headers: [], rows: [] }
31
+ const headers = parseCSVLine(lines[headerIdx])
32
+ const rows = []
33
+ for (let i = headerIdx + 1; i < lines.length; i++) {
34
+ const l = lines[i]
35
+ if (!l || l.trim() === '') continue
36
+ const vals = parseCSVLine(l)
37
+ const obj = {}
38
+ for (let j = 0; j < headers.length; j++) obj[headers[j]] = vals[j] ?? ''
39
+ rows.push(obj)
40
+ }
41
+ return { headers, rows }
42
+ }
src/views/Leaderboard.vue ADDED
@@ -0,0 +1,174 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script setup>
2
+ import { ref, onMounted, watch } from 'vue'
3
+ import { useLeaderboardData } from '@/composables/useLeaderboardData.js'
4
+ import Chart from '@/components/Chart.vue'
5
+
6
+ // 使用数据管理 composable
7
+ const {
8
+ leaderboard,
9
+ csvHeaders,
10
+ loading,
11
+ error,
12
+ visibleColumns,
13
+ selectableColumns,
14
+ dataGroups,
15
+ selectedDataName,
16
+ autoShowSeries,
17
+ headerDisplayMap,
18
+ dataNameDisplayMap,
19
+ modelTypeGroups,
20
+ selectedModelType,
21
+ filteredLeaderboard,
22
+ displayedColumns,
23
+ fetchAndLoadCsv,
24
+ selectAll,
25
+ clearAll,
26
+ formatCell,
27
+ init
28
+ } = useLeaderboardData()
29
+
30
+ // 当 visibleColumns 改变时持久化
31
+ watch(visibleColumns, (v) => {
32
+ try { localStorage.setItem('visible_columns', JSON.stringify(v)) } catch (e) { }
33
+ }, { deep: true })
34
+
35
+ // theme (dark mode) support: sync with document root class and localStorage
36
+ const isDark = ref(false)
37
+
38
+ onMounted(() => {
39
+ init()
40
+ })
41
+
42
+ onMounted(() => {
43
+ const stored = localStorage.getItem('theme')
44
+ if (stored === 'dark') {
45
+ isDark.value = true
46
+ } else if (stored === 'light') {
47
+ isDark.value = false
48
+ } else {
49
+ // follow system preference when no stored preference
50
+ isDark.value = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
51
+ }
52
+ })
53
+
54
+ watch(isDark, (val) => {
55
+ try {
56
+ if (val) document.documentElement.classList.add('dark')
57
+ else document.documentElement.classList.remove('dark')
58
+ localStorage.setItem('theme', val ? 'dark' : 'light')
59
+ } catch (e) {
60
+ // ignore if SSR or unavailable
61
+ }
62
+ })
63
+
64
+ function toggleTheme() {
65
+ isDark.value = !isDark.value
66
+ }
67
+ </script>
68
+
69
+ <template>
70
+ <div class="min-h-screen bg-gray-50 dark:bg-gradient-to-b dark:from-gray-900 dark:via-gray-800 dark:to-gray-800 py-12 px-4 sm:px-6 lg:px-8">
71
+ <div class=" mx-auto">
72
+ <header class="mb-6 flex items-start justify-between">
73
+ <div>
74
+ <h1 class="text-3xl font-extrabold text-gray-900 dark:text-gray-100">LLM Leaderboard</h1>
75
+ <p class="mt-1 text-sm text-gray-600 dark:text-gray-300">按分数排序的顶级大模型(演示数据)</p>
76
+ </div>
77
+ </header>
78
+
79
+ <Chart :autoShowSeries="autoShowSeries" />
80
+
81
+ <div class="bg-white dark:bg-gray-900/60 shadow rounded-lg overflow-hidden">
82
+ <div
83
+ class="px-6 py-4 border-b bg-gradient-to-r from-indigo-50 via-white to-white dark:bg-gradient-to-r dark:from-gray-800 dark:via-gray-900 dark:to-gray-900">
84
+ <div class="flex items-center justify-between">
85
+ <h2 class="text-lg font-medium text-gray-800 dark:text-gray-50">排行榜</h2>
86
+ <div class="text-sm text-gray-500 dark:text-gray-300">更新于模拟数据</div>
87
+ </div>
88
+ </div>
89
+
90
+ <!-- 数据集筛选区域(独立于列筛选) -->
91
+ <div class="px-6 py-3 border-b bg-gray-50 dark:bg-gradient-to-b dark:from-gray-900 dark:to-gray-800">
92
+ <div class="flex items-center gap-3">
93
+ <span class="text-sm font-medium text-gray-700 dark:text-gray-200">数据集筛选</span>
94
+ <div v-if="dataGroups.length > 0" class="flex gap-2 items-center overflow-x-auto">
95
+ <!-- <label class="px-2 py-1 rounded-full border border-gray-200 dark:border-gray-700 text-sm cursor-pointer" :class="{'bg-gray-100 dark:bg-gray-700': selectedDataName==='all'}">
96
+ <input type="radio" class="hidden" value="all" v-model="selectedDataName" /> 全部
97
+ </label> -->
98
+ <label v-for="g in dataGroups" :key="g" class="px-2 py-1 rounded-full border border-gray-200 dark:border-gray-700 text-sm cursor-pointer dark:text-slate-300" :class="{'bg-gray-100 dark:bg-gray-700 dark:text-white': selectedDataName===g}">
99
+ <input type="radio" class="hidden" :value="g" v-model="selectedDataName" /> {{ dataNameDisplayMap[g] ? dataNameDisplayMap[g] : g }}
100
+ </label>
101
+ </div>
102
+ <div v-else class="text-sm text-gray-500 dark:text-gray-400">(数据集中未检测到 data_name 列)</div>
103
+ </div>
104
+ </div>
105
+
106
+ <!-- 模型类型筛选区域 -->
107
+ <div class="px-6 py-3 border-b bg-gray-50 dark:bg-gradient-to-b dark:from-gray-900 dark:to-gray-800">
108
+ <div class="flex items-center gap-3">
109
+ <span class="text-sm font-medium text-gray-700 dark:text-gray-200">模型类型筛选</span>
110
+ <div v-if="modelTypeGroups.length > 0" class="flex gap-2 items-center overflow-x-auto">
111
+ <label class="px-2 py-1 rounded-full border border-gray-200 dark:border-gray-700 text-sm cursor-pointer dark:text-slate-300" :class="{'bg-gray-100 dark:bg-gray-700 dark:text-white': selectedModelType==='all'}">
112
+ <input type="radio" class="hidden" value="all" v-model="selectedModelType" /> 全部
113
+ </label>
114
+ <label v-for="g in modelTypeGroups" :key="g" class="px-2 py-1 rounded-full border border-gray-200 dark:border-gray-700 text-sm cursor-pointer dark:text-slate-300" :class="{'bg-gray-100 dark:bg-gray-700 dark:text-white': selectedModelType===g}">
115
+ <input type="radio" class="hidden" :value="g" v-model="selectedModelType" /> {{ g }}
116
+ </label>
117
+ </div>
118
+ <div v-else class="text-sm text-gray-500 dark:text-gray-400">(未配置模型类型映射)</div>
119
+ </div>
120
+ </div>
121
+
122
+ <!-- 美化后的内联列选择区域:pills 风格,支持水平滚动,并兼容深色/浅色模式 -->
123
+ <div class="px-6 py-3 border-b bg-gray-50 dark:bg-gradient-to-b dark:from-gray-900 dark:to-gray-800">
124
+ <div class="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3">
125
+ <div class="flex items-center gap-3">
126
+ <span class="text-sm font-medium text-gray-700 dark:text-gray-200">显示列</span>
127
+ <div class="flex items-center gap-2">
128
+ <button @click.prevent="selectAll" class="text-sm px-2 py-1 bg-white/90 dark:bg-gray-700/60 border border-gray-200 dark:border-gray-600 rounded text-gray-700 dark:text-gray-200 hover:bg-white dark:hover:bg-gray-600 transition">全选</button>
129
+ <button @click.prevent="clearAll" class="text-sm px-2 py-1 bg-transparent border border-gray-200 dark:border-gray-700 rounded text-gray-600 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 transition">清除</button>
130
+ </div>
131
+ </div>
132
+
133
+ <div class="flex-1 overflow-x-auto">
134
+ <div class="flex gap-2 items-center px-1 py-2">
135
+ <label v-for="h in selectableColumns" :key="h" class="flex items-center gap-2 text-sm bg-white dark:bg-gray-800 px-3 py-1 rounded-full border border-gray-200 dark:border-gray-700 hover:shadow-sm whitespace-nowrap">
136
+ <input type="checkbox" :value="h" v-model="visibleColumns" class="h-4 w-4 text-indigo-600 dark:text-indigo-400 bg-white dark:bg-gray-700 border-gray-300 dark:border-gray-600 rounded" />
137
+ <span class="truncate text-gray-800 dark:text-gray-50">{{ headerDisplayMap[h] || h }}</span>
138
+ </label>
139
+ </div>
140
+ </div>
141
+ </div>
142
+ </div>
143
+
144
+ <div class="p-4 overflow-x-auto">
145
+ <table class="min-w-full divide-y divide-gray-200 dark:divide-gray-700">
146
+ <thead class="bg-gray-50 dark:bg-gradient-to-r dark:from-gray-800 dark:to-gray-900">
147
+ <tr>
148
+ <th class="px-4 py-2 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider">#</th>
149
+ <th v-for="h in displayedColumns" :key="h" class="px-4 py-2 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider">
150
+ {{ headerDisplayMap[h] || h }}
151
+ </th>
152
+ </tr>
153
+ </thead>
154
+ <tbody class="bg-white dark:bg-transparent divide-y divide-gray-100 dark:divide-gray-700">
155
+ <tr v-for="model in filteredLeaderboard" :key="model.rank" :class="{
156
+ 'bg-yellow-50 dark:bg-yellow-700/25': model.rank === 1,
157
+ 'bg-gray-50 dark:bg-gray-800/60': model.rank === 2,
158
+ 'bg-indigo-50 dark:bg-indigo-700/25': model.rank === 3
159
+ }" class="hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors duration-150">
160
+ <td class="px-4 py-3 whitespace-nowrap font-medium text-gray-800 dark:text-gray-50">#{{ model.rank }}
161
+ </td>
162
+ <td v-for="h in displayedColumns" :key="h" class="px-4 py-3 whitespace-nowrap">
163
+ <div class="text-sm text-gray-800 dark:text-gray-50">{{ formatCell(h, model) }}</div>
164
+ </td>
165
+ </tr>
166
+ </tbody>
167
+ </table>
168
+ </div>
169
+ </div>
170
+ </div>
171
+ </div>
172
+ </template>
173
+
174
+ <style scoped></style>
tsconfig.json DELETED
@@ -1,11 +0,0 @@
1
- {
2
- "files": [],
3
- "references": [
4
- {
5
- "path": "./tsconfig.node.json"
6
- },
7
- {
8
- "path": "./tsconfig.app.json"
9
- }
10
- ]
11
- }