use std::fmt::Debug;
use enum_map::Enum;
#[cfg(doc)]
use crate::Solver;
#[cfg(doc)]
use crate::basic_types::Random;
use crate::basic_types::SolutionReference;
#[cfg(doc)]
use crate::branching;
use crate::branching::SelectionContext;
#[cfg(doc)]
use crate::branching::branchers::dynamic_brancher::DynamicBrancher;
#[cfg(doc)]
use crate::branching::value_selection::ValueSelector;
#[cfg(doc)]
use crate::branching::variable_selection::VariableSelector;
#[cfg(doc)]
use crate::create_statistics_struct;
use crate::engine::predicates::predicate::Predicate;
use crate::engine::variables::DomainId;
#[cfg(doc)]
use crate::results::solution_iterator::SolutionIterator;
use crate::statistics::StatisticLogger;
pub trait Brancher: Debug {
fn log_statistics(&self, _statistic_logger: StatisticLogger) {}
fn next_decision(&mut self, context: &mut SelectionContext) -> Option<Predicate>;
fn on_conflict(&mut self) {}
fn on_backtrack(&mut self) {}
fn on_solution(&mut self, _solution: SolutionReference) {}
fn on_unassign_integer(&mut self, _variable: DomainId, _value: i32) {}
fn on_appearance_in_conflict_predicate(&mut self, _predicate: Predicate) {}
fn on_restart(&mut self) {}
fn synchronise(&mut self, _context: &mut SelectionContext) {}
fn is_restart_pointless(&mut self) -> bool {
true
}
fn subscribe_to_events(&self) -> Vec<BrancherEvent>;
}
#[derive(Debug, Clone, Copy, Enum, Hash, PartialEq, Eq)]
pub enum BrancherEvent {
Conflict,
Backtrack,
Solution,
UnassignInteger,
AppearanceInConflictPredicate,
Restart,
Synchronise,
}