-
Notifications
You must be signed in to change notification settings - Fork 40
Open
Labels
bugSomething isn't workingSomething isn't working
Description
Description: When using the method dual on a SolutionWithDual with a constraint expressed with >=, the returned dual value has the opposite sign of the one expected
I noticed this error using both Highs and Clarabel Solvers, the only ones implementing SolutionWithDual
Code Example:
The error is on constraint 3
use good_lp::{
clarabel, constraint, highs, variable, DualValues, ProblemVariables, Solution,
SolutionWithDual, SolverModel,
};
fn main() {
let mut problem = ProblemVariables::new();
let vars = problem.add_vector(variable().min(0), 4);
let z = 4 * vars[0] + 6 * vars[1] + 7 * vars[2] + 8 * vars[3];
let cst1 = constraint!(2 * vars[0] + 3 * vars[1] + 4 * vars[2] + 7 * vars[3] <= 4600);
let cst2 = constraint!(3 * vars[0] + 4 * vars[1] + 5 * vars[2] + 6 * vars[3] <= 5000);
let cst3 = constraint!(vars[3] >= 400);
let cst4 = constraint!(vars[0] + vars[1] + vars[2] + vars[3] == 950);
let mut problem = problem.maximise(z.clone()).using(highs);
let c1 = problem.add_constraint(cst1);
let c2 = problem.add_constraint(cst2);
let c3 = problem.add_constraint(cst3);
let c4 = problem.add_constraint(cst4);
let mut solution = problem.solve().unwrap();
for (idx, var) in vars.iter().enumerate() {
println!("x{} = {}", idx, solution.value(*var));
}
let dual = solution.compute_dual();
println!("shadow price cst1: {}", dual.dual(c1));
println!("shadow price cst2: {}", dual.dual(c2));
// The issue seems to only be for >= constraints
println!("shadow price cst3: {}", dual.dual(c3)); // It should be -2
println!("shadow price cst4: {}", dual.dual(c4));
println!("objective value: {}", solution.eval(&z));
}
Output
x0 = 0
x1 = 400
x2 = 150
x3 = 400
shadow price cst1: 1
shadow price cst2: 0
shadow price cst3: 2 // Here should be -2
shadow price cst4: 3
objective value: 6650
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working