Satisfiability

Struct Satisfiability 

Source
pub struct Satisfiability<W = i32> { /* private fields */ }
Expand description

Boolean Satisfiability (SAT) problem in CNF form.

Given a Boolean formula in conjunctive normal form (CNF), determine if there exists an assignment that satisfies all clauses.

The problem can be weighted, where the goal is to maximize the total weight of satisfied clauses (MAX-SAT).

§Example

use problemreductions::models::satisfiability::{Satisfiability, CNFClause};
use problemreductions::{Problem, Solver, BruteForce};

// Formula: (x1 OR x2) AND (NOT x1 OR x3) AND (NOT x2 OR NOT x3)
let problem = Satisfiability::<i32>::new(
    3,
    vec![
        CNFClause::new(vec![1, 2]),      // x1 OR x2
        CNFClause::new(vec![-1, 3]),     // NOT x1 OR x3
        CNFClause::new(vec![-2, -3]),    // NOT x2 OR NOT x3
    ],
);

let solver = BruteForce::new();
let solutions = solver.find_best(&problem);

// Verify solutions satisfy all clauses
for sol in solutions {
    assert!(problem.solution_size(&sol).is_valid);
}

Implementations§

Source§

impl<W: Clone + Default> Satisfiability<W>

Source

pub fn new(num_vars: usize, clauses: Vec<CNFClause>) -> Self
where W: From<i32>,

Create a new SAT problem with unit weights.

Source

pub fn with_weights( num_vars: usize, clauses: Vec<CNFClause>, weights: Vec<W>, ) -> Self

Create a new weighted SAT problem (MAX-SAT).

Source

pub fn num_vars(&self) -> usize

Get the number of variables.

Source

pub fn num_clauses(&self) -> usize

Get the number of clauses.

Source

pub fn clauses(&self) -> &[CNFClause]

Get the clauses.

Source

pub fn get_clause(&self, index: usize) -> Option<&CNFClause>

Get a specific clause.

Source

pub fn count_satisfied(&self, assignment: &[bool]) -> usize

Count satisfied clauses for an assignment.

Source

pub fn is_satisfying(&self, assignment: &[bool]) -> bool

Check if an assignment satisfies all clauses.

Trait Implementations§

Source§

impl<W: Clone> Clone for Satisfiability<W>

Source§

fn clone(&self) -> Satisfiability<W>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<W> ConstraintSatisfactionProblem for Satisfiability<W>
where W: Clone + Default + PartialOrd + Num + Zero + AddAssign + 'static,

Source§

fn constraints(&self) -> Vec<LocalConstraint>

Returns the hard constraints that must be satisfied.
Source§

fn objectives(&self) -> Vec<LocalSolutionSize<Self::Size>>

Returns the local objectives that contribute to solution size.
Source§

fn weights(&self) -> Vec<Self::Size>

Returns the weights for the problem (e.g., vertex weights).
Source§

fn set_weights(&mut self, weights: Vec<Self::Size>)

Set new weights for the problem.
Source§

fn is_weighted(&self) -> bool

Returns whether the problem has non-uniform weights.
Source§

fn is_satisfied(&self, config: &[usize]) -> bool

Check if all constraints are satisfied by a configuration.
Source§

fn compute_objective(&self, config: &[usize]) -> Self::Size

Compute the total objective value from all local objectives.
Source§

impl<W: Debug> Debug for Satisfiability<W>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de, W> Deserialize<'de> for Satisfiability<W>
where W: Deserialize<'de>,

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl<W> Problem for Satisfiability<W>
where W: Clone + Default + PartialOrd + Num + Zero + AddAssign + 'static,

Source§

const NAME: &'static str = "Satisfiability"

Base name of this problem type (e.g., “IndependentSet”).
Source§

type GraphType = SimpleGraph

The graph type this problem operates on.
Source§

type Weight = W

The weight type for this problem.
Source§

type Size = W

The type used for objective/size values.
Source§

fn num_variables(&self) -> usize

Returns the number of variables in the problem.
Source§

fn num_flavors(&self) -> usize

