def test_surrogate_message_format(self): mm = om.MultiFiMetaModelUnStructuredComp(nfi=2) mm.add_input('x', np.zeros((1, 2))) mm.add_output('y', np.zeros((1, ))) mm.options['default_surrogate'] = om.MultiFiCoKrigingSurrogate( normalize=False) prob = om.Problem() prob.model.add_subsystem('mm', mm) prob.setup() x = [ [ [0.13073587, 0.24909577], # expensive (hifi) doe [0.13073587, 0.24909577], [0.40806563, 0.91465314] ], [ [0.91430235, 0.17029894], # cheap (lowfi) doe [0.40806563, 0.91465314] ] ] mm.options['train:x'] = x[0] mm.options['train:y'] = np.array([1, 2, 3]) mm.options['train:x_fi2'] = x[1] mm.options['train:y_fi2'] = np.array([1, 2]) prob['mm.x'] = np.array([[2. / 3., 1. / 3.]]) with self.assertRaises(ValueError) as cm: prob.run_model() self.assertEqual( str(cm.exception), "MultiFiMetaModelUnStructuredComp (mm): " "Error calling compute(), Multiple input features cannot have the same value." )
def test_one_dim_bi_fidelity_training(self): mm = om.MultiFiMetaModelUnStructuredComp(nfi=2) surr = MockSurrogate() mm.add_input('x', 0.) mm.add_output('y', 0., surrogate=surr) prob = om.Problem() prob.model.add_subsystem('mm', mm) prob.setup() mm.options['train:x'] = [0.0, 0.4, 1.0] mm.options['train:x_fi2'] = [ 0.1, 0.2, 0.3, 0.5, 0.6, 0.7, 0.8, 0.9, 0.0, 0.4, 1.0 ] mm.options['train:y'] = [3.02720998, 0.11477697, 15.82973195] mm.options['train:y_fi2'] = [ -9.32828839, -8.31986355, -7.00778837, -4.54535129, -4.0747189, -5.30287702, -4.47456522, 1.85597517, -8.48639501, -5.94261151, 7.91486597 ] expected_xtrain = [ np.array([[0.0], [0.4], [1.0]]), np.array([[0.1], [0.2], [0.3], [0.5], [0.6], [0.7], [0.8], [0.9], [0.0], [0.4], [1.0]]) ] expected_ytrain = [ np.array([[3.02720998], [0.11477697], [15.82973195]]), np.array([[-9.32828839], [-8.31986355], [-7.00778837], [-4.54535129], [-4.0747189], [-5.30287702], [-4.47456522], [1.85597517], [-8.48639501], [-5.94261151], [7.91486597]]) ] prob.run_model() np.testing.assert_array_equal(surr.xtrain[0], expected_xtrain[0]) np.testing.assert_array_equal(surr.xtrain[1], expected_xtrain[1]) np.testing.assert_array_equal(surr.ytrain[0], expected_ytrain[0]) np.testing.assert_array_equal(surr.ytrain[1], expected_ytrain[1])
def test_2_input_2_fidelity(self): import numpy as np import openmdao.api as om mm = om.MultiFiMetaModelUnStructuredComp(nfi=2) mm.add_input('x', np.zeros((1, 2))) mm.add_output('y', np.zeros((1, ))) # Surrrogate model that implements the multifidelity cokriging method. mm.options['default_surrogate'] = om.MultiFiCoKrigingSurrogate( normalize=False) prob = om.Problem() prob.model.add_subsystem('mm', mm) prob.setup() x_hifi = np.array([ [0.13073587, 0.24909577], # expensive (hifi) doe [0.91915571, 0.4735261], [0.75830543, 0.13321705], [0.51760477, 0.34594101], [0.03531219, 0.77765831], [0.27249206, 0.5306115], [0.62762489, 0.65778471], [0.3914706, 0.09852519], [0.86565585, 0.85350002], [0.40806563, 0.91465314] ]) y_hifi = np.array([ 69.22687251161716, 28.427292491743817, 20.36175030334259, 7.840766670948326, 23.950783505007422, 16.0326610719367, 77.32264403894713, 26.625242780670835, 135.85615334210993, 101.43980212355875 ]) x_lofi = np.array([ [0.91430235, 0.17029894], # cheap (lowfi) doe [0.99329651, 0.76431519], [0.2012252, 0.35006032], [0.61707854, 0.90210676], [0.15113004, 0.0133355], [0.07108082, 0.55344447], [0.4483159, 0.52182902], [0.5926638, 0.06595122], [0.66305449, 0.48579608], [0.47965045, 0.7407793], [0.13073587, 0.24909577], # notice hifi doe inclusion [0.91915571, 0.4735261], [0.75830543, 0.13321705], [0.51760477, 0.34594101], [0.03531219, 0.77765831], [0.27249206, 0.5306115], [0.62762489, 0.65778471], [0.3914706, 0.09852519], [0.86565585, 0.85350002], [0.40806563, 0.91465314] ]) y_lofi = list([ 18.204898470295255, 107.66640600958577, 46.11717344625053, 186.002239934648, 135.12480249921992, 65.3605467926758, 51.72316385370553, 15.541873662737451, 72.77648156410065, 100.33324800434931, 86.69974561161716, 52.63307549174382, 34.358261803342586, 28.218996970948325, 57.280532805007425, 41.9510060719367, 107.05618533894713, 39.580998480670836, 171.46115394210995, 138.87939632355875 ]) mm.options['train:x'] = x_hifi mm.options['train:y'] = y_hifi mm.options['train:x_fi2'] = x_lofi mm.options['train:y_fi2'] = y_lofi prob.set_val('mm.x', np.array([[2. / 3., 1. / 3.]])) prob.run_model() assert_near_equal(prob.get_val('mm.y'), 26.26, tolerance=0.02)
def test_error_messages(self): mm = om.MultiFiMetaModelUnStructuredComp(nfi=3) mm.add_input('x', 0.) mm.add_output('y', 0.) prob = om.Problem() prob.model.add_subsystem('mm', mm) prob.setup() mm.options['train:x'] = [0.0, 0.4, 1.0] mm.options['train:y'] = [3.02720998, 0.11477697, 15.82973195] mm.options['train:x_fi2'] = [0.0, 0.4, 1.0] mm.options['train:y_fi2'] = [3.02720998, 0.11477697, 15.82973195] mm.options['train:x_fi3'] = [0.0, 0.4, 1.0] mm.options['train:y_fi3'] = [3.02720998, 0.11477697, 15.82973195] with self.assertRaises(RuntimeError) as cm: prob.run_model() msg = ( "MultiFiMetaModelUnStructuredComp (mm): No surrogate specified for output 'y'" ) self.assertEqual(str(cm.exception), msg) # Wrong number of input samples mm = om.MultiFiMetaModelUnStructuredComp(nfi=3) mm.add_input('x', 0.) mm.add_input('x2', 0.) mm.add_output('y', 0.) prob = om.Problem() prob.model.add_subsystem('mm', mm) prob.setup() mm.options['train:x'] = [0.0, 0.4, 1.0] mm.options['train:x2'] = [0.0, 0.4, 1.0, 999.0] mm.options['train:y'] = [3.02720998, 0.11477697, 15.82973195] mm.options['train:x_fi2'] = [0.0, 0.4, 1.0] mm.options['train:x2_fi2'] = [0.0, 0.4, 1.0] mm.options['train:y_fi2'] = [3.02720998, 0.11477697, 15.82973195] mm.options['train:x_fi3'] = [0.0, 0.4, 1.0] mm.options['train:x2_fi3'] = [0.0, 0.4, 1.0] mm.options['train:y_fi3'] = [3.02720998, 0.11477697, 15.82973195] with self.assertRaises(RuntimeError) as cm: prob.run_model() msg = ( "MultiFiMetaModelUnStructuredComp (mm): Each variable must have the same number of training points. Expected 3 but found 4 points for 'x2'." ) self.assertEqual(str(cm.exception), msg) # Wrong number of output samples mm = om.MultiFiMetaModelUnStructuredComp(nfi=3) mm.add_input('x', 0.) mm.add_output('y', 0.) mm.add_output('y2', 0.) prob = om.Problem() prob.model.add_subsystem('mm', mm) prob.setup() mm.options['train:x'] = [0.0, 0.4, 1.0] mm.options['train:y'] = [3.02720998, 0.11477697, 15.82973195] mm.options['train:y'] = [3.02720998, 0.11477697, 15.82973195, 3.14159] mm.options['train:x_fi2'] = [0.0, 0.4, 1.0] mm.options['train:y_fi2'] = [3.02720998, 0.11477697, 15.82973195] mm.options['train:y_fi2'] = [3.02720998, 0.11477697, 15.82973195] mm.options['train:x_fi3'] = [0.0, 0.4, 1.0] mm.options['train:y_fi3'] = [3.02720998, 0.11477697, 15.82973195] mm.options['train:y_fi3'] = [3.02720998, 0.11477697, 15.82973195] with self.assertRaises(RuntimeError) as cm: prob.run_model() msg = ( "MultiFiMetaModelUnStructuredComp (mm): Each variable must have the same number of training points. Expected 3 but found 4 points for 'y'." ) self.assertEqual(str(cm.exception), msg)
mm.options['train:x_fi2'] = x[1] mm.options['train:y_fi2'] = y[1] prob['mm.x'] = np.array([[2. / 3., 1. / 3.]]) prob.run_model() assert_near_equal(prob['mm.y'], 26.26, tolerance=0.02) prob['mm.x'] = np.array([[1. / 3., 2. / 3.]]) prob.run_model() assert_near_equal(prob['mm.y'], 36.1031735, tolerance=0.02) # Now, vectorized model with both points predicted together. mm = om.MultiFiMetaModelUnStructuredComp(nfi=2, vec_size=2) mm.add_input('x', np.zeros((2, 1, 2))) mm.add_output('y', np.zeros(( 2, 1, ))) mm.options['default_surrogate'] = om.MultiFiCoKrigingSurrogate( normalize=False) prob = om.Problem() prob.model.add_subsystem('mm', mm) prob.setup() mm.options['train:x'] = x[0] mm.options['train:y'] = y[0]
import numpy as np from time import time import matplotlib.pyplot as plt import openmdao.api as om from testbed_components import simple_1D_low, simple_1D_high np.random.seed(314) mm = om.MultiFiMetaModelUnStructuredComp(nfi=2) mm.add_input("x", np.zeros((1, ))) mm.add_output("y", np.zeros((1, ))) # Surrrogate model that implements the multifidelity cokriging method. mm.options["default_surrogate"] = om.MultiFiCoKrigingSurrogate(normalize=False) prob = om.Problem() prob.model.add_subsystem("mm", mm, promotes=["*"]) prob.driver = om.pyOptSparseDriver() # om.ScipyOptimizeDriver() # prob.driver.options["optimizer"] = "SNOPT" # prob.driver.opt_settings['Verify level'] = -1 # --- Objective --- prob.model.add_objective("y") prob.model.add_design_var("x", lower=0.0, upper=1.0) prob.setup() prob["x"] = 0.8