def _test_solve_interior_point_2(self, linear_solver): m = pyo.ConcreteModel() m.x = pyo.Var(bounds=(1, 4)) m.obj = pyo.Objective(expr=m.x**2) interface = InteriorPointInterface(m) ip_solver = InteriorPointSolver(linear_solver) status = ip_solver.solve(interface) self.assertEqual(status, InteriorPointStatus.optimal) interface.load_primals_into_pyomo_model() self.assertAlmostEqual(m.x.value, 1)
def _test_regularization_2(self, linear_solver): m = make_model_2() interface = InteriorPointInterface(m) ip_solver = InteriorPointSolver(linear_solver) status = ip_solver.solve(interface) self.assertEqual(status, InteriorPointStatus.optimal) interface.load_primals_into_pyomo_model() self.assertAlmostEqual(m.x.value, 1) self.assertAlmostEqual(m.y.value, pyo.exp(-1))
def test_mumps(self): n = 20000 m = make_model_tri(n, small_val=1e-7) interface = InteriorPointInterface(m) linear_solver = MumpsInterface() # Default memory "buffer" factor: 20 linear_solver.set_icntl(14, 20) kkt = interface.evaluate_primal_dual_kkt_matrix() res = linear_solver.do_symbolic_factorization(kkt) predicted = linear_solver.get_infog(16) self._test_ip_with_reallocation(linear_solver, interface) actual = linear_solver.get_icntl(23) self.assertTrue(predicted == 12 or predicted == 11) self.assertTrue(actual > predicted)
def _test_regularization(self, linear_solver): m = make_model() interface = InteriorPointInterface(m) ip_solver = InteriorPointSolver(linear_solver) ip_solver.set_interface(interface) interface.set_barrier_parameter(1e-1) # Evaluate KKT matrix before any iterations kkt = interface.evaluate_primal_dual_kkt_matrix() reg_coef = ip_solver.factorize(kkt) # Expected regularization coefficient: self.assertAlmostEqual(reg_coef, 1e-4) desired_n_neg_evals = (ip_solver.interface.n_eq_constraints() + ip_solver.interface.n_ineq_constraints()) # Expected inertia: n_pos_evals, n_neg_evals, n_null_evals = linear_solver.get_inertia() self.assertEqual(n_null_evals, 0) self.assertEqual(n_neg_evals, desired_n_neg_evals)
def _test_solve_interior_point_1(self, linear_solver): m = pyo.ConcreteModel() m.x = pyo.Var() m.y = pyo.Var() m.obj = pyo.Objective(expr=m.x**2 + m.y**2) m.c1 = pyo.Constraint(expr=m.y == pyo.exp(m.x)) m.c2 = pyo.Constraint(expr=m.y >= (m.x - 1)**2) interface = InteriorPointInterface(m) ip_solver = InteriorPointSolver(linear_solver) status = ip_solver.solve(interface) self.assertEqual(status, InteriorPointStatus.optimal) x = interface.get_primals() duals_eq = interface.get_duals_eq() duals_ineq = interface.get_duals_ineq() self.assertAlmostEqual(x[0], 0) self.assertAlmostEqual(x[1], 1) self.assertAlmostEqual(duals_eq[0], -1-1.0/3.0) self.assertAlmostEqual(duals_ineq[0], 2.0/3.0) interface.load_primals_into_pyomo_model() self.assertAlmostEqual(m.x.value, 0) self.assertAlmostEqual(m.y.value, 1)
import pyomo.environ as pe from pyomo.contrib.interior_point.interior_point import InteriorPointSolver from pyomo.contrib.interior_point.interface import InteriorPointInterface from pyomo.contrib.interior_point.linalg.mumps_interface import MumpsInterface import logging logging.basicConfig(level=logging.INFO) # Supposedly this sets the root logger's level to INFO. # But when linear_solver.logger logs with debug, # it gets propagated to a mysterious root logger with # level NOTSET... m = pe.ConcreteModel() m.x = pe.Var() m.y = pe.Var() m.obj = pe.Objective(expr=m.x**2 + m.y**2) m.c1 = pe.Constraint(expr=m.y == pe.exp(m.x)) m.c2 = pe.Constraint(expr=m.y >= (m.x - 1)**2) interface = InteriorPointInterface(m) linear_solver = MumpsInterface( # log_filename='lin_sol.log', icntl_options={11: 1}, # Set error level to 1 (most detailed) ) ip_solver = InteriorPointSolver(linear_solver) x, duals_eq, duals_ineq = ip_solver.solve(interface) print(x, duals_eq, duals_ineq)