def test_edge_type_graph_crf_energy_lp_integral(): # same test as for graph crf above, using single edge type crf = EdgeTypeGraphCRF(n_states=2, inference_method="lp", n_edge_types=1) inf_res, energy_lp = crf.inference((x_1, [g_1]), w_sym, relaxed=True, return_energy=True) # integral solution assert_array_almost_equal(np.max(inf_res[0], axis=-1), 1) y = np.argmax(inf_res[0], axis=-1) # energy and psi check out assert_almost_equal(energy_lp, -np.dot(w_sym, crf.psi((x_1, [g_1]), y)))
def test_edge_type_graph_crf_energy_lp_relaxed(): # same test as for graph crf above, using single edge type crf = EdgeTypeGraphCRF(n_states=2, inference_method="lp", n_edge_types=1) for i in xrange(10): w_ = np.random.uniform(size=w_sym.shape) inf_res, energy_lp = crf.inference((x_1, [g_1]), w_, relaxed=True, return_energy=True) assert_almost_equal(energy_lp, -np.dot(w_, crf.psi((x_1, [g_1]), inf_res))) # now with fractional solution x = np.array([[0, 0], [0, 0], [0, 0]]) inf_res, energy_lp = crf.inference((x, [g_1]), w_sym, relaxed=True, return_energy=True) assert_almost_equal(energy_lp, -np.dot(w_sym, crf.psi((x, [g_1]), inf_res)))
def test_edge_type_graph_crf(): # create two samples with different graphs # two states only, pairwise smoothing # all edges are of the first type. should do the same as GraphCRF # if we make w symmetric for inference_method in get_installed(['qpbo', 'lp', 'ad3', 'dai', 'ogm']): crf = EdgeTypeGraphCRF(n_states=2, inference_method=inference_method, n_edge_types=1) assert_array_equal(crf.inference((x_1, [g_1]), w_sym), y_1) assert_array_equal(crf.inference((x_2, [g_2]), w_sym), y_2) # same, only with two edge types and no edges of second type w_sym_ = np.array([1, 0, # unary 0, 1, .22, 0, # pairwise 0, .22, 2, -1, # second edge type, doesn't exist -1, 3]) for inference_method in get_installed(['qpbo', 'lp', 'ad3', 'dai', 'ogm']): crf = EdgeTypeGraphCRF(n_states=2, inference_method=inference_method, n_edge_types=2) assert_array_equal(crf.inference((x_1, [g_1, np.zeros((0, 2), dtype=np.int)]), w_sym_), y_1) assert_array_equal(crf.inference((x_2, [g_2, np.zeros((0, 2), dtype=np.int)]), w_sym_), y_2) print crf.get_pairwise_potentials((x_2, [g_2, np.zeros((0, 2), dtype=np.int)]), w_sym_)
def test_edge_type_graph_crf(): # create two samples with different graphs # two states only, pairwise smoothing # all edges are of the first type. should do the same as GraphCRF # if we make w symmetric for inference_method in ["qpbo", "lp", "ad3", "dai"]: crf = EdgeTypeGraphCRF(n_states=2, inference_method=inference_method, n_edge_types=1) assert_array_equal(crf.inference((x_1, [g_1]), w_sym), y_1) assert_array_equal(crf.inference((x_2, [g_2]), w_sym), y_2) # same, only with two edge types and no edges of second type w_sym_ = np.array( [1, 0, 0, 1, 0.22, 0, 0, 0.22, 2, -1, -1, 3] # unary # pairwise # second edge type, doesn't exist ) for inference_method in ["qpbo", "lp", "ad3", "dai"]: crf = EdgeTypeGraphCRF(n_states=2, inference_method=inference_method, n_edge_types=2) assert_array_equal(crf.inference((x_1, [g_1, np.zeros((0, 2), dtype=np.int)]), w_sym_), y_1) assert_array_equal(crf.inference((x_2, [g_2, np.zeros((0, 2), dtype=np.int)]), w_sym_), y_2)
def loss_augmented_inference(self, x, y, w, relaxed=False, return_energy=False): y_hat = EdgeTypeGraphCRF.loss_augmented_inference( self, x, y.ravel(), w, relaxed=relaxed, return_energy=return_energy) return self._reshape_y(y_hat, x[0].shape[0], return_energy)
def inference(self, x, w, relaxed=False, return_energy=False): y = EdgeTypeGraphCRF.inference(self, x, w, relaxed=relaxed, return_energy=return_energy) return self._reshape_y(y, x[0].shape[0], return_energy)