use crate::{
db::{
atom::AtomDB,
clause::{db_clause::dbClause, ClauseDB},
keys::ClauseKey,
},
dispatch::{
library::delta::{self, Delta},
Dispatch,
},
misc::log::targets::{self},
structures::literal::Literal,
types::err::{self},
};
impl ClauseDB {
pub fn transfer_to_binary(
&mut self,
key: ClauseKey,
atoms: &mut AtomDB,
) -> Result<ClauseKey, err::ClauseDB> {
match key {
ClauseKey::Unit(_) => {
log::error!(target: targets::TRANSFER, "Attempt to transfer unit");
Err(err::ClauseDB::TransferUnit)
}
ClauseKey::Binary(_) => {
log::error!(target: targets::TRANSFER, "Attempt to transfer binary");
Err(err::ClauseDB::TransferBinary)
}
ClauseKey::Original(_) | ClauseKey::Addition(_, _) => {
let the_clause = self.get_mut(&key)?;
the_clause.deactivate();
let copied_clause = the_clause.to_vec();
if copied_clause.len() != 2 {
log::error!(target: targets::TRANSFER, "Attempt to transfer binary");
return Err(err::ClauseDB::TransferBinary);
}
let binary_key = self.fresh_binary_key()?;
unsafe {
let zero = copied_clause.get_unchecked(0);
atoms.unwatch_unchecked(zero.atom(), zero.polarity(), &key)?;
let one = copied_clause.get_unchecked(1);
atoms.unwatch_unchecked(one.atom(), one.polarity(), &key)?;
}
if let Some(dispatch) = &self.dispatcher {
let delta = delta::ClauseDB::ClauseStart;
dispatch(Dispatch::Delta(Delta::ClauseDB(delta)));
for literal in &copied_clause {
let delta = delta::ClauseDB::ClauseLiteral(*literal);
dispatch(Dispatch::Delta(Delta::ClauseDB(delta)));
}
let delta = delta::ClauseDB::Transfer(key, binary_key);
dispatch(Dispatch::Delta(Delta::ClauseDB(delta)));
}
let binary_clause = dbClause::from(binary_key, copied_clause, atoms);
self.binary.push(binary_clause);
if matches!(key, ClauseKey::Addition(_, _)) {
self.remove_addition(key.index())?;
}
Ok(binary_key)
}
}
}
}