pub struct CdclBranchingState<F = f64> {
pub n_vars: usize,
pub decisions: Vec<BranchingDecision>,
pub learned_clauses: Vec<LearnedClause>,
pub activity: Vec<F>,
pub config: CdclConfig,
}Expand description
Mutable state for CDCL-style MIP branching.
Maintains a decision trail, a database of learned clauses, and VSIDS activity scores for heuristic variable selection.
Fields§
§n_vars: usizeNumber of (binary/integer) variables in the problem.
decisions: Vec<BranchingDecision>Current decision trail (ordered stack).
learned_clauses: Vec<LearnedClause>Accumulated learned clauses (nogoods).
activity: Vec<F>VSIDS activity scores per variable.
config: CdclConfigSolver configuration.
Implementations§
Source§impl<F> CdclBranchingState<F>
impl<F> CdclBranchingState<F>
Sourcepub fn new(n_vars: usize, config: CdclConfig) -> OptimizeResult<Self>
pub fn new(n_vars: usize, config: CdclConfig) -> OptimizeResult<Self>
Create a new CDCL branching state for a problem with n_vars variables.
Sourcepub fn select_branching_var(&self, lp_solution: &[F]) -> Option<usize>
pub fn select_branching_var(&self, lp_solution: &[F]) -> Option<usize>
Select the variable to branch on.
Among all variables that are fractional in the LP relaxation
(i.e., 0 < lp_solution[i] < 1), return the index with the highest
activity score. If no fractional variable exists, return None.
§Arguments
lp_solution– current LP relaxation solution (lengthn_vars).
Sourcepub fn record_conflict(&mut self, infeasible_decisions: &[BranchingDecision])
pub fn record_conflict(&mut self, infeasible_decisions: &[BranchingDecision])
Record a conflict: given the set of branching decisions that led to infeasibility, extract a learned clause and update VSIDS activities.
§Algorithm
- Build clause
{NOT d | d ∈ infeasible_decisions}as the conjunction of negated literals. - Bump activity for all variables in the clause.
- Apply clause minimisation (remove literals subsumed by existing shorter clauses).
- Evict oldest clauses if the database exceeds
max_clauses.
At most max_learned_per_conflict clauses are added per call.
Sourcepub fn apply_clauses(&self, current_decisions: &[BranchingDecision]) -> bool
pub fn apply_clauses(&self, current_decisions: &[BranchingDecision]) -> bool
Check whether any learned clause is violated by the current decisions.
A clause is violated (fires) when every literal (i, v) in the
clause is matched by some decision d with d.var_index == i and
d.value == v. Firing indicates that the current node is provably
infeasible and should be pruned.
Returns true if at least one clause fires (prune this node).
Sourcepub fn decay_activities(&mut self)
pub fn decay_activities(&mut self)
Decay all variable activity scores by multiplying by config.decay.
This implements the VSIDS (Variable State Independent Decaying Sum) heuristic, which prioritises variables that appeared in recent conflicts.
Sourcepub fn push_decision(&mut self, decision: BranchingDecision)
pub fn push_decision(&mut self, decision: BranchingDecision)
Push a new decision onto the decision trail.
Sourcepub fn pop_decision(&mut self) -> Option<BranchingDecision>
pub fn pop_decision(&mut self) -> Option<BranchingDecision>
Pop the most recent decision from the trail (backtrack one level).
Sourcepub fn n_learned_clauses(&self) -> usize
pub fn n_learned_clauses(&self) -> usize
Return the number of learned clauses currently in the database.
Sourcepub fn prune_inactive_clauses(&mut self)
pub fn prune_inactive_clauses(&mut self)
Remove all learned clauses with activity below the configured threshold.
Trait Implementations§
Source§impl<F: Clone> Clone for CdclBranchingState<F>
impl<F: Clone> Clone for CdclBranchingState<F>
Source§fn clone(&self) -> CdclBranchingState<F>
fn clone(&self) -> CdclBranchingState<F>
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl<F> Freeze for CdclBranchingState<F>
impl<F> RefUnwindSafe for CdclBranchingState<F>where
F: RefUnwindSafe,
impl<F> Send for CdclBranchingState<F>where
F: Send,
impl<F> Sync for CdclBranchingState<F>where
F: Sync,
impl<F> Unpin for CdclBranchingState<F>where
F: Unpin,
impl<F> UnsafeUnpin for CdclBranchingState<F>
impl<F> UnwindSafe for CdclBranchingState<F>where
F: 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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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 moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.