From e9780817b78a6ef5f625cd1c4c6e066867133118 Mon Sep 17 00:00:00 2001 From: rachelmoan <moanrachel516@gmail.com> Date: Thu, 17 Oct 2024 18:57:32 -0500 Subject: [PATCH] Separate out optimizer to be used by multiple problems --- .../conflict_resolvers/traj_opt_resolver.py | 34 ++--------------- guided_mrmp/controllers/mpc.py | 35 ++---------------- guided_mrmp/optimizer.py | 37 +++++++++++++++++++ 3 files changed, 44 insertions(+), 62 deletions(-) create mode 100644 guided_mrmp/optimizer.py diff --git a/guided_mrmp/conflict_resolvers/traj_opt_resolver.py b/guided_mrmp/conflict_resolvers/traj_opt_resolver.py index 92e3a72..aab7dac 100644 --- a/guided_mrmp/conflict_resolvers/traj_opt_resolver.py +++ b/guided_mrmp/conflict_resolvers/traj_opt_resolver.py @@ -1,6 +1,7 @@ import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import Circle, Rectangle +from guided_mrmp.optimizer import Optimizer from casadi import * class TrajOptResolver(): @@ -148,37 +149,8 @@ class TrajOptResolver(): return {'opti':opti, 'X':X, 'T':T} def solve_optimization_problem(self, problem, initial_guesses=None, solver_options=None): - opti = problem['opti'] - - if initial_guesses: - for param, value in initial_guesses.items(): - print(f"param = {param}") - print(f"value = {value}") - opti.set_initial(problem[param], value) - - # Set numerical backend, with options if provided - if solver_options: - opti.solver('ipopt', solver_options) - else: - opti.solver('ipopt') - - try: - sol = opti.solve() # actual solve - status = 'succeeded' - except: - sol = None - status = 'failed' - - results = { - 'status' : status, - 'solution' : sol, - } - - if sol: - for var_name, var in problem.items(): - if var_name != 'opti': - results[var_name] = sol.value(var) - + opt = Optimizer(problem) + results = opt.solve_optimization_problem(initial_guesses, solver_options) return results def solve(self, N, x_range, y_range, initial_guesses): diff --git a/guided_mrmp/controllers/mpc.py b/guided_mrmp/controllers/mpc.py index f4c9c72..d87557c 100644 --- a/guided_mrmp/controllers/mpc.py +++ b/guided_mrmp/controllers/mpc.py @@ -1,5 +1,6 @@ import numpy as np import casadi as ca +from guided_mrmp.optimizer import Optimizer np.seterr(divide="ignore", invalid="ignore") @@ -95,37 +96,8 @@ class MPC: } def solve_optimization_problem(self, problem, initial_guesses=None, solver_options=None): - opti = problem['opti'] - - if initial_guesses: - for param, value in initial_guesses.items(): - # print(f"param = {param}") - # print(f"value = {value}") - opti.set_initial(problem[param], value) - - # Set numerical backend, with options if provided - if solver_options: - opti.solver('ipopt', solver_options) - else: - opti.solver('ipopt') - - try: - sol = opti.solve() # actual solve - status = 'succeeded' - except: - sol = None - status = 'failed' - - results = { - 'status' : status, - 'solution' : sol, - } - - if sol: - for var_name, var in problem.items(): - if var_name != 'opti': - results[var_name] = sol.value(var) - + opt = Optimizer(problem) + results = opt.solve_optimization_problem(initial_guesses, solver_options) return results def step(self, initial_state, target, prev_cmd, initial_guesses=None): @@ -147,6 +119,7 @@ class MPC: solver_options = {'ipopt.print_level': self.print_level, 'print_time': self.print_time, + 'ipopt.tol': self.acceptable_tol, 'ipopt.acceptable_tol': self.acceptable_tol, 'ipopt.acceptable_iter': self.acceptable_iter} diff --git a/guided_mrmp/optimizer.py b/guided_mrmp/optimizer.py new file mode 100644 index 0000000..5afa7cf --- /dev/null +++ b/guided_mrmp/optimizer.py @@ -0,0 +1,37 @@ +class Optimizer: + def __init__(self, problem): + self.problem = problem + + def solve_optimization_problem(self, initial_guesses=None, solver_options=None): + opti = self.problem['opti'] + + if initial_guesses: + for param, value in initial_guesses.items(): + print(f"param = {param}") + print(f"value = {value}") + opti.set_initial(self.problem[param], value) + + # Set numerical backend, with options if provided + if solver_options: + opti.solver('ipopt', solver_options) + else: + opti.solver('ipopt') + + try: + sol = opti.solve() # actual solve + status = 'succeeded' + except: + sol = None + status = 'failed' + + results = { + 'status' : status, + 'solution' : sol, + } + + if sol: + for var_name, var in self.problem.items(): + if var_name != 'opti': + results[var_name] = sol.value(var) + + return results -- GitLab