pub mod atom;
pub mod clause;
pub mod consequence_q;
mod keys;
pub use keys::*;
pub mod literal;
use std::{borrow::Borrow, collections::HashSet};
use crate::{
context::GenericContext,
structures::{
clause::ClauseSource,
consequence::{Consequence, Source as ConsequenceSource},
},
types::err::ErrorKind,
};
pub type LevelIndex = u32;
impl<R: rand::Rng + std::default::Default> GenericContext<R> {
pub fn record_consequence(
&mut self,
consequence: impl Borrow<Consequence>,
) -> Result<(), ErrorKind> {
let consequence = consequence.borrow().clone();
match consequence.source() {
ConsequenceSource::PureLiteral => {
let premises = HashSet::default();
if !self.literal_db.decision_is_made() && self.literal_db.decision_count() == 0 {
self.clause_db.store(
*consequence.literal(),
ClauseSource::PureUnit,
&mut self.atom_db,
None,
premises,
);
} else {
panic!("! Origins")
}
Ok(())
}
ConsequenceSource::BCP(key) => {
log::info!("BCP Consequence: {key}: {}", consequence.literal());
match self.literal_db.decision_count() {
0 => {
if self.literal_db.assumption_is_made()
&& !self.literal_db.decision_is_made()
{
unsafe { self.literal_db.store_top_consequence_unchecked(consequence) };
} else {
let unit_clause = *consequence.literal();
let mut premises = HashSet::default();
premises.insert(*key);
let direct_origin_clause =
unsafe { self.clause_db.get_unchecked_mut(&key) }?;
direct_origin_clause.increment_proof_count();
self.clause_db.note_use(*key);
self.clause_db.store(
unit_clause,
ClauseSource::BCP,
&mut self.atom_db,
None,
premises,
);
};
}
_ => unsafe {
self.literal_db.store_top_consequence_unchecked(consequence);
},
}
Ok(())
}
}
}
}