Returns the number of possible values (flavors) for each variable. For binary problems, this is 2.
Source§

fn problem_size(&self) -> ProblemSize

Returns metadata about the problem size.
Source§

fn energy_mode(&self) -> EnergyMode

Returns whether larger or smaller objective values are better.
Source§

fn solution_size(&self, config: &[usize]) -> SolutionSize<Self::Size>

Evaluate the solution size for a given configuration. Read more
Source§

fn variables(&self) -> Range<usize>

Returns the range of variable indices.
Source§

fn flavors(&self) -> Vec<usize>

Returns the possible flavors as a vector.
Source§

fn is_valid_config(&self, config: &[usize]) -> bool

Check if a configuration is valid for this problem.
Source§

fn solution_size_multiple( &self, configs: &[Vec<usize>], ) -> Vec<SolutionSize<Self::Size>>

Evaluate multiple configurations at once (batch evaluation).
Source§

impl<W> ReduceTo<Coloring> for Satisfiability<W>
where W: Clone + Default + PartialOrd + Num + Zero + AddAssign + From<i32> + 'static,

Source§

type Result = ReductionSATToColoring<W>

The reduction result type.
Source§

fn reduce_to(&self) -> Self::Result

Reduce this problem to the target problem type.
Source§

impl<W> ReduceTo<DominatingSet<W>> for Satisfiability<W>
where W: Clone + Default + PartialOrd + Num + Zero + AddAssign + From<i32> + 'static,

Source§

type Result = ReductionSATToDS<W>

The reduction result type.
Source§

fn reduce_to(&self) -> Self::Result

Reduce this problem to the target problem type.
Source§

impl<W> ReduceTo<IndependentSet<W>> for Satisfiability<W>
where W: Clone + Default + PartialOrd + Num + Zero + AddAssign + From<i32> + 'static,

Source§

type Result = ReductionSATToIS<W>

The reduction result type.
Source§

fn reduce_to(&self) -> Self::Result

Reduce this problem to the target problem type.
Source§

impl<W> ReduceTo<KSatisfiability<3, W>> for Satisfiability<W>
where W: Clone + Default + PartialOrd + Num + Zero + AddAssign + From<i32> + 'static,

Source§

type Result = ReductionSATToKSAT<3, W>

The reduction result type.
Source§

fn reduce_to(&self) -> Self::Result

Reduce this problem to the target problem type.
Source§

impl<W> ReduceTo<KSatisfiability<4, W>> for Satisfiability<W>
where W: Clone + Default + PartialOrd + Num + Zero + AddAssign + From<i32> + 'static,

Source§

type Result = ReductionSATToKSAT<4, W>

The reduction result type.
Source§

fn reduce_to(&self) -> Self::Result

Reduce this problem to the target problem type.
Source§

impl<W> ReduceTo<KSatisfiability<5, W>> for Satisfiability<W>
where W: Clone + Default + PartialOrd + Num + Zero + AddAssign + From<i32> + 'static,

Source§

type Result = ReductionSATToKSAT<5, W>

The reduction result type.
Source§

fn reduce_to(&self) -> Self::Result

Reduce this problem to the target problem type.
Source§

impl<const K: usize, W> ReduceTo<Satisfiability<W>> for KSatisfiability<K, W>
where W: Clone + Default + PartialOrd + Num + Zero + AddAssign + From<i32> + 'static,

Source§

type Result = ReductionKSATToSAT<K, W>

The reduction result type.
Source§

fn reduce_to(&self) -> Self::Result

Reduce this problem to the target problem type.
Source§

impl<W> Serialize for Satisfiability<W>
where W: Serialize,

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

§

impl<W> Freeze for Satisfiability<W>

§

impl<W> RefUnwindSafe for Satisfiability<W>
where W: RefUnwindSafe,

§

impl<W> Send for Satisfiability<W>
where W: Send,

§

impl<W> Sync for Satisfiability<W>
where W: Sync,

§

impl<W> Unpin for Satisfiability<W>
where W: Unpin,

§

impl<W> UnwindSafe for Satisfiability<W>
where W: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> Pipe for T
where T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,