def test_unsupported_multiple_obj(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('comp2', Paraboloid()) model.add_subsystem('con', ExecComp('c = - x + y'), promotes=['*']) prob.set_solver_print(level=0) prob.driver = pyOptSparseDriver() prob.driver.options['optimizer'] = 'SLSQP' prob.driver.options['gradient method'] = 'snopt_fd' prob.driver.options['print_results'] = 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_objective('comp2.f_xy') model.add_constraint('c', upper=-15.0) expected = 'Multiple objectives have been added to pyOptSparseDriver' \ ' but the selected optimizer (SLSQP) does not support' \ ' multiple objectives.' prob.setup(check=False) with self.assertRaises(RuntimeError) as cm: prob.final_setup() self.assertEqual(str(cm.exception), expected)
def test_regression_bug_fix_issue_2062_sql_meta_file_running_parallel(self): from openmdao.test_suite.components.paraboloid import Paraboloid prob = om.Problem() prob.model.add_subsystem('comp', Paraboloid(), promotes=['x', 'y', 'f_xy']) prob.model.add_design_var('x', lower=0.0, upper=1.0) prob.model.add_design_var('y', lower=0.0, upper=1.0) prob.model.add_objective('f_xy') prob.driver = om.DOEDriver(om.FullFactorialGenerator(levels=3)) prob.driver.options['run_parallel'] = True prob.driver.options['procs_per_model'] = 1 prob.driver.add_recorder(om.SqliteRecorder("cases.sql")) prob.setup() prob.run_driver() prob.cleanup() # Run this again. Because of the bug fix for issue 2062, this code should NOT # throw an exception prob = om.Problem() prob.model.add_subsystem('comp', Paraboloid(), promotes=['x', 'y', 'f_xy']) prob.model.add_design_var('x', lower=0.0, upper=1.0) prob.model.add_design_var('y', lower=0.0, upper=1.0) prob.model.add_objective('f_xy') prob.driver = om.DOEDriver(om.FullFactorialGenerator(levels=3)) prob.driver.options['run_parallel'] = True prob.driver.options['procs_per_model'] = 1 prob.driver.add_recorder(om.SqliteRecorder("cases.sql")) prob.setup() if prob.comm.rank == 0: expected_warnings = [ (UserWarning, 'The existing case recorder metadata file, cases.sql_meta, ' 'is being overwritten.'), (UserWarning, 'The existing case recorder file, cases.sql_0, is being ' 'overwritten.'), ] else: expected_warnings = [ (UserWarning, 'The existing case recorder file, cases.sql_1, is being ' 'overwritten.'), ] with assert_warnings(expected_warnings): prob.run_driver() prob.cleanup()
def test_sql_meta_file_exists(self): # Check that an existing sql_meta file will be deleted/overwritten # if it already exists before a run. (see Issue #2062) prob = om.Problem() prob.model.add_subsystem('comp', Paraboloid(), promotes=['x', 'y', 'f_xy']) prob.model.add_design_var('x', lower=0.0, upper=1.0) prob.model.add_design_var('y', lower=0.0, upper=1.0) prob.model.add_objective('f_xy') prob.driver = om.DOEDriver(om.FullFactorialGenerator(levels=3)) prob.driver.options['run_parallel'] = True prob.driver.options['procs_per_model'] = 1 prob.driver.add_recorder(om.SqliteRecorder("cases.sql")) prob.setup() prob.run_driver() prob.cleanup() # Run this again. It should NOT throw an exception. prob = om.Problem() prob.model.add_subsystem('comp', Paraboloid(), promotes=['x', 'y', 'f_xy']) prob.model.add_design_var('x', lower=0.0, upper=1.0) prob.model.add_design_var('y', lower=0.0, upper=1.0) prob.model.add_objective('f_xy') prob.driver = om.DOEDriver(om.FullFactorialGenerator(levels=3)) prob.driver.options['run_parallel'] = True prob.driver.options['procs_per_model'] = 1 prob.driver.add_recorder(om.SqliteRecorder("cases.sql")) prob.setup() if prob.comm.rank == 0: expected_warnings = [ (UserWarning, 'The existing case recorder metadata file, cases.sql_meta, ' 'is being overwritten.'), (UserWarning, 'The existing case recorder file, cases.sql_0, is being ' 'overwritten.'), ] else: expected_warnings = [ (UserWarning, 'The existing case recorder file, cases.sql_1, is being ' 'overwritten.'), ] with assert_warnings(expected_warnings): prob.run_driver() prob.cleanup()
def test_debug_print_option(self): from openmdao.api import Problem, Group, IndepVarComp, ScipyOptimizeDriver, ExecComp 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=['*']) model.add_subsystem('con', ExecComp('c = - x + y'), promotes=['*']) prob.set_solver_print(level=0) prob.driver = ScipyOptimizeDriver() prob.driver.options['optimizer'] = 'SLSQP' prob.driver.options['tol'] = 1e-9 prob.driver.options['disp'] = False prob.driver.options['debug_print'] = [ 'desvars', 'ln_cons', 'nl_cons', 'objs' ] 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', upper=-15.0) prob.setup(check=False) prob.run_driver()
def test_simple_paraboloid_unconstrained_COBYLA(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 = ScipyOptimizeDriver() 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') 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_snopt_fd_option_error(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 = pyOptSparseDriver() prob.driver.options['optimizer'] = 'SLSQP' prob.driver.options['gradient method'] = 'snopt_fd' prob.driver.options['print_results'] = 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', upper=-15.0) prob.setup(check=False) with self.assertRaises(Exception) as raises_cm: prob.run_driver() exception = raises_cm.exception msg = "SNOPT's internal finite difference can only be used with SNOPT" self.assertEqual(exception.args[0], msg)
def test_CMAESDriver_missing_objective(self): prob = om.Problem() prob.model.add_subsystem('x', om.IndepVarComp('x', 2.0), promotes=['*']) prob.model.add_subsystem('f_x', Paraboloid(), promotes=['*']) cma_es = CMAES() cma_es.options['verbose'] = -9 # silence output prob.driver = GenericDriver(algorithm=cma_es) prob.model.add_design_var('x', lower=0) prob.model.add_constraint('x', lower=0) prob.setup() with self.assertRaises(Exception) as raises_msg: prob.run_driver() exception = raises_msg.exception msg = "Driver requires objective to be declared" self.assertEqual(exception.args[0], msg)
def test_compute_totals_basic_return_dict(self): # Make sure 'dict' return_format works. prob = Problem() model = prob.model = Group() model.add_subsystem('p1', IndepVarComp('x', 0.0), promotes=['x']) model.add_subsystem('p2', IndepVarComp('y', 0.0), promotes=['y']) model.add_subsystem('comp', Paraboloid(), promotes=['x', 'y', 'f_xy']) prob.setup(check=False, mode='fwd') prob.set_solver_print(level=0) prob.run_model() of = ['f_xy'] wrt = ['x', 'y'] derivs = prob.compute_totals(of=of, wrt=wrt, return_format='dict') assert_rel_error(self, derivs['f_xy']['x'], [[-6.0]], 1e-6) assert_rel_error(self, derivs['f_xy']['y'], [[8.0]], 1e-6) prob.setup(check=False, mode='rev') prob.run_model() of = ['f_xy'] wrt = ['x', 'y'] derivs = prob.compute_totals(of=of, wrt=wrt, return_format='dict') assert_rel_error(self, derivs['f_xy']['x'], [[-6.0]], 1e-6) assert_rel_error(self, derivs['f_xy']['y'], [[8.0]], 1e-6)
def test_inf_as_desvar_bounds(self): # User may use np.inf as a bound. It is unneccessary, but the user # may do it anyway, so make sure SLSQP doesn't blow up with it (bug # reported by rfalck) 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 = pyOptSparseDriver() prob.driver.options['optimizer'] = 'SLSQP' prob.driver.opt_settings['ACC'] = 1e-9 prob.driver.options['print_results'] = False model.add_design_var('x', lower=-np.inf, upper=np.inf) model.add_design_var('y', lower=-50.0, upper=50.0) model.add_objective('f_xy') model.add_constraint('c', upper=-15.0) prob.setup(check=False) prob.run_driver() # 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_compute_totals_basic_return_array(self): # Make sure 'array' return_format works. prob = Problem() model = prob.model = Group() model.add_subsystem('p1', IndepVarComp('x', 0.0), promotes=['x']) model.add_subsystem('p2', IndepVarComp('y', 0.0), promotes=['y']) model.add_subsystem('comp', Paraboloid(), promotes=['x', 'y', 'f_xy']) 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, mode='fwd') prob.set_solver_print(level=0) prob.run_driver() of = ['comp.f_xy'] wrt = ['p1.x', 'p2.y'] derivs = prob.driver._compute_totals(of=of, wrt=wrt, return_format='array') assert_rel_error(self, derivs[0, 0], -6.0, 1e-6) assert_rel_error(self, derivs[0, 1], 8.0, 1e-6) prob.setup(check=False, mode='rev') prob.run_model() of = ['comp.f_xy'] wrt = ['p1.x', 'p2.y'] derivs = prob.driver._compute_totals(of=of, wrt=wrt, return_format='array') assert_rel_error(self, derivs[0, 0], -6.0, 1e-6) assert_rel_error(self, derivs[0, 1], 8.0, 1e-6)
def test_simple_paraboloid_equality_linear(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 = ScipyOptimizeDriver() 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, linear=True) prob.setup(check=False) failed = prob.run_driver() self.assertFalse( failed, "Optimization failed, result =\n" + str(prob.driver.result)) # 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_paraboloid_subbed(self): prob = Problem() model = prob.model = Group() model.add_subsystem('p1', IndepVarComp('x', 0.0), promotes=['x']) model.add_subsystem('p2', IndepVarComp('y', 0.0), promotes=['y']) sub = model.add_subsystem('sub', Group(), promotes=['x', 'y', 'f_xy']) sub.add_subsystem('comp', Paraboloid(), promotes=['x', 'y', 'f_xy']) model.linear_solver = ScipyKrylov() sub.approx_totals() prob.setup(check=False, mode='fwd') prob.set_solver_print(level=0) prob.run_model() of = ['f_xy'] wrt = ['x', 'y'] derivs = prob.compute_totals(of=of, wrt=wrt) assert_rel_error(self, derivs['f_xy', 'x'], [[-6.0]], 1e-6) assert_rel_error(self, derivs['f_xy', 'y'], [[8.0]], 1e-6) Jfd = sub.jacobian._subjacs assert_rel_error(self, Jfd['sub.comp.f_xy', 'sub.comp.x'], [[6.0]], 1e-6) assert_rel_error(self, Jfd['sub.comp.f_xy', 'sub.comp.y'], [[-8.0]], 1e-6) # 1 output x 2 inputs self.assertEqual(len(sub._approx_schemes['fd']._exec_list), 2)
def test_paraboloid_subbed(self, vec_class): if not vec_class: raise unittest.SkipTest("PETSc is not installed") prob = self.prob model = prob.model = Group() model.add_subsystem('p1', IndepVarComp('x', 0.0), promotes=['x']) model.add_subsystem('p2', IndepVarComp('y', 0.0), promotes=['y']) sub = model.add_subsystem('sub', Group(), promotes=['x', 'y', 'f_xy']) sub.add_subsystem('comp', Paraboloid(), promotes=['x', 'y', 'f_xy']) model.linear_solver = ScipyKrylov() sub.approx_totals(method='cs') prob.setup(check=False, vector_class=vec_class, mode='fwd') prob.set_solver_print(level=0) prob.run_model() of = ['f_xy'] wrt = ['x', 'y'] derivs = prob.compute_totals(of=of, wrt=wrt) assert_rel_error(self, derivs['f_xy', 'x'], [[-6.0]], 1e-6) assert_rel_error(self, derivs['f_xy', 'y'], [[8.0]], 1e-6) Jfd = sub.jacobian._subjacs assert_rel_error(self, Jfd['sub.comp.f_xy', 'sub.comp.x'], [[6.0]], 1e-6) assert_rel_error(self, Jfd['sub.comp.f_xy', 'sub.comp.y'], [[-8.0]], 1e-6) # 1 output x 2 inputs self.assertEqual(len(sub._approx_schemes['cs']._exec_list), 2)
def test_unconstrained(self): from openmdao.test_suite.components.paraboloid import Paraboloid # build the model prob = om.Problem() indeps = prob.model.add_subsystem('indeps', om.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 = om.ScipyOptimizeDriver(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', index=0) prob.setup() prob.run_driver() # minimum value assert_near_equal(prob['paraboloid.f_xy'], -27.33333, 1e-6) # location of the minimum assert_near_equal(prob['indeps.x'], 6.6667, 1e-4) assert_near_equal(prob['indeps.y'], -7.33333, 1e-4) # just make sure this doesn't raise an exception prob.driver.scaling_report(show_browser=False)
def test_plackett_burman(self): prob = Problem() model = prob.model model.add_subsystem('p1', IndepVarComp('x', 0.0), promotes=['x']) model.add_subsystem('p2', IndepVarComp('y', 0.0), promotes=['y']) model.add_subsystem('comp', Paraboloid(), promotes=['x', 'y', 'f_xy']) model.add_design_var('x', lower=0.0, upper=1.0) model.add_design_var('y', lower=0.0, upper=1.0) model.add_objective('f_xy') prob.driver = DOEDriver(PlackettBurmanGenerator()) prob.driver.add_recorder(SqliteRecorder("CASES.db")) prob.setup(check=False) prob.run_driver() prob.cleanup() expected = { 0: {'x': np.array([0.]), 'y': np.array([0.]), 'f_xy': np.array([22.00])}, 1: {'x': np.array([1.]), 'y': np.array([0.]), 'f_xy': np.array([17.00])}, 2: {'x': np.array([0.]), 'y': np.array([1.]), 'f_xy': np.array([31.00])}, 3: {'x': np.array([1.]), 'y': np.array([1.]), 'f_xy': np.array([27.00])}, } cases = CaseReader("CASES.db").driver_cases self.assertEqual(cases.num_cases, 4) for n in range(cases.num_cases): self.assertEqual(cases.get_case(n).outputs['x'], expected[n]['x']) self.assertEqual(cases.get_case(n).outputs['y'], expected[n]['y']) self.assertEqual(cases.get_case(n).outputs['f_xy'], expected[n]['f_xy'])
def test_index_number(self): prob = om.Problem() model = prob.model model.add_subsystem('p1', om.IndepVarComp('x', 0.0), promotes=['x']) model.add_subsystem('p2', om.IndepVarComp('y', 0.0), promotes=['y']) model.add_subsystem('comp', Paraboloid(), promotes=['x', 'y', 'f_xy']) model.add_design_var('x', lower=0.0, upper=1.0) model.add_design_var('y', lower=0.0, upper=1.0) model.add_objective('f_xy') prob.driver = om.DOEDriver(om.PlackettBurmanGenerator()) prob.driver.add_recorder(self.recorder) prob.setup() prob.run_driver() prob.cleanup() data_dict = _get_viewer_data(self.filename, case_id=3) vals = data_dict['tree']['children'][2]['children'] x_val = vals[0]['value'] y_val = vals[1]['value'] f_xy_val = vals[2]['value'] self.assertEqual(x_val, "N/A") self.assertEqual(y_val, "N/A") self.assertEqual(f_xy_val, np.array([27.]))
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 = ScipyOptimizeDriver() 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_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_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 = ScipyOptimizeDriver() 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') failed = prob.run_driver() self.assertFalse( failed, "Optimization failed, result =\n" + str(prob.driver.result)) assert_rel_error(self, prob['x'] - prob['y'], 11.0, 1e-6)
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_compute_totals_basic(self): # Basic test for the method using default solvers on simple model. prob = Problem() model = prob.model = Group() model.add_subsystem('p1', IndepVarComp('x', 0.0), promotes=['x']) model.add_subsystem('p2', IndepVarComp('y', 0.0), promotes=['y']) model.add_subsystem('comp', Paraboloid(), promotes=['x', 'y', 'f_xy']) prob.setup(check=False, mode='fwd') prob.set_solver_print(level=0) prob.run_model() of = ['f_xy'] wrt = ['x', 'y'] derivs = prob.compute_totals(of=of, wrt=wrt) assert_rel_error(self, derivs['f_xy', 'x'], [[-6.0]], 1e-6) assert_rel_error(self, derivs['f_xy', 'y'], [[8.0]], 1e-6) prob.setup(check=False, mode='rev') prob.run_model() of = ['f_xy'] wrt = ['x', 'y'] derivs = prob.compute_totals(of=of, wrt=wrt) assert_rel_error(self, derivs['f_xy', 'x'], [[-6.0]], 1e-6) assert_rel_error(self, derivs['f_xy', 'y'], [[8.0]], 1e-6)
def test_simple_paraboloid_scaled_objective_fwd(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='fwd') 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_feature_numpyvec_setup(self): prob = Problem() model = prob.model = Group() model.add_subsystem('p1', IndepVarComp('x', 0.0), promotes=['x']) model.add_subsystem('p2', IndepVarComp('y', 0.0), promotes=['y']) model.add_subsystem('comp', Paraboloid(), promotes=['x', 'y', 'f_xy']) prob.setup() prob['x'] = 2. prob['y'] = 10. prob.run_model() assert_rel_error(self, prob['f_xy'], 214.0, 1e-6) prob['x'] = 0. prob['y'] = 0. prob.run_model() assert_rel_error(self, prob['f_xy'], 22.0, 1e-6) # skip the setup error checking prob.setup(check=False) prob['x'] = 4 prob['y'] = 8. prob.run_model() assert_rel_error(self, prob['f_xy'], 174.0, 1e-6)
def test_simple_paraboloid_upper(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 = pyOptSparseDriver() prob.driver.options['optimizer'] = OPTIMIZER if OPTIMIZER == 'SLSQP': prob.driver.opt_settings['ACC'] = 1e-9 prob.driver.options['print_results'] = 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', upper=-15.0) prob.setup(check=False) prob.run_driver() # 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_snopt_fd_solution(self): if OPTIMIZER is not 'SNOPT': raise unittest.SkipTest() 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 = pyOptSparseDriver() prob.driver.options['optimizer'] = OPTIMIZER prob.driver.options['gradient method'] = 'snopt_fd' prob.driver.options['print_results'] = 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', upper=-15.0) prob.setup(check=False) prob.run_driver() # 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_uniform(self): prob = Problem() model = prob.model model.add_subsystem('p1', IndepVarComp('x', 0.), promotes=['*']) model.add_subsystem('p2', IndepVarComp('y', 0.), promotes=['*']) model.add_subsystem('comp', Paraboloid(), promotes=['*']) model.add_design_var('x', lower=-10, upper=10) model.add_design_var('y', lower=-10, upper=10) model.add_objective('f_xy') prob.driver = DOEDriver(UniformGenerator(num_samples=5, seed=0)) prob.driver.add_recorder(SqliteRecorder("CASES.db")) prob.setup(check=False) prob.run_driver() prob.cleanup() # all values should be between -10 and 10, check expected values for seed = 0 expected = { 0: {'x': np.array([ 0.97627008]), 'y': np.array([ 4.30378733])}, 1: {'x': np.array([ 2.05526752]), 'y': np.array([ 0.89766366])}, 2: {'x': np.array([-1.52690401]), 'y': np.array([ 2.91788226])}, 3: {'x': np.array([-1.24825577]), 'y': np.array([ 7.83546002])}, 4: {'x': np.array([ 9.27325521]), 'y': np.array([-2.33116962])}, } cases = CaseReader("CASES.db").driver_cases self.assertEqual(cases.num_cases, 5) for n in range(cases.num_cases): assert_rel_error(self, cases.get_case(n).outputs['x'], expected[n]['x'], 1e-4) assert_rel_error(self, cases.get_case(n).outputs['y'], expected[n]['y'], 1e-4)
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_uniform(self): from openmdao.api import Problem, IndepVarComp from openmdao.test_suite.components.paraboloid import Paraboloid from openmdao.api import DOEDriver, UniformGenerator, SqliteRecorder, CaseReader prob = Problem() model = prob.model model.add_subsystem('p1', IndepVarComp('x', 0.), promotes=['*']) model.add_subsystem('p2', IndepVarComp('y', 0.), promotes=['*']) model.add_subsystem('comp', Paraboloid(), promotes=['*']) model.add_design_var('x', lower=-10, upper=10) model.add_design_var('y', lower=-10, upper=10) model.add_objective('f_xy') prob.driver = DOEDriver(UniformGenerator(num_samples=5)) prob.driver.add_recorder(SqliteRecorder("CASES.db")) prob.setup() prob.run_driver() prob.cleanup() cases = CaseReader("CASES.db").driver_cases self.assertEqual(cases.num_cases, 5) values = [] for n in range(cases.num_cases): case = cases.get_case(n) values.append((case.outputs['x'], case.outputs['y'], case.outputs['f_xy']))
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 = pyOptSparseDriver() prob.driver.options['optimizer'] = OPTIMIZER if OPTIMIZER == 'SNOPT': prob.driver.opt_settings['Verify level'] = 3 prob.driver.options['print_results'] = 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_feature_tol(self): from openmdao.api import Problem, Group, IndepVarComp, ScipyOptimizeDriver 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 = ScipyOptimizeDriver() prob.driver.options['tol'] = 1.0e-9 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)