mod backtracking;
pub mod badger;
mod pqueue;
mod pqueue_worker;
use std::fmt::Debug;
#[cfg(feature = "portmatching")]
pub use badger::ECCBadgerOptimiser;
pub use badger::{BadgerLogger, BadgerOptimiser};
use pqueue::StatePQueue;
use pqueue_worker::StatePQWorker;
pub use backtracking::BacktrackingOptimiser;
#[derive(Default)]
#[non_exhaustive]
pub struct OptimiserOptions<'w> {
pub badger_logger: BadgerLogger<'w>,
pub track_n_best: Option<usize>,
}
impl<'w> From<BadgerLogger<'w>> for OptimiserOptions<'w> {
fn from(badger_logger: BadgerLogger<'w>) -> Self {
Self {
badger_logger,
..Default::default()
}
}
}
pub struct OptimiserResult<S> {
pub best_state: S,
pub n_best_states: Option<Vec<S>>,
}
pub trait Optimiser: Sized {
fn optimise<C, S>(&self, start_state: S, start_context: C) -> Option<S>
where
S: State<C>,
{
self.optimise_with_options(start_state, start_context, Default::default())
.map(|r| r.best_state)
}
fn optimise_with_options<C, S>(
&self,
start_state: S,
start_context: C,
options: OptimiserOptions,
) -> Option<OptimiserResult<S>>
where
S: State<C>;
}
pub trait State<Context>: Clone {
type Cost: Ord + Debug + serde::Serialize + Clone;
fn hash(&self, context: &Context) -> Option<u64>;
fn cost(&self, context: &Context) -> Option<Self::Cost>;
fn next_states(&self, context: &mut Context) -> Vec<Self>;
}