pub struct ConstraintSolver {
pub variables: Vec<CspVariable>,
pub constraints: Vec<Constraint>,
pub config: SolverConfig,
}Expand description
A full-featured CSP solver combining AC-3 domain pruning with backtracking search and configurable variable/value ordering heuristics.
Fields§
§variables: Vec<CspVariable>All registered variables (in insertion order).
constraints: Vec<Constraint>All registered constraints.
config: SolverConfigSolver configuration.
Implementations§
Source§impl ConstraintSolver
impl ConstraintSolver
Sourcepub fn new(config: SolverConfig) -> Self
pub fn new(config: SolverConfig) -> Self
Create a new, empty solver with the given configuration.
Sourcepub fn add_variable(&mut self, name: String, domain: Vec<i64>) -> CspVarId
pub fn add_variable(&mut self, name: String, domain: Vec<i64>) -> CspVarId
Register a new variable with the given name and initial domain values.
Returns the CspVarId that uniquely identifies this variable.
Sourcepub fn add_constraint(&mut self, c: Constraint)
pub fn add_constraint(&mut self, c: Constraint)
Append a constraint to the problem.
Sourcepub fn is_consistent(
&self,
assignment: &Assignment,
var: CspVarId,
value: i64,
) -> bool
pub fn is_consistent( &self, assignment: &Assignment, var: CspVarId, value: i64, ) -> bool
Return true when all constraints that are fully grounded by
assignment (plus the tentative assignment of value to var) are
satisfied.
Sourcepub fn check_constraint(
&self,
c: &Constraint,
assignment: &Assignment,
var: CspVarId,
value: i64,
) -> bool
pub fn check_constraint( &self, c: &Constraint, assignment: &Assignment, var: CspVarId, value: i64, ) -> bool
Check a single constraint under a partial assignment with var = value.
Returns true when:
- the constraint cannot yet be evaluated (some participant is unassigned), OR
- the constraint is satisfied by the current (partial+tentative) assignment.
Sourcepub fn ac3(&self, domains: &mut [Domain]) -> bool
pub fn ac3(&self, domains: &mut [Domain]) -> bool
Run the AC-3 arc-consistency algorithm on the given domains (which
are cloned from the initial variable domains at the start of solve).
Returns false when arc consistency reveals that the problem has no
solution (some domain became empty).
Sourcepub fn revise(&self, domains: &mut [Domain], xi: CspVarId, xj: CspVarId) -> bool
pub fn revise(&self, domains: &mut [Domain], xi: CspVarId, xj: CspVarId) -> bool
Revise xi’s domain: remove any value that has no support in xj.
Returns true when at least one value was removed from xi’s domain.
Sourcepub fn select_unassigned_variable(
&self,
assignment: &Assignment,
domains: &[Domain],
) -> Option<CspVarId>
pub fn select_unassigned_variable( &self, assignment: &Assignment, domains: &[Domain], ) -> Option<CspVarId>
Select the next unassigned variable to expand.
When use_mrv is enabled, picks the variable with the fewest remaining
domain values (ties broken by variable id). Otherwise returns the first
unassigned variable in insertion order.
Sourcepub fn order_domain_values(
&self,
var: CspVarId,
_assignment: &Assignment,
domains: &[Domain],
) -> Vec<i64>
pub fn order_domain_values( &self, var: CspVarId, _assignment: &Assignment, domains: &[Domain], ) -> Vec<i64>
Return the values from var’s current domain in the order we should
try them during backtracking.
When use_lcv is enabled this would apply the Least Constraining Value
heuristic; currently we return values in sorted (ascending) order as a
lightweight deterministic approximation.
Sourcepub fn backtrack(
&self,
assignment: &mut Assignment,
domains: &mut Vec<Domain>,
result: &mut SolverResult,
) -> bool
pub fn backtrack( &self, assignment: &mut Assignment, domains: &mut Vec<Domain>, result: &mut SolverResult, ) -> bool
Recursive backtracking search.
Returns true when the search should stop (either max_solutions
reached or max_backtracks exceeded).
Sourcepub fn solve(&mut self) -> SolverResult
pub fn solve(&mut self) -> SolverResult
Solve the CSP and return a SolverResult with all found solutions
and search statistics.
Auto Trait Implementations§
impl Freeze for ConstraintSolver
impl RefUnwindSafe for ConstraintSolver
impl Send for ConstraintSolver
impl Sync for ConstraintSolver
impl Unpin for ConstraintSolver
impl UnsafeUnpin for ConstraintSolver
impl UnwindSafe for ConstraintSolver
Blanket Implementations§
impl<T> Allocation for T
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more