def solve(self,net): from optalg.opt_solver import OptSolverError from optalg.opt_solver import OptSolverIQP, OptSolverAugL, OptSolverIpopt # Parameters params = self._parameters solver_name = params['solver'] solver_params = params['solver_parameters'] # Solver if solver_name == 'iqp': solver = OptSolverIQP() elif solver_name == 'augl': solver = OptSolverAugL() elif solver_name == 'ipopt': solver = OptSolverIpopt() else: raise PFmethodError_BadOptSolver() solver.set_parameters(solver_params[solver_name]) # Copy network net = net.get_copy() # Problem t0 = time.time() problem = self.create_problem(net) problem_time = time.time()-t0 # Solve update = True t0 = time.time() try: solver.solve(problem) except OptSolverError as e: raise PFmethodError_SolverError(e) except Exception as e: update = False raise e finally: # Update network if update: net.set_var_values(solver.get_primal_variables()[:net.num_vars]) net.update_properties() net.clear_sensitivities() problem.store_sensitivities(*solver.get_dual_variables()) # Save results self.set_solver_name(solver_name) self.set_solver_status(solver.get_status()) self.set_solver_message(solver.get_error_msg()) self.set_solver_iterations(solver.get_iterations()) self.set_solver_time(time.time()-t0) self.set_solver_primal_variables(solver.get_primal_variables()) self.set_solver_dual_variables(solver.get_dual_variables()) self.set_problem(None) # skip for now self.set_problem_time(problem_time) self.set_network_snapshot(net)
# Hock-Schittkowski # Problem 71 from optalg.opt_solver import OptSolverIpopt from optmod import VariableScalar, Problem, minimize x1 = VariableScalar('x1', value=1) x2 = VariableScalar('x2', value=5) x3 = VariableScalar('x3', value=5) x4 = VariableScalar('x4', value=1) f = x1*x4*(x1+x2+x3) + x3 constraints = [x1*x2*x3*x4 >= 25, x1*x1 + x2*x2 + x3*x3 + x4*x4 == 40, 1 <= x1, x1 <= 5, 1 <= x2, x2 <= 5, 1 <= x3, x3 <= 5, 1 <= x4, x4 <= 5] p = Problem(minimize(f), constraints) p.solve(solver=OptSolverIpopt(), parameters={'quiet': False}) print(f.get_value()) for x in [x1, x2, x3, x4]: print(x, x.get_value())
def solve(self,net): from optalg.opt_solver import OptSolverError, OptTermination from optalg.opt_solver import OptSolverAugL, OptSolverIpopt, OptSolverINLP # Parameters params = self._parameters vmin_thresh = params['vmin_thresh'] solver_name = params['solver'] solver_params = params['solver_parameters'] # Opt solver if solver_name == 'augl': solver = OptSolverAugL() elif solver_name == 'ipopt': solver = OptSolverIpopt() elif solver_name == 'inlp': solver = OptSolverINLP() else: raise PFmethodError_BadOptSolver() solver.set_parameters(solver_params[solver_name]) # Copy network net = net.get_copy(merge_buses=True) self.set_network_snapshot(net) # Problem t0 = time.time() problem = self.create_problem(net) problem_time = time.time()-t0 # Termination def t1(s): if np.min(s.problem.wrapped_problem.network.bus_v_min) < vmin_thresh: return True else: return False solver.add_termination(OptTermination(t1,'low voltage')) # Solve update = True t0 = time.time() try: solver.solve(problem) except OptSolverError as e: raise PFmethodError_SolverError(e) except Exception as e: update = False raise e finally: # Update network if update: net.set_var_values(solver.get_primal_variables()[:net.num_vars]) net.update_properties() net.clear_sensitivities() problem.store_sensitivities(*solver.get_dual_variables()) # Save results self.set_solver_name(solver_name) self.set_solver_status(solver.get_status()) self.set_solver_message(solver.get_error_msg()) self.set_solver_iterations(solver.get_iterations()) self.set_solver_time(time.time()-t0) self.set_solver_primal_variables(solver.get_primal_variables()) self.set_solver_dual_variables(solver.get_dual_variables()) self.set_problem(None) # skip for now self.set_problem_time(problem_time) self.set_network_snapshot(net)
import numpy as np from optalg.opt_solver import OptSolverIpopt from optmod import VariableMatrix, Problem, minimize N = 1000 x = VariableMatrix(name='x', shape=(N,1)) f = 0. for i in range(N-1): f = f + 100*(x[i+1,0]-x[i,0]*x[i,0]) * (x[i+1,0] - x[i,0]*x[i,0]) + (1-x[i,0])*(1-x[i,0]) p = Problem(minimize(f)) info = p.solve(solver=OptSolverIpopt(), parameters={'quiet': True, 'max_iter': 1500}) print(info) print(f.get_value()) print(np.all(x.get_value() == 1.))
def solve(self, net): from optalg.opt_solver import OptSolverError, OptTermination, OptCallback from optalg.opt_solver import OptSolverAugL, OptSolverIpopt, OptSolverNR, OptSolverINLP # Parameters params = self._parameters lock_taps = params['lock_taps'] lock_shunts = params['lock_shunts'] vmin_thresh = params['vmin_thresh'] solver_name = params['solver'] solver_params = params['solver_parameters'] feastol = solver_params['nr']['feastol'] # Opt solver if solver_name == 'augl': solver = OptSolverAugL() elif solver_name == 'ipopt': solver = OptSolverIpopt() elif solver_name == 'inlp': solver = OptSolverINLP() elif solver_name == 'nr': solver = OptSolverNR() else: raise PFmethodError_BadOptSolver() solver.set_parameters(solver_params[solver_name]) # Copy network net = net.get_copy() # Problem t0 = time.time() problem = self.create_problem(net) problem_time = time.time() - t0 # Callbacks def c1(s): if (s.k != 0 and (not lock_taps) and norm(s.problem.f, np.inf) < 100. * feastol): try: self.apply_tran_v_regulation(s) except Exception as e: raise PFmethodError_TranVReg(e) def c2(s): if (s.k != 0 and (not lock_shunts) and norm(s.problem.f, np.inf) < 100. * feastol): try: self.apply_shunt_v_regulation(s) except Exception as e: raise PFmethodError_ShuntVReg(e) def c3(s): if s.k > 0: prob = s.problem.wrapped_problem prob.apply_heuristics(s.x) s.problem.A = prob.A s.problem.b = prob.b if solver_name == 'nr': solver.add_callback(OptCallback(c1)) solver.add_callback(OptCallback(c2)) solver.add_callback(OptCallback(c3)) # Termination def t1(s): if np.min( s.problem.wrapped_problem.network.bus_v_min) < vmin_thresh: return True else: return False solver.add_termination(OptTermination(t1, 'low voltage')) # Info printer info_printer = self.get_info_printer() solver.set_info_printer(info_printer) # Solve update = True t0 = time.time() try: solver.solve(problem) except OptSolverError as e: raise PFmethodError_SolverError(e) except Exception as e: update = False raise e finally: # Update network if update: net.set_var_values( solver.get_primal_variables()[:net.num_vars]) net.update_properties() net.clear_sensitivities() if solver_name != 'nr': problem.store_sensitivities(*solver.get_dual_variables()) # Save results self.set_solver_name(solver_name) self.set_solver_status(solver.get_status()) self.set_solver_message(solver.get_error_msg()) self.set_solver_iterations(solver.get_iterations()) self.set_solver_time(time.time() - t0) self.set_solver_primal_variables(solver.get_primal_variables()) self.set_solver_dual_variables(solver.get_dual_variables()) self.set_problem(None) # skip for now self.set_problem_time(problem_time) self.set_network_snapshot(net)
def solve_problem(self, net, problem, save_problem=False, update_net=False): """ solve the Optimization problem """ from optalg.opt_solver import OptSolverError, OptTermination, OptCallback from optalg.opt_solver import OptSolverAugL, OptSolverIpopt, OptSolverNR, OptSolverINLP # Parameters params = self._parameters Q_mode = params['Q_mode'] shunt_mode = params['shunt_mode'] tap_mode = params['tap_mode'] vmin_thresh = params['vmin_thresh'] solver_name = params['solver'] solver_params = params['solver_parameters'] # Opt solver if solver_name == 'augl': solver = OptSolverAugL() elif solver_name == 'ipopt': solver = OptSolverIpopt() elif solver_name == 'inlp': solver = OptSolverINLP() elif solver_name == 'nr': solver = OptSolverNR() else: raise PFmethodError_BadOptSolver() solver.set_parameters(solver_params[solver_name]) # Callbacks def c1(s): if (s.k != 0 and params['tap_limits'] and tap_mode == self.CONTROL_MODE_REG and norm(s.problem.f, np.inf) < 100.*solver_params['nr']['feastol']): try: self.apply_tran_v_regulation(s) except Exception as e: raise PFmethodError_TranVReg(e) def c2(s): if (s.k != 0 and params['shunt_limits'] and shunt_mode == self.CONTROL_MODE_REG and norm(s.problem.f, np.inf) < 100.*solver_params['nr']['feastol']): try: self.apply_shunt_v_regulation(s) except Exception as e: raise PFmethodError_ShuntVReg(e) def c3(s): if (s.k >= params['pvpq_start_k'] and params['Q_limits'] and Q_mode == self.CONTROL_MODE_REG): prob = s.problem.wrapped_problem prob.apply_heuristics(s.x) s.problem.A = prob.A s.problem.b = prob.b if solver_name == 'nr': solver.add_callback(OptCallback(c1)) solver.add_callback(OptCallback(c2)) solver.add_callback(OptCallback(c3)) # Termination def t1(s): if np.min(s.problem.wrapped_problem.network.bus_v_min) < vmin_thresh: return True else: return False solver.add_termination(OptTermination(t1, 'low voltage')) # Info printer info_printer = self.get_info_printer() solver.set_info_printer(info_printer) # Solve update = True t0 = time.time() try: solver.solve(problem) except OptSolverError as e: raise PFmethodError_SolverError(e) except Exception as e: update = False raise e finally: # Update network if update: if update_net and solver.get_status() == 'error': pass else: net.set_var_values(solver.get_primal_variables()[:net.num_vars]) net.update_properties() net.clear_sensitivities() if solver_name != 'nr': problem.store_sensitivities(*solver.get_dual_variables()) # Save results self.set_solver_name(solver_name) self.set_solver_status(solver.get_status()) self.set_solver_message(solver.get_error_msg()) self.set_solver_iterations(solver.get_iterations()) self.set_solver_time(time.time()-t0) self.set_solver_primal_variables(solver.get_primal_variables()) self.set_solver_dual_variables(solver.get_dual_variables()) self.set_problem(problem if save_problem else None) self.set_network_snapshot(net)