def test_2d_1fi_cokriging(self):
     # CoKrigingSurrogate with one fidelity could be used as a KrigingSurrogate
     # Same test as for KrigingSurrogate...  well with predicted test value adjustment
     
     def branin(x):
         y = (x[1]-(5.1/(4.*pi**2.))*x[0]**2.+5.*x[0]/pi-6.)**2.+10.*(1.-1./(8.*pi))*cos(x[0])+10.
         return y
     
     x = array([[-2., 0.], [-0.5, 1.5], [1., 3.], [8.5, 4.5], 
                [-3.5, 6.], [4., 7.5], [-5., 9.], [5.5, 10.5],
                [10., 12.], [7., 13.5], [2.5, 15.]])
     y = array([branin(case) for case in x])
     krig1 = MultiFiCoKrigingSurrogate()
     krig1.train(x, y)
     
     pred1 = krig1.predict([-2., 0.])
     self.assertAlmostEqual(branin(x[0]), pred1.mu, places=5)
     self.assertAlmostEqual(0., pred1.sigma, places=5)
     
     pred2 = krig1.predict([5., 5.])
     self.assertAlmostEqual(22, pred2.mu, delta=1)        
     self.assertAlmostEqual(13, pred2.sigma, delta=1)
     
     # Test with theta setting instead of estimation
     krig2 = MultiFiCoKrigingSurrogate(theta=[0.1])
     krig1.train(x, y)
     
     pred1 = krig1.predict([-2., 0.])
     self.assertAlmostEqual(branin(x[0]), pred1.mu, places=5)
     self.assertAlmostEqual(0., pred1.sigma, places=5)
     
     pred2 = krig1.predict([5., 5.])
     self.assertAlmostEqual(22, pred2.mu, delta=1)        
     self.assertAlmostEqual(13, pred2.sigma, delta=1)
 def test_1d_2fi_cokriging(self):     
     # Example from Forrester: Engineering design via surrogate modelling
     def f_expensive(x):
         return ((x*6-2)**2)*sin((x*6-2)*2)
     def f_cheap(x):
         return 0.5*((x*6-2)**2)*sin((x*6-2)*2)+(x-0.5)*10. - 5
     
     
     x = array([[[0.0], [0.4], [0.6], [1.0]], 
                [[0.1], [0.2], [0.3], [0.5], [0.7], 
                 [0.8], [0.9], [0.0], [0.4], [0.6], [1.0]]])
     y = array([[f_expensive(v) for v in array(x[0]).ravel()], 
                [f_cheap(v) for v in array(x[1]).ravel()]])
     
     cokrig = MultiFiCoKrigingSurrogate()
     cokrig.train_multifi(x, y)
     
     new_x = array([0.75])        
     pred = cokrig.predict(new_x)
     self.assertTrue(isinstance(pred, NormalDistribution))
     self.assertAlmostEqual( f_expensive(new_x[0]), pred.mu, delta=0.05)
     self.assertAlmostEqual(0., pred.sigma, delta=0.02)
    def test_1d_1fi_cokriging(self):
        # CoKrigingSurrogate with one fidelity could be used as a KrigingSurrogate
        # Same test as for KrigingSurrogate...  well with predicted test value adjustment
        
        x = array([[0.05], [.25], [0.61], [0.95]])
        y = array([0.738513784857542, -0.210367746201974, -0.489015457891476, 12.3033138316612])
        krig1 = MultiFiCoKrigingSurrogate()
        krig1.train(x, y)
        new_x = array([0.5])
        
        pred1 = krig1.predict(x[0])
        self.assertTrue(isinstance(pred1, NormalDistribution))
        self.assertAlmostEqual(y[0] , pred1.mu, places=4)
        self.assertAlmostEqual(.0, pred1.sigma, places=4)

        pred2 = krig1.predict(new_x)
        self.assertTrue(isinstance(pred2, NormalDistribution))
        self.assertAlmostEqual( -2.0279, pred2.mu, places=3)
        self.assertAlmostEqual(1.3408, pred2.sigma, places=3)
        
        # Test with theta setting instead of estimation
        krig2 = MultiFiCoKrigingSurrogate(theta=0.1)
        krig2.train(x, y)
        
        pred1 = krig2.predict(x[0])
        self.assertTrue(isinstance(pred1, NormalDistribution))
        self.assertAlmostEqual(y[0] , pred1.mu, places=4)
        self.assertAlmostEqual(.0, pred1.sigma, places=4)

        pred2 = krig2.predict(new_x)
        self.assertTrue(isinstance(pred2, NormalDistribution))
        self.assertAlmostEqual( -1.2719, pred2.mu, places=3)
        self.assertAlmostEqual(0.0439, pred2.sigma, places=3)
 def test_2d_2fi_cokriging(self):
     
     def branin(x):
         x1 = 15*x[0]-5
         x2 = 15*x[1]
         return (x2-(5.1/(4.*pi**2.))*x1**2.+5.*x1/pi-6.)**2.+10.*(1.-1./(8.*pi))*cos(x1)+10.
         
     # Add a linear error
     def branin_low_fidelity(x):
         return branin(x)+30.*x[1] + 10.
     
     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 = array([[branin(case) for case in x[0]],
                [branin_low_fidelity(case) for case in x[1]]])
     nfi=2
     cokrig = MultiFiCoKrigingSurrogate()
     cokrig.train_multifi(x, y)
     
     pred = cokrig.predict([2./3., 1/3.])
     self.assertAlmostEqual(26, pred.mu, places=0)        
     self.assertAlmostEqual(0.3, pred.sigma, places=0)
     
     # Test with theta setting instead of theta estimation
     cokrig2 = MultiFiCoKrigingSurrogate(theta=0.1)
     cokrig2.train_multifi(x, y)
     
     pred = cokrig2.predict([2./3., 1/3.])
     self.assertAlmostEqual(21.7, pred.mu, places=0)        
     self.assertAlmostEqual(2.29, pred.sigma, places=0)
     
     # Test with theta setting instead of theta estimation
     cokrig2 = MultiFiCoKrigingSurrogate(theta=[0.1, 10])
     cokrig2.train_multifi(x, y)
     
     pred = cokrig2.predict([2./3., 1/3.])
     self.assertAlmostEqual(21.01, pred.mu, places=0)        
     self.assertAlmostEqual(2.29, pred.sigma, places=0)
     
     # Test bad theta setting
     cokrig3 = MultiFiCoKrigingSurrogate(theta=[0.1])
     try:
         cokrig3.train_multifi(x, y)
     except ValueError, err:
         self.assertEqual(str(err),
             "theta must be a list of 2 element(s).")
     self.assertAlmostEqual( f_expensive(new_x[0]), pred.mu, delta=0.05)
     self.assertAlmostEqual(0., pred.sigma, delta=0.02)
     
 def test_2d_1fi_cokriging(self):
     # CoKrigingSurrogate with one fidelity could be used as a KrigingSurrogate
     # Same test as for KrigingSurrogate...  well with predicted test value adjustment
     
     def branin(x):
         y = (x[1]-(5.1/(4.*pi**2.))*x[0]**2.+5.*x[0]/pi-6.)**2.+10.*(1.-1./(8.*pi))*cos(x[0])+10.
         return y
     
     x = array([[-2., 0.], [-0.5, 1.5], [1., 3.], [8.5, 4.5], 
                [-3.5, 6.], [4., 7.5], [-5., 9.], [5.5, 10.5],
                [10., 12.], [7., 13.5], [2.5, 15.]])
     y = array([branin(case) for case in x])
     krig1 = MultiFiCoKrigingSurrogate()
     krig1.train(x, y)
     
     pred1 = krig1.predict([-2., 0.])
     self.assertAlmostEqual(branin(x[0]), pred1.mu, places=5)
     self.assertAlmostEqual(0., pred1.sigma, places=5)
     
     pred2 = krig1.predict([5., 5.])
     self.assertAlmostEqual(22, pred2.mu, delta=1)        
     self.assertAlmostEqual(13, pred2.sigma, delta=1)
     
     # Test with theta setting instead of estimation
     krig2 = MultiFiCoKrigingSurrogate(theta=[0.1])
     krig1.train(x, y)
     
     pred1 = krig1.predict([-2., 0.])