Skip to content

Commit

Permalink
port minion changes from conjure-cp#230 to new solver interface
Browse files Browse the repository at this point in the history
  • Loading branch information
niklasdewally committed Mar 9, 2024
1 parent 23e56c2 commit f5f4b4c
Show file tree
Hide file tree
Showing 7 changed files with 123 additions and 110 deletions.
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions conjure_oxide/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ versions = "6.1.0"
linkme = "0.3.22"
walkdir = "2.5.0"
itertools = "0.12.1"
regex = "1.10.3"

[features]

Expand Down
80 changes: 46 additions & 34 deletions conjure_oxide/src/unstable/solver_interface/adaptors/minion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ use super::super::SolverError;
use super::super::SolverError::*;

use minion_rs::run_minion;
use regex::Regex;

use crate::ast as conjureast;
use minion_rs::ast as minionast;
Expand Down Expand Up @@ -48,8 +49,13 @@ fn minion_rs_callback(solutions: HashMap<minionast::VarName, minionast::Constant
_ => todo!(),
};

//FIXME (niklasdewally): what about machine names?
let conjure_name = conjureast::Name::UserName(minion_name);
let machine_name_re = Regex::new(r"__conjure_machine_name_([0-9]+)").unwrap();
let conjure_name = if let Some(caps) = machine_name_re.captures(&minion_name) {
conjureast::Name::MachineName(caps[1].parse::<i32>().unwrap())
} else {
conjureast::Name::UserName(minion_name)
};

conjure_solutions.insert(conjure_name, conjure_const);
}

Expand Down Expand Up @@ -237,42 +243,48 @@ fn parse_expr(
expr: conjureast::Expression,
minion_model: &mut minionast::Model,
) -> Result<(), SolverError> {
minion_model.constraints.push(read_expr(expr)?);
Ok(())
}

