use std::time::SystemTime;
use std::cell::RefCell;
use std::rc::Rc;
use serde_json::json;
use crate::search_manager::SearchManager;
pub trait StoppingCriterion:Clone {
fn is_finished(&self) -> bool;
}
#[derive(Debug, Clone, Default)]
pub struct NeverStoppingCriterion {}
impl StoppingCriterion for NeverStoppingCriterion {
fn is_finished(&self) -> bool { false }
}
#[derive(Debug, Clone)]
pub struct TimeStoppingCriterion {
t_start: SystemTime,
t_max: f32,
}
impl TimeStoppingCriterion {
pub fn new(t_max:f32) -> Self {
Self {
t_start: SystemTime::now(),
t_max,
}
}
}
impl StoppingCriterion for TimeStoppingCriterion {
fn is_finished(&self) -> bool {
self.t_start.elapsed().unwrap().as_secs_f32() >= self.t_max
}
}
pub trait SearchAlgorithm<N, B> {
fn run<SC:StoppingCriterion>(&mut self, stopping_criterion:SC);
fn get_manager(&mut self) -> &mut SearchManager<N,B>;
fn is_optimal(&self) -> bool { false }
fn json_statistics(&self, json:&mut serde_json::Value) { json["is_optimal"] = json!(self.is_optimal()) }
}
pub trait BuildableWithInteger<Space> {
fn create_with_integer(s:Rc<RefCell<Space>>, d:usize) -> Self;
}