Yoobit commited on
Commit
f50aa23
·
1 Parent(s): deeeb60
.dockerignore ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 忽略所有 .log 文件
2
+ *.log
3
+
4
+ # 忽略 node_modules(通常不需要从主机复制进去)
5
+ node_modules/
6
+
7
+ # 忽略构建输出目录
8
+ dist/
9
+
10
+ # 忽略 .git 目录
11
+ .git/
12
+
13
+ # 忽略环境变量文件
14
+ .env
15
+ .env.local
16
+
17
+ # 忽略测试目录
18
+ tests/
19
+ __pycache__/
20
+ *.pyc
21
+
22
+ # 忽略 macOS 元数据
23
+ .DS_Store
24
+
25
+ .vscode
.editorconfig ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ [*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue,css,scss,sass,less,styl}]
2
+ charset = utf-8
3
+ indent_size = 2
4
+ indent_style = space
5
+ insert_final_newline = true
6
+ trim_trailing_whitespace = true
7
+
8
+ end_of_line = lf
9
+ max_line_length = 100
.gitattributes copy ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
.gitignore ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Logs
2
+ logs
3
+ *.log
4
+ npm-debug.log*
5
+ yarn-debug.log*
6
+ yarn-error.log*
7
+ pnpm-debug.log*
8
+ lerna-debug.log*
9
+
10
+ node_modules
11
+ .DS_Store
12
+ dist
13
+ dist-ssr
14
+ coverage
15
+ *.local
16
+
17
+ /cypress/videos/
18
+ /cypress/screenshots/
19
+
20
+ # Editor directories and files
21
+ .vscode/*
22
+ !.vscode/extensions.json
23
+ .idea
24
+ *.suo
25
+ *.ntvs*
26
+ *.njsproj
27
+ *.sln
28
+ *.sw?
29
+
30
+ *.tsbuildinfo
31
+
32
+ data
33
+ outdata
34
+
35
+ pnpm-lock.yaml
.prettierrc.json ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ {
2
+ "$schema": "https://json.schemastore.org/prettierrc",
3
+ "semi": false,
4
+ "singleQuote": true,
5
+ "printWidth": 100
6
+ }
Dockerfile CHANGED
@@ -1,16 +1,31 @@
1
- # Read the doc: https://huggingface.co/docs/hub/spaces-sdks-docker
2
- # you will also find guides on how best to write your Dockerfile
3
 
4
- FROM python:3.9
5
 
6
- RUN useradd -m -u 1000 user
7
- USER user
8
- ENV PATH="/home/user/.local/bin:$PATH"
9
 
10
- WORKDIR /app
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
 
12
- COPY --chown=user ./requirements.txt requirements.txt
13
- RUN pip install --no-cache-dir --upgrade -r requirements.txt
14
 
15
- COPY --chown=user . /app
16
- CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
 
1
+ # 第一阶段:构建应用
2
+ FROM node:18-alpine as build
3
 
4
+ WORKDIR /app
5
 
6
+ # 复制依赖文件
7
+ COPY package*.json ./
 
8
 
9
+ # 安装 pnpm 并安装依赖
10
+ RUN npm install -g pnpm && pnpm install
11
+
12
+ # 复制源代码
13
+ COPY . .
14
+
15
+ # 构建应用
16
+ RUN pnpm build
17
+
18
+ # 第二阶段:运行 nginx 服务器
19
+ FROM nginx:alpine
20
+
21
+ # 复制构建产物到 nginx 目录
22
+ COPY --from=build /app/dist /usr/share/nginx/html
23
+
24
+ # 复制自定义 nginx 配置(让 nginx 在 7860 端口监听)
25
+ COPY nginx.conf /etc/nginx/conf.d/default.conf
26
 
27
+ # 暴露端口 7860(宿主或平台需将此端口映射/开放)
28
+ EXPOSE 7860
29
 
30
+ # 启动 nginx
31
+ CMD ["nginx", "-g", "daemon off;"]
README copy.md ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: LLM IC Leaderboard
3
+ emoji: 👍
4
+ colorFrom: purple
5
+ colorTo: indigo
6
+ sdk: docker
7
+ suggested_hardware: cpu-basic
8
+ suggested_storage: small
9
+ pinned: false
10
+ ---
11
+
12
+
13
+
14
+
15
+ # 使用
16
+ 1. 配置参数及字典映射: `src/composables/useLeaderboardData.js`
17
+ ```js
18
+ DEFAULT_HIDDEN: new Set(['seq_len', 'uniform_entropy', 'entropy_gain', 'information_capacity', 'data_name']) // 默认隐藏的列
19
+
20
+ // 模型类型映射对象:键为模型类型,值为包含的 model_series 数组
21
+ const modelTypeMapping = {
22
+ 'Qwen1.5':['Qwen1.5'],
23
+ 'Qwen2.5':['Qwen2.5'],
24
+ 'Gemma-3': ['gemma-3'],
25
+ 'Qwen2': ['Qwen2'],
26
+ 'Hunyuan': ['Hunyuan'],
27
+ 'Qwen3': ['Qwen3'],
28
+ 'InternLM2.5': ['internlm2.5'],
29
+ 'Llama-3': ['Llama-3.1','Llama-3.2'],
30
+ 'DeepSeek-V2': ['DeepSeek-V2'],
31
+ 'DeepSeek-V3.1': ['DeepSeek-V3.1-Base'],
32
+ 'GLM-4': ['glm-4','GLM-4'],
33
+ 'GLM-4.5': ['GLM-4.5-Air-Base','GLM-4.5-Base'],
34
+ 'Llama-4': ['Llama-4'],
35
+ 'Seed-OSS': ['Seed-OSS'],
36
+ }
37
+
38
+ const autoShowSeries = ['Qwen3','Llama-3','InternLM2.5','GLM-4','Seed-OSS','Gemma-3','Hunyuan','DeepSeek-V3.1','DeepSeek-V2','GLM-4.5']
39
+
40
+ // 表头显示名称映射(raw header -> 显示名),可以在此添加或由用户修改
41
+ const headerDisplayMap = reactive({
42
+ 'model_name': 'MODEL NAME',
43
+ 'model_series': 'MODEL SERIES',
44
+ 'model_size (B)': 'MODEL SIZE (B)',
45
+ 'BF16_TFLOPs': 'BF16 TFLOPs',
46
+ 'ic': 'IC',
47
+ })
48
+
49
+ // 数据集名称显示映射(raw data_name -> 显示名)
50
+ const dataNameDisplayMap = reactive({
51
+ 'data_part_0000': 'Data Part 0000',
52
+ 'NextCoderDataset_v1_lo': 'NextCoder v1',
53
+ 'IndustryCorpus_batch_aa_long': 'Industry Corpus AA',
54
+ 'CC-MAIN-2013-20_train-00000-of-00014_long': 'CC-MAIN (2013-20)',
55
+ 'NextCoderDataset_v1_long': 'NextCoder v1',
56
+ })
57
+
58
+ // MoE模型区分配置
59
+ const MoEModelSeries = ['Qwen2', 'Qwen1.5']
60
+
61
+ ```
62
+
63
+ # 安装
64
+
65
+ ## 1 合并 CSV(脚本)
66
+
67
+ 仓库包含一个小脚本 `scripts/merge_csv.js`,用于把多个 CSV 合并为一个文件(简单合并,保留首次出现的列顺序)。
68
+
69
+ 示例:
70
+
71
+ ```sh
72
+ # 使用目录
73
+ npm run merge-csv -- --inputDir ./data --out ./merged.csv
74
+
75
+ # 或直接传文件
76
+ npm run merge-csv -- file1.csv file2.csv --out merged.csv
77
+ ```
78
+
79
+ 说明:`npm run merge-csv` 后面的参数会传递给脚本(注意 `--`),脚本会把所有 CSV 的表头合并成最终输出的表头,行数按各文件合并。该实现为轻量版,能处理普通带引号字段的 CSV,但不保证支持所有复杂嵌套换行场景。
80
+
81
+ ## 2 统计类别
82
+ ```sh
83
+ node .\scripts\count_column.js --file .\data\entropy_calc4_part3.csv --column model_series --out .\p3_model_series.csv
84
+ ```
85
+ 统计后需要手动合并类目,如Llama-3.2 Llama-3.1合并为Llama-3
86
+ 删除TingLLama
87
+
88
+ ## 3. 筛选处理
89
+ 因为在步骤`2`中我们删除了TinyLlama,执行此脚本从merged.csv中提取出最终表
90
+
91
+ 使用默认路径(merged.csv 在 outdata):
92
+ `node .\scripts\filter_by_series.js`
93
+
94
+ 指定输入文件与 series 列表并输出到自定义文件:
95
+ `node .\scripts\filter_by_series.js --file .\outdata\merged.csv --series .\outdata\p3_model_series.csv --out .\outdata\filtered.csv`
README.md CHANGED
@@ -5,6 +5,8 @@ colorFrom: yellow
5
  colorTo: green
6
  sdk: docker
7
  pinned: false
 
 
8
  license: apache-2.0
9
  short_description: 这是用作测试的
10
  ---
 
5
  colorTo: green
6
  sdk: docker
7
  pinned: false
8
+ suggested_hardware: cpu-basic
9
+ suggested_storage: small
10
  license: apache-2.0
11
  short_description: 这是用作测试的
12
  ---
config.app.json ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "extends": "@vue/tsconfig/tsconfig.dom.json",
3
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
4
+ "exclude": ["src/**/__tests__/*"],
5
+ "compilerOptions": {
6
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
7
+
8
+ "paths": {
9
+ "@/*": ["./src/*"]
10
+ }
11
+ }
12
+ }
docker-compose.yml ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ version: '3.8'
2
+
3
+ services:
4
+ web:
5
+ build: .
6
+ ports:
7
+ - "7860:80"
8
+ restart: unless-stopped
env.d.ts ADDED
@@ -0,0 +1 @@
 
 
1
+ /// <reference types="vite/client" />
eslint.config.ts ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { globalIgnores } from 'eslint/config'
2
+ import { defineConfigWithVueTs, vueTsConfigs } from '@vue/eslint-config-typescript'
3
+ import pluginVue from 'eslint-plugin-vue'
4
+ import skipFormatting from '@vue/eslint-config-prettier/skip-formatting'
5
+
6
+ // To allow more languages other than `ts` in `.vue` files, uncomment the following lines:
7
+ // import { configureVueProject } from '@vue/eslint-config-typescript'
8
+ // configureVueProject({ scriptLangs: ['ts', 'tsx'] })
9
+ // More info at https://github.com/vuejs/eslint-config-typescript/#advanced-setup
10
+
11
+ export default defineConfigWithVueTs(
12
+ {
13
+ name: 'app/files-to-lint',
14
+ files: ['**/*.{ts,mts,tsx,vue}'],
15
+ },
16
+
17
+ globalIgnores(['**/dist/**', '**/dist-ssr/**', '**/coverage/**']),
18
+
19
+ pluginVue.configs['flat/essential'],
20
+ vueTsConfigs.recommended,
21
+ skipFormatting,
22
+ )
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
index.html ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <link rel="icon" href="">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <meta name="description" content="Information Capacity Leaderboard - TeleAI">
8
+ <title>Information Capacity Leaderboard - TeleAI</title>
9
+ </head>
10
+ <body>
11
+ <div id="app"></div>
12
+ <script type="module" src="/src/main.js"></script>
13
+ </body>
14
+ </html>
nginx.conf ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ server {
2
+ listen 7860;
3
+ server_name localhost;
4
+
5
+ root /usr/share/nginx/html;
6
+ index index.html;
7
+
8
+ # Single Page App: 如果找不到请求的静态文件,则返回 index.html
9
+ location / {
10
+ try_files $uri $uri/ /index.html;
11
+ }
12
+
13
+ # 可选:短时间缓存静态资源
14
+ location ~* \.(?:css|js|jpg|jpeg|gif|png|svg|ico|woff2?|ttf|eot)$ {
15
+ expires 7d;
16
+ add_header Cache-Control "public";
17
+ }
18
+ }
package-lock.json ADDED
The diff for this file is too large to render. See raw diff
 
