Skip to content

Commit

Permalink
Switch from AssignStack::var_order to vam::VAR_HEAP
Browse files Browse the repository at this point in the history
  • Loading branch information
shnarazk committed Feb 6, 2025
1 parent 74bb1d6 commit def81d7
Show file tree
Hide file tree
Showing 7 changed files with 77 additions and 35 deletions.
2 changes: 0 additions & 2 deletions src/assign/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@

/// Ema
mod ema;
/// Heap
mod heap;
/// Boolean constraint propagation
mod propagate;
/// Var rewarding
Expand Down
7 changes: 4 additions & 3 deletions src/assign/propagate.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
// implement boolean constraint propagation, backjump
// This version can handle Chronological and Non Chronological Backtrack.
use {
super::{heap::VarHeapIF, AssignIF, AssignStack, VarManipulateIF},
crate::{cdb::ClauseDBIF, types::*, var_vector::*},
super::{AssignIF, AssignStack, VarManipulateIF},
crate::{cdb::ClauseDBIF, types::*, vam::VarActivityManager, var_vector::*},
};

#[cfg(feature = "trail_saving")]
Expand Down Expand Up @@ -290,7 +290,8 @@ impl PropagateIF for AssignStack {
debug_assert!(self.root_level < VarRef(vi).level());
unset_assign!(self, vi);
VarRef(vi).set_reason(AssignReason::None);
self.insert_heap(vi);
// self.insert_heap(vi);
VarActivityManager::insert_heap(vi);
}
self.trail.truncate(lim);
self.trail_lim.truncate(self.root_level as usize);
Expand Down
18 changes: 11 additions & 7 deletions src/assign/select.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
use super::property;

use {
super::{heap::VarHeapIF, stack::AssignStack},
crate::{types::*, var_vector::*},
super::stack::AssignStack,
crate::{types::*, vam::*, var_vector::*},
std::collections::HashMap,
};

