mod boolean;
mod initialization;
mod integer;
use std::{marker::PhantomData, ops::Not};
pub use crate::actions::{
boolean::{
BoolInspectionActions, BoolOperations, BoolPropagationActions, BoolSimplificationActions,
},
initialization::{BoolInitActions, BrancherInitActions, InitActions, IntInitActions},
integer::{
IntDecisionActions, IntEvent, IntExplanationActions, IntInspectionActions, IntOperations,
IntPropCond, IntPropagationActions, IntSimplificationActions,
},
};
use crate::{
constraints::{BoxedPropagator, Constraint, DeferredReason, ReasonBuilder},
helpers::bytes::Bytes,
};
pub trait ConstructionActions {
fn new_trailed<T: Bytes>(&mut self, init: T) -> Trailed<T>;
}
pub trait DecisionActions: TrailingActions {
fn num_conflicts(&self) -> u64;
}
pub trait PostingActions: ConstructionActions + ReasoningContext {
fn add_clause(
&mut self,
clause: impl IntoIterator<Item = Self::Atom>,
) -> Result<(), Self::Conflict>;
fn add_propagator(&mut self, propagator: BoxedPropagator);
}
pub trait PropagationActions: DecisionActions + ReasoningContext {
fn declare_conflict(&mut self, reason: impl ReasonBuilder<Self>) -> Self::Conflict;
fn deferred_reason(&self, data: u64) -> DeferredReason;
}
pub trait ReasoningContext {
type Atom: BoolOperations + Not<Output = Self::Atom>;
type Conflict;
}
pub trait ReasoningEngine {
type Atom: BoolOperations + Not<Output = Self::Atom>;
type Conflict;
type ExplanationContext<'a>: ReasoningContext<Atom = Self::Atom, Conflict = Self::Conflict>
+ TrailingActions;
type InitializationContext<'a>: ReasoningContext<Atom = Self::Atom, Conflict = Self::Conflict>
+ InitActions;
type NotificationContext<'a>: ReasoningContext<Atom = Self::Atom, Conflict = Self::Conflict>
+ TrailingActions;
type PropagationContext<'a>: ReasoningContext<Atom = Self::Atom, Conflict = Self::Conflict>
+ PropagationActions<Atom = Self::Atom, Conflict = Self::Conflict>;
}
pub trait SimplificationActions {
type Target: ReasoningEngine;
fn post_constraint<C: Constraint<Self::Target>>(&mut self, constraint: C);
}
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub struct Trailed<T: Bytes> {
pub(crate) index: u32,
pub(crate) ty: PhantomData<T>,
}
pub trait TrailingActions {
fn set_trailed<T: Bytes>(&mut self, i: Trailed<T>, v: T) -> T;
fn trailed<T: Bytes>(&self, i: Trailed<T>) -> T;
}