|
|
@@ -1,5 +1,5 @@
|
|
|
use super::parse::bench_complete;
|
|
|
-use super::quality::{award_medals, incomplete};
|
|
|
+use super::quality::{Medals, award_medals, incomplete};
|
|
|
use super::render::fmt_pct;
|
|
|
use super::serve::load_report;
|
|
|
use super::{ReportRow, collect, detect_quant, extract_time, html_page, parse_score, slash_pair};
|
|
|
@@ -152,7 +152,7 @@ fn entry(pct: f64, done: bool) -> super::ReportEntry {
|
|
|
.unwrap()
|
|
|
}
|
|
|
|
|
|
-fn qrow(name: &str, parent: &str, nodes: u32, pct: Option<f64>) -> ReportRow {
|
|
|
+fn qrow(name: &str, parent: &str, model: &str, tp: u32, pct: Option<f64>) -> ReportRow {
|
|
|
let reports = match pct {
|
|
|
Some(p) => serde_json::json!([
|
|
|
{"file": "f.md", "files": ["f.md"], "date": "2026-01-02", "label": "l", "pct": p, "done": true}
|
|
|
@@ -160,9 +160,9 @@ fn qrow(name: &str, parent: &str, nodes: u32, pct: Option<f64>) -> ReportRow {
|
|
|
None => serde_json::json!([]),
|
|
|
};
|
|
|
serde_json::from_value(serde_json::json!({
|
|
|
- "name": name, "title": name, "model": parent, "parent": parent,
|
|
|
- "quant": "NVFP4", "engine": "vllm", "image": "img", "nodes": nodes,
|
|
|
- "tp": nodes, "deploy": "docker", "port": 30000, "medal": null,
|
|
|
+ "name": name, "title": name, "model": model, "parent": parent,
|
|
|
+ "quant": "NVFP4", "engine": "vllm", "image": "img", "nodes": tp,
|
|
|
+ "tp": tp, "deploy": "docker", "port": 30000,
|
|
|
"reports": reports,
|
|
|
}))
|
|
|
.unwrap()
|
|
|
@@ -188,23 +188,60 @@ fn incomplete_flags_pool_not_finished() {
|
|
|
}
|
|
|
|
|
|
#[test]
|
|
|
-fn medals_rank_within_parent_and_node_count() {
|
|
|
+fn medals_rank_family_model_and_tp_tiers() {
|
|
|
let mut rows = vec![
|
|
|
- qrow("a", "M", 2, Some(90.0)),
|
|
|
- qrow("b", "M", 2, Some(94.0)), // gold among 2-node M lanes
|
|
|
- qrow("c", "M", 2, Some(88.0)), // bronze
|
|
|
- qrow("d", "M", 4, Some(91.0)), // gold among 4-node lanes (own group)
|
|
|
- qrow("e", "M", 2, None), // no score — no medal
|
|
|
- qrow("f", "N", 1, Some(50.0)), // gold of its own single-lane model
|
|
|
+ qrow("a", "M", "m1", 2, Some(90.0)),
|
|
|
+ qrow("b", "M", "m1", 2, Some(94.0)), // family gold, model gold, tp(2) gold
|
|
|
+ qrow("c", "M", "m1", 2, Some(88.0)), // family bronze, model bronze, tp(2) bronze
|
|
|
+ qrow("d", "M", "m2", 4, Some(91.0)), // family silver, model-m2 gold, tp(4) gold
|
|
|
+ qrow("e", "M", "m1", 2, None), // no score — no medal anywhere
|
|
|
+ qrow("f", "N", "n1", 1, Some(50.0)), // own family/model/tp golds
|
|
|
];
|
|
|
award_medals(&mut rows);
|
|
|
- let medal = |n: &str| rows.iter().find(|r| r.name == n).unwrap().medal;
|
|
|
- assert_eq!(medal("b"), Some(1));
|
|
|
- assert_eq!(medal("a"), Some(2));
|
|
|
- assert_eq!(medal("c"), Some(3));
|
|
|
- assert_eq!(medal("d"), Some(1));
|
|
|
- assert_eq!(medal("e"), None);
|
|
|
- assert_eq!(medal("f"), Some(1));
|
|
|
+ let got = |n: &str| rows.iter().find(|r| r.name == n).unwrap().medals;
|
|
|
+ assert_eq!(
|
|
|
+ got("b"),
|
|
|
+ Medals {
|
|
|
+ p: Some(1),
|
|
|
+ m: Some(1),
|
|
|
+ t: Some(1)
|
|
|
+ }
|
|
|
+ );
|
|
|
+ assert_eq!(
|
|
|
+ got("a"),
|
|
|
+ Medals {
|
|
|
+ p: Some(3),
|
|
|
+ m: Some(2),
|
|
|
+ t: Some(2)
|
|
|
+ }
|
|
|
+ );
|
|
|
+ // family rank 4 (d=91 outranks) — no family medal, but model/tp medals hold
|
|
|
+ assert_eq!(
|
|
|
+ got("c"),
|
|
|
+ Medals {
|
|
|
+ p: None,
|
|
|
+ m: Some(3),
|
|
|
+ t: Some(3)
|
|
|
+ }
|
|
|
+ );
|
|
|
+ assert_eq!(
|
|
|
+ got("d"),
|
|
|
+ Medals {
|
|
|
+ p: Some(2),
|
|
|
+ m: Some(1),
|
|
|
+ t: Some(1)
|
|
|
+ },
|
|
|
+ "family silver; tp(4) own group gold"
|
|
|
+ );
|
|
|
+ assert_eq!(got("e"), Medals::default());
|
|
|
+ assert_eq!(
|
|
|
+ got("f"),
|
|
|
+ Medals {
|
|
|
+ p: Some(1),
|
|
|
+ m: Some(1),
|
|
|
+ t: Some(1)
|
|
|
+ }
|
|
|
+ );
|
|
|
}
|
|
|
|
|
|
#[test]
|