def test_explicit_model(self): dual = Model() convert_linear_problem_to_dual(self.model, dual_model=dual) primal_status = self.model.optimize() dual_status = dual.optimize() self.assertEqual(primal_status, optlang.interface.OPTIMAL) self.assertEqual(dual_status, optlang.interface.OPTIMAL) self.assertEqual(self.model.objective.value, 31) self.assertEqual(dual.objective.value, 31)
def test_making_primal_unbounded(self): self.model.remove(self.c1) dual = convert_linear_problem_to_dual(self.model) primal_status = self.model.optimize() dual_status = dual.optimize() self.assertEqual(primal_status, optlang.interface.UNBOUNDED) self.assertEqual(dual_status, optlang.interface.INFEASIBLE)
def test_making_primal_infeasible(self): # Note: The dual of an infeasible primal will be either unbounded or infeasible. In this case it is unbounded. c4 = Constraint(self.model.variables["z"], lb=100) self.model.add(c4) dual = convert_linear_problem_to_dual(self.model) primal_status = self.model.optimize() dual_status = dual.optimize() self.assertEqual(primal_status, optlang.interface.INFEASIBLE) self.assertEqual(dual_status, optlang.interface.UNBOUNDED)
def test_dual_value_equal_primal(self): dual = convert_linear_problem_to_dual(self.model) primal_status = self.model.optimize() dual_status = dual.optimize() self.assertEqual(primal_status, optlang.interface.OPTIMAL) self.assertEqual(dual_status, optlang.interface.OPTIMAL) self.assertEqual(self.model.objective.value, 31) self.assertEqual(dual.objective.value, 31)
def test_variable_with_positive_lower_bound(self): self.model.variables["x"].lb = 1 dual = convert_linear_problem_to_dual(self.model) primal_status = self.model.optimize() dual_status = dual.optimize() self.assertEqual(primal_status, optlang.interface.OPTIMAL) self.assertEqual(dual_status, optlang.interface.OPTIMAL) self.assertEqual(self.model.objective.value, 31) self.assertEqual(dual.objective.value, 31)
def test_with_minimization(self): self.model.objective = Objective(self.model.objective.expression * -1, direction="min") dual = convert_linear_problem_to_dual(self.model) primal_status = self.model.optimize() dual_status = dual.optimize() self.assertEqual(primal_status, optlang.interface.OPTIMAL) self.assertEqual(dual_status, optlang.interface.OPTIMAL) self.assertEqual(self.model.objective.value, -31) self.assertEqual(dual.objective.value, -31)
def test_zero_bound_variable(self): w = Variable("w", lb=0, ub=0) self.model.add(w) dual = convert_linear_problem_to_dual(self.model) primal_status = self.model.optimize() dual_status = dual.optimize() self.assertEqual(primal_status, optlang.interface.OPTIMAL) self.assertEqual(dual_status, optlang.interface.OPTIMAL) self.assertEqual(self.model.objective.value, 31) self.assertEqual(dual.objective.value, 31)
def test_free_constraint(self): c4 = Constraint(self.model.variables["x"], lb=None, ub=None) self.model.add(c4) dual = convert_linear_problem_to_dual(self.model) primal_status = self.model.optimize() dual_status = dual.optimize() self.assertEqual(primal_status, optlang.interface.OPTIMAL) self.assertEqual(dual_status, optlang.interface.OPTIMAL) self.assertEqual(self.model.objective.value, 31) self.assertEqual(dual.objective.value, 31)
def test_empty_constraint(self): c4 = Constraint(0, lb=0, ub=13) self.model.add(c4) dual = convert_linear_problem_to_dual(self.model) primal_status = self.model.optimize() dual_status = dual.optimize() self.assertEqual(primal_status, optlang.interface.OPTIMAL) self.assertEqual(dual_status, optlang.interface.OPTIMAL) self.assertEqual(self.model.objective.value, 31) self.assertEqual(dual.objective.value, 31)
def test_equality_constraint_not_zero(self): c2 = self.model.constraints[1] c2.ub = 1 c2.lb = 1 dual = convert_linear_problem_to_dual(self.model, maintain_standard_form=False) primal_status = self.model.optimize() dual_status = dual.optimize() self.assertEqual(primal_status, optlang.interface.OPTIMAL) self.assertEqual(dual_status, optlang.interface.OPTIMAL) self.assertEqual(self.model.objective.value, 32) self.assertEqual(dual.objective.value, 32)
def test_dual_is_standard_form(self): dual = convert_linear_problem_to_dual(self.model, infinity=1000) dual_2 = convert_linear_problem_to_dual(self.model, maintain_standard_form=False, infinity=1000) self.assertTrue(all(var.lb >= 0 for var in dual.variables)) self.assertFalse(all(var.lb >= 0 for var in dual_2.variables))
def test_infinity(self): dual = convert_linear_problem_to_dual(self.model, infinity=1000) for var in dual.variables: self.assertTrue(var.ub <= 1000) self.assertTrue(var.lb >= -1000)