pub enum SolveProof {
Satisfying {
assignment: Vec<bool>,
checksum: u64,
},
Unsatisfiable {
checksum: u64,
},
Approximate {
assignment: Vec<bool>,
satisfied_clauses: u32,
total_clauses: u32,
iterations: u32,
},
None,
}Expand description
Proof artifact from a SAT/MaxSAT solver.
Proofs provide evidence of the solver’s conclusion. For satisfiable instances, this includes the satisfying assignment with a checksum for verification. For unsatisfiable instances, a proof of unsatisfiability is included.
§Variants
Satisfying: Contains a satisfying assignment with checksumUnsatisfiable: Proof that no satisfying assignment existsApproximate: Best-effort assignment that may not satisfy all clausesNone: No proof available (e.g., timeout before any result)
§Checksums
The checksum field uses FNV-1a hashing to enable lightweight verification that an assignment hasn’t been corrupted. This is particularly useful for:
- Verifying GPU-to-CPU transfers
- Detecting memory corruption
- Validating serialized/deserialized results
§Example
use xlog_solve::SolveProof;
// Create a satisfying proof with automatic checksum
let proof = SolveProof::satisfying(vec![true, false, true]);
assert!(proof.is_satisfying());
// Extract the assignment
if let Some(assignment) = proof.assignment() {
assert_eq!(assignment, &[true, false, true]);
}Variants§
Satisfying
The instance is satisfiable with the given assignment.
The checksum can be used to verify the assignment’s integrity.
Fields
Unsatisfiable
The instance is unsatisfiable.
The checksum can be used to verify the proof’s integrity (e.g., if the solver produces resolution proofs).
Approximate
An approximate solution from an incomplete solver.
This is typically produced by local search or heuristic solvers that may not find a complete satisfying assignment.
Fields
None
No proof available.
This occurs when the solver times out or is interrupted before producing any meaningful result.
Implementations§
Source§impl SolveProof
impl SolveProof
Sourcepub fn satisfying(assignment: Vec<bool>) -> Self
pub fn satisfying(assignment: Vec<bool>) -> Self
Sourcepub fn unsatisfiable() -> Self
pub fn unsatisfiable() -> Self
Creates an unsatisfiability proof.
The checksum is computed as a sentinel value for the empty proof.
§Example
use xlog_solve::SolveProof;
let proof = SolveProof::unsatisfiable();
assert!(!proof.is_satisfying());Sourcepub fn approximate(
assignment: Vec<bool>,
satisfied_clauses: u32,
total_clauses: u32,
iterations: u32,
) -> Self
pub fn approximate( assignment: Vec<bool>, satisfied_clauses: u32, total_clauses: u32, iterations: u32, ) -> Self
Creates an approximate solution proof.
This is typically used by incomplete solvers (like local search) that may not find a fully satisfying assignment.
§Arguments
assignment- The best assignment foundsatisfied_clauses- Number of clauses satisfiedtotal_clauses- Total number of clausesiterations- Number of solver iterations performed
§Example
use xlog_solve::SolveProof;
let proof = SolveProof::approximate(vec![true, false], 8, 10, 1000);
if let SolveProof::Approximate { satisfied_clauses, total_clauses, .. } = proof {
assert_eq!(satisfied_clauses, 8);
assert_eq!(total_clauses, 10);
}Sourcepub fn is_satisfying(&self) -> bool
pub fn is_satisfying(&self) -> bool
Returns true if this is a satisfying proof.
§Example
use xlog_solve::SolveProof;
assert!(SolveProof::satisfying(vec![true]).is_satisfying());
assert!(!SolveProof::unsatisfiable().is_satisfying());Sourcepub fn assignment(&self) -> Option<&[bool]>
pub fn assignment(&self) -> Option<&[bool]>
Returns the assignment if this proof contains one.
Returns Some for Satisfying and
Approximate variants, None otherwise.
§Example
use xlog_solve::SolveProof;
let proof = SolveProof::satisfying(vec![true, false]);
assert_eq!(proof.assignment(), Some(&[true, false][..]));
let unsat = SolveProof::unsatisfiable();
assert_eq!(unsat.assignment(), None);Sourcepub fn checksum(&self) -> Option<u64>
pub fn checksum(&self) -> Option<u64>
Returns the checksum if this proof has one.
§Example
use xlog_solve::SolveProof;
let proof = SolveProof::satisfying(vec![true]);
assert!(proof.checksum().is_some());Sourcepub fn verify_checksum(&self) -> Option<bool>
pub fn verify_checksum(&self) -> Option<bool>
Verifies the integrity of a satisfying assignment by recomputing its checksum.
Returns true if the checksum matches, false if corrupted.
Returns None for non-satisfying proofs.
§Example
use xlog_solve::SolveProof;
let proof = SolveProof::satisfying(vec![true, false]);
assert_eq!(proof.verify_checksum(), Some(true));Sourcepub fn satisfaction_ratio(&self) -> Option<f64>
pub fn satisfaction_ratio(&self) -> Option<f64>
Returns the satisfaction ratio for approximate proofs.
Returns Some(ratio) for Approximate where
ratio = satisfied_clauses / total_clauses. Returns None for other variants.
§Example
use xlog_solve::SolveProof;
let proof = SolveProof::approximate(vec![true], 8, 10, 100);
assert_eq!(proof.satisfaction_ratio(), Some(0.8));Trait Implementations§
Source§impl Clone for SolveProof
impl Clone for SolveProof
Source§fn clone(&self) -> SolveProof
fn clone(&self) -> SolveProof
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more