1 mod gnuplot_backend;
2 #[cfg(feature = "plotters")]
3 mod plotters_backend;
4 
5 pub(crate) use gnuplot_backend::Gnuplot;
6 #[cfg(feature = "plotters")]
7 pub(crate) use plotters_backend::PlottersBackend;
8 
9 use crate::estimate::Statistic;
10 use crate::measurement::ValueFormatter;
11 use crate::report::{BenchmarkId, ComparisonData, MeasurementData, ReportContext, ValueType};
12 use std::path::PathBuf;
13 
14 const REPORT_STATS: [Statistic; 7] = [
15     Statistic::Typical,
16     Statistic::Slope,
17     Statistic::Mean,
18     Statistic::Median,
19     Statistic::MedianAbsDev,
20     Statistic::MedianAbsDev,
21     Statistic::StdDev,
22 ];
23 const CHANGE_STATS: [Statistic; 2] = [Statistic::Mean, Statistic::Median];
24 #[derive(Clone, Copy)]
25 pub(crate) struct PlotContext<'a> {
26     pub(crate) id: &'a BenchmarkId,
27     pub(crate) context: &'a ReportContext,
28     pub(crate) size: Option<(usize, usize)>,
29     pub(crate) is_thumbnail: bool,
30 }
31 
32 impl<'a> PlotContext<'a> {
size(mut self, s: Option<criterion_plot::Size>) -> PlotContext<'a>33     pub fn size(mut self, s: Option<criterion_plot::Size>) -> PlotContext<'a> {
34         if let Some(s) = s {
35             self.size = Some((s.0, s.1));
36         }
37         self
38     }
39 
thumbnail(mut self, value: bool) -> PlotContext<'a>40     pub fn thumbnail(mut self, value: bool) -> PlotContext<'a> {
41         self.is_thumbnail = value;
42         self
43     }
44 
line_comparison_path(&self) -> PathBuf45     pub fn line_comparison_path(&self) -> PathBuf {
46         let mut path = self.context.output_directory.clone();
47         path.push(self.id.as_directory_name());
48         path.push("report");
49         path.push("lines.svg");
50         path
51     }
52 
violin_path(&self) -> PathBuf53     pub fn violin_path(&self) -> PathBuf {
54         let mut path = self.context.output_directory.clone();
55         path.push(self.id.as_directory_name());
56         path.push("report");
57         path.push("violin.svg");
58         path
59     }
60 }
61 
62 #[derive(Clone, Copy)]
63 pub(crate) struct PlotData<'a> {
64     pub(crate) formatter: &'a dyn ValueFormatter,
65     pub(crate) measurements: &'a MeasurementData<'a>,
66     pub(crate) comparison: Option<&'a ComparisonData>,
67 }
68 
69 impl<'a> PlotData<'a> {
comparison(mut self, comp: &'a ComparisonData) -> PlotData<'a>70     pub fn comparison(mut self, comp: &'a ComparisonData) -> PlotData<'a> {
71         self.comparison = Some(comp);
72         self
73     }
74 }
75 
76 pub(crate) trait Plotter {
pdf(&mut self, ctx: PlotContext<'_>, data: PlotData<'_>)77     fn pdf(&mut self, ctx: PlotContext<'_>, data: PlotData<'_>);
78 
regression(&mut self, ctx: PlotContext<'_>, data: PlotData<'_>)79     fn regression(&mut self, ctx: PlotContext<'_>, data: PlotData<'_>);
80 
iteration_times(&mut self, ctx: PlotContext<'_>, data: PlotData<'_>)81     fn iteration_times(&mut self, ctx: PlotContext<'_>, data: PlotData<'_>);
82 
abs_distributions(&mut self, ctx: PlotContext<'_>, data: PlotData<'_>)83     fn abs_distributions(&mut self, ctx: PlotContext<'_>, data: PlotData<'_>);
84 
rel_distributions(&mut self, ctx: PlotContext<'_>, data: PlotData<'_>)85     fn rel_distributions(&mut self, ctx: PlotContext<'_>, data: PlotData<'_>);
86 
line_comparison( &mut self, ctx: PlotContext<'_>, formatter: &dyn ValueFormatter, all_curves: &[&(&BenchmarkId, Vec<f64>)], value_type: ValueType, )87     fn line_comparison(
88         &mut self,
89         ctx: PlotContext<'_>,
90         formatter: &dyn ValueFormatter,
91         all_curves: &[&(&BenchmarkId, Vec<f64>)],
92         value_type: ValueType,
93     );
94 
violin( &mut self, ctx: PlotContext<'_>, formatter: &dyn ValueFormatter, all_curves: &[&(&BenchmarkId, Vec<f64>)], )95     fn violin(
96         &mut self,
97         ctx: PlotContext<'_>,
98         formatter: &dyn ValueFormatter,
99         all_curves: &[&(&BenchmarkId, Vec<f64>)],
100     );
101 
t_test(&mut self, ctx: PlotContext<'_>, data: PlotData<'_>)102     fn t_test(&mut self, ctx: PlotContext<'_>, data: PlotData<'_>);
103 
wait(&mut self)104     fn wait(&mut self);
105 }
106