def setUp(self): if OPT is None: raise unittest.SkipTest("pyoptsparse is not installed") if OPTIMIZER is None: raise unittest.SkipTest( "pyoptsparse is not providing SNOPT or SLSQP") prob = Problem(impl=impl) root = prob.root = Group() #root.ln_solver = lin_solver() root.ln_solver = LinearGaussSeidel() par = root.add('par', ParallelGroup()) par.ln_solver = LinearGaussSeidel() ser1 = par.add('ser1', Group()) ser1.ln_solver = LinearGaussSeidel() ser1.add('p1', IndepVarComp('x', np.zeros([2])), promotes=['x']) ser1.add('comp', SimpleArrayComp(), promotes=['x', 'y']) ser1.add('con', ExecComp('c = y - 20.0', c=np.array([0.0, 0.0]), y=np.array([0.0, 0.0])), promotes=['c', 'y']) ser1.add('obj', ExecComp('o = y[0]', y=np.array([0.0, 0.0])), promotes=['y', 'o']) ser2 = par.add('ser2', Group()) ser2.ln_solver = LinearGaussSeidel() ser2.add('p1', IndepVarComp('x', np.zeros([2])), promotes=['x']) ser2.add('comp', SimpleArrayComp(), promotes=['x', 'y']) ser2.add('con', ExecComp('c = y - 30.0', c=np.array([0.0, 0.0]), y=np.array([0.0, 0.0])), promotes=['c', 'y']) ser2.add('obj', ExecComp('o = y[0]', y=np.array([0.0, 0.0])), promotes=['o', 'y']) root.add('total', ExecComp('obj = x1 + x2')) root.connect('par.ser1.o', 'total.x1') root.connect('par.ser2.o', 'total.x2') prob.driver = pyOptSparseDriver() prob.driver.options['optimizer'] = OPTIMIZER prob.driver.options['print_results'] = False prob.driver.add_desvar('par.ser1.x', lower=-50.0, upper=50.0) prob.driver.add_desvar('par.ser2.x', lower=-50.0, upper=50.0) prob.driver.add_objective('total.obj') prob.driver.add_constraint('par.ser1.c', equals=0.0) prob.driver.add_constraint('par.ser2.c', equals=0.0) self.prob = prob
def test_subarray_to_promoted_var(self): root = Group() P = root.add('P', IndepVarComp('x', np.array([1., 2., 3., 4., 5.]))) G = root.add('G', Group()) C = root.add('C', SimpleComp()) A = G.add('A', SimpleArrayComp()) G2 = G.add('G2', Group()) A2 = G2.add('A2', SimpleArrayComp()) root.connect('P.x', 'G.A.x', src_indices=[0, 1]) root.connect('P.x', 'C.x', src_indices=[ 2, ]) root.connect('P.x', 'G.G2.A2.x', src_indices=[3, 4]) prob = Problem(root) prob.setup(check=False) prob.run() assert_rel_error(self, root.G.A.params['x'], np.array([1., 2.]), 0.0001) self.assertAlmostEqual(root.C.params['x'], 3.) assert_rel_error(self, root.G.G2.A2.params['x'], np.array([4., 5.]), 0.0001) # now try the same thing with promoted var root = Group() P = root.add('P', IndepVarComp('x', np.array([1., 2., 3., 4., 5.]))) G = root.add('G', Group()) C = root.add('C', SimpleComp()) A = G.add('A', SimpleArrayComp(), promotes=['x', 'y']) G2 = G.add('G2', Group()) A2 = G2.add('A2', SimpleArrayComp(), promotes=['x', 'y']) root.connect('P.x', 'G.x', src_indices=[0, 1]) root.connect('P.x', 'C.x', src_indices=[ 2, ]) root.connect('P.x', 'G.G2.x', src_indices=[3, 4]) prob = Problem(root) prob.setup(check=False) prob.run() assert_rel_error(self, root.G.A.params['x'], np.array([1., 2.]), 0.0001) self.assertAlmostEqual(root.C.params['x'], 3.) assert_rel_error(self, root.G.G2.A2.params['x'], np.array([4., 5.]), 0.0001)
def test_simple_array_Jacobian(self): # Tests that we can correctly handle user-defined Jacobians. # Now with arrays empty = {} mycomp = SimpleArrayComp() mycomp._jacobian_cache = mycomp.linearize(empty, empty, empty) # Forward dparams = {} dparams['x'] = np.array([1.5, 3.1]) dresids = {} dresids['y'] = np.array([0.0, 0.0]) mycomp.apply_linear(empty, empty, dparams, empty, dresids, 'fwd') target = mycomp._jacobian_cache[('y', 'x')].dot(dparams['x']) diff = abs(dresids['y'] - target).max() self.assertAlmostEqual(diff, 0.0, places=3) # Reverse dparams = {} dparams['x'] = np.array([0.0, 0.0]) dresids = {} dresids['y'] = np.array([1.5, 3.1]) mycomp.apply_linear(empty, empty, dparams, empty, dresids, 'rev') target = mycomp._jacobian_cache[('y', 'x')].T.dot(dresids['y']) diff = abs(dparams['x'] - target).max() self.assertAlmostEqual(diff, 0.0, places=3)
def test_simple_array_comp_SLSQP_scaler_unity_eq(self): prob = Problem() root = prob.root = Group() root.add('p1', IndepVarComp('x', np.zeros([2])), promotes=['*']) root.add('comp', SimpleArrayComp(), promotes=['*']) root.add('con', ExecComp('c = y - 20.0', c=np.array([0.0, 0.0]), y=np.array([0.0, 0.0])), promotes=['*']) root.add('obj', ExecComp('o = y[0]', y=np.array([0.0, 0.0])), promotes=['*']) prob.driver = ScipyOptimizer() prob.driver.options['optimizer'] = 'SLSQP' prob.driver.add_desvar('x', lower=-50.0, upper=50.0, scaler=np.array([1.0, 1.0])) prob.driver.add_objective('o', scaler=np.array([1.0, 1.0])) prob.driver.add_constraint('c', equals=0.0, scaler=np.array([1.0, 1.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_simple_array_comp(self): prob = Problem() root = prob.root = Group() root.add('p1', IndepVarComp('x', np.zeros([2])), promotes=['*']) root.add('comp', SimpleArrayComp(), promotes=['*']) root.add('con', ExecComp('c = y - 20.0', c=np.array([0.0, 0.0]), y=np.array([0.0, 0.0])), promotes=['*']) root.add('obj', ExecComp('o = y[0]', y=np.array([0.0, 0.0])), promotes=['*']) prob.driver = pyOptSparseDriver() prob.driver.options['optimizer'] = OPTIMIZER prob.driver.options['print_results'] = False 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.setup(check=False) prob.run() obj = prob['o'] assert_rel_error(self, obj, 20.0, 1e-6)
def test_simple_array_comp(self): prob = Problem() root = prob.root = Group() root.add('p1', ParamComp('x', np.zeros([2])), promotes=['*']) root.add('comp', SimpleArrayComp(), promotes=['*']) root.add('con', ExecComp('c = y - 20.0', c=np.array([0.0, 0.0]), y=np.array([0.0, 0.0])), promotes=['*']) root.add('obj', ExecComp('o = y[0]', y=np.array([0.0, 0.0])), promotes=['*']) prob.driver = pyOptSparseDriver() prob.driver.add_param('x', low=-50.0, high=50.0) prob.driver.add_objective('o') prob.driver.add_constraint('c', ctype='eq') prob.setup(check=False) prob.run() obj = prob['o'] assert_rel_error(self, obj, 20.0, 1e-6)
def test_src_indices_connect_error(self): root = Group() P = root.add('P', IndepVarComp('x', np.array([1., 2., 3., 4., 5.]))) G = root.add('G', Group()) C = root.add('C', SimpleComp()) A = G.add('A', SimpleArrayComp()) root.connect('P.x', 'G.A.x', src_indices=[0]) root.connect('P.x', 'C.x', src_indices=[ 2, ]) prob = Problem(root) with self.assertRaises(Exception) as cm: prob.setup(check=False) expected = py3fix("Size 1 of the indexed sub-part of source 'P.x' " "must be the same as size 2 of target 'G.A.x'.") self.assertTrue(expected in str(cm.exception)) # now try the same thing with promoted var root = Group() P = root.add('P', IndepVarComp('x', np.array([1., 2., 3., 4., 5.]))) G = root.add('G', Group()) C = root.add('C', SimpleComp()) A = G.add('A', SimpleArrayComp(), promotes=['x', 'y']) root.connect('P.x', 'G.x', src_indices=[0, 1, 2]) root.connect('P.x', 'C.x', src_indices=[ 2, ]) prob = Problem(root) with self.assertRaises(Exception) as cm: prob.setup(check=False) expected = py3fix( "Size 3 of the indexed sub-part of source 'P.x' " "must be the same as size 2 of target 'G.A.x' (G.x).") self.assertTrue(expected in str(cm.exception))
def __init__(self): super(TestProb, self).__init__() self.root = root = Group() root.add('c1', SimpleArrayComp()) root.add('p1', ParamComp('p', 1 * np.ones(2))) root.connect('p1.p', 'c1.x') root.add('ci1', SimpleImplicitComp()) root.add('pi1', ParamComp('p', 1.)) root.connect('pi1.p', 'ci1.x')
def __init__(self): super(TestProb, self).__init__() self.root = root = Group() root.ln_solver = ScipyGMRES() root.add('c1', SimpleArrayComp()) root.add('p1', IndepVarComp('p', 1*np.ones(2))) root.connect('p1.p','c1.x') root.add('ci1', SimpleImplicitComp()) root.add('pi1', IndepVarComp('p', 1.)) root.connect('pi1.p','ci1.x') root.add('pjunk', IndepVarComp('pj', np.ones((2,2)))) root.add('junk', ExecComp('y=x', x=np.zeros((2,2)), y=np.zeros((2,2)))) root.connect('pjunk.pj', 'junk.x')
def test_simple_array_model(self): prob = Problem() prob.root = Group() prob.root.add('comp', SimpleArrayComp()) prob.root.add('p1', IndepVarComp('x', np.ones([2]))) prob.root.connect('p1.x', 'comp.x') prob.setup(check=False) prob.run() data = prob.check_partial_derivatives(out_stream=None) for key1, val1 in iteritems(data): for key2, val2 in iteritems(val1): assert_rel_error(self, val2['abs error'][0], 0.0, 1e-5) assert_rel_error(self, val2['abs error'][1], 0.0, 1e-5) assert_rel_error(self, val2['abs error'][2], 0.0, 1e-5) assert_rel_error(self, val2['rel error'][0], 0.0, 1e-5) assert_rel_error(self, val2['rel error'][1], 0.0, 1e-5) assert_rel_error(self, val2['rel error'][2], 0.0, 1e-5)