def test_basics(self): # create a metamodel component mm = MetaModelUnStructuredComp() mm.add_input('x1', 0.) mm.add_input('x2', 0.) mm.add_output('y1', 0.) mm.add_output('y2', 0., surrogate=FloatKrigingSurrogate()) mm.options['default_surrogate'] = ResponseSurface() # add metamodel to a problem prob = Problem(model=Group()) prob.model.add_subsystem('mm', mm) prob.setup(check=False) # check that surrogates were properly assigned surrogate = mm._metadata('y1').get('surrogate') self.assertTrue(isinstance(surrogate, ResponseSurface)) surrogate = mm._metadata('y2').get('surrogate') self.assertTrue(isinstance(surrogate, FloatKrigingSurrogate)) # populate training data mm.options['train:x1'] = [1.0, 2.0, 3.0] mm.options['train:x2'] = [1.0, 3.0, 4.0] mm.options['train:y1'] = [3.0, 2.0, 1.0] mm.options['train:y2'] = [1.0, 4.0, 7.0] # run problem for provided data point and check prediction prob['mm.x1'] = 2.0 prob['mm.x2'] = 3.0 self.assertTrue(mm.train) # training will occur before 1st run prob.run_model() assert_rel_error(self, prob['mm.y1'], 2.0, .00001) assert_rel_error(self, prob['mm.y2'], 4.0, .00001) # run problem for interpolated data point and check prediction prob['mm.x1'] = 2.5 prob['mm.x2'] = 3.5 self.assertFalse(mm.train) # training will not occur before 2nd run prob.run_model() assert_rel_error(self, prob['mm.y1'], 1.5934, .001) # change default surrogate, re-setup and check that metamodel re-trains mm.options['default_surrogate'] = FloatKrigingSurrogate() prob.setup(check=False) surrogate = mm._metadata('y1').get('surrogate') self.assertTrue(isinstance(surrogate, FloatKrigingSurrogate)) self.assertTrue(mm.train) # training will occur after re-setup
def test_sin_metamodel_rmse(self): # create MetaModelUnStructuredComp with Kriging, using the rmse option sin_mm = MetaModelUnStructuredComp() sin_mm.add_input('x', 0.) sin_mm.add_output('f_x', 0.) sin_mm.options['default_surrogate'] = KrigingSurrogate(eval_rmse=True) # add it to a Problem prob = Problem() prob.model.add_subsystem('sin_mm', sin_mm) prob.setup(check=False) # train the surrogate and check predicted value sin_mm.options['train:x'] = np.linspace(0, 10, 20) sin_mm.options['train:f_x'] = np.sin(sin_mm.options['train:x']) prob['sin_mm.x'] = 2.1 prob.run_model() assert_rel_error(self, prob['sin_mm.f_x'], np.sin(2.1), 1e-4) # mean self.assertTrue( self, sin_mm._metadata('f_x')['rmse'] < 1e-5) # std deviation
def test_sin_metamodel(self): # create a MetaModelUnStructuredComp for sine and add it to a Problem sin_mm = MetaModelUnStructuredComp() sin_mm.add_input('x', 0.) sin_mm.add_output('f_x', 0.) prob = Problem() prob.model.add_subsystem('sin_mm', sin_mm) # check that missing surrogate is detected in check_config testlogger = TestLogger() prob.setup(check=True, logger=testlogger) # Conclude setup but don't run model. prob.final_setup() msg = ("No default surrogate model is defined and the " "following outputs do not have a surrogate model:\n" "['f_x']\n" "Either specify a default_surrogate, or specify a " "surrogate model for all outputs.") self.assertEqual(len(testlogger.get('error')), 1) self.assertTrue(msg in testlogger.get('error')[0]) # check that output with no specified surrogate gets the default sin_mm.options['default_surrogate'] = FloatKrigingSurrogate() prob.setup(check=False) surrogate = sin_mm._metadata('f_x').get('surrogate') self.assertTrue(isinstance(surrogate, FloatKrigingSurrogate), 'sin_mm.f_x should get the default surrogate') # check error message when no training data is provided with self.assertRaises(RuntimeError) as cm: prob.run_model() msg = ( "MetaModelUnStructuredComp: The following training data sets must be " "provided as options for sin_mm: ['train:x', 'train:f_x']") self.assertEqual(str(cm.exception), msg) # train the surrogate and check predicted value sin_mm.options['train:x'] = np.linspace(0, 10, 20) sin_mm.options['train:f_x'] = .5 * np.sin(sin_mm.options['train:x']) prob['sin_mm.x'] = 2.1 prob.run_model() assert_rel_error(self, prob['sin_mm.f_x'], .5 * np.sin(prob['sin_mm.x']), 1e-4)
def test_sin_metamodel_preset_data(self): # preset training data x = np.linspace(0, 10, 200) f_x = .5 * np.sin(x) # create a MetaModelUnStructuredComp for Sin and add it to a Problem sin_mm = MetaModelUnStructuredComp() sin_mm.add_input('x', 0., training_data=x) sin_mm.add_output('f_x', 0., training_data=f_x) prob = Problem() prob.model.add_subsystem('sin_mm', sin_mm) # check that missing surrogate is detected in check_setup testlogger = TestLogger() prob.setup(check=True, logger=testlogger) # Conclude setup but don't run model. prob.final_setup() msg = ("No default surrogate model is defined and the " "following outputs do not have a surrogate model:\n" "['f_x']\n" "Either specify a default_surrogate, or specify a " "surrogate model for all outputs.") self.assertEqual(len(testlogger.get('error')), 1) self.assertTrue(msg in testlogger.get('error')[0]) # check that output with no specified surrogate gets the default sin_mm.options['default_surrogate'] = FloatKrigingSurrogate() prob.setup(check=False) surrogate = sin_mm._metadata('f_x').get('surrogate') self.assertTrue(isinstance(surrogate, FloatKrigingSurrogate), 'sin_mm.f_x should get the default surrogate') prob['sin_mm.x'] = 2.22 prob.run_model() assert_rel_error(self, prob['sin_mm.f_x'], .5 * np.sin(prob['sin_mm.x']), 1e-4)