mod heap;
mod propagate;
#[cfg_attr(feature = "EVSIDS", path = "evsids.rs")]
#[cfg_attr(feature = "LR_rewarding", path = "learning_rate.rs")]
mod reward;
mod select;
mod stack;
mod var;
pub use self::{propagate::PropagateIF, property::*, select::VarSelectIF, var::VarManipulateIF};
#[cfg(any(feature = "best_phases_tracking", feature = "var_staging"))]
use std::collections::HashMap;
use {
self::heap::VarHeapIF,
super::{cdb::ClauseDBIF, types::*},
std::{ops::Range, slice::Iter},
};
pub trait AssignIF:
ActivityIF<VarId>
+ Instantiate
+ PropagateIF
+ VarManipulateIF
+ PropertyDereference<property::Tusize, usize>
+ PropertyReference<property::TEma, Ema>
{
fn stack(&self, i: usize) -> Lit;
fn stack_range(&self, r: Range<usize>) -> &[Lit];
fn stack_len(&self) -> usize;
fn len_upto(&self, n: DecisionLevel) -> usize;
fn stack_is_empty(&self) -> bool;
fn stack_iter(&self) -> Iter<'_, Lit>;
fn decision_level(&self) -> DecisionLevel;
fn decision_vi(&self, lv: DecisionLevel) -> VarId;
fn remains(&self) -> bool;
fn assign_ref(&self) -> &[Option<bool>];
fn level_ref(&self) -> &[DecisionLevel];
fn best_assigned(&mut self) -> Option<usize>;
fn extend_model<C>(&mut self, c: &mut C, lits: &[Lit]) -> Vec<Option<bool>>
where
C: ClauseDBIF;
fn satisfies(&self, c: &[Lit]) -> bool;
fn locked(&self, c: &Clause, cid: ClauseId) -> bool;
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum AssignReason {
None,
Implication(ClauseId, Lit),
}
#[derive(Clone, Debug)]
pub struct Var {
pub index: VarId,
participated: u32,
reward: f64,
timestamp: usize,
flags: Flag,
}
#[derive(Clone, Debug)]
pub struct AssignStack {
assign: Vec<Option<bool>>,
level: Vec<DecisionLevel>,
reason: Vec<AssignReason>,
trail: Vec<Lit>,
trail_lim: Vec<usize>,
q_head: usize,
pub root_level: DecisionLevel,
var_order: VarIdHeap,
best_assign: bool,
build_best_at: usize,
num_best_assign: usize,
rephasing: bool,
#[cfg(feature = "best_phases_tracking")]
best_phases: HashMap<VarId, (bool, AssignReason)>,
#[cfg(feature = "var_staging")]
staging_reward_decay: f64,
#[cfg(feature = "var_staging")]
staging_reward_value: f64,
#[cfg(feature = "var_staging")]
staged_vars: HashMap<VarId, bool>,
#[cfg(feature = "var_staging")]
stage_mode_select: usize,
num_stages: usize,
stage_activity: f64,
reward_index: usize,
pub num_vars: usize,
pub num_asserted_vars: usize,
pub num_eliminated_vars: usize,
num_decision: usize,
num_propagation: usize,
pub num_conflict: usize,
num_restart: usize,
dpc_ema: EmaSU,
ppc_ema: EmaSU,
cpr_ema: EmaSU,
ordinal: usize,
var: Vec<Var>,
activity_decay: f64,
activity_decay_default: f64,
activity_anti_decay: f64,
activity_ema: Ema,
activity_decay_step: f64,
during_vivification: bool,
vivify_sandbox: (usize, usize, usize),
}
#[derive(Clone, Debug)]
pub struct VarIdHeap {
heap: Vec<VarId>,
idxs: Vec<usize>,
}
impl VarIdHeap {
pub fn new(n: usize, init: usize) -> Self {
let mut heap = Vec::with_capacity(n + 1);
let mut idxs = Vec::with_capacity(n + 1);
heap.push(0);
idxs.push(n);
for i in 1..=n {
heap.push(i);
idxs.push(i);
}
idxs[0] = init;
VarIdHeap { heap, idxs }
}
}
pub mod property {
use super::AssignStack;
use crate::types::*;
#[derive(Clone, Debug, PartialEq)]
pub enum Tusize {
NumConflict,
NumDecision,
NumPropagation,
NumRestart,
NumVar,
NumAssertedVar,
NumEliminatedVar,
NumUnassertedVar,
NumUnassignedVar,
NumUnreachableVar,
}
impl PropertyDereference<Tusize, usize> for AssignStack {
#[inline]
fn derefer(&self, k: Tusize) -> usize {
match k {
Tusize::NumConflict => self.num_conflict,
Tusize::NumDecision => self.num_decision,
Tusize::NumPropagation => self.num_propagation,
Tusize::NumRestart => self.num_restart,
Tusize::NumVar => self.num_vars,
Tusize::NumAssertedVar => self.num_asserted_vars,
Tusize::NumEliminatedVar => self.num_eliminated_vars,
Tusize::NumUnassertedVar => {
self.num_vars - self.num_eliminated_vars - self.num_asserted_vars
}
Tusize::NumUnassignedVar => {
self.num_vars - self.num_eliminated_vars - self.trail.len()
}
Tusize::NumUnreachableVar => self.num_vars - self.num_best_assign,
}
}
}
#[derive(Clone, Debug, PartialEq)]
pub enum TEma {
DPC,
PPC,
CPR,
}
impl PropertyReference<TEma, Ema> for AssignStack {
#[inline]
fn refer(&self, k: TEma) -> &Ema {
match k {
TEma::DPC => self.dpc_ema.get_ema(),
TEma::PPC => self.ppc_ema.get_ema(),
TEma::CPR => self.cpr_ema.get_ema(),
}
}
}
}