pub mod simulator;
use crate::{
algorithm::Algorithm, random::Seed, statistic::ProcessingTime, termination::StopReason,
};
use chrono::{DateTime, Duration, Local};
pub trait Simulation<A>
where
A: Algorithm,
{
type Error;
fn run(&mut self) -> Result<SimResult<A>, Self::Error>;
fn step(&mut self) -> Result<SimResult<A>, Self::Error>;
fn stop(&mut self) -> Result<bool, Self::Error>;
fn reset(&mut self) -> Result<bool, Self::Error>;
}
pub trait SimulationBuilder<S, A>
where
S: Simulation<A>,
A: Algorithm,
{
fn build(self) -> S;
fn build_with_seed(self, seed: Seed) -> S;
}
#[derive(Debug, PartialEq)]
pub struct State<A>
where
A: Algorithm,
{
pub started_at: DateTime<Local>,
pub iteration: u64,
pub duration: Duration,
pub processing_time: ProcessingTime,
pub result: <A as Algorithm>::Output,
}
#[derive(Debug, PartialEq)]
pub enum SimResult<A>
where
A: Algorithm,
{
Intermediate(State<A>),
Final(State<A>, ProcessingTime, Duration, StopReason),
}