pub mod atom;
pub mod clause;
pub mod consequence_q;
mod keys;
pub use keys::*;
pub mod literal;
use std::borrow::Borrow;
use crate::{
context::GenericContext,
dispatch::{
library::delta::{self, Delta},
Dispatch,
},
structures::{
clause::{Clause, Source as ClauseSource},
literal::{abLiteral, Source as LiteralSource},
},
types::err,
};
pub type LevelIndex = u32;
#[allow(non_camel_case_types)]
#[derive(PartialEq, Eq)]
pub enum dbStatus {
Consistent,
Inconsistent,
Unknown,
}
impl std::fmt::Display for dbStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
dbStatus::Consistent => write!(f, "Consistent"),
Self::Inconsistent => write!(f, "Inconsistent"),
Self::Unknown => write!(f, "Unknown"),
}
}
}
impl<R: rand::Rng + std::default::Default> GenericContext<R> {
pub fn record_literal(&mut self, literal: impl Borrow<abLiteral>, source: LiteralSource) {
match source {
LiteralSource::PureLiteral => {
match self.literal_db.decision_count() {
0 => {
self.record_clause(*literal.borrow(), ClauseSource::PureLiteral);
}
_ => {
panic!("!")
}
}
}
LiteralSource::BCP(_) => {
match self.literal_db.decision_count() {
0 => {
self.record_clause(*literal.borrow(), ClauseSource::BCP);
}
_ => unsafe {
self.literal_db
.top_mut_unchecked()
.record_consequence(literal, source)
},
}
}
}
}
pub fn record_clause(
&mut self,
clause: impl Clause,
source: ClauseSource,
) -> Result<ClauseKey, err::ClauseDB> {
let key = self.clause_db.store(clause, source, &mut self.atom_db)?;
if let Some(dispatcher) = &self.dispatcher {
match key {
ClauseKey::Unit(literal) => match source {
ClauseSource::PureLiteral => {
}
ClauseSource::BCP => {
let delta = delta::ClauseDB::BCP(ClauseKey::Unit(literal));
dispatcher(Dispatch::Delta(delta::Delta::ClauseDB(delta)));
}
ClauseSource::Resolution => {
let delta = delta::ClauseDB::Added(key);
dispatcher(Dispatch::Delta(delta::Delta::ClauseDB(delta)));
}
ClauseSource::Original => {
let delta = delta::ClauseDB::Original(key);
dispatcher(Dispatch::Delta(delta::Delta::ClauseDB(delta)));
}
},
_ => {
let db_clause = unsafe { self.clause_db.get_unchecked(&key)? };
match db_clause.size() {
0 | 1 => panic!("!"),
_ => {
let delta = delta::ClauseDB::ClauseStart;
dispatcher(Dispatch::Delta(Delta::ClauseDB(delta)));
for literal in db_clause.literals() {
let delta = delta::ClauseDB::ClauseLiteral(*literal);
dispatcher(Dispatch::Delta(Delta::ClauseDB(delta)));
}
let delta = {
match source {
ClauseSource::BCP | ClauseSource::PureLiteral => panic!("!"),
ClauseSource::Original => delta::ClauseDB::Original(key),
ClauseSource::Resolution => delta::ClauseDB::Added(key),
}
};
dispatcher(Dispatch::Delta(Delta::ClauseDB(delta)));
}
}
}
}
}
Ok(key)
}
}