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