pub const AC_GPUTRAIN_007_REQUIRED_VERSION_JSON_KEYS: &[&str] =
&["cuda_feature", "cuda_runtime_available", "visible_devices"];
#[derive(Debug, Clone)]
pub struct VersionJsonCudaFields {
pub cuda_feature: bool,
pub cuda_runtime_available: bool,
pub visible_devices: Vec<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Gputrain007Verdict {
Pass,
Fail,
}
#[must_use]
pub fn verdict_from_version_json_keys(present_keys: &[&str]) -> Gputrain007Verdict {
for required in AC_GPUTRAIN_007_REQUIRED_VERSION_JSON_KEYS {
if !present_keys.contains(required) {
return Gputrain007Verdict::Fail;
}
}
Gputrain007Verdict::Pass
}
#[must_use]
pub fn verdict_from_version_json_fields(fields: &VersionJsonCudaFields) -> Gputrain007Verdict {
if fields.visible_devices.len() > 16 {
return Gputrain007Verdict::Fail;
}
if fields.cuda_feature && !fields.cuda_runtime_available {
return Gputrain007Verdict::Fail;
}
Gputrain007Verdict::Pass
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn falsify_gputrain_007_version_json_schema_and_shape() {
assert_eq!(
verdict_from_version_json_keys(&[
"cuda_feature",
"cuda_runtime_available",
"visible_devices",
]),
Gputrain007Verdict::Pass,
"all three required keys present must Pass",
);
assert_eq!(
verdict_from_version_json_keys(&[
"cuda_feature",
"cuda_runtime_available",
"visible_devices",
"version",
"sha",
"tensorrt_feature",
]),
Gputrain007Verdict::Pass,
"extra unknown keys must not Fail (forward-compat)",
);
assert_eq!(
verdict_from_version_json_keys(&["cuda_runtime_available", "visible_devices",]),
Gputrain007Verdict::Fail,
"missing `cuda_feature` must Fail",
);
assert_eq!(
verdict_from_version_json_keys(&["cuda_feature", "visible_devices"]),
Gputrain007Verdict::Fail,
"missing `cuda_runtime_available` must Fail",
);
assert_eq!(
verdict_from_version_json_keys(&["cuda_feature", "cuda_runtime_available",]),
Gputrain007Verdict::Fail,
"missing `visible_devices` must Fail",
);
assert_eq!(
verdict_from_version_json_keys(&[]),
Gputrain007Verdict::Fail,
"empty present-keys slice must Fail",
);
assert_eq!(
verdict_from_version_json_keys(&["version", "sha"]),
Gputrain007Verdict::Fail,
"only unrelated keys present must Fail",
);
for (feat, runtime) in [(false, false), (false, true), (true, true)] {
let fields = VersionJsonCudaFields {
cuda_feature: feat,
cuda_runtime_available: runtime,
visible_devices: vec!["0:RTX 4090".to_string()],
};
assert_eq!(
verdict_from_version_json_fields(&fields),
Gputrain007Verdict::Pass,
"consistent (cuda_feature={feat}, runtime_available={runtime}) must Pass",
);
}
let fields = VersionJsonCudaFields {
cuda_feature: false,
cuda_runtime_available: false,
visible_devices: vec![],
};
assert_eq!(
verdict_from_version_json_fields(&fields),
Gputrain007Verdict::Pass,
"empty visible_devices on CPU-only build must Pass",
);
let stale = VersionJsonCudaFields {
cuda_feature: true,
cuda_runtime_available: false,
visible_devices: vec![],
};
assert_eq!(
verdict_from_version_json_fields(&stale),
Gputrain007Verdict::Fail,
"cuda_feature=true + runtime_available=false must Fail \
(FM-GPUTRAIN-STALE-BUILD: advertised but missing)",
);
let stale_with_stale_devices = VersionJsonCudaFields {
cuda_feature: true,
cuda_runtime_available: false,
visible_devices: vec!["0:RTX 4090".to_string()],
};
assert_eq!(
verdict_from_version_json_fields(&stale_with_stale_devices),
Gputrain007Verdict::Fail,
"advertised feature + missing runtime must Fail regardless of visible_devices",
);
let sixteen = VersionJsonCudaFields {
cuda_feature: true,
cuda_runtime_available: true,
visible_devices: (0..16).map(|i| format!("{i}:device")).collect(),
};
assert_eq!(
verdict_from_version_json_fields(&sixteen),
Gputrain007Verdict::Pass,
"exactly 16 visible devices must Pass (grammar max)",
);
let seventeen = VersionJsonCudaFields {
cuda_feature: true,
cuda_runtime_available: true,
visible_devices: (0..17).map(|i| format!("{i}:device")).collect(),
};
assert_eq!(
verdict_from_version_json_fields(&seventeen),
Gputrain007Verdict::Fail,
"17 visible devices must Fail (exceeds cuda:0..cuda:15 grammar)",
);
let many = VersionJsonCudaFields {
cuda_feature: true,
cuda_runtime_available: true,
visible_devices: (0..100).map(|i| format!("{i}:device")).collect(),
};
assert_eq!(
verdict_from_version_json_fields(&many),
Gputrain007Verdict::Fail,
"100 visible devices must Fail (well past grammar)",
);
let happy_fields = VersionJsonCudaFields {
cuda_feature: true,
cuda_runtime_available: true,
visible_devices: vec!["0:RTX 4090".to_string(), "1:RTX 4090".to_string()],
};
assert_eq!(
verdict_from_version_json_fields(&happy_fields),
Gputrain007Verdict::Pass,
"consistent 2-device CUDA build must Pass field-shape gate",
);
assert_eq!(
verdict_from_version_json_keys(&[
"cuda_feature",
"cuda_runtime_available",
"visible_devices",
]),
Gputrain007Verdict::Pass,
"matching 3-key schema must Pass schema gate",
);
assert_eq!(
AC_GPUTRAIN_007_REQUIRED_VERSION_JSON_KEYS.len(),
3,
"required key count is 3 \
(spec §14.4 / gpu-training-backend-v1 INV-GPUTRAIN-007)",
);
assert!(
AC_GPUTRAIN_007_REQUIRED_VERSION_JSON_KEYS.contains(&"cuda_feature"),
"`cuda_feature` is a required key",
);
assert!(
AC_GPUTRAIN_007_REQUIRED_VERSION_JSON_KEYS.contains(&"cuda_runtime_available"),
"`cuda_runtime_available` is a required key",
);
assert!(
AC_GPUTRAIN_007_REQUIRED_VERSION_JSON_KEYS.contains(&"visible_devices"),
"`visible_devices` is a required key",
);
}
}