A Constraint Satisfaction Problem (CSP) solver library written in Rust.
This library provides efficient algorithms and data structures for solving constraint satisfaction problems. CSPs are mathematical problems defined as a set of objects whose state must satisfy a number of constraints or limitations.
Variable Types: int
, float
, mixed constraints
Constraint Categories:
-
Mathematical:
+
,-
,*
,/
,%
,abs()
,min()
,max()
,sum()
-
Comparison:
==
,!=
,<
,<=
,>
,>=
(natural syntax) -
Boolean Logic:
and()
,or()
,not()
with clean function syntax -
Global:
alldiff()
Add this to your Cargo.toml
:
[dependencies]
cspsolver = "0.5.2"
cargo run --example sudoku
cargo run --example pc_builder
cargo run --example resource_allocation
cargo run --example portfolio_optimization
๐งฉ Solving PLATINUM puzzle:
๐ Puzzle stats: 17 clues given, 64 empty cells
Puzzle: Solution:
โโโโโโโโโฌโโโโโโโโฌโโโโโโโโ โโโโโโโโโฌโโโโโโโโฌโโโโโโโโ
โ ยท ยท ยท โ ยท ยท ยท โ ยท ยท ยท โ โ 9 8 7 โ 6 5 4 โ 3 2 1 โ
โ ยท ยท ยท โ ยท ยท 3 โ ยท 8 5 โ โ 2 4 6 โ 1 7 3 โ 9 8 5 โ
โ ยท ยท 1 โ ยท 2 ยท โ ยท ยท ยท โ โ 3 5 1 โ 9 2 8 โ 7 4 6 โ
โโโโโโโโโผโโโโโโโโผโโโโโโโโค โโโโโโโโโผโโโโโโโโผโโโโโโโโค
โ ยท ยท ยท โ 5 ยท 7 โ ยท ยท ยท โ โ 1 2 8 โ 5 3 7 โ 6 9 4 โ
โ ยท ยท 4 โ ยท ยท ยท โ 1 ยท ยท โ โ 6 3 4 โ 8 9 2 โ 1 5 7 โ
โ ยท 9 ยท โ ยท ยท ยท โ ยท ยท ยท โ โ 7 9 5 โ 4 6 1 โ 8 3 2 โ
โโโโโโโโโผโโโโโโโโผโโโโโโโโค โโโโโโโโโผโโโโโโโโผโโโโโโโโค
โ 5 ยท ยท โ ยท ยท ยท โ ยท 7 3 โ โ 5 1 9 โ 2 8 6 โ 4 7 3 โ
โ ยท ยท 2 โ ยท 1 ยท โ ยท ยท ยท โ โ 4 7 2 โ 3 1 9 โ 5 6 8 โ
โ ยท ยท ยท โ ยท 4 ยท โ ยท ยท 9 โ โ 8 6 3 โ 7 4 5 โ 2 1 9 โ
โโโโโโโโโดโโโโโโโโดโโโโโโโโ โโโโโโโโโดโโโโโโโโดโโโโโโโโ
โ
Solution found in 144330.511ms!
๐ Statistics: 638 propagations, 54 nodes explored
๐ Efficiency: 11.8 propagations/node
use cspsolver::prelude::*;
fn main() {
let mut m = Model::default();
// Create variables with clean syntax
let x = m.int(1, 10); // Integer variable
let y = m.int(5, 15); // Integer variable
let z = m.float(0.0, 20.0); // Float variable
// Mathematical constraints using post! macro
post!(m, x < y); // Comparison
post!(m, x + y >= int(10)); // Arithmetic
post!(m, abs(z) <= float(15.5)); // Math functions
// Enhanced constraint features
post!(m, sum([x, y]) == int(12)); // Sum function
post!(m, and(x > int(3), y < int(12))); // Boolean logic
post!(m, x % int(3) != int(0)); // Modulo operations
// Global constraints
post!(m, alldiff([x, y])); // All different
if let Some(solution) = m.solve() {
println!("x = {:?}", solution[x]);
println!("y = {:?}", solution[y]);
println!("z = {:?}", solution[z]);
}
}
use cspsolver::prelude::*;
fn main() {
let mut m = Model::default();
let vars = vec![m.int(1, 5), m.int(1, 5), m.int(1, 5)];
// Complex mathematical expressions
post!(m, sum(vars.clone()) <= int(12));
post!(m, max([vars[0]]) >= min([vars[1]]));
// Boolean logic with traditional syntax
let a = m.bool();
let b = m.bool();
post!(m, and(a, b)); // Boolean AND
post!(m, or(a, not(b))); // Boolean OR with NOT
// Mixed type constraints
let float_var = m.float(1.0, 10.0);
post!(m, abs(float_var) + vars[0] <= float(15.0));
if let Some(solution) = m.solve() {
println!("Solution found!");
}
}
The library is currently in active development. Features and APIs may change as we refine the implementation and add new functionality.
This project is licensed under the MIT License - see the LICENSE file for details.