routee_compass/plugin/output/default/summary/
plugin.rs

1use crate::app::{compass::CompassAppError, search::SearchAppResult};
2use crate::plugin::output::default::summary::SummaryConfig;
3use crate::plugin::output::output_plugin::OutputPlugin;
4use crate::plugin::output::OutputPluginError;
5use routee_compass_core::algorithm::search::SearchInstance;
6use routee_compass_core::util::duration_extension::DurationExtension;
7use serde_json::json;
8
9/// provides metrics for the performance of the search algorithm.
10pub struct SummaryOutputPlugin {
11    pub estimate_memory_consumption: bool,
12}
13
14impl OutputPlugin for SummaryOutputPlugin {
15    /// append "Cost" value to the output JSON
16    fn process(
17        &self,
18        output: &mut serde_json::Value,
19        search_result: &Result<(SearchAppResult, SearchInstance), CompassAppError>,
20    ) -> Result<(), OutputPluginError> {
21        match search_result {
22            Err(_e) => Ok(()),
23            Ok((result, _)) => {
24                let route_edges = result.routes.iter().map(|r| r.len()).sum::<usize>();
25                let tree_edges = result.trees.iter().map(|t| t.len()).sum::<usize>();
26                let terminated = result
27                    .terminated
28                    .clone()
29                    .unwrap_or_else(|| "false".to_string());
30
31                output["search_executed_time"] = json![result.search_executed_time.clone()];
32                output["search_runtime"] = json![result.search_runtime.hhmmss()];
33                output["route_edges"] = json![route_edges];
34                output["tree_size_count"] = json![tree_edges];
35                output["iterations"] = json![result.iterations];
36                output["terminated"] = json![terminated];
37
38                if self.estimate_memory_consumption {
39                    let memory_bytes = allocative::size_of_unique(result) as f64;
40                    let memory_mib = memory_bytes / 1_048_576.0;
41                    output["search_result_size_mib"] = json![memory_mib];
42                }
43
44                Ok(())
45            }
46        }
47    }
48}
49
50impl SummaryOutputPlugin {
51    pub fn new(conf: SummaryConfig) -> SummaryOutputPlugin {
52        SummaryOutputPlugin {
53            estimate_memory_consumption: conf.estimate_memory_consumption.unwrap_or_default(),
54        }
55    }
56}