use super::types::{Backend, BackendComparison, SizeCliff, WorkloadType};
#[derive(Debug, Clone)]
pub struct TransferAnalysis {
pub backend: Backend,
pub workload: WorkloadType,
pub average_overhead: f64,
pub total_transfer_time_us: f64,
pub total_compute_time_us: f64,
pub sizes_dominated_by_transfer: Vec<(usize, f64)>,
}
impl TransferAnalysis {
pub fn transfer_dominated(&self) -> bool {
self.average_overhead > 0.5
}
pub fn summary(&self) -> String {
if self.transfer_dominated() {
format!(
"{} {}: Transfer overhead {:.1}% - consider larger batches",
self.backend.name(),
self.workload.name(),
self.average_overhead * 100.0
)
} else {
format!(
"{} {}: Transfer overhead {:.1}% - GPU efficient",
self.backend.name(),
self.workload.name(),
self.average_overhead * 100.0
)
}
}
}
#[derive(Debug, Clone)]
pub struct BackendSummary {
pub measurement_count: usize,
pub backend_count: usize,
pub workload_count: usize,
pub regression_count: usize,
pub cliff_count: usize,
pub regressions: Vec<BackendComparison>,
pub cliffs: Vec<SizeCliff>,
}
impl BackendSummary {
pub fn has_regressions(&self) -> bool {
self.regression_count > 0
}
pub fn has_cliffs(&self) -> bool {
self.cliff_count > 0
}
pub fn status(&self) -> &'static str {
if self.regression_count > 0 {
"FAIL: Regressions detected"
} else if self.cliff_count > 0 {
"WARN: Size cliffs detected"
} else {
"PASS: No issues detected"
}
}
}