package.json ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "vue",
3
+ "version": "1.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "vite build",
9
+ "preview": "vite preview --host 0.0.0.0",
10
+ "lint": "eslint . --fix",
11
+ "format": "prettier --write src/"
12
+ },
13
+ "dependencies": {
14
+ "echarts": "^6.0.0",
15
+ "pinia": "^3.0.1",
16
+ "vue": "^3.5.13",
17
+ "vue-router": "^4.5.0"
18
+ },
19
+ "devDependencies": {
20
+ "@vitejs/plugin-vue": "^5.2.3",
21
+ "@vue/eslint-config-prettier": "^10.2.0",
22
+ "@vue/tsconfig": "^0.7.0",
23
+ "autoprefixer": "^10.4.21",
24
+ "eslint": "^9.22.0",
25
+ "eslint-plugin-vue": "~10.0.0",
26
+ "jiti": "^2.4.2",
27
+ "npm-run-all2": "^7.0.2",
28
+ "postcss": "^8.5.6",
29
+ "prettier": "3.5.3",
30
+ "tailwindcss": "^3.3.3",
31
+ "vite": "^6.2.4",
32
+ "vite-plugin-vue-devtools": "^7.7.2"
33
+ }
34
+ }
postcss.config.js ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ export default {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+ }
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/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 ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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,329 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ // 独立监听主题变化
10
+ const isDarkChart = ref(document.documentElement.classList.contains('dark'))
11
+
12
+ let themeObserver = null
13
+
14
+ const { leaderboard, selectedDataNameChart, modelTypeGroups, strtSymbolSeries } = useLeaderboardData()
15
+
16
+ // 接受一个可选 prop:autoShowSeries(数组),用于指定哪些模型类型在图表加载时自动显示。
17
+ // 例如:<Chart :autoShowSeries="['gemma-3','Hunyuan']" />
18
+ const props = defineProps({
19
+ autoShowSeries: { type: Array, default: () => [] }
20
+ })
21
+
22
+ // 把 leaderboard 转成 ECharts 所需的 series 数组(每个 model_series 一条线)
23
+ function buildSeriesFromLeaderboard(rows = []) {
24
+ const groups = {}
25
+ rows.forEach(r => {
26
+ // 按 model_type 分组;如果 model_type 未填则标记为 未知
27
+ // 优化:如果行上有 _isMoE 标记,则把其归为 "<model_type> (MoE)" 系列,且保留 model_series_base
28
+ const baseType = r.model_type || '未知'
29
+ const isMoE = !!r._isMoE
30
+ const seriesName = isMoE ? `${baseType} (MoE)` : baseType
31
+ if (!groups[seriesName]) groups[seriesName] = []
32
+ // 数据原本单位为 FLOPs (G),转换为 FLOPs(1 TFLOP = 1e12 FLOPs)用于对数尺度显示
33
+ const xRaw = parseFloat(r.BF16_TFLOPs) || 0
34
+ const x = xRaw > 0 ? xRaw * 1e12 / 1024 : 0
35
+ // const x = xRaw
36
+ const y = parseFloat(r.ic) || 0
37
+ const rank = Number(r.rank) || 0
38
+ groups[seriesName].push({ x, y, rank })
39
+ })
40
+
41
+ return Object.keys(groups).map(name => {
42
+ // 过滤掉 x<=0 的点(对数坐标轴不能显示 0 或负值),并按 x 轴值排序
43
+ const data = groups[name]
44
+ .filter(p => Number.isFinite(p.x) && p.x > 0 && Number.isFinite(p.y))
45
+ .sort((a, b) => a.x - b.x)
46
+ .map(d => [d.x, d.y])
47
+ // 根据该系列的样本点数量适度放大 symbolSize,避免点太小难以点击
48
+ const count = groups[name].length || 1
49
+ const symbolSize = Math.min(18, 6 + Math.sqrt(count) * 1.6)
50
+ return { name, rawCount: count, type: 'line', showSymbol: true, symbolSize, data }
51
+ })
52
+ }
53
+
54
+ function getChartOption(series, isDark = false) {
55
+ // 根据主题设置颜色
56
+ const titleColor = isDark ? '#cfd8dc' : '#333333'
57
+ const legendColor = isDark ? '#cfd8dc' : '#333333'
58
+ const axisLineColor = isDark ? '#78909c' : '#666666'
59
+ const axisLabelColor = isDark ? '#b0bec5' : '#666666'
60
+ const splitLineColor = isDark ? '#37474f' : '#cccccc'
61
+ // 计算数据范围以自动缩放坐标轴,避免留太多空白
62
+ const allX = []
63
+ const allY = []
64
+ series.forEach(s => {
65
+ if (Array.isArray(s.data)) {
66
+ s.data.forEach(d => {
67
+ const x = Number(d[0])
68
+ const y = Number(d[1])
69
+ if (Number.isFinite(x)) allX.push(x)
70
+ if (Number.isFinite(y)) allY.push(y)
71
+ })
72
+ }
73
+ })
74
+ let xMin = allX.length ? Math.min(...allX) : undefined
75
+ let xMax = allX.length ? Math.max(...allX) : undefined
76
+ let yMin = allY.length ? Math.min(...allY) : undefined
77
+ let yMax = allY.length ? Math.max(...allY) : undefined
78
+
79
+ // 对数轴不能为 0 或负值,确保 min>0;并添加一些 padding
80
+ if (xMin !== undefined && xMax !== undefined) {
81
+ // 防止极值过于接近或相等
82
+ if (xMin <= 0) xMin = Math.min(...allX.filter(v => v > 0)) || xMax
83
+ if (xMin === xMax) {
84
+ xMin = xMin / 10
85
+ xMax = xMax * 10
86
+ } else {
87
+ xMin = xMin * 0.8
88
+ xMax = xMax * 1.15
89
+ }
90
+ }
91
+
92
+ if (yMin !== undefined && yMax !== undefined) {
93
+ if (yMin === yMax) {
94
+ // small symmetric padding
95
+ // 如果只有单一数值,使用该值作为中心;但若该值为 0,则不要把区间提升到以 1 为中心(之前用 `yMin || 1` 会导致 0 -> 1)
96
+ const v = (yMin !== undefined ? yMin : 1)
97
+ if (v === 0) {
98
+ // 为 0 时给一个小的对称 padding(之后如果原始数据全为正,会被下限为 0)
99
+ const pad = 0.05
100
+ yMin = -pad
101
+ yMax = pad
102
+ } else {
103
+ yMin = v - Math.abs(v) * 0.05
104
+ yMax = v + Math.abs(v) * 0.05
105
+ }
106
+ } else {
107
+ const pad = (yMax - yMin) * 0.08
108
+ yMin = yMin - pad
109
+ yMax = yMax + pad
110
+ }
111
+ // 如果 yMin 变为负但原数据全为正,可以下限为 0
112
+ if (yMin < 0 && Math.min(...allY) >= 0) yMin = 0
113
+ }
114
+
115
+ // helper: 将整数指数转换为 Unicode 上标字符,例如 9 -> '⁹', -3 -> '⁻³'
116
+ function toSuperscript(n) {
117
+ const map = { '0': '⁰', '1': '¹', '2': '²', '3': '³', '4': '⁴', '5': '⁵', '6': '⁶', '7': '⁷', '8': '⁸', '9': '⁹', '-': '⁻' }
118
+ const s = String(n)
119
+ return s.split('').map(ch => map[ch] || ch).join('')
120
+ }
121
+ // 可循环使用的视觉样式(颜色/符号/线型)
122
+ // 7 种颜色从红到紫,重复使用
123
+ const colors = ['#1F77B4', '#ff7f0e', '#2CA02C', '#D62728', '#9467BD', '#8C564B', '#E377C2', '#7F7F7F', '#BCBD22', '#17BECF']
124
+ const lineStyles = ['solid', 'solid', 'solid', 'solid', 'dash', 'solid', 'solid']
125
+
126
+ // 先构建不带颜色/符号的基础 series(rawSeries),后面会在排序后按顺序分配颜色和符号
127
+ const rawSeries = series.map(s => {
128
+ const baseSize = Number(s.symbolSize) || 8
129
+ return Object.assign({}, s, { symbolSize: baseSize, hoverAnimation: true })
130
+ })
131
+
132
+ // 构建 legend.selected 映射:只有 props.autoShowSeries 中的系列会默认显示,其他需手动点击 legend 打开
133
+ const legendSelected = {}
134
+ if (props.autoShowSeries.includes("*")) {
135
+ rawSeries.forEach(s => {
136
+ const name = String(s.name)
137
+ legendSelected[name] = true
138
+ })
139
+ }
140
+ else {
141
+ rawSeries.forEach(s => {
142
+ const name = String(s.name)
143
+ legendSelected[name] = Array.isArray(props.autoShowSeries) && props.autoShowSeries.includes(name)
144
+ })
145
+ }
146
+
147
+
148
+ // 按 modelTypeMapping 的定义顺序对 series 排序(使用来自 useLeaderboardData 的 modelTypeGroups)
149
+ const preferredOrder = (modelTypeGroups && Array.isArray(modelTypeGroups.value)) ? modelTypeGroups.value : []
150
+ const orderIndex = {}
151
+ preferredOrder.forEach((n, i) => { orderIndex[String(n)] = i })
152
+ // console.log('Preferred series order:', preferredOrder)
153
+ const inOrder = []
154
+ const rest = []
155
+ rawSeries.forEach(s => {
156
+ const name = String(s.name)
157
+ if (Object.prototype.hasOwnProperty.call(orderIndex, name)) {
158
+ inOrder.push(s)
159
+ } else {
160
+ rest.push(s)
161
+ }
162
+ })
163
+ // 按映射顺序排序 inOrder
164
+ inOrder.sort((a, b) => orderIndex[String(a.name)] - orderIndex[String(b.name)])
165
+ // 其余的按名字字母序 (目前全部指定映射了)
166
+ rest.sort((a, b) => String(a.name).localeCompare(String(b.name)))
167
+
168
+ // console.log('Final series order:', inOrder.map(s => s.name), rest.map(s => s.name))
169
+
170
+ const finalSeries = [...inOrder, ...rest]
171
+
172
+ // 现在按 finalSeries 顺序分配颜色和符号,保证颜色顺序与 modelTypeMapping 一致
173
+ const finalSeriesStyled = finalSeries.map((s, idx) => {
174
+ const color = colors[idx % colors.length]
175
+ const lineType = lineStyles[idx % lineStyles.length] || 'solid'
176
+ // 如果 series 名称包含 (MoE) 则使用星形
177
+ const isMoESeries = String(s.name).includes('(MoE)')
178
+ const symbolShape = strtSymbolSeries.includes(String(s.name)) ?
179
+ 'path://M341.5 45.1C337.4 37.1 329.1 32 320.1 32C311.1 32 302.8 37.1 298.7 45.1L225.1 189.3L65.2 214.7C56.3 216.1 48.9 222.4 46.1 231C43.3 239.6 45.6 249 51.9 255.4L166.3 369.9L141.1 529.8C139.7 538.7 143.4 547.7 150.7 553C158 558.3 167.6 559.1 175.7 555L320.1 481.6L464.4 555C472.4 559.1 482.1 558.3 489.4 553C496.7 547.7 500.4 538.8 499 529.8L473.7 369.9L588.1 255.4C594.5 249 596.7 239.6 593.9 231C591.1 222.4 583.8 216.1 574.8 214.7L415 189.3L341.5 45.1z'
180
+ : 'circle'
181
+ // console.log(`Series "${s.name}" uses symbol "${symbolShape}"`)
182
+ const baseSize = Number(s.symbolSize) || 8
183
+ const emphasisSize = Math.max(12, Math.round(baseSize * 1.6))
184
+ // 如果是星形,增大尺寸以匹配视觉效果
185
+ const adjustedBaseSize = symbolShape !== 'circle' ? baseSize * 1.5 : baseSize
186
+ const adjustedEmphasisSize = symbolShape !== 'circle' ? emphasisSize * 1.5 : emphasisSize
187
+ return Object.assign({}, s, {
188
+ lineStyle: { width: 2, type: lineType, color },
189
+ itemStyle: {
190
+ borderColor: '#f3f3f3', // 高亮时拐点边框颜色
191
+ borderWidth: symbolShape !== 'circle' ? 1 : 0, // 拐点边框宽度
192
+ borderCap: 'round',
193
+ borderRadius: 1,
194
+ shadowBlur: 0, // 阴影大小
195
+ shadowColor: '#45DB76'
196
+ }, // 阴影颜色 },
197
+ symbol: symbolShape,
198
+ symbolSize: adjustedBaseSize,
199
+ hoverAnimation: true,
200
+ emphasis: {
201
+ focus: 'series',
202
+ symbolSize: adjustedEmphasisSize,
203
+ itemStyle: { borderWidth: 2, borderColor: '#ffffff' }
204
+ }
205
+ })
206
+ })
207
+ const legendData = finalSeriesStyled.map(s => String(s.name))
208
+
209
+ return {
210
+ color: colors,
211
+ tooltip: {
212
+ trigger: 'item',
213
+ formatter: params => {
214
+ if (!params) return ''
215
+ const x = params.data && Array.isArray(params.data) ? params.data[0] : ''
216
+ const y = params.data && Array.isArray(params.data) ? params.data[1] : ''
217
+ // 显示 X 为 mantissa×10^n,并把指数用上标显示
218
+ let xStr = ''
219
+ if (typeof x === 'number' && Number.isFinite(x) && x > 0) {
220
+ const exp = Math.floor(Math.log10(x))
221
+ const mant = x / Math.pow(10, exp)
222
+ const mantStr = mant >= 10 ? mant.toFixed(0) : mant.toFixed(2)
223
+ xStr = `${mantStr}×10${toSuperscript(exp)}`
224
+ } else {
225
+ xStr = String(x)
226
+ }
227
+ const yStr = (typeof y === 'number' && Number.isFinite(y)) ? Number(y).toFixed(4) : String(y)
228
+ return `${params.seriesName}<br/>FLOPs: ${xStr}<br/>IC: ${yStr}`
229
+ }
230
+ },
231
+ legend: Object.assign({
232
+ orient: 'vertical',
233
+ right: 10,
234
+ top: '10%',
235
+ align: 'left',
236
+ itemWidth: 14,
237
+ itemHeight: 10,
238
+ textStyle: { color: legendColor },
239
+ tooltip: { show: true }
240
+ }, { selected: legendSelected, data: legendData }),
241
+ grid: { left: '6%', right: '20%', bottom: '8%', containLabel: true },
242
+ xAxis: {
243
+ type: 'log',
244
+ name: 'FLOPs',
245
+ nameLocation: 'middle',
246
+ nameGap: 30,
247
+ axisLine: { lineStyle: { color: axisLineColor } },
248
+ axisLabel: {
249
+ color: axisLabelColor,
250
+ formatter: value => {
251
+ if (!Number.isFinite(value) || value <= 0) return String(value)
252
+ const exp = Math.floor(Math.log10(value))
253
+ const mant = value / Math.pow(10, exp)
254
+ if (Math.abs(mant - 1) < 1e-6) return `10${toSuperscript(exp)}`
255
+ return `${mant.toFixed(2)}×10${toSuperscript(exp)}`
256
+ }
257
+ },
258
+ splitLine: { show: true, lineStyle: { type: 'dashed', color: splitLineColor } },
259
+ min: xMin,
260
+ max: xMax
261
+ },
262
+ yAxis: {
263
+ type: 'value',
264
+ name: 'Information capacity',
265
+ axisLine: { lineStyle: { color: axisLineColor } },
266
+ axisLabel: { color: axisLabelColor, formatter: v => (Number.isFinite(v) ? Number(v).toFixed(2) : String(v)) },
267
+ splitLine: { show: true, lineStyle: { type: 'dashed', color: splitLineColor } },
268
+ min: yMin,
269
+ max: yMax
270
+ },
271
+ series: finalSeriesStyled
272
+ }
273
+ }
274
+
275
+ let resizeHandler = null
276
+
277
+ function renderChart() {
278
+ if (!chart) return
279
+ let rows = leaderboard.value || []
280
+ // 根据 selectedDataNameChart 过滤数据集(如果未选择或为 'all' 则使用全部)
281
+ const sel = selectedDataNameChart && selectedDataNameChart.value ? String(selectedDataNameChart.value) : ''
282
+ if (sel && sel !== 'all') {
283
+ rows = rows.filter(r => String(r.data_name ?? '') === sel)
284
+ }
285
+ const series = buildSeriesFromLeaderboard(rows)
286
+ const option = getChartOption(series, isDarkChart.value)
287
+ chart.setOption(option, { notMerge: true })
288
+ }
289
+
290
+ onMounted(() => {
291
+ isDarkChart.value = window.matchMedia("(prefers-color-scheme: dark)").matches //true | false
292
+
293
+ if (!chartRef.value) return
294
+ chart = echarts.init(chartRef.value)
295
+ // 首次渲染(如果数据尚未加载,后续会由 watcher 更新)
296
+ renderChart()
297
+
298
+ resizeHandler = () => chart && chart.resize()
299
+ window.addEventListener('resize', resizeHandler)
300
+ })
301
+
302
+ // 当 leaderboard 变化时重新渲染(不受 visibleColumns 影响)
303
+ watch(leaderboard, () => {
304
+ renderChart()
305
+ }, { deep: true })
306
+
307
+ // 当所选数据集变化时也要重新渲染图表
308
+ watch(selectedDataNameChart, () => {
309
+ renderChart()
310
+ })
311
+
312
+ // 当主题变化时重新渲染图表
313
+ watch(isDarkChart, (newVal) => {
314
+ console.log('isDarkChart changed to:', newVal)
315
+ renderChart()
316
+ })
317
+
318
+ onBeforeUnmount(() => {
319
+ if (resizeHandler) window.removeEventListener('resize', resizeHandler)
320
+ if (themeObserver) themeObserver.disconnect()
321
+ if (chart) { chart.dispose(); chart = null }
322
+ })
323
+ </script>
324
+
325
+ <template>
326
+ <div ref="chartRef" class="w-2/5 h-[80vh] mx-auto"></div>
327
+ </template>
328
+
329
+ <style scoped></style>
src/components/star-solid-full.svg ADDED
src/composables/useLeaderboardData.js ADDED
@@ -0,0 +1,429 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ // 排序状态:当前排序列(key)与方向(true = 降序)
11
+ sortKey: '',
12
+ sortDesc: true,
13
+ visibleColumns: [],
14
+ dataGroups: [],
15
+ selectedDataName: '',
16
+ selectedDataNameChart: '',
17
+ modelTypeGroups: [],
18
+ selectedModelType: [], // 改为数组支持多选
19
+ DEFAULT_CSV_PATH: '/filtered.csv',
20
+ DEFAULT_HIDDEN: new Set(['seq_len', 'uniform_entropy', 'entropy_gain', 'information_capacity', 'data_name', 'model_size (B)']) // 默认隐藏的列
21
+ })
22
+
23
+ // 模型类型映射对象:键为模型类型,值为包含的 model_series 数组
24
+ const modelTypeMapping = {
25
+ 'Qwen3': ['Qwen3'],
26
+ 'Qwen2.5': ['Qwen2.5'],
27
+ 'Qwen2': ['Qwen2'],
28
+ 'Qwen1.5': ['Qwen1.5'],
29
+ 'Llama-3': ['Llama-3.1', 'Llama-3.2'],
30
+ 'InternLM2.5': ['internlm2.5'],
31
+ 'GLM-4': ['glm-4', 'GLM-4'],
32
+ 'Seed-OSS': ['Seed-OSS'],
33
+ 'Gemma-3': ['gemma-3'],
34
+ 'Hunyuan': ['Hunyuan'],
35
+ 'Qwen2 (MoE)': ['Qwen2 (MoE)'],
36
+ 'Qwen1.5 (MoE)': ['Qwen1.5 (MoE)'],
37
+ 'DeepSeek-V3.1': ['DeepSeek-V3.1-Base'],
38
+ 'DeepSeek-V2': ['DeepSeek-V2'],
39
+ 'GLM-4.5': ['GLM-4.5-Air-Base', 'GLM-4.5-Base'],
40
+ 'Llama-4': ['Llama-4'],
41
+ }
42
+
43
+ const MoEModelSeries = ['Qwen2', 'Qwen1.5']
44
+
45
+ const strtSymbolSeries = ['Qwen2 (MoE)', 'Qwen1.5 (MoE)', 'DeepSeek-V3.1', 'DeepSeek-V2', 'GLM-4.5', "Llama-4"]
46
+
47
+ // const autoShowSeries = ['Qwen3', 'Llama-3', 'InternLM2.5', 'GLM-4', 'Seed-OSS', 'Gemma-3', 'Hunyuan', 'DeepSeek-V3.1', 'DeepSeek-V2', 'GLM-4.5']
48
+ const autoShowSeries = ["*"]
49
+
50
+ // 表头显示名称映射(raw header -> 显示名),可以在此添加或由用户修改
51
+ const headerDisplayMap = reactive({
52
+ 'model_name': 'MODEL NAME',
53
+ 'model_series': 'MODEL SERIES',
54
+ 'model_size (B)': 'MODEL SIZE (B)',
55
+ 'constant': 'TEXT SIZE',
56
+ 'conditional_entropy': 'NEGATIVE LOG-LIKELIHOOD',
57
+ 'BF16_TFLOPs': 'FLOPs (G)',
58
+ 'ic': ' INFORMATION CAPACITY',
59
+ })
60
+
61
+ // 数据集名称显示映射(raw data_name -> 显示名)
62
+ const dataNameDisplayMap = reactive({
63
+ 'data_part_0000': 'Mixed text',
64
+ 'eng_Latn_000_00027_long': 'FinePDFs-en',
65
+ 'IndustryCorpus_batch_aa_long': 'Ch-FineWeb-Edu',
66
+ 'CC-MAIN-2013-20_train-00000-of-00014_long': 'FineWeb-Edu',
67
+ 'NextCoderDataset_v1_long': 'NextCoder',
68
+ })
69
+
70
+
71
+ // 默认选择模式为Model
72
+ const selectedMode = ref('Model')
73
+
74
+ // 可选择的列(不包含 rank,也不包含被默认隐藏的列)
75
+ const selectableColumns = computed(() => {
76
+ if (!globalState.csvHeaders || globalState.csvHeaders.length === 0) return []
77
+ return globalState.csvHeaders.slice(1).filter(h => !globalState.DEFAULT_HIDDEN.has(h))
78
+ })
79
+
80
+ // 模型类型分组(从映射对象中获取)
81
+ const modelTypeGroups = computed(() => {
82
+ return Object.keys(modelTypeMapping)
83
+ })
84
+
85
+ // 对 leaderboard 做基于 sortKey/sortDesc 的排序视图(不改变原始 globalState.leaderboard)
86
+ const sortedLeaderboard = computed(() => {
87
+ if (!globalState.leaderboard || globalState.leaderboard.length === 0) return []
88
+ const key = globalState.sortKey
89
+ const desc = !!globalState.sortDesc
90
+ const arr = [...globalState.leaderboard]
91
+ if (!key || key === '') return arr
92
+ arr.sort((a, b) => {
93
+ const va = a[key]
94
+ const vb = b[key]
95
+ // null/undefined push to end
96
+ if (va == null && vb == null) return 0
97
+ if (va == null) return 1
98
+ if (vb == null) return -1
99
+ const na = Number(va)
100
+ const nb = Number(vb)
101
+ if (Number.isFinite(na) && Number.isFinite(nb)) {
102
+ return desc ? (nb - na) : (na - nb)
103
+ }
104
+ try {
105
+ return desc ? String(vb).localeCompare(String(va)) : String(va).localeCompare(String(vb))
106
+ } catch (e) {
107
+ return 0
108
+ }
109
+ })
110
+ return arr
111
+ })
112
+
113
+ // 根据 selectedDataName 和 selectedModelType 过滤 leaderboard,用于表格渲染
114
+ const filteredLeaderboard = computed(() => {
115
+ if (!globalState.leaderboard || globalState.leaderboard.length === 0) return []
116
+ // 从已排序的视图开始过滤
117
+ let filtered = sortedLeaderboard.value
118
+
119
+ // 过滤数据集
120
+ if (globalState.selectedDataName && globalState.selectedDataName !== 'all') {
121
+ filtered = filtered.filter(r => String(r['data_name'] ?? '') === String(globalState.selectedDataName))
122
+ }
123
+
124
+ // 过滤模型类型(支持多选)
125
+ // 特殊值 '__none__' 表示用户明确选择了“清除”——此时应返回空结果
126
+ const sel = globalState.selectedModelType
127
+ if (Array.isArray(sel)) {
128
+ if (sel.includes('__none__')) return []
129
+ if (sel.length > 0) {
130
+ filtered = filtered.filter(r => sel.includes(String(r['model_type'] ?? '')))
131
+ }
132
+ }
133
+
134
+ return filtered
135
+ })
136
+
137
+ // 计算每个 model_series 的 IC 平均值,返回数组,元素格式为 { ModelSeries, IC }
138
+ const modelSeriesICAvg = computed(() => {
139
+ const rows = globalState.leaderboard || []
140
+ const selData = globalState.selectedDataName
141
+ const selModelTypes = globalState.selectedModelType
142
+
143
+ // 以 modelTypeMapping 的 key 为行(即用户划分好的 ModelSeries)来生成平均值
144
+ const out = []
145
+ const keys = Object.keys(modelTypeMapping)
146
+
147
+ // 如果用户显式清空选择,直接返回空数组
148
+ if (Array.isArray(selModelTypes) && selModelTypes.includes('__none__')) return []
149
+
150
+ for (const key of keys) {
151
+ // 当有选中的 model types 时,只处理被选中的那些 key
152
+ if (Array.isArray(selModelTypes) && selModelTypes.length > 0) {
153
+ // 如果 selectedModelType 包含元素,但不包含当前 key,则跳过
154
+ if (!selModelTypes.includes(key)) continue
155
+ }
156
+
157
+ const mappedSeries = new Set(modelTypeMapping[key] || [])
158
+ // 也把 key 自身加入集合(保险)
159
+ mappedSeries.add(key)
160
+
161
+ // 聚合该 key 下所有匹配 series 的 IC
162
+ let sum = 0
163
+ let count = 0
164
+ for (const r of rows) {
165
+ // Dataset 过滤
166
+ if (selData && selData !== 'all') {
167
+ if (String(r['data_name'] ?? '') !== String(selData)) continue
168
+ }
169
+ const seriesName = String(r['model_series'] ?? '').trim()
170
+ if (!seriesName) continue
171
+ if (!mappedSeries.has(seriesName)) continue
172
+ const icRaw = r['ic'] ?? r['information_capacity']
173
+ const n = Number(icRaw)
174
+ if (!Number.isFinite(n)) continue
175
+ sum += n
176
+ count += 1
177
+ }
178
+ if (count === 0) continue
179
+ const avg = sum / count
180
+ out.push({ ModelSeries: key, IC: Number(avg.toFixed(4)) })
181
+ }
182
+
183
+ // 按 IC 降序排序以便展示
184
+ out.sort((a, b) => b.IC - a.IC)
185
+ return out
186
+ })
187
+
188
+ // 点击表头切换排序:循环 降序 -> 升序
189
+ function setSortKey(h) {
190
+ if (!h) return
191
+ if (globalState.sortKey !== h) {
192
+ globalState.sortKey = h
193
+ globalState.sortDesc = true
194
+ return
195
+ }
196
+ // same key, toggle between desc and asc
197
+ globalState.sortDesc = !globalState.sortDesc
198
+ }
199
+
200
+ // 计算当前应该显示的列(不含 rank)
201
+ const displayedColumns = computed(() => {
202
+ if (!globalState.csvHeaders || globalState.csvHeaders.length === 0) return []
203
+ // csvHeaders includes 'rank' at idx 0
204
+ const all = globalState.csvHeaders.slice(1)
205
+ return all.filter(h => globalState.visibleColumns.includes(h))
206
+ })
207
+
208
+ async function fetchAndLoadCsv(path = globalState.DEFAULT_CSV_PATH) {
209
+ globalState.loading = true
210
+ globalState.error = null
211
+ try {
212
+ const res = await fetch(path)
213
+ if (!res.ok) throw new Error(`Failed to fetch CSV (${res.status})`)
214
+ const txt = await res.text()
215
+ const { headers, rows } = parseCsvContent(txt)
216
+ if (!headers || headers.length === 0) { globalState.leaderboard = []; globalState.loading = false; return }
217
+
218
+ // 选择用于排序/显示的分数字段(优先 information_capacity, ic, 然后尝试 numeric-like fields)
219
+ const scoreKey = headers.find(h => ['information_capacity', 'ic', 'score'].includes(h)) || headers.find(h => /capacity|score|ic/i.test(h)) || headers[0]
220
+ // 默认以最后一列升序排序(如果不存在则回退到 scoreKey),不直接在 rows 上预排序
221
+ const defaultKey = headers.length > 0 ? headers[headers.length - 1] : scoreKey
222
+ globalState.sortKey = defaultKey || ''
223
+ globalState.sortDesc = true
224
+
225
+ // 特定处理
226
+ // 判断模型开头是否在 MoEModelSeries 中,是则在 判断尾部是否为-A{number}B这样的格式
227
+ for (const r of rows) {
228
+ const name = r['model_name'] || ''
229
+ for (const moePrefix of MoEModelSeries) {
230
+ if (name.startsWith(moePrefix)) {
231
+ // console.log('Checking MoE model name:', name,name.match(/-A(\d+(?:\.\d+)?)B/))
232
+ const moeSuffixMatch = name.match(/-A(.+)B$/)
233
+ if (moeSuffixMatch) {
234
+ // 更改 model_series 显示名称 为 moePrefix + ' (MoE)'
235
+ r['model_series'] = `${moePrefix} (MoE)`
236
+ console.log('Detected MoE model, updated series:', r['model_series'])
237
+ }
238
+ }
239
+ }
240
+ }
241
+
242
+ // 确保关键列按顺序显示
243
+ const preferred = ['model_name', 'model_series', 'model_size (B)', 'seq_len', 'uniform_entropy', 'constant', 'conditional_entropy', 'entropy_gain', 'BF16_TFLOPs', 'information_capacity', 'ic']
244
+ const ordered = []
245
+ for (const p of preferred) if (headers.includes(p) && !ordered.includes(p)) ordered.push(p)
246
+ for (const h of headers) if (!ordered.includes(h)) ordered.push(h)
247
+ globalState.csvHeaders = ['rank', ...ordered]
248
+ globalState.leaderboard = rows.map((r, idx) => {
249
+ // 根据 model_series 推断 model_type
250
+ let modelType = ''
251
+ for (const [type, series] of Object.entries(modelTypeMapping)) {
252
+ if (series.includes(r['model_series'])) {
253
+ modelType = type
254
+ break
255
+ }
256
+ }
257
+ // 修改 BF16_TFLOPs:先 /1024 再 *1000
258
+ const originalTFLOPs = Number(r['BF16_TFLOPs']) || 0
259
+ const modifiedTFLOPs = (originalTFLOPs / 1024) * 1000
260
+ return { rank: idx + 1, model_type: modelType, ...r, BF16_TFLOPs: modifiedTFLOPs }
261
+ })
262
+
263
+ // 构建 data_name 分组(保持出现顺序,不包含空)
264
+ const seen = new Set()
265
+ const groups = []
266
+ for (const r of rows) {
267
+ const dn = r['data_name']
268
+ if (dn == null) continue
269
+ const s = String(dn)
270
+ if (s.trim() === '') continue
271
+ if (!seen.has(s)) { seen.add(s); groups.push(s) }
272
+ }
273
+ globalState.dataGroups = groups
274
+
275
+ // 构建 model_type 分组
276
+ globalState.modelTypeGroups = Object.keys(modelTypeMapping)
277
+
278
+ // 默认显示第一个数据集
279
+ if (globalState.dataGroups.length > 0) {
280
+ globalState.selectedDataName = globalState.dataGroups[0]
281
+ globalState.selectedDataNameChart = globalState.dataGroups[0]
282
+ }
283
+
284
+ // 默认模型类型:默认全选(使筛选 UI 初始为所有模型被勾选)
285
+ if (globalState.modelTypeGroups.length > 0) {
286
+ globalState.selectedModelType = [...globalState.modelTypeGroups]
287
+ }
288
+
289
+ // 初始化可见列:优先使用 localStorage,否则默认显示所有列(除了 rank)
290
+ try {
291
+ const saved = localStorage.getItem('visible_columns')
292
+ if (saved) {
293
+ const parsed = JSON.parse(saved)
294
+ if (Array.isArray(parsed)) {
295
+ // 仅保留当前 CSV 中存在且不是默认隐藏的列
296
+ globalState.visibleColumns = parsed.filter(h => ordered.includes(h) && !globalState.DEFAULT_HIDDEN.has(h))
297
+ }
298
+ }
299
+ } catch (e) {
300
+ // ignore malformed localStorage
301
+ }
302
+ if (!globalState.visibleColumns || globalState.visibleColumns.length === 0) {
303
+ // 默认显示所有可选列(不包含默认隐藏列)
304
+ globalState.visibleColumns = ordered.filter(h => !globalState.DEFAULT_HIDDEN.has(h))
305
+ }
306
+
307
+ // 格式化 helper
308
+ const numericFloatCols = new Set(['uniform_entropy', 'conditional_entropy', 'entropy_gain', 'information_capacity', 'ic', 'constant', 'BF16_TFLOPs'])
309
+ const numericIntCols = new Set(['seq_len'])
310
+ // attach formatter per row for rendering convenience (non-reactive simple values)
311
+ for (const row of globalState.leaderboard) {
312
+ row._formatted = {}
313
+ for (const h of ordered) {
314
+ const raw = row[h]
315
+ if (raw == null || raw === '') { row._formatted[h] = ''; continue }
316
+ if (numericIntCols.has(h)) {
317
+ const n = Number(raw)
318
+ row._formatted[h] = Number.isFinite(n) ? String(Math.round(n)) : raw
319
+ } else if (numericFloatCols.has(h)) {
320
+ const n = Number(raw)
321
+ if (h === 'ic') {
322
+ row._formatted[h] = Number.isFinite(n) ? n.toFixed(4) : raw
323
+ }
324
+ else if (h === 'constant') {
325
+ row._formatted[h] = Number.isFinite(n) ? n.toFixed(2) : raw
326
+ }
327
+ else {
328
+ row._formatted[h] = Number.isFinite(n) ? n.toFixed(3) : raw
329
+ }
330
+ } else {
331
+ row._formatted[h] = raw
332
+ }
333
+ }
334
+ }
335
+ } catch (e) {
336
+ console.error(e)
337
+ globalState.error = e && e.message ? e.message : String(e)
338
+ } finally {
339
+ globalState.loading = false
340
+ }
341
+ }
342
+
343
+ function selectAll() {
344
+ // 复制一份可选列到 visibleColumns
345
+ globalState.visibleColumns = [...selectableColumns.value]
346
+ }
347
+
348
+ function clearAll() {
349
+ globalState.visibleColumns = []
350
+ }
351
+
352
+ function selectAllModelTypes() {
353
+ globalState.selectedModelType = [...modelTypeGroups.value]
354
+ }
355
+
356
+ function clearAllModelTypes() {
357
+ // 使用特殊标记表示用户显式地清空选择(区别于未选择任何项)
358
+ globalState.selectedModelType = ['__none__']
359
+ }
360
+
361
+ function formatCell(h, model) {
362
+ if (!model) return ''
363
+ if (model._formatted && model._formatted[h] !== undefined) return model._formatted[h]
364
+ return model[h]
365
+ }
366
+
367
+ // 初始化函数,在组件挂载时调用
368
+ function init() {
369
+ fetchAndLoadCsv()
370
+ }
371
+
372
+ export function useLeaderboardData() {
373
+ return {
374
+ // 状态
375
+ leaderboard: computed(() => globalState.leaderboard),
376
+ csvHeaders: computed(() => globalState.csvHeaders),
377
+ loading: computed(() => globalState.loading),
378
+ error: computed(() => globalState.error),
379
+ visibleColumns: computed({
380
+ get: () => globalState.visibleColumns,
381
+ set: (v) => globalState.visibleColumns = v
382
+ }),
383
+ selectedMode: computed({
384
+ get: () => selectedMode.value,
385
+ set: (v) => selectedMode.value = v
386
+ }),
387
+ selectableColumns,
388
+ autoShowSeries,
389
+ strtSymbolSeries,
390
+ headerDisplayMap: computed(() => headerDisplayMap),
391
+ dataNameDisplayMap: computed(() => dataNameDisplayMap),
392
+ dataGroups: computed(() => globalState.dataGroups),
393
+ selectedDataName: computed({
394
+ get: () => globalState.selectedDataName,
395
+ set: (v) => globalState.selectedDataName = v
396
+ }),
397
+ selectedDataNameChart: computed({
398
+ get: () => globalState.selectedDataNameChart,
399
+ set: (v) => globalState.selectedDataNameChart = v
400
+ }),
401
+ modelTypeGroups: computed(() => globalState.modelTypeGroups),
402
+ selectedModelType: computed({
403
+ get: () => globalState.selectedModelType,
404
+ set: (v) => {
405
+ // 当用户通过 UI 勾选真实模型类型时,移除 '__none__' 标��
406
+ if (Array.isArray(v) && v.some(x => x !== '__none__')) {
407
+ globalState.selectedModelType = v.filter(x => x !== '__none__')
408
+ } else {
409
+ globalState.selectedModelType = v
410
+ }
411
+ }
412
+ }),
413
+ filteredLeaderboard,
414
+ displayedColumns,
415
+ modelSeriesICAvg,
416
+ // 函数
417
+ fetchAndLoadCsv,
418
+ selectAll,
419
+ clearAll,
420
+ selectAllModelTypes,
421
+ clearAllModelTypes,
422
+ // 排序相关
423
+ sortKey: computed(() => globalState.sortKey),
424
+ sortDesc: computed(() => globalState.sortDesc),
425
+ setSortKey,
426
+ formatCell,
427
+ init
428
+ }
429
+ }
src/main.css ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ /* 你可以在这里添加自定义样式,例如: */
6
+ body {
7
+ /* 例如为全局字体或背景设置默认 */
8
+ }
src/main.js ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
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/utils/mk2html.js ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // 一个小型且安全的 Markdown -> HTML 解析器(支持标题、段落、链接、粗体、斜体、行内代码)
2
+ function escapeHtml(str) {
3
+ return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')
4
+ }
5
+
6
+ function parseInline(md) {
7
+ // code
8
+ md = md.replace(/`([^`]+)`/g, '<code>$1</code>')
9
+ // bold **text** or __text__
10
+ md = md.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>')
11
+ md = md.replace(/__([^_]+)__/g, '<strong>$1</strong>')
12
+ // italic *text* or _text_
13
+ md = md.replace(/\*([^*]+)\*/g, '<em>$1</em>')
14
+ md = md.replace(/_([^_]+)_/g, '<em>$1</em>')
15
+ // links [text](url)
16
+ md = md.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (m, text, url) => {
17
+ const safeUrl = url.replace(/\"/g, '%22')
18
+ return `<a href="${safeUrl}" target="_blank" rel="noopener noreferrer" class="text-blue-600 underline dark:text-blue-400">${text}</a>`
19
+ })
20
+ return md
21
+ }
22
+
23
+ function parsedHeaderHtml(headerMarkdown){
24
+ const raw = headerMarkdown || ''
25
+ // split into lines and paragraphs
26
+ const blocks = raw.split(/\n{2,}/g)
27
+ const html = blocks.map(block => {
28
+ const line = block.trim()
29
+ if (!line) return ''
30
+ // heading
31
+ const hMatch = line.match(/^(#{1,6})\s+(.*)$/)
32
+ if (hMatch) {
33
+ const level = Math.min(6, hMatch[1].length)
34
+ const content = parseInline(escapeHtml(hMatch[2]))
35
+ // 增加块间距(mb-2)以扩大行之间的视觉间隔
36
+ return `<h${level} class="text-lg font-semibold text-gray-800 dark:text-gray-100 mb-2">${content}</h${level}>`
37
+ }
38
+ // normal paragraph
39
+ // 使用 leading-relaxed 增加行高,并用 mb-2 增加段落间距
40
+ return `<p class="text-sm text-gray-700 dark:text-gray-200 leading-relaxed mb-2">${parseInline(escapeHtml(line))}</p>`
41
+ }).join('\n')
42
+ return html
43
+ }
44
+
45
+ export { parsedHeaderHtml }
src/views/Leaderboard.vue ADDED
@@ -0,0 +1,350 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script setup>
2
+ import { ref, onMounted, watch, nextTick } from 'vue'
3
+ import { useLeaderboardData } from '@/composables/useLeaderboardData.js'
4
+ import Chart from '@/components/Chart.vue'
5
+ import { computed } from 'vue'
6
+ import { parsedHeaderHtml } from '@/utils/mk2html.js'
7
+
8
+ // 使用数据管理 composable
9
+ const {
10
+ leaderboard,
11
+ csvHeaders,
12
+ loading,
13
+ error,
14
+ selectedMode,
15
+ visibleColumns,
16
+ selectableColumns,
17
+ dataGroups,
18
+ selectedDataName,
19
+ modelSeriesICAvg,
20
+ selectedDataNameChart,
21
+ autoShowSeries,
22
+ headerDisplayMap,
23
+ dataNameDisplayMap,
24
+ modelTypeGroups,
25
+ selectedModelType,
26
+ filteredLeaderboard,
27
+ displayedColumns,
28
+ fetchAndLoadCsv,
29
+ selectAll,
30
+ clearAll,
31
+ selectAllModelTypes,
32
+ clearAllModelTypes,
33
+ formatCell,
34
+ // 排序 API
35
+ sortKey,
36
+ sortDesc,
37
+ setSortKey,
38
+ init
39
+ } = useLeaderboardData()
40
+
41
+ const isSeries = computed(() => selectedMode.value === 'ModelSeries')
42
+
43
+ // theme (dark mode) support: sync with document root class and localStorage
44
+ const isDark = ref(false)
45
+
46
+ // 图表区域ref
47
+ const chartSection = ref(null)
48
+
49
+ // 记录上一次选择的图表数据集,用于区分初始加载和用户点击
50
+ const lastSelectedDataNameChart = ref('')
51
+
52
+ // header markdown 内容
53
+ const headerMarkdown = ref(`
54
+
55
+ **Information Capacity** evaluates an LLM's **efficiency** based on text compression performance relative to computational complexity, harnessing the inherent correlation between **compression** and **intelligence**.
56
+ Larger models can predict the next token more accurately, leading to higher compression gains but at increased computational costs.
57
+ Consequently, a series of models with varying sizes exhibits **consistent** information capacity, which can be used to compare model capability across model series and predict model performance within a series.
58
+ It also facilitates dynamic routing of different-sized models for efficient handling of tasks with varying difficulties, which is especially relevant to the device-edge-cloud infrastructure detailed in the **AI Flow** framework.
59
+ With the rapid evolution of edge intelligence, we believe that this hierarchical network will replace the mainstream cloud-centric computing scheme in the near future.
60
+
61
+ If you want to add your model to the leaderboard, please submit a PR
62
+ at [our GitHub repo](https://github.com/TeleAI-AI-Flow/InformationCapacity), and we will assist with evaluation and updates.
63
+
64
+ `)
65
+
66
+ const title = 'Information Capacity Leaderboard'
67
+
68
+ const lastUpdatedTime = '11/12/2025 15:30'
69
+
70
+ const headerInfo = parsedHeaderHtml(headerMarkdown.value)
71
+
72
+
73
+ // 当 visibleColumns 改变时持久化
74
+ watch(visibleColumns, (v) => {
75
+ try { localStorage.setItem('visible_columns', JSON.stringify(v)) } catch (e) { }
76
+ }, { deep: true })
77
+
78
+ // 当图表数据集变化时,滚动到图表区域底部(仅当用户点击时)
79
+ watch(selectedDataNameChart, (newVal) => {
80
+ if (lastSelectedDataNameChart.value && lastSelectedDataNameChart.value !== newVal) {
81
+ nextTick(() => {
82
+ chartSection.value?.scrollIntoView({ behavior: 'smooth', block: 'end' })
83
+ })
84
+ }
85
+ lastSelectedDataNameChart.value = newVal
86
+ })
87
+
88
+ onMounted(() => {
89
+ init()
90
+ })
91
+
92
+ onMounted(() => {
93
+ const stored = localStorage.getItem('theme')
94
+ if (stored === 'dark') {
95
+ isDark.value = true
96
+ } else if (stored === 'light') {
97
+ isDark.value = false
98
+ } else {
99
+ // follow system preference when no stored preference
100
+ isDark.value = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
101
+ }
102
+ })
103
+
104
+ watch(isDark, (val) => {
105
+ try {
106
+ if (val) document.documentElement.classList.add('dark')
107
+ else document.documentElement.classList.remove('dark')
108
+ localStorage.setItem('theme', val ? 'dark' : 'light')
109
+ } catch (e) {
110
+ // ignore if SSR or unavailable
111
+ }
112
+ })
113
+
114
+ function clearModelTypeSelection() {
115
+ selectAllModelTypes()
116
+ }
117
+ </script>
118
+
119
+ <template>
120
+ <div
121
+ 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">
122
+ <div class=" mx-auto">
123
+ <header class="mb-4 flex items-start justify-between mr-4">
124
+ <div>
125
+ <h1 class="text-3xl font-extrabold text-gray-900 dark:text-gray-100">{{ title }}</h1>
126
+ <!-- <p class="mt-1 text-sm text-gray-600 dark:text-gray-300">LLM IC Leaderboard Demo</p> -->
127
+ <div v-html="headerInfo" class="py-7"></div>
128
+ </div>
129
+ <div class="flex items-center">
130
+ <!-- 固定正方形容器,内部图片保持纵横比且居中 -->
131
+ <div class="h-40 w-40 flex items-center justify-center rounded-md overflow-hidden p-2">
132
+ </div>
133
+ </div>
134
+ </header>
135
+
136
+
137
+ <div class="bg-white dark:bg-gray-900/60 shadow rounded-lg overflow-hidden">
138
+ <div
139
+ 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">
140
+ <div class="flex items-center justify-between">
141
+ <h2 class="text-lg font-medium text-gray-800 dark:text-gray-50">Leaderboard</h2>
142
+ <div class="text-sm text-gray-500 dark:text-gray-300">Last updated on {{ lastUpdatedTime }}</div>
143
+ </div>
144
+ </div>
145
+ <!-- 筛选(模型分类,模型系列分类) -->
146
+ <div class="px-6 py-3 border-b bg-gray-50 dark:bg-gradient-to-b dark:from-gray-900 dark:to-gray-800">
147
+ <div class="flex items-center gap-3">
148
+ <span class="text-sm font-medium text-gray-700 dark:text-gray-200">Pass by</span>
149
+ <div v-if="dataGroups.length > 0" class="flex gap-2 items-center overflow-x-auto">
150
+ <!-- <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'}">
151
+ <input type="radio" class="hidden" value="all" v-model="selectedDataName" /> 全部
152
+ </label> -->
153
+ <label @click="selectedMode = 'Model'"
154
+ class="px-2 py-1 rounded-full border border-gray-200 dark:border-gray-700 text-sm cursor-pointer dark:text-slate-300"
155
+ :class="{ 'bg-gray-100 dark:bg-gray-700 dark:text-white': selectedMode === 'Model' }">
156
+ Model
157
+ </label>
158
+ <label @click="selectedMode = 'ModelSeries'"
159
+ class="px-2 py-1 rounded-full border border-gray-200 dark:border-gray-700 text-sm cursor-pointer dark:text-slate-300"
160
+ :class="{ 'bg-gray-100 dark:bg-gray-700 dark:text-white': selectedMode === 'ModelSeries' }">
161
+ Model Series
162
+ </label>
163
+ </div>
164
+ <div v-else class="text-sm text-gray-500 dark:text-gray-400">(数据集中未检测到 data_name 列)</div>
165
+ </div>
166
+ </div>
167
+
168
+ <!-- 数据集筛选区域(独立于列筛选) -->
169
+ <div class="px-6 py-3 border-b bg-gray-50 dark:bg-gradient-to-b dark:from-gray-900 dark:to-gray-800">
170
+ <div class="flex items-center gap-3">
171
+ <span class="text-sm font-medium text-gray-700 dark:text-gray-200">Dataset</span>
172
+ <div v-if="dataGroups.length > 0" class="flex gap-2 items-center overflow-x-auto">
173
+ <!-- <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'}">
174
+ <input type="radio" class="hidden" value="all" v-model="selectedDataName" /> 全部
175
+ </label> -->
176
+ <label v-for="g in dataGroups" :key="g"
177
+ class="px-2 py-1 rounded-full border border-gray-200 dark:border-gray-700 text-sm cursor-pointer dark:text-slate-300"
178
+ :class="{ 'bg-gray-100 dark:bg-gray-700 dark:text-white': selectedDataName === g }">
179
+ <input type="radio" class="hidden" :value="g" v-model="selectedDataName" /> <span
180
+ class="whitespace-nowrap">{{ dataNameDisplayMap[g] ?
181
+ dataNameDisplayMap[g] : g }}</span>
182
+ </label>
183
+ </div>
184
+ <div v-else class="text-sm text-gray-500 dark:text-gray-400">(数据集中未检测到 data_name 列)</div>
185
+ </div>
186
+ </div>
187
+
188
+
189
+ <!-- 模型类型筛选区域 -->
190
+ <div class="px-6 py-3 border-b bg-gray-50 dark:bg-gradient-to-b dark:from-gray-900 dark:to-gray-800">
191
+ <div class="flex items-center gap-3">
192
+ <span class="text-sm font-medium text-gray-700 dark:text-gray-200 whitespace-nowrap">Model Series</span>
193
+ <div class="flex items-center gap-2">
194
+ <button @click="clearModelTypeSelection"
195
+ class="whitespace-nowrap 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">
196
+ 全选
197
+ </button>
198
+ <button @click="clearAllModelTypes"
199
+ class="whitespace-nowrap 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">
200
+ 清除
201
+ </button>
202
+ </div>
203
+ <div v-if="modelTypeGroups.length > 0" class="flex flex-wrap gap-2 items-center">
204
+ <label v-for="g in modelTypeGroups" :key="g"
205
+ 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">
206
+ <input type="checkbox" :value="g" v-model="selectedModelType"
207
+ 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" />
208
+ <span class="truncate text-gray-800 dark:text-gray-50">{{ g }}</span>
209
+ </label>
210
+ </div>
211
+ <div v-else class="text-sm text-gray-500 dark:text-gray-400">(未配置模型类型映射)</div>
212
+ </div>
213
+ </div>
214
+
215
+ <!-- 美化后的内联列选择区域:pills 风格,支持水平滚动,并兼容深色/浅色模式 -->
216
+ <div class="px-6 py-3 border-b bg-gray-50 dark:bg-gradient-to-b dark:from-gray-900 dark:to-gray-800" v-show="!isSeries">
217
+ <div class="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3">
218
+ <div class="flex items-center gap-3">
219
+ <span class="text-sm font-medium text-gray-700 dark:text-gray-200">Visible Columns</span>
220
+ <div class="flex items-center gap-2">
221
+ <button @click.prevent="selectAll"
222
+ 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>
223
+ <button @click.prevent="clearAll"
224
+ 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>
225
+ </div>
226
+ </div>
227
+
228
+ <div class="flex-1 overflow-x-auto">
229
+ <div class="flex gap-2 items-center px-1 py-2">
230
+ <label v-for="h in selectableColumns" :key="h"
231
+ 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">
232
+ <input type="checkbox" :value="h" v-model="visibleColumns"
233
+ 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" />
234
+ <span class="truncate text-gray-800 dark:text-gray-50">{{ headerDisplayMap[h] || h }}</span>
235
+ </label>
236
+ </div>
237
+ </div>
238
+ </div>
239
+ </div>
240
+
241
+ <div class="p-4 overflow-x-auto">
242
+ <table class="min-w-full divide-y divide-gray-200 dark:divide-gray-700">
243
+ <thead class="bg-gray-50 dark:bg-gradient-to-r dark:from-gray-800 dark:to-gray-900">
244
+ <tr>
245
+ <!-- ModelSeries 模式下使用计算结果列,否则使用普通列 -->
246
+ <template v-if="selectedMode === 'ModelSeries'">
247
+ <th v-if="visibleColumns.includes('model_series')"
248
+ class="px-4 py-2 text-left text-xs font-medium text-gray-500 dark:text-gray-300 tracking-wider">
249
+ <div class="flex items-center gap-2">
250
+ <span class="whitespace-nowrap">{{ headerDisplayMap['model_series'] || 'ModelSeries' }}</span>
251
+ </div>
252
+ </th>
253
+ <th v-if="visibleColumns.includes('constant')"
254
+ class="px-4 py-2 text-left text-xs font-medium text-gray-500 dark:text-gray-300 tracking-wider">
255
+ <div class="flex items-center gap-2">
256
+ <span class="whitespace-nowrap">{{ headerDisplayMap['constant']}}</span>
257
+ </div>
258
+ </th>
259
+ <th v-if="visibleColumns.includes('ic')"
260
+ class="px-4 py-2 text-left text-xs font-medium text-gray-500 dark:text-gray-300 tracking-wider">
261
+ <div class="flex items-center gap-2">
262
+ <span class="whitespace-nowrap">{{ headerDisplayMap['ic']}} (AVG)</span>
263
+ </div>
264
+ </th>
265
+ </template>
266
+ <template v-else>
267
+ <th v-for="h in displayedColumns" :key="h" @click="setSortKey(h)"
268
+ class="px-4 py-2 text-left text-xs font-medium text-gray-500 dark:text-gray-300 tracking-wider cursor-pointer select-none">
269
+ <div class="flex items-center gap-2">
270
+ <span class="whitespace-nowrap">{{ headerDisplayMap[h] || h }}</span>
271
+ <span v-if="sortKey === h" class="text-xs text-gray-600 dark:text-gray-300">
272
+ <span v-if="sortDesc">▼</span>
273
+ <span v-else>▲</span>
274
+ </span>
275
+ </div>
276
+ </th>
277
+ </template>
278
+ </tr>
279
+ </thead>
280
+ <tbody class="bg-white dark:bg-transparent divide-y divide-gray-100 dark:divide-gray-700">
281
+ <!-- ModelSeries mode -> 显示 modelSeriesICAvg -->
282
+ <template v-if="selectedMode === 'ModelSeries'">
283
+ <tr v-for="(row, idx) in modelSeriesICAvg" :key="row.ModelSeries"
284
+ class="hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors duration-150">
285
+ <td v-if="visibleColumns.includes('model_series')" class="px-4 py-3 whitespace-nowrap">
286
+ <div class="text-sm text-gray-800 dark:text-gray-50">{{ row.ModelSeries }}</div>
287
+ </td>
288
+ <td v-if="visibleColumns.includes('ic')"
289
+ class="px-4 py-3 whitespace-nowrap">
290
+ <div class="text-sm text-gray-800 dark:text-gray-50">{{ row.IC }}</div>
291
+ </td>
292
+ <td v-if="visibleColumns.includes('constant')"
293
+ class="px-4 py-3 whitespace-nowrap">
294
+ <div class="text-sm text-gray-800 dark:text-gray-50">{{ row.Constant }}</div>
295
+ </td>
296
+ </tr>
297
+ </template>
298
+
299
+ <!-- 默认 Model 模式 -> 现有表格 -->
300
+ <template v-else>
301
+ <tr v-for="(model, index) in filteredLeaderboard" :key="model.rank" :class="{
302
+ // 'bg-yellow-50 dark:bg-yellow-700/25': index === 0,
303
+ // 'bg-gray-50 dark:bg-gray-800/60': index === 1,
304
+ // 'bg-indigo-50 dark:bg-indigo-700/25': index === 2
305
+ }" class="hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors duration-150">
306
+ <td v-for="h in displayedColumns" :key="h" class="px-4 py-3 whitespace-nowrap">
307
+ <div class="text-sm text-gray-800 dark:text-gray-50">{{ formatCell(h, model) }}</div>
308
+ </td>
309
+ </tr>
310
+ </template>
311
+ </tbody>
312
+ </table>
313
+ </div>
314
+ </div>
315
+
316
+ <!-- 图表区域 -->
317
+ <div ref="chartSection" class="mt-8 bg-white dark:bg-gray-900/60 shadow rounded-lg overflow-hidden">
318
+ <!-- 图表头部 -->
319
+ <div
320
+ 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">
321
+ <h2 class="text-lg font-medium text-gray-800 dark:text-gray-50">Data visualization</h2>
322
+ </div>
323
+
324
+ <!-- 图表数据集筛选区域 -->
325
+ <div class="px-6 py-3 border-b bg-gray-50 dark:bg-gradient-to-b dark:from-gray-900 dark:to-gray-800">
326
+ <div class="flex items-center gap-3">
327
+ <span class="text-sm font-medium text-gray-700 dark:text-gray-200">Dataset</span>
328
+ <div v-if="dataGroups.length > 0" class="flex gap-2 items-center overflow-x-auto">
329
+ <label v-for="g in dataGroups" :key="g"
330
+ class="px-2 py-1 rounded-full border border-gray-200 dark:border-gray-700 text-sm cursor-pointer dark:text-slate-300"
331
+ :class="{ 'bg-gray-100 dark:bg-gray-700 dark:text-white': selectedDataNameChart === g }">
332
+ <input type="radio" class="hidden" :value="g" v-model="selectedDataNameChart" /> <span
333
+ class="whitespace-nowrap">{{ dataNameDisplayMap[g]
334
+ ? dataNameDisplayMap[g] : g }}</span>
335
+ </label>
336
+ </div>
337
+ <div v-else class="text-sm text-gray-500 dark:text-gray-400">(数据集中未检测到 data_name 列)</div>
338
+ </div>
339
+ </div>
340
+
341
+ <!-- 图表内容 -->
342
+ <div class="p-6">
343
+ <Chart :autoShowSeries="autoShowSeries" />
344
+ </div>
345
+ </div>
346
+ </div>
347
+ </div>
348
+ </template>
349
+
350
+ <style scoped></style>
tailwind.config.js ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /** @type {import('tailwindcss').Config} */
2
+ export default {
3
+ content: [
4
+ "./index.html",
5
+ "./src/**/*.{vue,js,ts,jsx,tsx}"
6
+ ],
7
+ theme: {
8
+ extend: {},
9
+ },
10
+ plugins: [],
11
+ }
12
+
vite.config.ts ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { fileURLToPath, URL } from 'node:url'
2
+
3
+ import { defineConfig } from 'vite'
4
+ import vue from '@vitejs/plugin-vue'
5
+ import vueDevTools from 'vite-plugin-vue-devtools'
6
+
7
+ // https://vite.dev/config/
8
+ export default defineConfig({
9
+ base: './',
10
+ plugins: [
11
+ vue(),
12
+ vueDevTools(),
13
+ ],
14
+ resolve: {
15
+ alias: {
16
+ '@': fileURLToPath(new URL('./src', import.meta.url))
17
+ },
18
+ },
19
+ })