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