Expand Down Expand Up @@ -83,7 +83,8 @@ impl VarSelectIF for AssignStack {
VarRef(*vi).set_activity(
VarRef(*vi).activity() * self.activity_decay + self.activity_anti_decay,
);
self.update_heap(*vi);
// self.update_heap(*vi);
VarActivityManager::update_heap(*vi);
}
}
num_flipped
Expand Down Expand Up @@ -123,13 +124,16 @@ impl VarSelectIF for AssignStack {
Lit::from((vi, VarRef(vi).is(FlagVar::PHASE)))
}
fn update_order(&mut self, v: VarId) {
self.update_heap(v);
// self.update_heap(v);
VarActivityManager::update_heap(v);
}
fn rebuild_order(&mut self) {
self.clear_heap();
// self.clear_heap();
VarActivityManager::clear_heap();
for vi in VarRef::var_id_iter() {
if VarRef(vi).assign().is_none() && !VarRef(vi).is(FlagVar::ELIMINATED) {
self.insert_heap(vi);
// self.insert_heap(vi);
VarActivityManager::insert_heap(vi);
}
}
}
Expand All @@ -139,7 +143,7 @@ impl AssignStack {
/// select a decision var
fn select_var(&mut self) -> VarId {
loop {
let vi = self.get_heap_root();
let vi = VarActivityManager::get_heap_root(self); // self.get_heap_root();
if var_assign!(self, vi).is_none() && !VarRef(vi).is(FlagVar::ELIMINATED) {
return vi;
}
Expand Down
23 changes: 12 additions & 11 deletions src/assign/stack.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
//! main struct AssignStack
use {
super::{ema::ProgressASG, heap::VarHeapIF, heap::VarIdHeap, AssignIF, PropagateIF},
crate::{cdb::ClauseDBIF, types::*, var_vector::*},
super::{ema::ProgressASG, AssignIF, PropagateIF},
crate::{cdb::ClauseDBIF, types::*, vam::VarActivityManager, var_vector::*},
std::{fmt, ops::Range, slice::Iter},
};

Expand All @@ -20,8 +20,7 @@ pub struct AssignStack {
/// the-number-of-assigned-and-propagated-vars + 1
pub(super) q_head: usize,
pub root_level: DecisionLevel,
pub(super) var_order: VarIdHeap, // Variable Order

// pub(super) var_order: VarIdHeap, // Variable Order
#[cfg(feature = "trail_saving")]
pub(super) trail_saved: Vec<Lit>,

Expand Down Expand Up @@ -94,8 +93,7 @@ impl Default for AssignStack {
trail_lim: Vec::new(),
q_head: 0,
root_level: 0,
var_order: VarIdHeap::default(),

// var_order: VarIdHeap::default(),
#[cfg(feature = "trail_saving")]
trail_saved: Vec::new(),

Expand Down Expand Up @@ -161,8 +159,7 @@ impl Instantiate for AssignStack {
let nv = cnf.num_of_variables;
AssignStack {
trail: Vec::with_capacity(nv),
var_order: VarIdHeap::new(nv),

// var_order: VarIdHeap::new(nv),
#[cfg(feature = "trail_saving")]
trail_saved: Vec::with_capacity(nv),

Expand Down Expand Up @@ -198,7 +195,8 @@ impl Instantiate for AssignStack {
self.clear_saved_trail();
}
SolverEvent::NewVar => {
self.expand_heap();
// self.expand_heap();
VarActivityManager::expand_heap();
// self.var.push(Var::default());
}
SolverEvent::Reinitialize => {
Expand Down Expand Up @@ -373,7 +371,8 @@ impl VarManipulateIF for AssignStack {
// self.var[vi].reason = AssignReason::Decision(0);
VarRef(vi).set_reason(AssignReason::Decision(0));
self.set_activity(vi, 0.0);
self.remove_from_heap(vi);
// self.remove_from_heap(vi);
VarActivityManager::remove_from_heap(vi);

#[cfg(feature = "boundary_check")]
{
Expand All @@ -387,7 +386,8 @@ impl VarManipulateIF for AssignStack {
if !VarRef(vi).is(FlagVar::ELIMINATED) {
VarRef(vi).turn_on(FlagVar::ELIMINATED);
self.set_activity(vi, 0.0);
self.remove_from_heap(vi);
// self.remove_from_heap(vi);
VarActivityManager::remove_from_heap(vi);
debug_assert_eq!(self.decision_level(), self.root_level);
self.trail.retain(|l| l.vi() != vi);
self.num_eliminated_vars += 1;
Expand Down Expand Up @@ -457,6 +457,7 @@ mod tests {
..CNFDescription::default()
};
VarRef::initialize(4);
VarActivityManager::initialize();
let mut asg = AssignStack::instantiate(&config, &cnf);
// [] + 1 => [1]
assert!(asg.assign_at_root_level(lit(1)).is_ok());
Expand Down
19 changes: 12 additions & 7 deletions src/assign/trail_saving.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
/// implement boolean constraint propagation, backjump
/// This version can handle Chronological and Non Chronological Backtrack.
use {
super::{heap::VarHeapIF, AssignStack, PropagateIF},
crate::{cdb::ClauseDBIF, types::*, var_vector::*},
super::{AssignStack, PropagateIF},
crate::{cdb::ClauseDBIF, types::*, vam::VarActivityManager, var_vector::*},
};

#[cfg(feature = "chrono_BT")]
Expand Down Expand Up @@ -45,15 +45,17 @@ impl TrailSavingIF for AssignStack {
if activity_threshold <= VarRef(vi).activity()
/* self.var[vi].reward */
{
self.insert_heap(vi);
// self.insert_heap(vi);
VarActivityManager::insert_heap(vi);
}
}
free = lim2;
}
for i in free..self.trail.len() {
let vi = self.trail[i].vi();
self.reward_at_unassign(vi);
self.insert_heap(vi);
// self.insert_heap(vi);
VarActivityManager::insert_heap(vi);
}
}
fn reuse_saved_trail(&mut self, cdb: &impl ClauseDBIF) -> PropagationResult {
Expand Down Expand Up @@ -83,7 +85,8 @@ impl TrailSavingIF for AssignStack {
}
// reason refinement by ignoring this dependecy
(None, AssignReason::Implication(c)) if q < cdb[c].rank => {
self.insert_heap(vi);
// self.insert_heap(vi);
VarActivityManager::insert_heap(vi);
return self.truncate_trail_saved(i + 1);
}
(None, AssignReason::Implication(cid)) => {
Expand Down Expand Up @@ -116,7 +119,8 @@ impl TrailSavingIF for AssignStack {
}
(_, AssignReason::Decision(lvl)) => {
debug_assert_ne!(0, lvl);
self.insert_heap(vi);
// self.insert_heap(vi);
VarActivityManager::insert_heap(vi);
return self.truncate_trail_saved(i + 1);
}
_ => unreachable!("from_saved_trail"),
Expand All @@ -128,7 +132,8 @@ impl TrailSavingIF for AssignStack {
fn clear_saved_trail(&mut self) {
for j in 0..self.trail_saved.len() {
let l = self.trail_saved[j];
self.insert_heap(l.vi());
// self.insert_heap(l.vi());
VarActivityManager::insert_heap(l.vi());
}
self.trail_saved.clear();
}
Expand Down
2 changes: 2 additions & 0 deletions src/solver/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use {
assign::{AssignIF, AssignStack, PropagateIF},
cdb::{ClauseDB, ClauseDBIF},
types::*,
vam::*,
var_vector::*,
},
};
Expand Down Expand Up @@ -119,6 +120,7 @@ impl Instantiate for Solver {
///```
fn instantiate(config: &Config, cnf: &CNFDescription) -> Solver {
VarRef::initialize(cnf.num_of_variables);
VarActivityManager::initialize();
Solver {
asg: AssignStack::instantiate(config, cnf),
cdb: ClauseDB::instantiate(config, cnf),
Expand Down
41 changes: 36 additions & 5 deletions src/vam.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
//! Variable Activity Manager with idempotent heap
#![allow(static_mut_refs)]
use {
crate::{assign::AssignStack, types::*, var_vector::*},
Expand Down Expand Up @@ -27,7 +28,7 @@ static mut VAR_HEAP: VarIdHeap = VarIdHeap {
impl VarActivityManager {
pub fn initialize() {
unsafe {
VAR_HEAP.clear();
VAR_HEAP = VarIdHeap::new(VarRef::num_vars());
}
}
pub fn set_activity_decay(decay: f64) {
Expand Down Expand Up @@ -55,19 +56,49 @@ impl VarActivityManager {
VarRef(vi).update_activity(VAM.decay, VAM.anti_decay);
}
}
pub fn add_var(vi: VarId) {

pub fn clear_heap() {
unsafe {
VAR_HEAP.clear_heap();
}
}
pub fn expand_heap() {
unsafe {
VAR_HEAP.expand_heap();
}
}
pub fn insert_heap(vi: VarId) {
unsafe {
VAR_HEAP.insert_heap(vi);
}
}
pub fn remove_var(vi: VarId) {
pub fn update_heap(vi: VarId) {
unsafe {
VAR_HEAP.remove_from_heap(vi);
VAR_HEAP.update_heap(vi);
}
}
pub fn pop_top_var(asg: &mut AssignStack) -> VarId {
pub fn get_heap_root(asg: &mut AssignStack) -> VarId {
unsafe { VAR_HEAP.get_heap_root(asg) }
}
pub fn remove_from_heap(vi: VarId) {
unsafe {
VAR_HEAP.remove_from_heap(vi);
}
}

// pub fn add_var(vi: VarId) {
// unsafe {
// VAR_HEAP.insert_heap(vi);
// }
// }
// pub fn remove_var(vi: VarId) {
// unsafe {
// VAR_HEAP.remove_from_heap(vi);
// }
// }
// pub fn pop_top_var(asg: &mut AssignStack) -> VarId {
// unsafe { VAR_HEAP.get_heap_root(asg) }
// }
pub fn increment_tick() {
unsafe {
VAM.tick += 1;
Expand Down

0 comments on commit def81d7

Please sign in to comment.