use super::experience::experiment::Experiment;
use super::experience::runner::{ExperimentRunner, RunOutput};
use crate::hub::domain::common::errors::HubResult;
pub struct Step {
pub name: String,
pub experiment: Experiment,
}
pub struct CampaignResult {
pub step_results: Vec<(String, RunOutput)>,
}
impl CampaignResult {
pub fn get(&self, name: &str) -> Option<&RunOutput> {
self.step_results
.iter()
.find(|(n, _)| n == name)
.map(|(_, r)| r)
}
pub fn len(&self) -> usize {
self.step_results.len()
}
pub fn is_empty(&self) -> bool {
self.step_results.is_empty()
}
pub fn scalars(&self) -> Vec<(&str, f64)> {
self.step_results
.iter()
.filter_map(|(n, r)| {
if let RunOutput::Scalar(v) = r {
Some((n.as_str(), *v))
} else {
None
}
})
.collect()
}
}
pub struct Campaign {
pub name: String,
steps: Vec<Step>,
}
impl Campaign {
pub fn new(name: &str) -> Self {
Self {
name: name.to_string(),
steps: Vec::new(),
}
}
pub fn add_step(mut self, name: &str, experiment: Experiment) -> Self {
self.steps.push(Step {
name: name.to_string(),
experiment,
});
self
}
pub fn step_count(&self) -> usize {
self.steps.len()
}
pub fn run(&self, runner: &ExperimentRunner) -> HubResult<CampaignResult> {
let mut results = Vec::with_capacity(self.steps.len());
for step in &self.steps {
let output = runner.run(&step.experiment)?;
results.push((step.name.clone(), output));
}
Ok(CampaignResult {
step_results: results,
})
}
}