use crate::types::{Clause, Lit};
pub mod am1;
pub mod atomics;
pub mod card;
pub mod pb;
pub trait CollectClauses {
fn n_clauses(&self) -> usize;
fn extend_clauses<T>(&mut self, cl_iter: T) -> Result<(), crate::OutOfMemory>
where
T: IntoIterator<Item = Clause>;
fn add_clause(&mut self, cl: Clause) -> Result<(), crate::OutOfMemory> {
self.extend_clauses([cl])
}
}
#[derive(thiserror::Error, Debug, PartialEq, Eq, Clone, Copy)]
#[error("the encoding is not built for this operation")]
pub struct NotEncoded;
#[derive(thiserror::Error, Debug, PartialEq, Eq, Clone, Copy)]
pub enum EnforceError {
#[error("not encoded to enforce bound")]
NotEncoded,
#[error("encoding is unsat")]
Unsat,
}
impl From<NotEncoded> for EnforceError {
fn from(_: NotEncoded) -> Self {
EnforceError::NotEncoded
}
}
#[derive(thiserror::Error, Debug, PartialEq, Eq)]
pub enum ConstraintEncodingError {
#[error("constraint is unsat")]
Unsat,
#[error("out of memory error: {0}")]
OutOfMemory(#[from] crate::OutOfMemory),
}
pub trait Monotone {}
pub trait EncodeStats {
fn n_clauses(&self) -> usize;
fn n_vars(&self) -> u32;
}
#[path = "encodings/nodedb.rs"]
mod nodedbimpl;
#[cfg_attr(feature = "_internals", visibility::make(pub))]
#[cfg_attr(docsrs, doc(cfg(feature = "_internals")))]
mod nodedb {
pub use super::nodedbimpl::{NodeById, NodeCon, NodeId, NodeLike};
}
#[path = "encodings/totdb.rs"]
mod totdbimpl;
#[cfg_attr(feature = "_internals", visibility::make(pub))]
#[cfg_attr(docsrs, doc(cfg(feature = "_internals")))]
mod totdb {
pub(crate) use super::totdbimpl::LitData;
pub use super::totdbimpl::{AssignIter, Db, GeneralNode, Node, Semantics, UnitNode};
#[cfg(feature = "proof-logging")]
pub use super::totdbimpl::cert;
}
pub trait IterInputs {
type Iter<'a>: Iterator<Item = Lit>
where
Self: 'a;
fn iter(&self) -> Self::Iter<'_>;
}
pub trait IterWeightedInputs {
type Iter<'a>: Iterator<Item = (Lit, usize)>
where
Self: 'a;
fn iter(&self) -> Self::Iter<'_>;
}
#[cfg(feature = "proof-logging")]
pub mod cert {
use crate::types::Clause;
pub trait CollectClauses: super::CollectClauses {
fn extend_cert_clauses<T>(&mut self, cl_iter: T) -> Result<(), crate::OutOfMemory>
where
T: IntoIterator<Item = (Clause, pigeons::AbsConstraintId)>,
{
self.extend_clauses(cl_iter.into_iter().map(|(cl, _)| cl))
}
fn add_cert_clause(
&mut self,
cl: Clause,
id: pigeons::AbsConstraintId,
) -> Result<(), crate::OutOfMemory> {
self.extend_cert_clauses([(cl, id)])
}
}
#[derive(thiserror::Error, Debug)]
pub enum EncodingError {
#[error("out of memory error: {0}")]
OutOfMemory(#[from] crate::OutOfMemory),
#[error("writing the proof failed: {0}")]
Proof(#[from] std::io::Error),
}
#[derive(thiserror::Error, Debug)]
pub enum ConstraintEncodingError {
#[error("constraint is unsat")]
Unsat,
#[error("out of memory error: {0}")]
OutOfMemory(#[from] crate::OutOfMemory),
#[error("writing the proof failed: {0}")]
Proof(#[from] std::io::Error),
}
impl From<EncodingError> for ConstraintEncodingError {
fn from(value: EncodingError) -> Self {
match value {
EncodingError::OutOfMemory(error) => error.into(),
EncodingError::Proof(error) => error.into(),
}
}
}
}