def test_inference(): # Test inference with different weights in different directions X, Y = toy.generate_blocks_multinomial(noise=2, n_samples=1, seed=1) x, y = X[0], Y[0] n_states = x.shape[-1] edges = _make_grid_edges(x, neighborhood=4) edge_list = _make_grid_edges(x, 4, return_lists=True) edges = np.vstack(edge_list) pw_horz = -1 * np.eye(n_states) xx, yy = np.indices(pw_horz.shape) # linear ordering constraint horizontally pw_horz[xx > yy] = 1 # high cost for unequal labels vertically pw_vert = -1 * np.eye(n_states) pw_vert[xx != yy] = 1 pw_vert *= 10 # generate edge weights edge_weights_horizontal = np.repeat(pw_horz[np.newaxis, :, :], edge_list[0].shape[0], axis=0) edge_weights_vertical = np.repeat(pw_vert[np.newaxis, :, :], edge_list[1].shape[0], axis=0) edge_weights = np.vstack([edge_weights_horizontal, edge_weights_vertical]) # do inference res = lp_general_graph(-x.reshape(-1, n_states), edges, edge_weights, exact=False) # same inference through CRF inferface crf = DirectionalGridCRF(n_states=3, inference_method='lp') w = np.hstack([np.ones(3), -pw_horz.ravel(), -pw_vert.ravel()]) y_pred = crf.inference(x, w, relaxed=True) assert_array_almost_equal(res[0], y_pred[0].reshape(-1, n_states)) assert_array_almost_equal(res[1], y_pred[1]) assert_array_equal(y, np.argmax(y_pred[0], axis=-1))
def test_energy(): # make sure that energy as computed by ssvm is the same as by lp np.random.seed(0) found_fractional = False while not found_fractional: x = np.random.normal(size=(2, 2, 3)) unary_params = np.ones(3) pairwise_params = np.random.normal() * np.eye(3) edges = _make_grid_edges(x) # check map inference inf_res, energy_lp = _inference_lp( x, unary_params, pairwise_params, edges=edges, relaxed=True, return_energy=True, exact=True ) found_fractional = np.any(np.max(inf_res[0], axis=-1) != 1) energy_svm = compute_energy(x, inf_res, unary_params, pairwise_params, neighborhood=4) assert_almost_equal(energy_lp, -energy_svm)