pub struct IntersectionConstraint<C> { /* private fields */ }Expand description
Logical conjunction of constraints (AND).
All children must agree on every variable binding. Built by the
and! macro or directly via new.
The intersection delegates to its children using cardinality-aware
ordering: the child with the lowest estimate
proposes candidates, and the remaining children
confirm them in order of increasing estimate.
This strategy keeps the candidate set small from the start and avoids
materialising cross products.
Variables from all children are exposed as a single union, so the engine sees one flat set of variables regardless of how many sub-constraints contribute.
Implementations§
Source§impl<'a, C> IntersectionConstraint<C>where
C: Constraint<'a> + 'a,
impl<'a, C> IntersectionConstraint<C>where
C: Constraint<'a> + 'a,
Trait Implementations§
Source§impl<'a, C> Constraint<'a> for IntersectionConstraint<C>where
C: Constraint<'a> + 'a,
impl<'a, C> Constraint<'a> for IntersectionConstraint<C>where
C: Constraint<'a> + 'a,
Source§fn variables(&self) -> VariableSet
fn variables(&self) -> VariableSet
Returns the union of all children’s variable sets.
Source§fn estimate(&self, variable: VariableId, binding: &Binding) -> Option<usize>
fn estimate(&self, variable: VariableId, binding: &Binding) -> Option<usize>
Returns the minimum estimate across children that constrain
variable. The tightest child bounds the search, reflecting the
intersection semantics: every child must agree, so the smallest
candidate set dominates.
Source§fn propose(
&self,
variable: VariableId,
binding: &Binding,
proposals: &mut Vec<RawValue>,
)
fn propose( &self, variable: VariableId, binding: &Binding, proposals: &mut Vec<RawValue>, )
Sorts children by estimate, lets the tightest one propose, then
confirms through the rest in ascending estimate order. Children
that return None for this variable are skipped entirely.
Source§fn confirm(
&self,
variable: VariableId,
binding: &Binding,
proposals: &mut Vec<RawValue>,
)
fn confirm( &self, variable: VariableId, binding: &Binding, proposals: &mut Vec<RawValue>, )
Confirms proposals through all children that constrain variable,
in order of increasing estimate.
Source§fn satisfied(&self, binding: &Binding) -> bool
fn satisfied(&self, binding: &Binding) -> bool
Returns true only when every child is satisfied.
Source§fn influence(&self, variable: VariableId) -> VariableSet
fn influence(&self, variable: VariableId) -> VariableSet
Returns the union of all children’s influence sets for variable.
Auto Trait Implementations§
impl<C> Freeze for IntersectionConstraint<C>
impl<C> RefUnwindSafe for IntersectionConstraint<C>where
C: RefUnwindSafe,
impl<C> Send for IntersectionConstraint<C>where
C: Send,
impl<C> Sync for IntersectionConstraint<C>where
C: Sync,
impl<C> Unpin for IntersectionConstraint<C>where
C: Unpin,
impl<C> UnsafeUnpin for IntersectionConstraint<C>
impl<C> UnwindSafe for IntersectionConstraint<C>where
C: UnwindSafe,
Blanket Implementations§
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
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