solverforge_solver/
problem_spec.rs1use std::sync::atomic::AtomicBool;
4use std::time::Duration;
5
6use solverforge_config::SolverConfig;
7use solverforge_core::domain::PlanningSolution;
8use solverforge_core::score::{ParseableScore, Score};
9use solverforge_scoring::{ConstraintSet, ScoreDirector};
10
11use crate::run::AnyTermination;
12use crate::solver::SolveResult;
13
14pub trait ProblemSpec<S, C>
19where
20 S: PlanningSolution,
21 S::Score: Score + ParseableScore,
22 C: ConstraintSet<S, S::Score>,
23{
24 fn is_trivial(&self, solution: &S) -> bool;
26
27 fn default_time_limit_secs(&self) -> u64;
29
30 fn log_scale(&self, solution: &S);
32
33 fn build_and_solve(
35 self,
36 director: ScoreDirector<S, C>,
37 config: &SolverConfig,
38 time_limit: Duration,
39 termination: AnyTermination<S, ScoreDirector<S, C>>,
40 terminate: Option<&AtomicBool>,
41 callback: impl Fn(&S) + Send + Sync,
42 ) -> SolveResult<S>;
43}