CBC dependency for LPs (#8)

This commit is contained in:
Alex Ozdemir
2021-08-04 14:03:26 -07:00
committed by GitHub
parent d7dfe956e1
commit 39c9c6ae00
5 changed files with 131 additions and 1 deletions

View File

@@ -21,7 +21,7 @@ jobs:
run: sudo apt-get update; sudo apt-get install zsh cvc4
- name: install dependencies
if: runner.os == 'Linux'
run: sudo apt-get install libboost-all-dev libssl-dev
run: sudo apt-get install libboost-all-dev libssl-dev coinor-cbc coinor-libcbc-dev
- uses: actions-rs/toolchain@v1
with:
profile: minimal

77
Cargo.lock generated
View File

@@ -214,10 +214,12 @@ dependencies = [
"fnv",
"funty",
"gmp-mpfr-sys",
"good_lp",
"hashconsing",
"ieee754",
"lazy_static",
"log",
"lp-solvers",
"quickcheck",
"quickcheck_macros",
"rand",
@@ -245,6 +247,22 @@ dependencies = [
"vec_map",
]
[[package]]
name = "coin_cbc"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97ab09f19676fd0768a387778bf3c18c795e6122ac4fadf50e67af25dbe60e8a"
dependencies = [
"coin_cbc_sys",
"lazy_static",
]
[[package]]
name = "coin_cbc_sys"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4902c2c164ed74da85aa8472c4a754de1d8164c1fd16d672ec0faf22da482fa9"
[[package]]
name = "constant_time_eq"
version = "0.1.5"
@@ -474,6 +492,17 @@ dependencies = [
"winapi",
]
[[package]]
name = "good_lp"
version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bfe80a29a2ebb9c2b0a11e0063b5ad3dcbbbb0669070ebdb3e0218a1747bf672"
dependencies = [
"coin_cbc",
"fnv",
"lp-solvers",
]
[[package]]
name = "group"
version = "0.9.0"
@@ -555,6 +584,16 @@ dependencies = [
"cfg-if 1.0.0",
]
[[package]]
name = "lp-solvers"
version = "0.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3a43e6a93981a893fbc122219a762361aa9608e6b2697814b75b3db5486a5d00"
dependencies = [
"tempfile",
"xml-rs",
]
[[package]]
name = "maplit"
version = "1.0.2"
@@ -820,6 +859,15 @@ dependencies = [
"rand_core",
]
[[package]]
name = "redox_syscall"
version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee"
dependencies = [
"bitflags",
]
[[package]]
name = "regex"
version = "1.4.3"
@@ -838,6 +886,15 @@ version = "0.6.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5eb417147ba9860a96cfe72a0b93bf88fee1744b5636ec99ab20c1aa9376581"
[[package]]
name = "remove_dir_all"
version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
dependencies = [
"winapi",
]
[[package]]
name = "rsmt2"
version = "0.12.0"
@@ -967,6 +1024,20 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
[[package]]
name = "tempfile"
version = "3.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22"
dependencies = [
"cfg-if 1.0.0",
"libc",
"rand",
"redox_syscall",
"remove_dir_all",
"winapi",
]
[[package]]
name = "termcolor"
version = "1.1.2"
@@ -1117,6 +1188,12 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214"
[[package]]
name = "xml-rs"
version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3"
[[package]]
name = "zokrates_parser"
version = "0.1.6"

View File

@@ -26,6 +26,8 @@ bellman = "0.9"
ff = "0.9"
funty = "=1.1"
ahash = "0.7"
good_lp = { version = "1.1", features = ["lp-solvers", "coin_cbc"], default-features = false }
lp-solvers = "0.0.4"
[dev-dependencies]
quickcheck = "1"

50
src/target/milp/mod.rs Normal file
View File

@@ -0,0 +1,50 @@
//! Mixed ILP backend
#[cfg(test)]
mod test {
use good_lp::{ProblemVariables, Solution, SolverModel, default_solver, variable, solvers::lp_solvers::SolverTrait};
#[test]
fn simple() {
let mut vars = ProblemVariables::new();
let a = vars.add(variable().name("a").binary());
let b = vars.add(variable().name("b").integer().max(10));
let c = vars.add(variable().name("c").max(10));
let solution =
vars
.maximise(a + b + c)
.using(default_solver)
.with(a + b << 30.0)
.solve().unwrap();
assert_eq!(solution.value(a), 1.0);
assert_eq!(solution.value(b), 10.0);
assert_eq!(solution.value(c), 10.0);
}
fn test_solver<S: SolverTrait + Clone>(s: S) {
let mut vars = ProblemVariables::new();
let a = vars.add(variable().name("a").binary());
let b = vars.add(variable().name("b").integer().max(10));
let c = vars.add(variable().name("c").max(10));
let solution =
vars
.maximise(a + b + c)
.using(good_lp::solvers::lp_solvers::LpSolver(s))
.with(a + b << 30.0)
.solve().unwrap();
assert_eq!(solution.value(a), 1.0);
assert_eq!(solution.value(b), 10.0);
assert_eq!(solution.value(c), 10.0);
}
#[test]
#[ignore]
fn test_cbc() {
test_solver(good_lp::solvers::lp_solvers::CbcSolver::new());
}
#[test]
#[ignore]
fn test_glpk() {
test_solver(good_lp::solvers::lp_solvers::GlpkSolver::new());
}
}

View File

@@ -3,3 +3,4 @@
pub mod aby;
pub mod r1cs;
pub mod smt;
pub mod milp;