Skip to content

Commit

Permalink
switched from SNOPT to IPOPT
Browse files Browse the repository at this point in the history
  • Loading branch information
kanekosh committed Aug 19, 2022
1 parent 9757454 commit 135ed31
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 38 deletions.
36 changes: 18 additions & 18 deletions docs/dymos_book/examples/cart_pole/cart_pole.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -260,18 +260,19 @@
"source": [
"# --- configure optimizer ---\n",
"p.driver = om.pyOptSparseDriver()\n",
"p.driver.options['optimizer'] = 'SNOPT'\n",
"p.driver.options[\"optimizer\"] = \"IPOPT\"\n",
"# IPOPT options\n",
"p.driver.opt_settings['mu_init'] = 1e-1\n",
"p.driver.opt_settings['max_iter'] = 600\n",
"p.driver.opt_settings['constr_viol_tol'] = 1e-6\n",
"p.driver.opt_settings['compl_inf_tol'] = 1e-6\n",
"p.driver.opt_settings['tol'] = 1e-5\n",
"p.driver.opt_settings['print_level'] = 0\n",
"p.driver.opt_settings['nlp_scaling_method'] = 'gradient-based'\n",
"p.driver.opt_settings['alpha_for_y'] = 'safer-min-dual-infeas'\n",
"p.driver.opt_settings['mu_strategy'] = 'monotone'\n",
"p.driver.opt_settings['bound_mult_init_method'] = 'mu-based'\n",
"p.driver.options['print_results'] = False\n",
"# SNOPT options\n",
"p.driver.opt_settings['Function precision'] = 1e-14\n",
"p.driver.opt_settings['Major optimality tolerance'] = 1e-7\n",
"p.driver.opt_settings['Major feasibility tolerance'] = 1e-7\n",
"p.driver.opt_settings['Major iterations limit'] = 300\n",
"p.driver.opt_settings['Minor iterations limit'] = 100_000_000\n",
"p.driver.opt_settings['Iterations limit'] = 10000\n",
"p.driver.opt_settings['Hessian full memory'] = 1\n",
"p.driver.opt_settings['Hessian frequency'] = 100\n",
"p.driver.opt_settings['Verify level'] = -1\n",
"\n",
"# declare total derivative coloring to accelerate the UDE linear solves\n",
"p.driver.declare_coloring()\n",
Expand All @@ -295,13 +296,12 @@
"# --- set initial guess ---\n",
"# The initial condition of cart-pole (i.e., state values at time 0) is set here because we set `fix_initial=True` when declaring the states.\n",
"p.set_val('traj.phase.t_initial', 0.0) # set initial time to 0.\n",
"# linearly interpolate the states between initial and terminal conditions.\n",
"p.set_val('traj.phase.states:x', phase.interp(ys=[0., 1.], nodes='state_input'), units='m')\n",
"p.set_val('traj.phase.states:x_dot', phase.interp(ys=[0., 0.], nodes='state_input'), units='m/s')\n",
"p.set_val('traj.phase.states:theta', phase.interp(ys=[0., np.pi], nodes='state_input'), units='rad')\n",
"p.set_val('traj.phase.states:theta_dot', phase.interp(ys=[0., 0.], nodes='state_input'), units='rad/s')\n",
"p.set_val('traj.phase.states:energy', phase.interp(ys=[0., 100.], nodes='state_input')) # start \"energy\" from 0.\n",
"p.set_val('traj.phase.controls:f', phase.interp(ys=[1., 0.], nodes='control_input'), units='N')\n",
"p.set_val(\"traj.phase.states:x\", phase.interp(xs=[0, 1, 2], ys=[0, 1, 1], nodes=\"state_input\"), units=\"m\")\n",
"p.set_val(\"traj.phase.states:x_dot\", phase.interp(xs=[0, 1, 2], ys=[0, 0.1, 0], nodes=\"state_input\"), units=\"m/s\")\n",
"p.set_val(\"traj.phase.states:theta\", phase.interp(xs=[0, 1, 2], ys=[0, np.pi/2, np.pi], nodes=\"state_input\"), units=\"rad\")\n",
"p.set_val(\"traj.phase.states:theta_dot\", phase.interp(xs=[0, 1, 2], ys=[0, 1, 0], nodes=\"state_input\"), units=\"rad/s\")\n",
"p.set_val(\"traj.phase.states:energy\", phase.interp(xs=[0, 1, 2], ys=[0, 30, 60], nodes=\"state_input\"))\n",
"p.set_val(\"traj.phase.controls:f\", phase.interp(xs=[0, 1, 2], ys=[3, -1, 0], nodes=\"control_input\"), units=\"N\")\n",
" \n",
"# --- run optimization ---\n",
"dm.run_problem(p, run_driver=True, simulate=True, simulate_kwargs={'method' : 'Radau', 'times_per_seg' : 10})\n",
Expand Down
40 changes: 20 additions & 20 deletions dymos/examples/cart_pole/test/test_cartpole_opt.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,18 +60,19 @@ def test_optimization(self):

# --- configure optimizer ---
p.driver = om.pyOptSparseDriver()
p.driver.options["optimizer"] = "SNOPT"
p.driver.options["print_results"] = False
# SNOPT options
p.driver.opt_settings["Function precision"] = 1e-14
p.driver.opt_settings["Major optimality tolerance"] = 1e-7
p.driver.opt_settings["Major feasibility tolerance"] = 1e-7
p.driver.opt_settings["Major iterations limit"] = 100
p.driver.opt_settings["Minor iterations limit"] = 100_000_000
p.driver.opt_settings["Iterations limit"] = 10000
p.driver.opt_settings["Hessian full memory"] = 1
p.driver.opt_settings["Hessian frequency"] = 100
p.driver.opt_settings["Verify level"] = -1
p.driver.options["optimizer"] = "IPOPT"
# IPOPT options
p.driver.opt_settings['mu_init'] = 1e-1
p.driver.opt_settings['max_iter'] = 600
p.driver.opt_settings['constr_viol_tol'] = 1e-6
p.driver.opt_settings['compl_inf_tol'] = 1e-6
p.driver.opt_settings['tol'] = 1e-5
p.driver.opt_settings['print_level'] = 0
p.driver.opt_settings['nlp_scaling_method'] = 'gradient-based'
p.driver.opt_settings['alpha_for_y'] = 'safer-min-dual-infeas'
p.driver.opt_settings['mu_strategy'] = 'monotone'
p.driver.opt_settings['bound_mult_init_method'] = 'mu-based'
p.driver.options['print_results'] = False

# declare total derivative coloring to accelerate the UDE linear solves
p.driver.declare_coloring()
Expand All @@ -82,21 +83,20 @@ def test_optimization(self):
# The initial condition of cart-pole (i.e., state values at time 0) is set here
# because we set `fix_initial=True` when declaring the states.
p.set_val("traj.phase.t_initial", 0.0) # set initial time to 0.
# linearly interpolate the states between initial and terminal conditions.
p.set_val("traj.phase.states:x", phase.interp(ys=[0.0, 1.0], nodes="state_input"), units="m")
p.set_val("traj.phase.states:x_dot", phase.interp(ys=[0.0, 0.0], nodes="state_input"), units="m/s")
p.set_val("traj.phase.states:theta", phase.interp(ys=[0.0, np.pi], nodes="state_input"), units="rad")
p.set_val("traj.phase.states:theta_dot", phase.interp(ys=[0.0, 0.0], nodes="state_input"), units="rad/s")
p.set_val("traj.phase.states:energy", phase.interp(ys=[0.0, 100.0], nodes="state_input")) # start "energy" from 0.
p.set_val("traj.phase.controls:f", phase.interp(ys=[1.0, 0.0], nodes="control_input"), units="N")
p.set_val("traj.phase.states:x", phase.interp(xs=[0, 1, 2], ys=[0, 1, 1], nodes="state_input"), units="m")
p.set_val("traj.phase.states:x_dot", phase.interp(xs=[0, 1, 2], ys=[0, 0.1, 0], nodes="state_input"), units="m/s")
p.set_val("traj.phase.states:theta", phase.interp(xs=[0, 1, 2], ys=[0, np.pi/2, np.pi], nodes="state_input"), units="rad")
p.set_val("traj.phase.states:theta_dot", phase.interp(xs=[0, 1, 2], ys=[0, 1, 0], nodes="state_input"), units="rad/s")
p.set_val("traj.phase.states:energy", phase.interp(xs=[0, 1, 2], ys=[0, 30, 60], nodes="state_input"))
p.set_val("traj.phase.controls:f", phase.interp(xs=[0, 1, 2], ys=[3, -1, 0], nodes="control_input"), units="N")

# --- run optimization ---
dm.run_problem(p, run_driver=True, simulate=False, simulate_kwargs={"method": "Radau", "times_per_seg": 10})

# --- check outputs ---
# objective value
obj = p.get_val("traj.phase.states:energy", units="N**2*s")[-1]
assert_near_equal(obj, 58.83924863, tolerance=1e-3)
assert_near_equal(obj, 58.8839489745, tolerance=1e-3)


if __name__ == "___main__":
Expand Down

0 comments on commit 135ed31

Please sign in to comment.