From b7091b584a5c41f951cded9b4187977552ededb2 Mon Sep 17 00:00:00 2001 From: Niklas Dewally Date: Wed, 15 Nov 2023 18:29:54 +0000 Subject: [PATCH 1/8] remove chuffed build files from git --- solvers/chuffed/libwrapper.a | Bin 22668 -> 0 bytes solvers/chuffed/wrapper.o | Bin 21096 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 solvers/chuffed/libwrapper.a delete mode 100644 solvers/chuffed/wrapper.o diff --git a/solvers/chuffed/libwrapper.a b/solvers/chuffed/libwrapper.a deleted file mode 100644 index 2b9638b4f30630f504e1715597b4e53d8defbe83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22668 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 OyAZZv;k01Z-+uw?coD<^ diff --git a/solvers/chuffed/wrapper.o b/solvers/chuffed/wrapper.o deleted file mode 100644 index 5a70149840133dd1f4937ffe06b94dd39881ccf7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21096 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 Date: Wed, 15 Nov 2023 18:31:18 +0000 Subject: [PATCH 2/8] conjure_oxide: depend on minion_rs --- Cargo.lock | 1 + conjure_oxide/Cargo.toml | 1 + 2 files changed, 2 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 8c76ff9ed7..5b4c30b546 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -116,6 +116,7 @@ name = "conjure_oxide" version = "0.0.1" dependencies = [ "json", + "minion_rs", ] [[package]] diff --git a/conjure_oxide/Cargo.toml b/conjure_oxide/Cargo.toml index 8921daee8d..f2cf96c2eb 100644 --- a/conjure_oxide/Cargo.toml +++ b/conjure_oxide/Cargo.toml @@ -5,3 +5,4 @@ edition = "2021" [dependencies] json = "0.12.4" +minion_rs = {path = "../solvers/minion" } From f1af68aa30f0c6f8d1b1017f11222bfd97fa1dce Mon Sep 17 00:00:00 2001 From: Niklas Dewally Date: Wed, 15 Nov 2023 18:45:45 +0000 Subject: [PATCH 3/8] conjure_oxide: add Model -> minion::Model translation template --- conjure_oxide/src/lib.rs | 1 + conjure_oxide/src/solvers/minion.rs | 11 +++++++++++ conjure_oxide/src/solvers/mod.rs | 1 + 3 files changed, 13 insertions(+) create mode 100644 conjure_oxide/src/solvers/minion.rs create mode 100644 conjure_oxide/src/solvers/mod.rs diff --git a/conjure_oxide/src/lib.rs b/conjure_oxide/src/lib.rs index 851c0bc27f..cec1c64245 100644 --- a/conjure_oxide/src/lib.rs +++ b/conjure_oxide/src/lib.rs @@ -1 +1,2 @@ pub mod ast; +mod solvers; diff --git a/conjure_oxide/src/solvers/minion.rs b/conjure_oxide/src/solvers/minion.rs new file mode 100644 index 0000000000..08072ccbee --- /dev/null +++ b/conjure_oxide/src/solvers/minion.rs @@ -0,0 +1,11 @@ +use crate::ast::Model as ConjureModel; +use minion_rs::ast::Model as MinionModel; + +impl TryFrom for MinionModel { + // TODO: set this to equal ConjureError once it is merged. + type Error = String; + + fn try_from(value: ConjureModel) -> Result { + todo!() + } +} diff --git a/conjure_oxide/src/solvers/mod.rs b/conjure_oxide/src/solvers/mod.rs new file mode 100644 index 0000000000..dad73cff9d --- /dev/null +++ b/conjure_oxide/src/solvers/mod.rs @@ -0,0 +1 @@ +pub mod minion; From ad8673e7e8827b93917a93dcbeccbc8456aa3e15 Mon Sep 17 00:00:00 2001 From: Niklas Dewally Date: Wed, 15 Nov 2023 19:50:49 +0000 Subject: [PATCH 4/8] conjure_oxide: add flat constraints for Minion --- conjure_oxide/src/ast.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/conjure_oxide/src/ast.rs b/conjure_oxide/src/ast.rs index 90f583f13d..63c6ec94c1 100644 --- a/conjure_oxide/src/ast.rs +++ b/conjure_oxide/src/ast.rs @@ -39,10 +39,15 @@ pub enum Range { } #[derive(Clone, Debug, PartialEq)] +#[non_exhaustive] pub enum Expression { ConstantInt(i32), Reference(Name), Sum(Vec), Eq(Box, Box), Geq(Box, Box), + + // Flattened Constraints + SumGeq(Vec, Box), + SumLeq(Vec, Box), } From 6a6f7078552c8ebb3822cc42436eb41bd5660eb6 Mon Sep 17 00:00:00 2001 From: Niklas Dewally Date: Wed, 15 Nov 2023 20:06:21 +0000 Subject: [PATCH 5/8] conjure_oxide: translation of SumGeq to minion::Model --- conjure_oxide/src/solvers/minion.rs | 105 ++++++++++++++++++++++++++-- 1 file changed, 101 insertions(+), 4 deletions(-) diff --git a/conjure_oxide/src/solvers/minion.rs b/conjure_oxide/src/solvers/minion.rs index 08072ccbee..e443256566 100644 --- a/conjure_oxide/src/solvers/minion.rs +++ b/conjure_oxide/src/solvers/minion.rs @@ -1,11 +1,108 @@ -use crate::ast::Model as ConjureModel; -use minion_rs::ast::Model as MinionModel; +//! Solver interface to minion_rs. + +use crate::ast::{Expression as ConjureExpression, Model as ConjureModel, Name as ConjureName}; +use minion_rs::ast::{Constraint as MinionConstraint, Model as MinionModel, Var as MinionVar}; impl TryFrom for MinionModel { // TODO: set this to equal ConjureError once it is merged. type Error = String; - fn try_from(value: ConjureModel) -> Result { - todo!() + fn try_from(conjure_model: ConjureModel) -> Result { + let mut minion_model = MinionModel::new(); + + // We assume (for now) that the conjure model is fully valid + // i.e. type checked and the variables referenced all exist. + parse_vars(&conjure_model, &mut minion_model)?; + parse_exprs(&conjure_model, &mut minion_model)?; + + Ok(minion_model) + } +} + +#[allow(unused_variables)] +fn parse_vars(conjure_model: &ConjureModel, minion_model: &MinionModel) -> Result<(), String> { + todo!(); +} + +fn parse_exprs(conjure_model: &ConjureModel, minion_model: &mut MinionModel) -> Result<(), String> { + for expr in conjure_model.constraints.iter() { + parse_expr(expr.to_owned(), minion_model)?; + } + Ok(()) +} + +fn parse_expr(expr: ConjureExpression, minion_model: &mut MinionModel) -> Result<(), String> { + match expr { + ConjureExpression::SumLeq(lhs, rhs) => parse_sumleq(lhs, *rhs, minion_model), + ConjureExpression::SumGeq(lhs, rhs) => parse_sumgeq(lhs, *rhs, minion_model), + x => Err(format!("Not supported: {:?}", x)), + } +} + +fn parse_sumleq( + sum_vars: Vec, + rhs: ConjureExpression, + minion_model: &mut MinionModel, +) -> Result<(), String> { + let minion_vars = must_be_vars(sum_vars)?; + let minion_rhs = must_be_var(rhs)?; + minion_model + .constraints + .push(MinionConstraint::SumLeq(minion_vars, minion_rhs)); + + Ok(()) +} + +fn parse_sumgeq( + sum_vars: Vec, + rhs: ConjureExpression, + minion_model: &mut MinionModel, +) -> Result<(), String> { + let minion_vars = must_be_vars(sum_vars)?; + let minion_rhs = must_be_var(rhs)?; + minion_model + .constraints + .push(MinionConstraint::SumGeq(minion_vars, minion_rhs)); + + Ok(()) +} + +fn must_be_vars(exprs: Vec) -> Result, String> { + let mut minion_vars: Vec = vec![]; + for expr in exprs { + let minion_var = must_be_var(expr)?; + minion_vars.push(minion_var); + } + Ok(minion_vars) +} + +fn must_be_var(e: ConjureExpression) -> Result { + // a minion var is either a reference or a "var as const" + match must_be_ref(e.clone()) { + Ok(name) => Ok(MinionVar::NameRef(name)), + Err(_) => match must_be_const(e) { + Ok(n) => Ok(MinionVar::ConstantAsVar(n)), + Err(x) => Err(x), + }, + } +} + +fn must_be_ref(e: ConjureExpression) -> Result { + let name = match e { + ConjureExpression::Reference(n) => Ok(n), + _ => Err(""), + }?; + + // always use names as strings in Minon. + match name { + ConjureName::UserName(x) => Ok(x), + ConjureName::MachineName(x) => Ok(x.to_string()), + } +} + +fn must_be_const(e: ConjureExpression) -> Result { + match e { + ConjureExpression::ConstantInt(n) => Ok(n), + _ => Err("".to_owned()), } } From 0dfaa7998c27fadc58742e35936059605067a147 Mon Sep 17 00:00:00 2001 From: Niklas Dewally Date: Sat, 18 Nov 2023 00:46:18 +0000 Subject: [PATCH 6/8] conjure_oxide: fix clippy lints --- Cargo.toml | 6 ++++++ conjure_oxide/Cargo.toml | 4 ++++ conjure_oxide/src/main.rs | 2 +- conjure_oxide/tests/model_tests.rs | 4 ++-- solvers/minion/Cargo.toml | 4 ++++ solvers/minion/build.rs | 2 +- 6 files changed, 18 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 399a556ecd..06366bacd3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,3 +5,9 @@ members = [ "solvers/minion", "solvers/chuffed" ] + +[workspace.lints.clippy] +unwrap_used = "warn" +expect_used = "warn" + + diff --git a/conjure_oxide/Cargo.toml b/conjure_oxide/Cargo.toml index f2cf96c2eb..1bb161df7a 100644 --- a/conjure_oxide/Cargo.toml +++ b/conjure_oxide/Cargo.toml @@ -6,3 +6,7 @@ edition = "2021" [dependencies] json = "0.12.4" minion_rs = {path = "../solvers/minion" } + +[lints] +workspace = true + diff --git a/conjure_oxide/src/main.rs b/conjure_oxide/src/main.rs index fe3c983155..4b843517e9 100644 --- a/conjure_oxide/src/main.rs +++ b/conjure_oxide/src/main.rs @@ -31,7 +31,7 @@ fn main() { }, ); - let mut m = Model { + let m = Model { variables, constraints: vec![ Expression::Eq( diff --git a/conjure_oxide/tests/model_tests.rs b/conjure_oxide/tests/model_tests.rs index edcf368904..0552362b9a 100644 --- a/conjure_oxide/tests/model_tests.rs +++ b/conjure_oxide/tests/model_tests.rs @@ -18,9 +18,9 @@ fn modify_domain() { constraints: Vec::new(), }; - assert!((*m.variables.get(&a).unwrap()).domain == d1); + assert!(m.variables.get(&a).unwrap().domain == d1); m.update_domain(&a, d2.clone()); - assert!((*m.variables.get(&a).unwrap()).domain == d2); + assert!(m.variables.get(&a).unwrap().domain == d2); } diff --git a/solvers/minion/Cargo.toml b/solvers/minion/Cargo.toml index f7ad037594..40a4b6dca0 100644 --- a/solvers/minion/Cargo.toml +++ b/solvers/minion/Cargo.toml @@ -13,3 +13,7 @@ cc = { version = "1.0.84", features = ["parallel"] } bindgen = "0.69.1" glob = "0.3.1" + +[lints] +workspace = true + diff --git a/solvers/minion/build.rs b/solvers/minion/build.rs index 0df3d58a09..3479b8bff3 100755 --- a/solvers/minion/build.rs +++ b/solvers/minion/build.rs @@ -2,7 +2,7 @@ // - https://github.com/gokberkkocak/rust_glucose/blob/master/build.rs // - https://rust-lang.github.io/rust-bindgen/non-system-libraries.html // - https://doc.rust-lang.org/cargo/reference/build-scripts.html#rerun-if-changed - +// use std::env; use std::path::PathBuf; use std::process::Command; From 5c5a36d851d334084f6ebe7766e792b98609c24f Mon Sep 17 00:00:00 2001 From: Niklas Dewally Date: Sat, 18 Nov 2023 16:13:18 +0000 Subject: [PATCH 7/8] conjure_oxide: translation of variables from Model to minion_rs::Model --- conjure_oxide/src/solvers/minion.rs | 78 +++++++++++++++++++++++++---- 1 file changed, 68 insertions(+), 10 deletions(-) diff --git a/conjure_oxide/src/solvers/minion.rs b/conjure_oxide/src/solvers/minion.rs index e443256566..d251c2ed0e 100644 --- a/conjure_oxide/src/solvers/minion.rs +++ b/conjure_oxide/src/solvers/minion.rs @@ -1,10 +1,16 @@ //! Solver interface to minion_rs. -use crate::ast::{Expression as ConjureExpression, Model as ConjureModel, Name as ConjureName}; -use minion_rs::ast::{Constraint as MinionConstraint, Model as MinionModel, Var as MinionVar}; +use crate::ast::{ + DecisionVariable, Domain as ConjureDomain, Expression as ConjureExpression, + Model as ConjureModel, Name as ConjureName, Range as ConjureRange, +}; +use minion_rs::ast::{ + Constraint as MinionConstraint, Model as MinionModel, Var as MinionVar, + VarDomain as MinionDomain, +}; impl TryFrom for MinionModel { - // TODO: set this to equal ConjureError once it is merged. + // TODO (nd60): set this to equal ConjureError once it is merged. type Error = String; fn try_from(conjure_model: ConjureModel) -> Result { @@ -19,9 +25,56 @@ impl TryFrom for MinionModel { } } -#[allow(unused_variables)] -fn parse_vars(conjure_model: &ConjureModel, minion_model: &MinionModel) -> Result<(), String> { - todo!(); +fn parse_vars(conjure_model: &ConjureModel, minion_model: &mut MinionModel) -> Result<(), String> { + // TODO (nd60): remove unused vars? + // TODO (nd60): ensure all vars references are used. + + for (name, variable) in conjure_model.variables.iter() { + parse_var(name, variable, minion_model)?; + } + Ok(()) +} + +fn parse_var( + name: &ConjureName, + variable: &DecisionVariable, + minion_model: &mut MinionModel, +) -> Result<(), String> { + let str_name = name_to_string(name.to_owned()); + + let ranges = match &variable.domain { + ConjureDomain::IntDomain(range) => Ok(range), + x => Err(format!("Not supported: {:?}", x)), + }?; + + // TODO (nd60): Currently, Minion only supports the use of one range in the domain. + // If there are multiple ranges, SparseBound should be used here instead. + // See: https://github.com/conjure-cp/conjure-oxide/issues/84 + + if ranges.len() != 1 { + return Err(format!( + "Variable {:?} has {:?} ranges. Multiple ranges / SparseBound is not yet supported.", + str_name, + ranges.len() + )); + } + + let range = ranges + .first() + .ok_or(format!("Variable {:?} has no range", str_name))?; + + let (low, high) = match range { + ConjureRange::Bounded(x, y) => Ok((x.to_owned(), y.to_owned())), + ConjureRange::Single(x) => Ok((x.to_owned(), x.to_owned())), + a => Err(format!("Not implemented {:?}", a)), + }?; + + minion_model + .named_variables + .add_var(str_name.to_owned(), MinionDomain::Bound(low, high)) + .ok_or(format!("Variable {:?} is defined twice", str_name))?; + + Ok(()) } fn parse_exprs(conjure_model: &ConjureModel, minion_model: &mut MinionModel) -> Result<(), String> { @@ -94,10 +147,8 @@ fn must_be_ref(e: ConjureExpression) -> Result { }?; // always use names as strings in Minon. - match name { - ConjureName::UserName(x) => Ok(x), - ConjureName::MachineName(x) => Ok(x.to_string()), - } + let str_name = name_to_string(name); + Ok(str_name) } fn must_be_const(e: ConjureExpression) -> Result { @@ -106,3 +157,10 @@ fn must_be_const(e: ConjureExpression) -> Result { _ => Err("".to_owned()), } } + +fn name_to_string(name: ConjureName) -> String { + match name { + ConjureName::UserName(x) => x, + ConjureName::MachineName(x) => x.to_string(), + } +} From 83bdfb82b722f31e40bb9a0ced4b123583c4bea3 Mon Sep 17 00:00:00 2001 From: Niklas Dewally Date: Sat, 18 Nov 2023 16:54:33 +0000 Subject: [PATCH 8/8] conjure_oxide: test Model -> minion::Model translation and add Ineq constraint --- conjure_oxide/src/ast.rs | 1 + conjure_oxide/src/solvers/minion.rs | 116 +++++++++++++++++++++++++++- 2 files changed, 114 insertions(+), 3 deletions(-) diff --git a/conjure_oxide/src/ast.rs b/conjure_oxide/src/ast.rs index 63c6ec94c1..c1eac5b616 100644 --- a/conjure_oxide/src/ast.rs +++ b/conjure_oxide/src/ast.rs @@ -50,4 +50,5 @@ pub enum Expression { // Flattened Constraints SumGeq(Vec, Box), SumLeq(Vec, Box), + Ineq(Box, Box, Box), } diff --git a/conjure_oxide/src/solvers/minion.rs b/conjure_oxide/src/solvers/minion.rs index d251c2ed0e..e7b9fb529a 100644 --- a/conjure_oxide/src/solvers/minion.rs +++ b/conjure_oxide/src/solvers/minion.rs @@ -5,8 +5,8 @@ use crate::ast::{ Model as ConjureModel, Name as ConjureName, Range as ConjureRange, }; use minion_rs::ast::{ - Constraint as MinionConstraint, Model as MinionModel, Var as MinionVar, - VarDomain as MinionDomain, + Constant as MinionConstant, Constraint as MinionConstraint, Model as MinionModel, + Var as MinionVar, VarDomain as MinionDomain, }; impl TryFrom for MinionModel { @@ -88,6 +88,7 @@ fn parse_expr(expr: ConjureExpression, minion_model: &mut MinionModel) -> Result match expr { ConjureExpression::SumLeq(lhs, rhs) => parse_sumleq(lhs, *rhs, minion_model), ConjureExpression::SumGeq(lhs, rhs) => parse_sumgeq(lhs, *rhs, minion_model), + ConjureExpression::Ineq(a, b, c) => parse_ineq(*a, *b, *c, minion_model), x => Err(format!("Not supported: {:?}", x)), } } @@ -120,6 +121,24 @@ fn parse_sumgeq( Ok(()) } +fn parse_ineq( + a: ConjureExpression, + b: ConjureExpression, + c: ConjureExpression, + minion_model: &mut MinionModel, +) -> Result<(), String> { + let a_minion = must_be_var(a)?; + let b_minion = must_be_var(b)?; + let c_value = must_be_const(c)?; + minion_model.constraints.push(MinionConstraint::Ineq( + a_minion, + b_minion, + MinionConstant::Integer(c_value), + )); + + Ok(()) +} + fn must_be_vars(exprs: Vec) -> Result, String> { let mut minion_vars: Vec = vec![]; for expr in exprs { @@ -146,7 +165,6 @@ fn must_be_ref(e: ConjureExpression) -> Result { _ => Err(""), }?; - // always use names as strings in Minon. let str_name = name_to_string(name); Ok(str_name) } @@ -164,3 +182,95 @@ fn name_to_string(name: ConjureName) -> String { ConjureName::MachineName(x) => x.to_string(), } } + +#[cfg(test)] +mod tests { + use std::collections::HashMap; + + use minion_rs::ast::VarName; + + use super::*; + + #[test] + fn flat_xyz_model() -> Result<(), String> { + // TODO: convert to use public interfaces when these exist. + let mut model = ConjureModel { + variables: HashMap::new(), + constraints: Vec::new(), + }; + + add_int_with_range(&mut model, "x", 1, 3)?; + add_int_with_range(&mut model, "y", 2, 4)?; + add_int_with_range(&mut model, "z", 1, 5)?; + + let x = ConjureExpression::Reference(ConjureName::UserName("x".to_owned())); + let y = ConjureExpression::Reference(ConjureName::UserName("y".to_owned())); + let z = ConjureExpression::Reference(ConjureName::UserName("z".to_owned())); + let four = ConjureExpression::ConstantInt(4); + + let geq = ConjureExpression::SumGeq( + vec![x.to_owned(), y.to_owned(), z.to_owned()], + Box::from(four.to_owned()), + ); + let leq = ConjureExpression::SumLeq( + vec![x.to_owned(), y.to_owned(), z.to_owned()], + Box::from(four.to_owned()), + ); + let ineq = ConjureExpression::Ineq(Box::from(x), Box::from(y), Box::from(four)); + + model.constraints.push(geq); + model.constraints.push(leq); + model.constraints.push(ineq); + + let minion_model = MinionModel::try_from(model)?; + minion_rs::run_minion(minion_model, xyz_callback).map_err(|x| x.to_string()) + } + + #[allow(clippy::unwrap_used)] + fn xyz_callback(solutions: HashMap) -> bool { + let x = match solutions.get("x").unwrap() { + MinionConstant::Integer(n) => n, + _ => panic!("x should be a integer"), + }; + + let y = match solutions.get("y").unwrap() { + MinionConstant::Integer(n) => n, + _ => panic!("y should be a integer"), + }; + + let z = match solutions.get("z").unwrap() { + MinionConstant::Integer(n) => n, + _ => panic!("z should be a integer"), + }; + + assert_eq!(*x, 1); + assert_eq!(*y, 2); + assert_eq!(*z, 1); + + false + } + + fn add_int_with_range( + model: &mut ConjureModel, + name: &str, + domain_low: i32, + domain_high: i32, + ) -> Result<(), String> { + // TODO: convert to use public interfaces when these exist. + let res = model.variables.insert( + ConjureName::UserName(name.to_owned()), + DecisionVariable { + domain: ConjureDomain::IntDomain(vec![ConjureRange::Bounded( + domain_low, + domain_high, + )]), + }, + ); + + match res { + // variable was not already present + None => Ok(()), + Some(_) => Err(format!("Variable {:?} was already present", name)), + } + } +}