fn read_expr(expr: conjureast::Expression) -> Result<minionast::Constraint, SolverError> {
match expr {
conjureast::Expression::SumLeq(_metadata, lhs, rhs) => {
minion_model.constraints.push(minionast::Constraint::SumLeq(
read_vars(lhs)?,
read_var(*rhs)?,
));
Ok(())
}
conjureast::Expression::SumGeq(_metadata, lhs, rhs) => {
minion_model.constraints.push(minionast::Constraint::SumGeq(
read_vars(lhs)?,
read_var(*rhs)?,
));
Ok(())
}
conjureast::Expression::Ineq(_metadata, a, b, c) => {
minion_model.constraints.push(minionast::Constraint::Ineq(
read_var(*a)?,
read_var(*b)?,
minionast::Constant::Integer(read_const(*c)?),
));
Ok(())
}
conjureast::Expression::Neq(_metadata, a, b) => {
minion_model
.constraints
.push(minionast::Constraint::WatchNeq(
read_var(*a)?,
read_var(*b)?,
));
Ok(())
conjureast::Expression::SumLeq(_metadata, lhs, rhs) => Ok(minionast::Constraint::SumLeq(
read_vars(lhs)?,
read_var(*rhs)?,
)),
conjureast::Expression::SumGeq(_metadata, lhs, rhs) => Ok(minionast::Constraint::SumGeq(
read_vars(lhs)?,
read_var(*rhs)?,
)),
conjureast::Expression::Ineq(_metadata, a, b, c) => Ok(minionast::Constraint::Ineq(
read_var(*a)?,
read_var(*b)?,
minionast::Constant::Integer(read_const(*c)?),
)),
conjureast::Expression::Neq(_metadata, a, b) => Ok(minionast::Constraint::AllDiff(vec![
read_var(*a)?,
read_var(*b)?,
])),
// conjureast::Expression::DivEq(_metadata, a, b, c) => {
// minion_model.constraints.push(minionast::Constraint::Div(
// (read_var(*a)?, read_var(*b)?),
// read_var(*c)?,
// ));
// Ok(())
// }
conjureast::Expression::AllDiff(_metadata, vars) => {
Ok(minionast::Constraint::AllDiff(read_vars(vars)?))
}
conjureast::Expression::Or(_metadata, exprs) => Ok(minionast::Constraint::WatchedOr(
exprs
.iter()
.map(|x| read_expr(x.to_owned()))
.collect::<Result<Vec<minionast::Constraint>, SolverError>>()?,
)),
x => Err(ModelFeatureNotSupported(format!("{:?}", x))),
}
}

fn read_vars(exprs: Vec<conjureast::Expression>) -> Result<Vec<minionast::Var>, SolverError> {
let mut minion_vars: Vec<minionast::Var> = vec![];
for expr in exprs {
Expand Down Expand Up @@ -319,6 +331,6 @@ fn read_const(e: conjureast::Expression) -> Result<i32, SolverError> {
fn _name_to_string(name: conjureast::Name) -> String {
match name {
conjureast::Name::UserName(x) => x,
conjureast::Name::MachineName(x) => x.to_string(),
conjureast::Name::MachineName(x) => format!("__conjure_machine_name_{}", x),
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[
{
"0": 3,
"a": 3,
"b": 3
"MachineName(0)": 3,
"UserName(a)": 3,
"UserName(b)": 3
}
]
Original file line number Diff line number Diff line change
@@ -1,42 +1,42 @@
[
{
"0": 1,
"a": 1,
"b": 1
"MachineName(0)": 1,
"UserName(a)": 1,
"UserName(b)": 1
},
{
"0": 1,
"a": 1,
"b": 2
"MachineName(0)": 1,
"UserName(a)": 1,
"UserName(b)": 2
},
{
"0": 1,
"a": 1,
"b": 3
"MachineName(0)": 1,
"UserName(a)": 1,
"UserName(b)": 3
},
{
"0": 1,
"a": 2,
"b": 1
"MachineName(0)": 1,
"UserName(a)": 2,
"UserName(b)": 1
},
{
"0": 1,
"a": 3,
"b": 1
"MachineName(0)": 1,
"UserName(a)": 3,
"UserName(b)": 1
},
{
"0": 2,
"a": 2,
"b": 2
"MachineName(0)": 2,
"UserName(a)": 2,
"UserName(b)": 2
},
{
"0": 2,
"a": 2,
"b": 3
"MachineName(0)": 2,
"UserName(a)": 2,
"UserName(b)": 3
},
{
"0": 2,
"a": 3,
"b": 2
"MachineName(0)": 2,
"UserName(a)": 3,
"UserName(b)": 2
}
]
Original file line number Diff line number Diff line change
@@ -1,37 +1,37 @@
[
{
"0": 1,
"a": 1,
"b": 2
"MachineName(0)": 1,
"UserName(a)": 1,
"UserName(b)": 2
},
{
"0": 1,
"a": 1,
"b": 3
"MachineName(0)": 1,
"UserName(a)": 1,
"UserName(b)": 3
},
{
"0": 1,
"a": 1,
"b": 4
"MachineName(0)": 1,
"UserName(a)": 1,
"UserName(b)": 4
},
{
"0": 2,
"a": 2,
"b": 2
"MachineName(0)": 2,
"UserName(a)": 2,
"UserName(b)": 2
},
{
"0": 2,
"a": 2,
"b": 3
"MachineName(0)": 2,
"UserName(a)": 2,
"UserName(b)": 3
},
{
"0": 2,
"a": 2,
"b": 4
"MachineName(0)": 2,
"UserName(a)": 2,
"UserName(b)": 4
},
{
"0": 2,
"a": 3,
"b": 2
"MachineName(0)": 2,
"UserName(a)": 3,
"UserName(b)": 2
}
]
Original file line number Diff line number Diff line change
@@ -1,47 +1,47 @@
[
{
"0": 1,
"a": 1,
"b": 2
"MachineName(0)": 1,
"UserName(a)": 1,
"UserName(b)": 2
},
{
"0": 1,
"a": 1,
"b": 3
"MachineName(0)": 1,
"UserName(a)": 1,
"UserName(b)": 3
},
{
"0": 1,
"a": 1,
"b": 4
"MachineName(0)": 1,
"UserName(a)": 1,
"UserName(b)": 4
},
{
"0": 2,
"a": 2,
"b": 2
"MachineName(0)": 2,
"UserName(a)": 2,
"UserName(b)": 2
},
{
"0": 2,
"a": 2,
"b": 3
"MachineName(0)": 2,
"UserName(a)": 2,
"UserName(b)": 3
},
{
"0": 2,
"a": 2,
"b": 4
"MachineName(0)": 2,
"UserName(a)": 2,
"UserName(b)": 4
},
{
"0": 2,
"a": 3,
"b": 2
"MachineName(0)": 2,
"UserName(a)": 3,
"UserName(b)": 2
},
{
"0": 2,
"a": 4,
"b": 2
"MachineName(0)": 2,
"UserName(a)": 4,
"UserName(b)": 2
},
{
"0": 2,
"a": 5,
"b": 2
"MachineName(0)": 2,
"UserName(a)": 5,
"UserName(b)": 2
}
]

0 comments on commit f5f4b4c

Please sign in to comment.