def test_array_multi_vectorize(self):
        def branin(x):
            x1 = 15 * x[0] - 5
            x2 = 15 * x[1]
            return (x2 - (5.1 / (4. * np.pi**2.)) * x1**2. + 5. * x1 / np.pi -
                    6.)**2. + 10. * (1. - 1. / (8. * np.pi)) * np.cos(x1) + 10.

        # Add a linear error
        def branin_low_fidelity(x):
            return branin(x) + 30. * x[1] + 10.

        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.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]
            ],
            [
                [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 = np.array([[branin(case) for case in x[0]],
                      [branin_low_fidelity(case) for case in x[1]]])
Esempio n. 2
0
    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()

        expected = ("mm: Multiple input features cannot have the same value.")
        self.assertEqual(str(cm.exception), expected)
    def test_om_slice_in_add_input(self):

        mm = om.MultiFiMetaModelUnStructuredComp(nfi=2)
        mm.add_input('x', np.ones(3), src_indices=om.slicer[:, 1])
        mm.add_output('y', np.zeros((1, )))

        mm.options['default_surrogate'] = om.MultiFiCoKrigingSurrogate(
            normalize=False)

        arr = np.array([[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]])

        prob = om.Problem()
        prob.model.add_subsystem('mm', mm)
        prob.model.add_subsystem('indep', om.IndepVarComp('x', arr))
        prob.model.connect('indep.x', 'mm.x')
        prob.setup()

        assert_near_equal(prob['mm.x'],
                          np.array([[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]))
    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)
        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]
        mm.options['train:x_fi2'] = x[1]
        mm.options['train:y_fi2'] = y[1]

        prob['mm.x'] = np.array([[[2. / 3., 1. / 3.]], [[1. / 3., 2. / 3.]]])
        prob.run_model()

        assert_near_equal(prob['mm.y'], [[26.26], [36.1031735]],
                          tolerance=0.02)