sciforge_hub/engine/
campaign.rs1use super::experience::experiment::Experiment;
7use super::experience::runner::{ExperimentRunner, RunOutput};
8use crate::domain::common::errors::HubResult;
9
10pub struct Step {
12 pub name: String,
14 pub experiment: Experiment,
16}
17
18pub struct CampaignResult {
20 pub step_results: Vec<(String, RunOutput)>,
22}
23
24impl CampaignResult {
25 pub fn get(&self, name: &str) -> Option<&RunOutput> {
27 self.step_results
28 .iter()
29 .find(|(n, _)| n == name)
30 .map(|(_, r)| r)
31 }
32
33 pub fn len(&self) -> usize {
35 self.step_results.len()
36 }
37
38 pub fn is_empty(&self) -> bool {
40 self.step_results.is_empty()
41 }
42
43 pub fn scalars(&self) -> Vec<(&str, f64)> {
45 self.step_results
46 .iter()
47 .filter_map(|(n, r)| {
48 if let RunOutput::Scalar(v) = r {
49 Some((n.as_str(), *v))
50 } else {
51 None
52 }
53 })
54 .collect()
55 }
56}
57
58pub struct Campaign {
60 pub name: String,
62 steps: Vec<Step>,
63}
64
65impl Campaign {
66 pub fn new(name: &str) -> Self {
68 Self {
69 name: name.to_string(),
70 steps: Vec::new(),
71 }
72 }
73
74 pub fn add_step(mut self, name: &str, experiment: Experiment) -> Self {
76 self.steps.push(Step {
77 name: name.to_string(),
78 experiment,
79 });
80 self
81 }
82
83 pub fn step_count(&self) -> usize {
85 self.steps.len()
86 }
87
88 pub fn run(&self, runner: &ExperimentRunner) -> HubResult<CampaignResult> {
90 let mut results = Vec::with_capacity(self.steps.len());
91 for step in &self.steps {
92 let output = runner.run(&step.experiment)?;
93 results.push((step.name.clone(), output));
94 }
95 Ok(CampaignResult {
96 step_results: results,
97 })
98 }
99}