use std::cmp::Ordering;
use lp_solvers::lp_format::{Constraint, LpObjective, LpProblem};
use lp_solvers::problem::{Problem, StrExpression, Variable};
#[test]
fn simple_problem() {
let pb = Problem {
name: "my_problem".to_string(),
sense: LpObjective::Minimize,
objective: StrExpression("2 x + y".to_string()),
variables: vec![
Variable {
name: "x".to_string(),
is_integer: false,
lower_bound: f64::NEG_INFINITY,
upper_bound: f64::INFINITY,
},
Variable {
name: "y".to_string(),
is_integer: false,
lower_bound: 0.0,
upper_bound: f64::INFINITY,
},
Variable {
name: "z".to_string(),
is_integer: false,
lower_bound: 1.,
upper_bound: 10.,
},
],
constraints: vec![Constraint {
lhs: StrExpression("x + y + z".to_string()),
operator: Ordering::Greater,
rhs: 5.0,
}],
};
let expected_str = "\\ my_problem
Minimize
obj: 2 x + y
Subject To
c0: x + y + z >= 5
Bounds
x free
0 <= y
1 <= z <= 10
End
";
assert_eq!(pb.display_lp().to_string(), expected_str);
}
#[test]
fn with_integers() {
let pb = Problem {
name: "int_problem".to_string(),
sense: LpObjective::Maximize,
objective: StrExpression("x - y".to_string()),
variables: vec![
Variable {
name: "x".to_string(),
is_integer: true,
lower_bound: -10.,
upper_bound: 10.,
},
Variable {
name: "y".to_string(),
is_integer: true,
lower_bound: f64::NEG_INFINITY,
upper_bound: 16.5,
},
],
constraints: vec![Constraint {
lhs: StrExpression("x - y".to_string()),
operator: Ordering::Less,
rhs: -5.0,
}],
};
let expected_str = "\\ int_problem
Maximize
obj: x - y
Subject To
c0: x - y <= -5
Bounds
-10 <= x <= 10
y <= 16.5
Generals
x
y
End
";
assert_eq!(pb.display_lp().to_string(), expected_str);
}
#[test]
fn without_constraints() {
let pb = Problem {
name: "int_problem".to_string(),
sense: LpObjective::Maximize,
objective: StrExpression("x".to_string()),
variables: vec![Variable {
name: "x".to_string(),
is_integer: true,
lower_bound: 0.,
upper_bound: 2.5,
}],
constraints: vec![],
};
let expected_str = "\\ int_problem
Maximize
obj: x
Subject To
Bounds
0 <= x <= 2.5
Generals
x
End
";
assert_eq!(pb.display_lp().to_string(), expected_str);
}