use std::cell::Cell;
use std::collections::VecDeque;
use std::ops::{Deref, DerefMut};
+use std::sync::Arc;
pub type BranchHits = IndexMap<usize, BitVec, FxBuildHasher>; // key: var_num, value: branch arm occurrences.
pub deep_safety: BitSet<usize>,
pub num_branches: usize,
pub current_branch_idx: usize,
- pub current_branch_num: BranchNumber,
+ pub current_branch_num: Arc<BranchNumber>,
pub subsumed_hits: SubsumedBranchHits,
}
impl BranchOccurrences {
- fn new(current_branch_num: BranchNumber, num_branches: usize) -> Self {
+ fn new(current_branch_num: Arc<BranchNumber>, num_branches: usize) -> Self {
Self {
hits: BranchHits::with_hasher(FxBuildHasher::default()),
shallow_safety: BitSet::default(),
}
}
- pub(crate) fn add_branch_stack(&mut self, branch_num: BranchNumber, num_branches: usize) {
+ pub(crate) fn add_branch_stack(&mut self, branch_num: Arc<BranchNumber>, num_branches: usize) {
self.push(BranchOccurrences::new(branch_num, num_branches));
}
}
#[inline]
- pub(crate) fn incr_current_branch(&mut self, branch_num: BranchNumber) {
+ pub(crate) fn incr_current_branch(&mut self, branch_num: Arc<BranchNumber>) {
let branch_occurrences = self.last_mut().unwrap();
branch_occurrences.current_branch_idx += 1;
branch_occurrences.current_branch_num = branch_num;
},
);
- let branch_designator = self.branch_stack.current_branch_designator();
+ let branch_designator = Arc::new(self.branch_stack.current_branch_designator());
let (deep_safety, shallow_safety) = match self.branch_stack.last_mut() {
Some(latest_branch) => {
}
pub(crate) fn mark_safe_var_unconditionally(&mut self, var_num: usize) {
- let branch_designator = self.branch_stack.current_branch_designator();
+ let branch_designator = Arc::new(self.branch_stack.current_branch_designator());
match &mut self.var_data.records[var_num].allocation {
VarAlloc::Perm(
}
fn mark_safe_var(&mut self, var_num: usize, lvl: Level, term_loc: GenContext) {
- let branch_designator = self.branch_stack.current_branch_designator();
+ let branch_designator = Arc::new(self.branch_stack.current_branch_designator());
match &mut self.var_data.records[var_num].allocation {
VarAlloc::Perm(
r: RegType,
arg_c: usize,
) -> Instruction {
- let branch_designator = self.branch_stack.current_branch_designator();
+ let branch_designator = Arc::new(self.branch_stack.current_branch_designator());
match &mut self.var_data.records[var_num].allocation {
VarAlloc::Perm(
var_num: usize,
r: RegType,
) -> Instruction {
- let branch_designator = self.branch_stack.current_branch_designator();
+ let branch_designator = Arc::new(self.branch_stack.current_branch_designator());
match &mut self.var_data.records[var_num].allocation {
VarAlloc::Perm(
use std::collections::VecDeque;
use std::hash::Hash;
use std::ops::{Deref, DerefMut};
+use std::sync::Arc;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct VarInfo {
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct BranchInfo {
- branch_num: BranchNumber,
+ branch_num: Arc<BranchNumber>,
chunks: Vec<ChunkInfo>,
}
impl BranchInfo {
- fn new(branch_num: BranchNumber) -> Self {
+ fn new(branch_num: Arc<BranchNumber>) -> Self {
Self {
branch_num,
chunks: vec![],
}
}
-type RootSet = IndexSet<BranchNumber>;
+type RootSet = IndexSet<Arc<BranchNumber>>;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ClassifyInfo {
Term(Term),
OverrideGlobalCutVar(usize),
ResetGlobalCutVarOverride(Option<usize>),
- AddBranchNum(BranchNumber), // set current_branch_num, add it to the root set
- RepBranchNum(BranchNumber), // replace current_branch_num and the latest in the root set
+ AddBranchNum(Arc<BranchNumber>), // set current_branch_num, add it to the root set
+ RepBranchNum(Arc<BranchNumber>), // replace current_branch_num and the latest in the root set
}
#[derive(Debug)]
pub struct VariableClassifier {
call_policy: CallPolicy,
- current_branch_num: BranchNumber,
+ current_branch_num: Arc<BranchNumber>,
current_chunk_num: usize,
current_chunk_type: ChunkType,
branch_map: BranchMap,
pub type ClassifyRuleResult = (Term, ChunkedTermVec, VarData);
fn merge_branch_seq(branches: impl Iterator<Item = BranchInfo>) -> BranchInfo {
- let mut branch_info = BranchInfo::new(BranchNumber::default());
+ let mut branch_info = BranchInfo::new(Arc::new(BranchNumber::default()));
for mut branch in branches {
branch_info.branch_num = branch.branch_num;
branch_info.chunks.append(&mut branch.chunks);
}
- branch_info.branch_num.delta = branch_info.branch_num.delta * Integer::from(2);
- branch_info.branch_num.branch_num -= &branch_info.branch_num.delta;
+ let new_delta = branch_info.branch_num.delta.clone() * Integer::from(2);
+
+ branch_info.branch_num = Arc::new(BranchNumber {
+ branch_num: branch_info.branch_num.branch_num.clone() - &new_delta,
+ delta: new_delta,
+ });
branch_info
}
fn flatten_into_disjunct(
build_stack: &mut ChunkedTermVec,
- branch_num: BranchNumber,
+ branch_num: Arc<BranchNumber>,
preceding_len: usize,
) {
let branch_vec = build_stack.drain(preceding_len + 1..).collect();
pub fn new(call_policy: CallPolicy) -> Self {
Self {
call_policy,
- current_branch_num: BranchNumber::default(),
+ current_branch_num: Arc::new(BranchNumber::default()),
current_chunk_num: 0,
current_chunk_type: ChunkType::Head,
branch_map: BranchMap(BranchMapInt::new()),
let tail = terms.pop().unwrap();
let head = terms.pop().unwrap();
- let first_branch_num = self.current_branch_num.split();
+ let first_branch_num = Arc::new(self.current_branch_num.split());
let branches: Vec<_> = std::iter::once(head)
.chain(unfold_by_str(tail, atom!(";")).into_iter())
.collect();
let succ_branch_number = branch_numbers[idx - 1].incr_by_delta();
branch_numbers.push(if idx + 1 < branches.len() {
- succ_branch_number.split()
+ Arc::new(succ_branch_number.split())
} else {
- succ_branch_number
+ Arc::new(succ_branch_number)
});
}
let build_stack_len = build_stack.len();
build_stack.reserve_branch(branches.len());
- state_stack.push(TraversalState::RepBranchNum(
+ state_stack.push(TraversalState::RepBranchNum(Arc::new(
self.current_branch_num.halve_delta(),
- ));
+ )));
let iter = branches.into_iter().zip(branch_numbers.into_iter());
let final_disjunct_loc = state_stack.len();
let not_term = terms.pop().unwrap();
let build_stack_len = build_stack.len();
- let first_branch_num = self.current_branch_num.split();
- let second_branch_num = first_branch_num.incr_by_delta();
+ let first_branch_num = Arc::new(self.current_branch_num.split());
+ let second_branch_num = Arc::new(first_branch_num.incr_by_delta());
build_stack.reserve_branch(2);
- state_stack.push(TraversalState::RepBranchNum(
+ state_stack.push(TraversalState::RepBranchNum(Arc::new(
self.current_branch_num.halve_delta(),
- ));
+ )));
state_stack.push(TraversalState::BuildFinalDisjunct(build_stack_len));
state_stack.push(TraversalState::Term(Term::Clause(
Cell::default(),