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> { |
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 | |
40 | pub fn thumbnail(mut self, value: bool) -> PlotContext<'a> { |
41 | self.is_thumbnail = value; |
42 | self |
43 | } |
44 | |
45 | 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 | |
53 | 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> { |
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 { |
77 | fn pdf(&mut self, ctx: PlotContext<'_>, data: PlotData<'_>); |
78 | |
79 | fn regression(&mut self, ctx: PlotContext<'_>, data: PlotData<'_>); |
80 | |
81 | fn iteration_times(&mut self, ctx: PlotContext<'_>, data: PlotData<'_>); |
82 | |
83 | fn abs_distributions(&mut self, ctx: PlotContext<'_>, data: PlotData<'_>); |
84 | |
85 | fn rel_distributions(&mut self, ctx: PlotContext<'_>, data: PlotData<'_>); |
86 | |
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 | |
95 | fn violin( |
96 | &mut self, |
97 | ctx: PlotContext<'_>, |
98 | formatter: &dyn ValueFormatter, |
99 | all_curves: &[&(&BenchmarkId, Vec<f64>)], |
100 | ); |
101 | |
102 | fn t_test(&mut self, ctx: PlotContext<'_>, data: PlotData<'_>); |
103 | |
104 | fn wait(&mut self); |
105 | } |
106 | |