use self::unsatisfiable::UnsatisfiableUnderAssumptions;
use crate::Solver;
pub use crate::basic_types::ProblemSolution;
use crate::basic_types::Solution;
pub use crate::basic_types::SolutionReference;
use crate::conflict_resolving::ConflictResolver;
pub mod solution_iterator;
pub mod unsatisfiable;
use crate::branching::Brancher;
#[cfg(doc)]
use crate::termination::TerminationCondition;
#[derive(Debug)]
pub enum SatisfactionResult<'solver, 'brancher, 'resolver, B: Brancher, R: ConflictResolver> {
Satisfiable(Satisfiable<'solver, 'brancher, 'resolver, B, R>),
Unsatisfiable(&'solver Solver, &'brancher B, &'resolver R),
Unknown(&'solver Solver, &'brancher B, &'resolver R),
}
#[derive(Debug)]
pub enum SatisfactionResultUnderAssumptions<
'solver,
'brancher,
'resolver,
B: Brancher,
R: ConflictResolver,
> {
Satisfiable(Satisfiable<'solver, 'brancher, 'resolver, B, R>),
UnsatisfiableUnderAssumptions(UnsatisfiableUnderAssumptions<'solver, 'brancher, B>),
Unsatisfiable(&'solver Solver),
Unknown(&'solver Solver),
}
#[derive(Debug)]
pub enum OptimisationResult<Stop> {
Optimal(Solution),
Satisfiable(Solution),
Stopped(Solution, Stop),
Unsatisfiable,
Unknown,
}
#[derive(Debug)]
pub struct Satisfiable<'solver, 'brancher, 'resolver, B: Brancher, R: ConflictResolver> {
solver: &'solver mut Solver,
brancher: &'brancher mut B,
resolver: &'resolver mut R,
}
impl<'solver, 'brancher, 'resolver, B: Brancher, R: ConflictResolver>
Satisfiable<'solver, 'brancher, 'resolver, B, R>
{
pub(crate) fn new(
solver: &'solver mut Solver,
brancher: &'brancher mut B,
resolver: &'resolver mut R,
) -> Self {
Satisfiable {
solver,
brancher,
resolver,
}
}
pub fn solution(&self) -> SolutionReference<'_> {
self.solver.get_solution_reference()
}
pub fn solver(&self) -> &Solver {
self.solver
}
pub fn brancher(&self) -> &B {
self.brancher
}
pub fn conflict_resolver(&self) -> &R {
self.resolver
}
}
impl<B: Brancher, R: ConflictResolver> Drop for Satisfiable<'_, '_, '_, B, R> {
fn drop(&mut self) {
self.solver
.satisfaction_solver
.restore_state_at_root(self.brancher);
}
}