use crate::{
db::{atom::AtomDB, keys::ClauseKey},
structures::{
clause::{CClause, Clause},
literal::CLiteral,
valuation::vValuation,
},
};
use std::{
collections::HashSet,
hash::{Hash, Hasher},
ops::Deref,
};
#[doc(hidden)]
mod subsumption;
#[doc(hidden)]
mod watches;
#[allow(non_camel_case_types)]
#[derive(Clone)]
pub struct dbClause {
key: ClauseKey,
clause: CClause,
active: bool,
watch_ptr: usize,
premises: HashSet<ClauseKey>,
inferences: usize,
}
impl dbClause {
pub fn new_unit(key: ClauseKey, literal: CLiteral, premises: HashSet<ClauseKey>) -> Self {
Self {
key,
clause: vec![literal],
active: true,
watch_ptr: 0,
premises,
inferences: 0,
}
}
pub fn new_nonunit(
key: ClauseKey,
clause: CClause,
atom_db: &mut AtomDB,
valuation: Option<&vValuation>,
premises: HashSet<ClauseKey>,
) -> Self {
let mut db_clause = dbClause {
key,
clause,
active: true,
watch_ptr: 0,
premises,
inferences: 0,
};
db_clause.initialise_watches(atom_db, valuation);
db_clause
}
pub const fn key(&self) -> &ClauseKey {
&self.key
}
pub fn is_active(&self) -> bool {
self.active
}
pub fn activate(&mut self) {
self.active = true
}
pub fn deactivate(&mut self) {
self.active = false
}
pub fn clause(&self) -> &CClause {
&self.clause
}
pub fn premises(&self) -> &HashSet<ClauseKey> {
&self.premises
}
pub fn proof_occurrence_count(&self) -> usize {
self.inferences
}
pub fn increment_proof_count(&mut self) {
self.inferences += 1
}
pub fn decrement_proof_count(&mut self) {
self.inferences -= 1
}
}
impl std::fmt::Display for dbClause {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{}", self.clause.as_dimacs(false))
}
}
impl Deref for dbClause {
type Target = [CLiteral];
fn deref(&self) -> &Self::Target {
&self.clause
}
}
impl PartialEq for dbClause {
fn eq(&self, other: &Self) -> bool {
self.key.eq(&other.key)
}
}
impl Eq for dbClause {}
impl Hash for dbClause {
fn hash<H: Hasher>(&self, state: &mut H) {
self.key.hash(state);
}
}