def test_HistoryMatching_select_expectations(): "test the select_expectations method of HistoryMatching" # correct functionality expectations = (np.array([2., 10.]), np.array([0., 0.]), np.array([[1., 2.]])) hm = HistoryMatching(obs=[1., 1.], expectations=expectations) expectations_new = hm._select_expectations() for a, b in zip(expectations, expectations_new): assert_allclose(a, b) gp = GaussianProcess(np.reshape(np.linspace(0., 1.), (-1, 1)), np.linspace(0., 1.)) np.random.seed(57483) gp.learn_hyperparameters() coords = np.array([[0.1], [1.]]) obs = [1., 0.01] expectations = gp.predict(coords) hm = HistoryMatching(gp=gp, obs=obs, coords=coords) expectations_new = hm._select_expectations() for a, b in zip(expectations, expectations_new): assert_allclose(a, b) # ncoords somehow not set hm.ncoords = None with pytest.raises(ValueError): hm._select_expectations() # both coords and expectations set hm = HistoryMatching(gp=gp, obs=obs, coords=coords, expectations=expectations) with pytest.raises(ValueError): hm._select_expectations() # if no expectations provided, fails hm = HistoryMatching(obs=obs) with pytest.raises(ValueError): hm._select_expectations()
def test_HistoryMatching_get_implausibility(): "test the get_implausibility method of HistoryMatching" # correct functionality expectations = (np.array([2., 10.]), np.array([0., 0.]), np.array([[1., 2.]])) hm = HistoryMatching(obs=[1., 1.], expectations=expectations) I = hm.get_implausibility() assert_allclose(I, [1., 9.]) assert_allclose(hm.I, [1., 9.]) I = hm.get_implausibility(1.) assert_allclose(I, [1. / np.sqrt(2.), 9. / np.sqrt(2.)]) assert_allclose(hm.I, [1. / np.sqrt(2.), 9. / np.sqrt(2.)]) gp = GaussianProcess(np.reshape(np.linspace(0., 1.), (-1, 1)), np.linspace(0., 1.)) np.random.seed(57483) gp.learn_hyperparameters() coords = np.array([[0.1], [1.]]) obs = [1., 0.01] mean, unc, _ = gp.predict(coords) I_exp = np.abs(mean - obs[0]) / np.sqrt(unc + obs[1]) hm = HistoryMatching(gp=gp, obs=obs, coords=coords) I = hm.get_implausibility() assert_allclose(I, I_exp) assert_allclose(hm.I, I_exp) # no observations hm = HistoryMatching(expectations=expectations) with pytest.raises(ValueError): hm.get_implausibility() # negative variance for model discrepancy hm = HistoryMatching(obs=[1., 1.], expectations=expectations) with pytest.raises(AssertionError): hm.get_implausibility(-1.)
def demo_1D(): # Create a gaussian process x_training = np.array([[0.], [10.], [20.], [30.], [43.], [50.]]) y_training = get_y_simulated_1D(x_training) gp = GaussianProcess(x_training, y_training) np.random.seed(47) gp.learn_hyperparameters() # Define observation obs = [-0.8, 0.0004] # Coords to predict n_rand = 2000 x_predict_min = -3 x_predict_max = 53 x_predict = np.random.rand(n_rand) x_predict = np.sort(x_predict, axis=0) x_predict *= (x_predict_max - x_predict_min) x_predict += x_predict_min x_predict = x_predict[:, None] coords = x_predict # Compute GPE expectations expectations = gp.predict(coords) # Compute Implausbility hm = HistoryMatching(obs=obs, expectations=expectations) I = hm.get_implausibility() NROY = hm.get_NROY() RO = hm.get_RO() print("Fraction of points ruled out {:6}".format( str(float(len(RO)) / float(n_rand)))) # Plotting if makeplots: fig, axs = plt.subplots(2, 1, sharex=True) fig.subplots_adjust(hspace=0) x_hist_plot = [min(x_predict)[0], max(x_predict)[0]] y_hist_plot = [obs[0], obs[0]] y_hist_err = 3 * np.sqrt(obs[1]) y_hist_up = [val + y_hist_err for val in y_hist_plot] y_hist_dn = [val - y_hist_err for val in y_hist_plot] axs[0].plot( # Horizontal line at value of y_obs x_hist_plot, y_hist_plot, color='black', label='observation') axs[0].fill_between( # Error bounds on y_obs x_hist_plot, y_hist_dn, y_hist_up, color='black', alpha=0.25) axs[0].plot( # Simulator output coords, get_y_simulated_1D(coords), color='black', label='simulator') axs[0].scatter( # Training Data x_training, y_training, marker='.', color='black', label='Training Data', s=100) axs[0].plot( # GPE expectation coords, expectations[0], color='red', label='GPE') axs[0].fill_between( # GPE uncertainty coords[:, 0], expectations[0] - 3 * np.sqrt(expectations[1]), expectations[0] + 3 * np.sqrt(expectations[1]), color='red', alpha=0.5) axs[1].scatter( # Implausibility coords, I, marker='.', color='black') axs[1].scatter(coords[NROY], I[NROY], marker='.', color='green') axs[1].plot( # implausibility Threshold x_hist_plot, [3, 3], color='green', label='implausibility threshold') axs[0].set(ylabel='Model Output f(x)') axs[1].set(xlabel='Imput Parameter x', ylabel='Implausibility I(x)', ylim=(-1, 21)) plt.savefig('histmatch_1D.png', bbox_inches='tight')
def test_sanity_checks(): "test basic functioning of HistoryMatching" # Create a gaussian process x_training = np.array([[0.], [10.], [20.], [30.], [43.], [50.]]) y_training = get_y_simulated_1D(x_training) gp = GaussianProcess(x_training, y_training) np.random.seed(47) gp.learn_hyperparameters() # Define observation and implausibility threshold obs = [-0.8, 0.0004] # Coords to predict n_rand = 2000 x_predict_min = -3 x_predict_max = 53 x_predict = np.random.rand(n_rand) x_predict = np.sort(x_predict, axis=0) x_predict *= (x_predict_max - x_predict_min) x_predict += x_predict_min x_predict = x_predict[:, None] coords = x_predict expectations = gp.predict(coords) # Create History Matching Instance print("---TEST INPUTS---") print("No Args") hm = HistoryMatching() hm.status() print("Obs Only a - list") hm = HistoryMatching(obs=obs) hm.status() print("Obs only b - single-element list") hm = HistoryMatching(obs=[3.]) hm.status() print("Obs only c - single-value") hm = HistoryMatching(obs=3.) hm.status() print("gp Only") hm = HistoryMatching(gp=gp) hm.status() print("Coords only a - 2d ndarray") hm = HistoryMatching(coords=coords) hm.status() print("Coords only b - 1d ndarray") hm = HistoryMatching(coords=np.random.rand(n_rand)) hm.status() print("Coords only c - list") hm = HistoryMatching(coords=[a for a in range(n_rand)]) hm.status() print("Expectation only") hm = HistoryMatching(expectations=expectations) hm.status() print("Threshold Only") hm = HistoryMatching(threshold=3.) hm.status() print("---TEST ASSIGNMENT---") print("Assign gp") hm = HistoryMatching(obs) hm.status() hm.set_gp(gp) hm.status() print("Assign Obs") hm = HistoryMatching(gp) hm.status() hm.set_obs(obs) hm.status() print("Assign Coords") hm = HistoryMatching() hm.status() hm.set_coords(coords) hm.status() print("Assign Expectations") hm = HistoryMatching() hm.status() hm.set_expectations(expectations) hm.status() print("Assign Threshold") hm = HistoryMatching() hm.status() hm.set_threshold(3.) hm.status() print("---TEST IMPLAUSABILIY---") print("implausibility test a - no vars") hm = HistoryMatching(obs=obs, gp=gp, coords=coords) I = hm.get_implausibility() print("implausibility test b - single value") hm = HistoryMatching(obs=obs, gp=gp, coords=coords) I = hm.get_implausibility(7.)
def demo_2D(): # Create a Gaussian Process x_training = np.array([[0., 0.], [1.5, 1.5], [3., 3.], [0., 1.5], [1.5, 0.], [0., 3.], [3., 0.], [3., 1.5], [1.5, 3.]]) y_training = get_y_simulated_2D(x_training) gp = GaussianProcess(x_training, y_training) np.random.seed(47) gp.learn_hyperparameters() # Define observation obs = [0.1, 0.0004] # Coords to predict n_rand = 2000 a_predict_min = 0 a_predict_max = np.pi b_predict_min = a_predict_min b_predict_max = a_predict_max a_predict = np.random.rand(n_rand) * (a_predict_max - a_predict_min) + a_predict_min b_predict = np.random.rand(n_rand) * (b_predict_max - b_predict_min) + b_predict_min x_predict = np.concatenate((a_predict[:, None], b_predict[:, None]), axis=1) x_predict = np.concatenate((x_predict, x_training), axis=0) coords = x_predict # Compute GPE expectations expectations = gp.predict(coords) # Compute Implausbility hm = HistoryMatching(obs=obs, expectations=expectations) I = hm.get_implausibility() NROY = hm.get_NROY() RO = hm.get_RO() print("Fraction of points ruled out {:6}".format( str(float(len(RO)) / float(n_rand)))) # Plotting if makeplots: from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = fig.add_subplot(111, projection='3d') Axes3D.scatter( # Training Data ax, x_training[:, 0], x_training[:, 1], y_training, color='black', marker='.', s=100) #Axes3D.scatter( # GPE prediction # ax, # coords[:,0], # coords[:,1], # expectations[0], # color='red', # marker='.', # s=2 #) Axes3D.scatter( # GPE prediction uncertainty ax, coords[:, 0][RO], coords[:, 1][RO], expectations[0][RO] + 3 * np.sqrt(expectations[1][RO]), color='red', marker='.', s=1) Axes3D.scatter(ax, coords[:, 0][RO], coords[:, 1][RO], expectations[0][RO] - 3 * np.sqrt(expectations[1][RO]), color='red', marker='.', s=1) Axes3D.scatter(ax, coords[:, 0][NROY], coords[:, 1][NROY], expectations[0][NROY] + 3 * np.sqrt(expectations[1][NROY]), color='green', marker='.', s=1) Axes3D.scatter(ax, coords[:, 0][NROY], coords[:, 1][NROY], expectations[0][NROY] - 3 * np.sqrt(expectations[1][NROY]), color='green', marker='.', s=1) Axes3D.set(ax, xlabel='Input parameter a', ylabel='Input parameter b', zlabel='Model output f(a, b)') plt.savefig('histmatch_2D.png', bbox_inches="tight")