in resctl-bench/src/bench/iocost_tune.rs [1541:1607]
fn solve_data_series(
&self,
sel: &DataSel,
series: &mut DataSeries,
isol_series: Option<&DataSeries>,
isol_thr: f64,
) -> Result<()> {
let (dir, filter_outliers, filter_by_isol) = sel.fit_lines_opts();
trace!(
"fitting {:?} points={} dir={:?} filter_outliers={} filter_by_isol={}",
&sel,
series.points.len(),
&dir,
filter_outliers,
filter_by_isol
);
let mut fill_upto = None;
if filter_by_isol {
let dl = &isol_series
.expect(&format!(
"iocost-tune: Solving {:?} requires {:?} which isn't available",
&sel,
&DataSel::Isol
))
.lines;
let slope = dl.slope();
if slope != 0.0 && dl.right.y < isol_thr {
let intcp =
(dl.right.x - (dl.right.y - isol_thr) / slope).clamp(dl.range.0, dl.range.1);
series.filter_beyond(intcp);
fill_upto = Some(intcp);
}
}
series.fit_lines(self.gran, dir)?;
if let Some(fill_upto) = fill_upto {
series.fill_vrate_range((series.lines.range.0, fill_upto));
}
if filter_outliers {
series.filter_outliers();
trace!(
"fitting {:?} points={} outliers={} dir={:?}",
&sel,
series.points.len(),
series.outliers.len(),
&dir
);
let range = series.lines.range;
series.fit_lines(self.gran, dir)?;
series.fill_vrate_range(range);
}
// For some data series, we fit the lines excluding the outliers
// so that the fitted lines can be used to guess the likely
// behaviors most of the time but we want to include the
// outliers when reporting error so that the users can gauge the
// flakiness of the device.
series.error = DataSeries::calc_error(
series.points.iter().chain(series.outliers.iter()),
&series.lines,
);
Ok(())
}