blob: cb836a3947be8abfc70ec94b7a8c506489ffdfcd [file] [log] [blame]
mod gnuplot_backend;
mod plotters_backend;
pub(crate) use gnuplot_backend::Gnuplot;
pub(crate) use plotters_backend::PlottersBackend;
use crate::estimate::Statistic;
use crate::measurement::ValueFormatter;
use crate::report::{BenchmarkId, ComparisonData, MeasurementData, ReportContext, ValueType};
use std::path::PathBuf;
const REPORT_STATS: [Statistic; 7] = [
Statistic::Typical,
Statistic::Slope,
Statistic::Mean,
Statistic::Median,
Statistic::MedianAbsDev,
Statistic::MedianAbsDev,
Statistic::StdDev,
];
const CHANGE_STATS: [Statistic; 2] = [Statistic::Mean, Statistic::Median];
#[derive(Clone, Copy)]
pub(crate) struct PlotContext<'a> {
pub(crate) id: &'a BenchmarkId,
pub(crate) context: &'a ReportContext,
pub(crate) size: Option<(usize, usize)>,
pub(crate) is_thumbnail: bool,
}
impl<'a> PlotContext<'a> {
pub fn size(mut self, s: Option<criterion_plot::Size>) -> PlotContext<'a> {
if let Some(s) = s {
self.size = Some((s.0, s.1));
}
self
}
pub fn thumbnail(mut self, value: bool) -> PlotContext<'a> {
self.is_thumbnail = value;
self
}
pub fn line_comparison_path(&self) -> PathBuf {
let mut path = self.context.output_directory.clone();
path.push(self.id.as_directory_name());
path.push("report");
path.push("lines.svg");
path
}
pub fn violin_path(&self) -> PathBuf {
let mut path = self.context.output_directory.clone();
path.push(self.id.as_directory_name());
path.push("report");
path.push("violin.svg");
path
}
}
#[derive(Clone, Copy)]
pub(crate) struct PlotData<'a> {
pub(crate) formatter: &'a dyn ValueFormatter,
pub(crate) measurements: &'a MeasurementData<'a>,
pub(crate) comparison: Option<&'a ComparisonData>,
}
impl<'a> PlotData<'a> {
pub fn comparison(mut self, comp: &'a ComparisonData) -> PlotData<'a> {
self.comparison = Some(comp);
self
}
}
pub(crate) trait Plotter {
fn pdf(&mut self, ctx: PlotContext<'_>, data: PlotData<'_>);
fn regression(&mut self, ctx: PlotContext<'_>, data: PlotData<'_>);
fn iteration_times(&mut self, ctx: PlotContext<'_>, data: PlotData<'_>);
fn abs_distributions(&mut self, ctx: PlotContext<'_>, data: PlotData<'_>);
fn rel_distributions(&mut self, ctx: PlotContext<'_>, data: PlotData<'_>);
fn line_comparison(
&mut self,
ctx: PlotContext<'_>,
formatter: &dyn ValueFormatter,
all_curves: &[&(&BenchmarkId, Vec<f64>)],
value_type: ValueType,
);
fn violin(
&mut self,
ctx: PlotContext<'_>,
formatter: &dyn ValueFormatter,
all_curves: &[&(&BenchmarkId, Vec<f64>)],
);
fn t_test(&mut self, ctx: PlotContext<'_>, data: PlotData<'_>);
fn wait(&mut self);
}