use super::super::declaration::BenchRow;
use super::{
BenchAttachment, BenchCall, WorkCurve, WorkJudgment, WorkJudgmentInput, WorkRecorder,
WorkRecordingRefusal,
};
pub(in crate::bench) fn curve(
call: BenchCall,
row: &BenchRow,
attachment: &BenchAttachment,
) -> Result<WorkCurve, WorkRecordingRefusal> {
let mut points = Vec::new();
for input_size in row.input_sizes().sizes().iter().copied() {
let mut recorder = WorkRecorder::scoped(attachment.observations());
for _sample in 0..row.budgets().samples() {
call(input_size, &mut recorder)?;
}
points.push(recorder.finish(input_size));
}
Ok(WorkCurve::recorded(points))
}
pub(in crate::bench) fn judge(
row: &BenchRow,
attachment: &BenchAttachment,
measured: &WorkCurve,
planted_worse: &WorkCurve,
) -> WorkJudgment {
let input = WorkJudgmentInput::over(
row.formula(),
row.complexity(),
row.budgets(),
measured,
planted_worse,
);
(attachment.judge().judge())(&input)
}