def __init__(self, n=10, derivs=False): super(BruteForceSellarProblem, self).__init__(impl=impl) root = self.root = Group() if not derivs: root.deriv_options['type'] = 'fd' sellars = root.add('sellars', ParallelGroup()) for i in range(n): name = 'sellar%i' % i sellars.add(name, SellarDerivatives()) root.connect('dist_x', 'sellars.' + name + '.x', src_indices=[i]) root.connect('dist_z', 'sellars.' + name + '.z', src_indices=[i * 2, i * 2 + 1]) root.connect('sellars.' + name + '.obj', 'collect.obj_%i' % i) root.connect('sellars.' + name + '.con1', 'collect.con1_%i' % i) root.connect('sellars.' + name + '.con2', 'collect.con2_%i' % i) root.add('indep', IndepVarComp([('x', 1.0), ('z', np.array([5.0, 2.0]))]), promotes=['x', 'z']) root.add( 'random', Randomize( n=n, params=[ # name, value, std dev ('x', 1.0, 1e-2), ('z', np.array([5.0, 2.0]), 1e-2) ]), promotes=['x', 'z', 'dist_x', 'dist_z']) root.add('collect', Collector(n=n, names=['obj', 'con1', 'con2']), promotes=['obj', 'con1', 'con2']) # top level driver setup self.driver = ScipyOptimizer() self.driver.options['optimizer'] = 'SLSQP' self.driver.options['tol'] = 1.0e-8 self.driver.options['maxiter'] = 50 self.driver.options['disp'] = False self.driver.add_desvar('z', lower=np.array([-10.0, 0.0]), upper=np.array([10.0, 10.0])) self.driver.add_desvar('x', lower=0.0, upper=10.0) self.driver.add_objective('obj') self.driver.add_constraint('con1', upper=0.0) self.driver.add_constraint('con2', upper=0.0)
def cobyla_optimize(iteration_count, dimensions): top = Problem() root = top.root = Group() root.add('p', RosenbrockMultiDim(dimensions)) top.driver = ScipyOptimizer() top.driver.options['optimizer'] = 'COBYLA' top.driver.options['maxiter'] = iteration_count top.driver.add_objective('p.f') for i in range(dimensions): componentName = 'p{0}'.format(i) variableName = 'x{0}'.format(i) portName = '{0}.{1}'.format(componentName, variableName) root.add(componentName, IndepVarComp(variableName, 0.0)) root.connect(portName, 'p.{0}'.format(variableName)) top.driver.add_desvar(portName, lower=-50, upper=50) top.setup() top.run() result_x = [] for i in range(dimensions): result_x.append(top['p.x{0}'.format(i)]) print('\n') print('Minimum of {0} found at {1}'.format(top['p.f'], result_x)) return top['p.f']
def test_opt_cylinder(self): # this is just here to make sure that the cylinder optimization works normally so # we know if the opt of the nested cylinder fails it's not due to some cylinder # model issue. prob = Problem(root=CylinderGroup()) prob.driver = ScipyOptimizer() prob.driver.options['optimizer'] = 'SLSQP' prob.driver.options['disp'] = False prob.driver.add_desvar("indep.r", lower=0.0, upper=1.e99) prob.driver.add_desvar("indep.h", lower=0.0, upper=1.e99) prob.driver.add_objective("cylinder.area") prob.driver.add_constraint("cylinder.volume", equals=1.5) prob.setup(check=False) prob.run() for name, opt in cylinder_opts: self.assertAlmostEqual(prob[name], opt, places=4, msg="%s should be %s, but got %s" % (name, opt, prob[name])) self.assertAlmostEqual(prob['cylinder.volume'], 1.5, places=4, msg="volume should be 1.5, but got %s" % prob['cylinder.volume'])
def main(): print("Bayesopt OpenMDAO Optimizer example") top = Problem() root = top.root = Group() # Initial value of x and y set in the IndepVarComp. root.add('p1', IndepVarComp('x', 13.0)) root.add('p2', IndepVarComp('y', -14.0)) root.add('p', Paraboloid()) root.connect('p1.x', 'p.x') root.connect('p2.y', 'p.y') top.driver = ScipyOptimizer() top.driver.options['optimizer'] = 'COBYLA' top.driver.add_desvar('p1.x', lower=-50, upper=50) top.driver.add_desvar('p2.y', lower=-50, upper=50) top.driver.add_objective('p.f_xy') top.setup() # You can also specify initial values post-setup top['p1.x'] = 3.0 top['p2.y'] = -4.0 top.run() print('\n') print('Minimum of %f found at (%f, %f)' % (top['p.f_xy'], top['p.x'], top['p.y']))
def test_index_array_param(self): prob = Problem() prob.root = SellarStateConnection() prob.driver = ScipyOptimizer() prob.driver.options['optimizer'] = 'SLSQP' prob.driver.options['tol'] = 1.0e-8 prob.driver.add_desvar('z', lower=np.array([-10.0]), upper=np.array([10.0]), indices=[0]) prob.driver.add_desvar('x', lower=0.0, upper=10.0) prob.driver.add_objective('obj') prob.driver.add_constraint('con1', upper=0.0) prob.driver.add_constraint('con2', upper=0.0) prob.driver.options['disp'] = False prob.setup(check=False) prob['z'][1] = 5.0 prob.run() assert_rel_error(self, prob['z'][0], 0.1005, 1e-3) assert_rel_error(self, prob['z'][1], 5.0, 1e-3) assert_rel_error(self, prob['x'], 0.0, 1e-3)
def test_sellar_state_connection(self): top = Problem() top.root = SellarStateConnection() top.driver = ScipyOptimizer() top.driver.options['optimizer'] = 'SLSQP' top.driver.options['tol'] = 1.0e-8 top.driver.options['disp'] = False top.driver.add_desvar('z', lower=np.array([-10.0, 0.0]), upper=np.array([10.0, 10.0])) top.driver.add_desvar('x', lower=0.0, upper=10.0) top.driver.add_objective('obj') top.driver.add_constraint('con1', upper=0.0) top.driver.add_constraint('con2', upper=0.0) top.setup(check=False) top.run() assert_rel_error(self, top['z'][0], 1.977639, 1e-5) assert_rel_error(self, top['z'][1], 0.0, 1e-5) assert_rel_error(self, top['x'], 0.0, 1e-5) assert_rel_error(self, top['obj'], 3.1833940, 1e-5)
def test_sellar_sand_architecture(self): top = Problem() top.root = SellarSAND() top.driver = ScipyOptimizer() top.driver.options['optimizer'] = 'SLSQP' top.driver.options['tol'] = 1.0e-12 top.driver.options['disp'] = False top.driver.add_desvar('z', lower=np.array([-10.0, 0.0]), upper=np.array([10.0, 10.0])) top.driver.add_desvar('x', lower=0.0, upper=10.0) top.driver.add_desvar('y1', lower=-10.0, upper=10.0) top.driver.add_desvar('y2', lower=-10.0, upper=10.0) top.driver.add_objective('obj') top.driver.add_constraint('con1', upper=0.0) top.driver.add_constraint('con2', upper=0.0) top.driver.add_constraint('resid1', equals=0.0) top.driver.add_constraint('resid2', equals=0.0) top.setup(check=False) top.run() assert_rel_error(self, top['z'][0], 1.9776, 1e-3) assert_rel_error(self, top['z'][1], 0.0000, 1e-3) assert_rel_error(self, top['x'], 0.0000, 1e-3) assert_rel_error(self, top['d1.y1'], 3.1600, 1e-3) assert_rel_error(self, top['d1.y2'], 3.7553, 1e-3) assert_rel_error(self, top['obj'], 3.1834, 1e-3)
def test_paraboloid_optimize_unconstrained(self): top = Problem() root = top.root = Group() root.add('p1', IndepVarComp('x', 3.0)) root.add('p2', IndepVarComp('y', -4.0)) root.add('p', ParaboloidOptUnCon()) root.connect('p1.x', 'p.x') root.connect('p2.y', 'p.y') top.driver = ScipyOptimizer() top.driver.options['optimizer'] = 'SLSQP' top.driver.options['disp'] = False top.driver.add_desvar('p1.x', lower=-50, upper=50) top.driver.add_desvar('p2.y', lower=-50, upper=50) top.driver.add_objective('p.f_xy') top.setup(check=False) top.run() assert_rel_error(self, top['p.x'], 6.666667, 1e-6) assert_rel_error(self, top['p.y'], -7.333333, 1e-6)
def test_beam_tutorial(self): top = Problem() top.root = BeamTutorial() top.driver = ScipyOptimizer() top.driver.options['optimizer'] = 'SLSQP' top.driver.options['tol'] = 1.0e-8 top.driver.options['maxiter'] = 10000 #maximum number of solver iterations top.driver.options['disp'] = False #room length and width bounds top.driver.add_desvar('ivc_rlength.room_length', lower=5.0*12.0, upper=50.0*12.0) #domain: 1in <= length <= 50ft top.driver.add_desvar('ivc_rwidth.room_width', lower=5.0*12.0, upper=30.0*12.0) #domain: 1in <= width <= 30ft top.driver.add_objective('d_neg_area.neg_room_area') #minimize negative area (or maximize area) top.driver.add_constraint('d_len_minus_wid.length_minus_width', lower=0.0) #room_length >= room_width top.driver.add_constraint('d_deflection.deflection', lower=720.0) #deflection >= 720 top.driver.add_constraint('d_bending.bending_stress_ratio', upper=0.5) #bending < 0.5 top.driver.add_constraint('d_shear.shear_stress_ratio', upper=1.0/3.0) #shear < 1/3 top.setup(check=False) top.run() assert_rel_error(self, -top['d_neg_area.neg_room_area'], 51655.257618, .01) assert_rel_error(self, top['ivc_rwidth.room_width'], 227.277956, .01) assert_rel_error(self,top['ivc_rlength.room_length'], 227.277904, .01) assert_rel_error(self,top['d_deflection.deflection'], 720, .01) assert_rel_error(self,top['d_bending.bending_stress_ratio'], 0.148863, .001) assert_rel_error(self,top['d_shear.shear_stress_ratio'], 0.007985, .0001)
def test_scipy_optimizer_simple_paraboloid_unconstrained(self): prob = Problem() model = prob.model = Group() model.add_subsystem('p1', IndepVarComp('x', 50.0), promotes=['*']) model.add_subsystem('p2', IndepVarComp('y', 50.0), promotes=['*']) model.add_subsystem('comp', Paraboloid(), promotes=['*']) prob.set_solver_print(level=0) prob.driver = ScipyOptimizer(optimizer='SLSQP', tol=1e-9, disp=False) model.add_design_var('x', lower=-50.0, upper=50.0) model.add_design_var('y', lower=-50.0, upper=50.0) model.add_objective('f_xy') prob.setup(check=False) failed = prob.run_driver() self.assertFalse( failed, "Optimization failed, result =\n" + str(prob.driver.result)) assert_rel_error(self, prob['x'], 6.66666667, 1e-6) assert_rel_error(self, prob['y'], -7.3333333, 1e-6)
def test_paraboloid_optimize_constrained_explicit_infinite_bounds(self): top = Problem() root = top.root = Group() root.add('p1', IndepVarComp('x', 3.0)) root.add('p2', IndepVarComp('y', -4.0)) root.add('p', ParaboloidOptCon()) # Constraint Equation root.add('con', ExecComp('c = x-y')) root.connect('p1.x', 'p.x') root.connect('p2.y', 'p.y') root.connect('p.x', 'con.x') root.connect('p.y', 'con.y') top.driver = ScipyOptimizer() top.driver.options['optimizer'] = 'SLSQP' top.driver.options['disp'] = False top.driver.add_desvar('p1.x', lower=-inf_bound, upper=50) top.driver.add_desvar('p2.y', lower=-50, upper=inf_bound) top.driver.add_objective('p.f_xy') top.driver.add_constraint('con.c', lower=15.0, upper=inf_bound) top.setup(check=False) top.run() assert_rel_error(self, top['p.x'], 7.166667, 1e-6) assert_rel_error(self, top['p.y'], -7.833333, 1e-6)
def test_feature_run_driver(self): import numpy as np from openmdao.api import Problem, NonlinearBlockGS, ScipyOptimizer from openmdao.test_suite.components.sellar import SellarDerivatives prob = Problem() model = prob.model = SellarDerivatives() model.nonlinear_solver = NonlinearBlockGS() prob.driver = ScipyOptimizer() prob.driver.options['optimizer'] = 'SLSQP' prob.driver.options['tol'] = 1e-9 model.add_design_var('z', lower=np.array([-10.0, 0.0]), upper=np.array([10.0, 10.0])) model.add_design_var('x', lower=0.0, upper=10.0) model.add_objective('obj') model.add_constraint('con1', upper=0.0) model.add_constraint('con2', upper=0.0) prob.setup() prob.run_driver() assert_rel_error(self, prob['x'], 0.0, 1e-5) assert_rel_error(self, prob['y1'], 3.160000, 1e-2) assert_rel_error(self, prob['y2'], 3.755278, 1e-2) assert_rel_error(self, prob['z'], [1.977639, 0.000000], 1e-2) assert_rel_error(self, prob['obj'], 3.18339395, 1e-2)
def test_unconstrainted(self): from openmdao.api import Problem, ScipyOptimizer, IndepVarComp # We'll use the component that was defined in the last tutorial from openmdao.test_suite.components.paraboloid import Paraboloid # build the model prob = Problem() indeps = prob.model.add_subsystem('indeps', IndepVarComp()) indeps.add_output('x', 3.0) indeps.add_output('y', -4.0) prob.model.add_subsystem('paraboloid', Paraboloid()) prob.model.connect('indeps.x', 'paraboloid.x') prob.model.connect('indeps.y', 'paraboloid.y') # setup the optimization prob.driver = ScipyOptimizer() prob.driver.options['optimizer'] = 'COBYLA' prob.model.add_design_var('indeps.x', lower=-50, upper=50) prob.model.add_design_var('indeps.y', lower=-50, upper=50) prob.model.add_objective('paraboloid.f_xy') prob.setup() prob.run_driver() # minimum value assert_rel_error(self, prob['paraboloid.f_xy'], -27.33333, 1e-6) # location of the minimum assert_rel_error(self, prob['indeps.x'], 6.6667, 1e-4) assert_rel_error(self, prob['indeps.y'], -7.33333, 1e-4)
def test_Sellar_SLSQP(self): prob = Problem() prob.root = SellarDerivatives() prob.driver = ScipyOptimizer() prob.driver.options['optimizer'] = 'SLSQP' prob.driver.options['tol'] = 1.0e-8 prob.driver.add_desvar('z', lower=np.array([-10.0, 0.0]), upper=np.array([10.0, 10.0])) prob.driver.add_desvar('x', lower=0.0, upper=10.0) prob.driver.add_objective('obj') prob.driver.add_constraint('con1', upper=0.0) prob.driver.add_constraint('con2', upper=0.0) prob.driver.options['disp'] = False prob.setup(check=False) prob.run() assert_rel_error(self, prob['z'][0], 1.9776, 1e-3) assert_rel_error(self, prob['z'][1], 0.0, 1e-3) assert_rel_error(self, prob['x'], 0.0, 1e-3)
def test_simple_array_comp2D(self): prob = Problem() root = prob.root = Group() root.add('p1', IndepVarComp('x', np.zeros((2, 2))), promotes=['*']) root.add('comp', ArrayComp2D(), promotes=['*']) root.add('con', ExecComp('c = y - 20.0', c=np.zeros((2, 2)), y=np.zeros((2, 2))), promotes=['*']) root.add('obj', ExecComp('o = y[0, 0]', y=np.zeros((2, 2))), promotes=['*']) prob.driver = ScipyOptimizer() prob.driver.options['optimizer'] = 'SLSQP' prob.driver.add_desvar('x', lower=-50.0, upper=50.0) prob.driver.add_objective('o') prob.driver.add_constraint('c', equals=0.0) prob.driver.options['disp'] = False prob.setup(check=False) prob.run() obj = prob['o'] assert_rel_error(self, obj, 20.0, 1e-6)
def test_unsupported_equality(self): prob = Problem() model = prob.model = Group() model.add_subsystem('p1', IndepVarComp('x', 50.0), promotes=['*']) model.add_subsystem('p2', IndepVarComp('y', 50.0), promotes=['*']) model.add_subsystem('comp', Paraboloid(), promotes=['*']) model.add_subsystem('con', ExecComp('c = - x + y'), promotes=['*']) prob.set_solver_print(level=0) prob.driver = ScipyOptimizer() prob.driver.options['optimizer'] = 'COBYLA' prob.driver.options['tol'] = 1e-9 prob.driver.options['disp'] = False model.add_design_var('x', lower=-50.0, upper=50.0) model.add_design_var('y', lower=-50.0, upper=50.0) model.add_objective('f_xy') model.add_constraint('c', equals=-15.0) prob.setup(check=False) with self.assertRaises(Exception) as raises_cm: prob.run_driver() exception = raises_cm.exception msg = "Constraints of type 'eq' not handled by COBYLA." self.assertEqual(exception.args[0], msg)
def test_beam_tutorial_viewtree(self): top = Problem() top.root = BeamTutorial() top.driver = ScipyOptimizer() top.driver.options['optimizer'] = 'SLSQP' top.driver.options['tol'] = 1.0e-8 top.driver.options['maxiter'] = 10000 #maximum number of solver iterations top.driver.options['disp'] = False #room length and width bounds top.driver.add_desvar('ivc_rlength.room_length', lower=5.0*12.0, upper=50.0*12.0) #domain: 1in <= length <= 50ft top.driver.add_desvar('ivc_rwidth.room_width', lower=5.0*12.0, upper=30.0*12.0) #domain: 1in <= width <= 30ft top.driver.add_objective('d_neg_area.neg_room_area') #minimize negative area (or maximize area) top.driver.add_constraint('d_len_minus_wid.length_minus_width', lower=0.0) #room_length >= room_width top.driver.add_constraint('d_deflection.deflection', lower=720.0) #deflection >= 720 top.driver.add_constraint('d_bending.bending_stress_ratio', upper=0.5) #bending < 0.5 top.driver.add_constraint('d_shear.shear_stress_ratio', upper=1.0/3.0) #shear < 1/3 top.setup(check=False) from openmdao.api import view_tree view_tree(top, show_browser=False) import os.path self.assertTrue(os.path.isfile('partition_tree_n2.html')) os.remove('partition_tree_n2.html')
def test_simple_paraboloid_scaled_objective_rev(self): prob = Problem() model = prob.model = Group() prob.set_solver_print(level=0) model.add_subsystem('p1', IndepVarComp('x', 50.0), promotes=['*']) model.add_subsystem('p2', IndepVarComp('y', 50.0), promotes=['*']) model.add_subsystem('comp', Paraboloid(), promotes=['*']) model.add_subsystem('con', ExecComp('c = x - y'), promotes=['*']) prob.driver = ScipyOptimizer() prob.driver.options['optimizer'] = 'SLSQP' prob.driver.options['tol'] = 1e-9 prob.driver.options['disp'] = False model.add_design_var('x', lower=-50.0, upper=50.0) model.add_design_var('y', lower=-50.0, upper=50.0) model.add_objective('f_xy', ref=10.) model.add_constraint('c', lower=10.0, upper=11.0) prob.setup(check=False, mode='rev') prob.run_driver() # Minimum should be at (7.166667, -7.833334) assert_rel_error(self, prob['x'] - prob['y'], 11.0, 1e-6)
def test(self): import numpy as np from openmdao.api import Problem, ScipyOptimizer from openmdao.test_suite.test_examples.beam_optimization.beam_group import BeamGroup E = 1. L = 1. b = 0.1 volume = 0.01 num_elements = 50 prob = Problem(model=BeamGroup(E=E, L=L, b=b, volume=volume, num_elements=num_elements)) prob.driver = ScipyOptimizer() prob.driver.options['optimizer'] = 'SLSQP' prob.driver.options['tol'] = 1e-9 prob.driver.options['disp'] = True prob.setup() prob.run_driver() print(prob['inputs_comp.h'])
def test_simple_paraboloid_equality(self): prob = Problem() model = prob.model = Group() model.add_subsystem('p1', IndepVarComp('x', 50.0), promotes=['*']) model.add_subsystem('p2', IndepVarComp('y', 50.0), promotes=['*']) model.add_subsystem('comp', Paraboloid(), promotes=['*']) model.add_subsystem('con', ExecComp('c = - x + y'), promotes=['*']) prob.set_solver_print(level=0) prob.driver = ScipyOptimizer() prob.driver.options['optimizer'] = 'SLSQP' prob.driver.options['tol'] = 1e-9 prob.driver.options['disp'] = False model.add_design_var('x', lower=-50.0, upper=50.0) model.add_design_var('y', lower=-50.0, upper=50.0) model.add_objective('f_xy') model.add_constraint('c', equals=-15.0) prob.setup(check=False) prob.run_driver() # Minimum should be at (7.166667, -7.833334) # (Note, loose tol because of appveyor py3.4 machine.) assert_rel_error(self, prob['x'], 7.16667, 1e-4) assert_rel_error(self, prob['y'], -7.833334, 1e-4)
def test_simple_array_comp2D_dbl_sided_con_array(self): prob = Problem() model = prob.model = Group() model.add_subsystem('p1', IndepVarComp('widths', np.zeros((2, 2))), promotes=['*']) model.add_subsystem('comp', TestExplCompArrayDense(), promotes=['*']) model.add_subsystem('obj', ExecComp('o = areas[0, 0]', areas=np.zeros( (2, 2))), promotes=['*']) prob.set_solver_print(level=0) prob.driver = ScipyOptimizer() prob.driver.options['optimizer'] = 'SLSQP' prob.driver.options['tol'] = 1e-9 prob.driver.options['disp'] = False model.add_design_var('widths', lower=-50.0, upper=50.0) model.add_objective('o') model.add_constraint('areas', lower=20.0, upper=20.0) prob.setup(check=False) prob.run_driver() obj = prob['o'] assert_rel_error(self, obj, 20.0, 1e-6)
def test_root_derivs_array(self): prob = Problem() prob.root = SellarDerivativesGrouped() prob.driver = ScipyOptimizer() prob.driver.options['optimizer'] = 'SLSQP' prob.driver.options['tol'] = 1.0e-8 prob.driver.options['disp'] = False prob.driver.add_desvar('z', lower=np.array([-10.0, 0.0]), upper=np.array([10.0, 10.0])) prob.driver.add_desvar('x', lower=0.0, upper=10.0) prob.driver.add_objective('obj') prob.driver.add_constraint('con1', upper=0.0) prob.driver.add_constraint('con2', upper=0.0) prob.driver.add_recorder(self.recorder) self.recorder.options['record_metadata'] = False self.recorder.options['record_derivs'] = True prob.setup(check=False) prob.run() prob.cleanup() sout = open(self.filename) lines = sout.readlines() self.assertEqual(lines[14].rstrip(), 'Derivatives:') self.assertTrue('9.61' in lines[15]) self.assertTrue('0.784' in lines[16]) self.assertTrue('1.077' in lines[17])
def test_simple_paraboloid_unconstrained(self): prob = Problem() model = prob.model = Group() model.add_subsystem('p1', IndepVarComp('x', 50.0), promotes=['*']) model.add_subsystem('p2', IndepVarComp('y', 50.0), promotes=['*']) model.add_subsystem('comp', Paraboloid(), promotes=['*']) prob.set_solver_print(level=0) prob.driver = ScipyOptimizer() prob.driver.options['optimizer'] = 'SLSQP' prob.driver.options['tol'] = 1e-9 prob.driver.options['disp'] = False model.add_design_var('x', lower=-50.0, upper=50.0) model.add_design_var('y', lower=-50.0, upper=50.0) model.add_objective('f_xy') prob.setup(check=False) prob.run_driver() assert_rel_error(self, prob['x'], 6.66666667, 1e-6) assert_rel_error(self, prob['y'], -7.3333333, 1e-6)
def test_feature_basic(self): from openmdao.api import Problem, Group, IndepVarComp, ScipyOptimizer from openmdao.test_suite.components.paraboloid import Paraboloid prob = Problem() model = prob.model = Group() model.add_subsystem('p1', IndepVarComp('x', 50.0), promotes=['*']) model.add_subsystem('p2', IndepVarComp('y', 50.0), promotes=['*']) model.add_subsystem('comp', Paraboloid(), promotes=['*']) prob.driver = ScipyOptimizer() prob.driver.options['optimizer'] = 'SLSQP' prob.driver.options['tol'] = 1e-9 prob.driver.options['disp'] = True model.add_design_var('x', lower=-50.0, upper=50.0) model.add_design_var('y', lower=-50.0, upper=50.0) model.add_objective('f_xy') prob.setup() prob.run_driver() assert_rel_error(self, prob['x'], 6.66666667, 1e-6) assert_rel_error(self, prob['y'], -7.3333333, 1e-6)
def test_driver_records_unknown_types_metadata(self): prob = Problem() root = prob.root = Group() # Need an optimization problem to test to make sure # the is_desvar, is_con, is_obj metadata is being # recorded for the Unknowns root.add('p1', IndepVarComp('x', 50.0)) root.add('p2', IndepVarComp('y', 50.0)) root.add('comp', Paraboloid()) root.connect('p1.x', 'comp.x') root.connect('p2.y', 'comp.y') prob.driver = ScipyOptimizer() prob.driver.options['optimizer'] = 'SLSQP' prob.driver.add_desvar('p1.x', lower=-50.0, upper=50.0) prob.driver.add_desvar('p2.y', lower=-50.0, upper=50.0) prob.driver.add_objective('comp.f_xy') prob.driver.options['disp'] = False prob.driver.add_recorder(self.recorder) self.recorder.options['record_metadata'] = True prob.setup(check=False) prob.cleanup() # close recorders expected_params = list(iteritems(prob.root.params)) expected_unknowns = list(iteritems(prob.root.unknowns)) expected_resids = list(iteritems(prob.root.resids)) self.assertMetadataRecorded( (expected_params, expected_unknowns, expected_resids))
def test_driver_param_indices_slsqp_force_fd(self): """ Test driver param indices with ScipyOptimizer SLSQP and force_fd=True """ prob = Problem() prob.root = SellarStateConnection() prob.root.fd_options['force_fd'] = True prob.driver = ScipyOptimizer() prob.driver.options['optimizer'] = 'SLSQP' prob.driver.options['tol'] = 1.0e-8 prob.driver.options['disp'] = False prob.driver.add_desvar('z', lower=np.array([-10.0]), upper=np.array([10.0]), indices=[0]) prob.driver.add_desvar('x', lower=0.0, upper=10.0) prob.driver.add_objective('obj') prob.driver.add_constraint('con1', upper=0.0) prob.driver.add_constraint('con2', upper=0.0) #prob.driver.options['disp'] = False prob.setup(check=False) prob['z'][1] = 0.0 prob.run() assert_rel_error(self, prob['z'][0], 1.9776, 1e-3) assert_rel_error(self, prob['z'][1], 0.0, 1e-3) assert_rel_error(self, prob['x'], 0.0, 1e-3)
def test_simple_paraboloid_constrained_COBYLA_upper(self): prob = Problem() root = prob.root = Group() root.add('p1', IndepVarComp('x', 50.0), promotes=['*']) root.add('p2', IndepVarComp('y', 50.0), promotes=['*']) root.add('comp', Paraboloid(), promotes=['*']) root.add('con', ExecComp('c = y - x'), promotes=['*']) prob.driver = ScipyOptimizer() prob.driver.options['optimizer'] = 'COBYLA' prob.driver.options['tol'] = 1.0e-8 prob.driver.add_desvar('x', lower=-50.0, upper=50.0) prob.driver.add_desvar('y', lower=-50.0, upper=50.0) prob.driver.add_objective('f_xy') prob.driver.add_constraint('c', upper=-15.0) prob.driver.options['disp'] = False prob.setup(check=False) prob.run() # Minimum should be at (7.166667, -7.833334) assert_rel_error(self, prob['x'], 7.16667, 1e-6) assert_rel_error(self, prob['y'], -7.833334, 1e-6)
def test_Sellar_state_SLSQP(self): """ Baseline Sellar test case without specifying indices. """ prob = Problem() prob.root = SellarStateConnection() prob.driver = ScipyOptimizer() prob.driver.options['optimizer'] = 'SLSQP' prob.driver.options['tol'] = 1.0e-8 prob.driver.add_desvar('z', lower=np.array([-10.0, 0.0]), upper=np.array([10.0, 10.0])) prob.driver.add_desvar('x', lower=0.0, upper=10.0) prob.driver.add_objective('obj') prob.driver.add_constraint('con1', upper=0.0) prob.driver.add_constraint('con2', upper=0.0) prob.driver.options['disp'] = False prob.setup(check=False) prob.run() assert_rel_error(self, prob['z'][0], 1.9776, 1e-3) assert_rel_error(self, prob['z'][1], 0.0, 1e-3) assert_rel_error(self, prob['x'], 0.0, 1e-3)
def test_sellar_opt(self): from openmdao.api import Problem, ScipyOptimizer, ExecComp, IndepVarComp, DirectSolver from openmdao.test_suite.components.sellar_feature import SellarMDA prob = Problem() prob.model = SellarMDA() prob.driver = ScipyOptimizer() prob.driver.options['optimizer'] = 'SLSQP' # prob.driver.options['maxiter'] = 100 prob.driver.options['tol'] = 1e-8 prob.model.add_design_var('x', lower=0, upper=10) prob.model.add_design_var('z', lower=0, upper=10) prob.model.add_objective('obj') prob.model.add_constraint('con1', upper=0) prob.model.add_constraint('con2', upper=0) prob.setup() prob.set_solver_print(level=0) # Ask OpenMDAO to finite-difference across the model to compute the gradients for the optimizer prob.model.approx_totals() prob.run_driver() print('minimum found at') assert_rel_error(self, prob['x'][0], 0., 1e-5) assert_rel_error(self, prob['z'], [1.977639, 0.], 1e-5) print('minumum objective') assert_rel_error(self, prob['obj'][0], 3.18339395045, 1e-5)
def test_simple_paraboloid_scaled_constraint_rev(self): prob = Problem() root = prob.root = Group() root.add('p1', IndepVarComp('x', 50.0), promotes=['*']) root.add('p2', IndepVarComp('y', 50.0), promotes=['*']) root.add('comp', Paraboloid(), promotes=['*']) root.add('con', ExecComp('c = x - y'), promotes=['*']) prob.driver = ScipyOptimizer() prob.driver.options['optimizer'] = 'SLSQP' prob.driver.options['tol'] = 1.0e-8 prob.driver.options['disp'] = False prob.driver.add_desvar('x', lower=-50.0, upper=50.0) prob.driver.add_desvar('y', lower=-50.0, upper=50.0) prob.driver.add_objective('f_xy') prob.driver.add_constraint('c', lower=10.0, upper=11.0, scaler=1 / 10.) root.ln_solver.options['mode'] = 'rev' prob.setup(check=False) prob.run() # Minimum should be at (7.166667, -7.833334) assert_rel_error(self, prob['x'] - prob['y'], 11.0, 1e-6)
def __init__(self, n=10, derivs=False): super(BruteForceSellarProblem, self).__init__(impl=impl) root = self.root = Group() if not derivs: root.deriv_options["type"] = "fd" sellars = root.add("sellars", ParallelGroup()) for i in range(n): name = "sellar%i" % i sellars.add(name, SellarDerivatives()) root.connect("dist_x", "sellars." + name + ".x", src_indices=[i]) root.connect("dist_z", "sellars." + name + ".z", src_indices=[i * 2, i * 2 + 1]) root.connect("sellars." + name + ".obj", "collect.obj_%i" % i) root.connect("sellars." + name + ".con1", "collect.con1_%i" % i) root.connect("sellars." + name + ".con2", "collect.con2_%i" % i) root.add("indep", IndepVarComp([("x", 1.0), ("z", np.array([5.0, 2.0]))]), promotes=["x", "z"]) root.add( "random", Randomize( n=n, params=[ # name, value, std dev ("x", 1.0, 1e-2), ("z", np.array([5.0, 2.0]), 1e-2), ], ), promotes=["x", "z", "dist_x", "dist_z"], ) root.add("collect", Collector(n=n, names=["obj", "con1", "con2"]), promotes=["obj", "con1", "con2"]) # top level driver setup self.driver = ScipyOptimizer() self.driver.options["optimizer"] = "SLSQP" self.driver.options["tol"] = 1.0e-8 self.driver.options["maxiter"] = 50 self.driver.options["disp"] = False self.driver.add_desvar("z", lower=np.array([-10.0, 0.0]), upper=np.array([10.0, 10.0])) self.driver.add_desvar("x", lower=0.0, upper=10.0) self.driver.add_objective("obj") self.driver.add_constraint("con1", upper=0.0) self.driver.add_constraint("con2", upper=0.0)
def __init__(self, n=10, derivs=False): super(BruteForceSellarProblem, self).__init__(impl=impl) root = self.root = Group() if not derivs: root.deriv_options['type'] = 'fd' sellars = root.add('sellars', ParallelGroup()) for i in range(n): name = 'sellar%i' % i sellars.add(name, SellarDerivatives()) root.connect('dist_x', 'sellars.'+name+'.x', src_indices=[i]) root.connect('dist_z', 'sellars.'+name+'.z', src_indices=[i*2, i*2+1]) root.connect('sellars.'+name+'.obj', 'collect.obj_%i' % i) root.connect('sellars.'+name+'.con1', 'collect.con1_%i' % i) root.connect('sellars.'+name+'.con2', 'collect.con2_%i' % i) root.add('indep', IndepVarComp([ ('x', 1.0), ('z', np.array([5.0, 2.0])) ]), promotes=['x', 'z']) root.add('random', Randomize(n=n, params=[ # name, value, std dev ('x', 1.0, 1e-2), ('z', np.array([5.0, 2.0]), 1e-2) ]), promotes=['x', 'z', 'dist_x', 'dist_z']) root.add('collect', Collector(n=n, names=['obj', 'con1', 'con2']), promotes=['obj', 'con1', 'con2']) # top level driver setup self.driver = ScipyOptimizer() self.driver.options['optimizer'] = 'SLSQP' self.driver.options['tol'] = 1.0e-8 self.driver.options['maxiter'] = 50 self.driver.options['disp'] = False self.driver.add_desvar('z', lower=np.array([-10.0, 0.0]), upper=np.array([ 10.0, 10.0])) self.driver.add_desvar('x', lower=0.0, upper=10.0) self.driver.add_objective('obj') self.driver.add_constraint('con1', upper=0.0) self.driver.add_constraint('con2', upper=0.0)
def setUp(self): solver = 'SLSQP' num_seg = 10 seg_ncn = 2 rel_lengths = 'lgl' # Instantiate a problem and set it's root to an empty Trajectory prob = Problem() prob.add_traj(Trajectory("traj0")) if solver == 'SNOPT' and pyOptSparseDriver is not None: driver = pyOptSparseDriver() driver.options['optimizer'] = solver driver.opt_settings['Major iterations limit'] = 1000 driver.opt_settings['iSumm'] = 6 driver.opt_settings['Major step limit'] = 0.5 driver.opt_settings["Major feasibility tolerance"] = 1.0E-5 driver.opt_settings["Major optimality tolerance"] = 1.0E-5 driver.opt_settings["Minor feasibility tolerance"] = 1.0E-4 driver.opt_settings['Verify level'] = 3 else: driver = ScipyOptimizer() driver.options['tol'] = 1.0E-6 driver.options['disp'] = True driver.options['maxiter'] = 500 prob.driver = driver dynamic_controls = [{'name': 'theta', 'units': 'rad'}, {'name': 'psi', 'units': 'rad'}] static_controls = [{'name': 'mass', 'units': 'kg'}, {'name': 'g', 'units': 'm/s/s'}, {'name': 'Cd', 'units': 'unitless'}, {'name': 'D_magnetic', 'units': 'N'}, {'name': 'R', 'units': 'J/(kg*K)'}, {'name': 'S', 'units': 'm**2'}, {'name': 'T_ambient', 'units': 'K'}, {'name': 'p_tube', 'units': 'Pa'}] phase0 = CollocationPhase(name='phase0', rhs_class=MagnePlaneRHS, num_seg=num_seg, seg_ncn=seg_ncn, rel_lengths=rel_lengths, dynamic_controls=dynamic_controls, static_controls=static_controls) prob.trajectories["traj0"].add_phase(phase0) phase0.set_state_options('x', lower=0, upper=100, ic_val=0, ic_fix=True, fc_val=10, fc_fix=True, scaler=10.0, defect_scaler=0.1) phase0.set_state_options('y', lower=0, upper=0, ic_val=0, ic_fix=True, fc_val=0, fc_fix=True, scaler=10.0, defect_scaler=0.1) phase0.set_state_options('z', lower=-10, upper=10, ic_val=-10, ic_fix=True, fc_val=-5, fc_fix=True, scaler=10.0, defect_scaler=0.1) phase0.set_state_options('v', lower=0, upper=np.inf, ic_val=0.0, ic_fix=True, fc_val=10.0, fc_fix=False, scaler=10.0, defect_scaler=0.1) phase0.set_dynamic_control_options('theta', ic_val=-1.57, fc_val=0.2, opt=True, lower=-1.58, upper=1.58, scaler=0.01) phase0.set_dynamic_control_options('psi', ic_val=0.0, fc_val=0.0, opt=True, lower=0.0, upper=0.0, scaler=0.01) phase0.set_static_control_options(name='g', val=9.80665, opt=False) phase0.set_static_control_options(name='mass', val=1200, opt=False) phase0.set_static_control_options(name='Cd', val=0.0, opt=False) phase0.set_static_control_options(name='S', val=0.0, opt=False) phase0.set_static_control_options(name='p_tube', val=0.0, opt=False) phase0.set_static_control_options(name='T_ambient', val=298.0, opt=False) phase0.set_static_control_options(name='R', val=287.0, opt=False) # Set D_magnetic equal to the thrust value for now, no net forces # on the pod except gravity. phase0.set_static_control_options(name='D_magnetic', val=30000.0, opt=False) phase0.set_time_options(t0_val=0, t0_lower=0, t0_upper=0, tp_val=1.81, tp_lower=0.5, tp_upper=10.0) prob.trajectories["traj0"].add_objective(name="t", phase="phase0", place="end", scaler=1.0) # Do top-level FD prob.root.deriv_options['type'] = 'fd' self.prob = prob
class BruteForceSellarProblem(Problem): """ Performs optimization on the Sellar problem. Applies a normal distribution to the design vars and runs all of the samples, then collects the values of all of the outputs, calculates the mean of those and stuffs that back into the unknowns vector. This is the brute force version that just stamps out N separate sellar models in a parallel group and sets the input of each one to be one of these random design vars. Args ---- n : number of randomized points to generate for each input value derivs : if True, use user-defined derivatives, else use Finite Difference """ def __init__(self, n=10, derivs=False): super(BruteForceSellarProblem, self).__init__(impl=impl) root = self.root = Group() if not derivs: root.deriv_options['type'] = 'fd' sellars = root.add('sellars', ParallelGroup()) for i in range(n): name = 'sellar%i' % i sellars.add(name, SellarDerivatives()) root.connect('dist_x', 'sellars.'+name+'.x', src_indices=[i]) root.connect('dist_z', 'sellars.'+name+'.z', src_indices=[i*2, i*2+1]) root.connect('sellars.'+name+'.obj', 'collect.obj_%i' % i) root.connect('sellars.'+name+'.con1', 'collect.con1_%i' % i) root.connect('sellars.'+name+'.con2', 'collect.con2_%i' % i) root.add('indep', IndepVarComp([ ('x', 1.0), ('z', np.array([5.0, 2.0])) ]), promotes=['x', 'z']) root.add('random', Randomize(n=n, params=[ # name, value, std dev ('x', 1.0, 1e-2), ('z', np.array([5.0, 2.0]), 1e-2) ]), promotes=['x', 'z', 'dist_x', 'dist_z']) root.add('collect', Collector(n=n, names=['obj', 'con1', 'con2']), promotes=['obj', 'con1', 'con2']) # top level driver setup self.driver = ScipyOptimizer() self.driver.options['optimizer'] = 'SLSQP' self.driver.options['tol'] = 1.0e-8 self.driver.options['maxiter'] = 50 self.driver.options['disp'] = False self.driver.add_desvar('z', lower=np.array([-10.0, 0.0]), upper=np.array([ 10.0, 10.0])) self.driver.add_desvar('x', lower=0.0, upper=10.0) self.driver.add_objective('obj') self.driver.add_constraint('con1', upper=0.0) self.driver.add_constraint('con2', upper=0.0)
class BruteForceSellarProblem(Problem): """ Performs optimization on the Sellar problem. Applies a normal distribution to the design vars and runs all of the samples, then collects the values of all of the outputs, calculates the mean of those and stuffs that back into the unknowns vector. This is the brute force version that just stamps out N separate sellar models in a parallel group and sets the input of each one to be one of these random design vars. Args ---- n : number of randomized points to generate for each input value derivs : if True, use user-defined derivatives, else use Finite Difference """ def __init__(self, n=10, derivs=False): super(BruteForceSellarProblem, self).__init__(impl=impl) root = self.root = Group() if not derivs: root.deriv_options["type"] = "fd" sellars = root.add("sellars", ParallelGroup()) for i in range(n): name = "sellar%i" % i sellars.add(name, SellarDerivatives()) root.connect("dist_x", "sellars." + name + ".x", src_indices=[i]) root.connect("dist_z", "sellars." + name + ".z", src_indices=[i * 2, i * 2 + 1]) root.connect("sellars." + name + ".obj", "collect.obj_%i" % i) root.connect("sellars." + name + ".con1", "collect.con1_%i" % i) root.connect("sellars." + name + ".con2", "collect.con2_%i" % i) root.add("indep", IndepVarComp([("x", 1.0), ("z", np.array([5.0, 2.0]))]), promotes=["x", "z"]) root.add( "random", Randomize( n=n, params=[ # name, value, std dev ("x", 1.0, 1e-2), ("z", np.array([5.0, 2.0]), 1e-2), ], ), promotes=["x", "z", "dist_x", "dist_z"], ) root.add("collect", Collector(n=n, names=["obj", "con1", "con2"]), promotes=["obj", "con1", "con2"]) # top level driver setup self.driver = ScipyOptimizer() self.driver.options["optimizer"] = "SLSQP" self.driver.options["tol"] = 1.0e-8 self.driver.options["maxiter"] = 50 self.driver.options["disp"] = False self.driver.add_desvar("z", lower=np.array([-10.0, 0.0]), upper=np.array([10.0, 10.0])) self.driver.add_desvar("x", lower=0.0, upper=10.0) self.driver.add_objective("obj") self.driver.add_constraint("con1", upper=0.0) self.driver.add_constraint("con2", upper=0.0)