1# -*- coding: utf-8 -*- 2"""Tests for the MindtPy solver.""" 3from math import fabs 4import pyomo.core.base.symbolic 5import pyomo.common.unittest as unittest 6from pyomo.contrib.mindtpy.tests.eight_process_problem import \ 7 EightProcessFlowsheet 8from pyomo.contrib.mindtpy.tests.MINLP_simple import SimpleMINLP as SimpleMINLP 9from pyomo.contrib.mindtpy.tests.MINLP2_simple import SimpleMINLP as SimpleMINLP2 10from pyomo.contrib.mindtpy.tests.MINLP3_simple import SimpleMINLP as SimpleMINLP3 11from pyomo.contrib.mindtpy.tests.from_proposal import ProposalModel 12from pyomo.contrib.mindtpy.tests.constraint_qualification_example import ConstraintQualificationExample 13from pyomo.contrib.mindtpy.tests.online_doc_example import OnlineDocExample 14from pyomo.environ import SolverFactory, value 15from pyomo.environ import * 16from pyomo.solvers.tests.models.LP_unbounded import LP_unbounded 17from pyomo.solvers.tests.models.QCP_simple import QCP_simple 18from pyomo.solvers.tests.models.MIQCP_simple import MIQCP_simple 19from pyomo.opt import TerminationCondition 20 21required_solvers = ('ipopt', 'glpk') 22# required_solvers = ('gams', 'gams') 23if all(SolverFactory(s).available() for s in required_solvers): 24 subsolvers_available = True 25else: 26 subsolvers_available = False 27 28model_list = [EightProcessFlowsheet(convex=True), 29 ConstraintQualificationExample(), 30 SimpleMINLP(), 31 SimpleMINLP2(), 32 SimpleMINLP3(), 33 ProposalModel(), 34 ] 35 36 37@unittest.skipIf(not subsolvers_available, 38 'Required subsolvers %s are not available' 39 % (required_solvers,)) 40@unittest.skipIf(not pyomo.core.base.symbolic.differentiate_available, 41 'Symbolic differentiation is not available') 42class TestMindtPy(unittest.TestCase): 43 """Tests for the MindtPy solver plugin.""" 44 45 def test_ECP(self): 46 """Test the extended cutting plane decomposition algorithm.""" 47 with SolverFactory('mindtpy') as opt: 48 for model in model_list: 49 results = opt.solve(model, strategy='ECP', 50 init_strategy='rNLP', 51 mip_solver=required_solvers[1], 52 nlp_solver=required_solvers[0], 53 bound_tolerance=1E-5) 54 55 self.assertIs(results.solver.termination_condition, 56 TerminationCondition.optimal) 57 self.assertAlmostEqual( 58 value(model.objective.expr), model.optimal_value, places=1) 59 60 def test_ECP_add_slack(self): 61 """Test the extended cutting plane decomposition algorithm.""" 62 with SolverFactory('mindtpy') as opt: 63 for model in model_list: 64 results = opt.solve(model, strategy='ECP', 65 init_strategy='rNLP', 66 mip_solver=required_solvers[1], 67 nlp_solver=required_solvers[0], 68 bound_tolerance=1E-5, 69 add_slack=True) 70 71 self.assertIs(results.solver.termination_condition, 72 TerminationCondition.optimal) 73 self.assertAlmostEqual( 74 value(model.objective.expr), model.optimal_value, places=1) 75 76 77if __name__ == '__main__': 78 unittest.main() 79