| @@ -39,6 +39,8 @@ class MedianPreimageGenerator(PreimageGenerator): | |||||
| self.__max_itrs_without_update = 3 | self.__max_itrs_without_update = 3 | ||||
| self.__epsilon_residual = 0.01 | self.__epsilon_residual = 0.01 | ||||
| self.__epsilon_ec = 0.1 | self.__epsilon_ec = 0.1 | ||||
| self.__allow_zeros = False | |||||
| self.__triangle_rule = True | |||||
| # values to compute. | # values to compute. | ||||
| self.__runtime_optimize_ec = None | self.__runtime_optimize_ec = None | ||||
| self.__runtime_generate_preimage = None | self.__runtime_generate_preimage = None | ||||
| @@ -79,6 +81,8 @@ class MedianPreimageGenerator(PreimageGenerator): | |||||
| self.__epsilon_ec = kwargs.get('epsilon_ec', 0.1) | self.__epsilon_ec = kwargs.get('epsilon_ec', 0.1) | ||||
| self.__gram_matrix_unnorm = kwargs.get('gram_matrix_unnorm', None) | self.__gram_matrix_unnorm = kwargs.get('gram_matrix_unnorm', None) | ||||
| self.__runtime_precompute_gm = kwargs.get('runtime_precompute_gm', None) | self.__runtime_precompute_gm = kwargs.get('runtime_precompute_gm', None) | ||||
| self.__allow_zeros = kwargs.get('allow_zeros', False) | |||||
| self.__triangle_rule = kwargs.get('triangle_rule', True) | |||||
| def run(self): | def run(self): | ||||
| @@ -382,7 +386,8 @@ class MedianPreimageGenerator(PreimageGenerator): | |||||
| def __update_ecc(self, nb_cost_mat, dis_k_vec, rw_constraints='inequality'): | def __update_ecc(self, nb_cost_mat, dis_k_vec, rw_constraints='inequality'): | ||||
| # if self.__ds_name == 'Letter-high': | # if self.__ds_name == 'Letter-high': | ||||
| if self.__ged_options['edit_cost'] == 'LETTER': | |||||
| if self.__ged_options['edit_cost'] == 'LETTER': | |||||
| raise Exception('Cannot compute for cost "LETTER".') | |||||
| pass | pass | ||||
| # # method 1: set alpha automatically, just tune c_vir and c_eir by | # # method 1: set alpha automatically, just tune c_vir and c_eir by | ||||
| # # LMS using cvxpy. | # # LMS using cvxpy. | ||||
| @@ -461,32 +466,34 @@ class MedianPreimageGenerator(PreimageGenerator): | |||||
| # edit_costs_new = [x.value[0], x.value[0], x.value[1], x.value[2], x.value[2]] | # edit_costs_new = [x.value[0], x.value[0], x.value[1], x.value[2], x.value[2]] | ||||
| # edit_costs_new = np.array(edit_costs_new) | # edit_costs_new = np.array(edit_costs_new) | ||||
| # residual = np.sqrt(prob.value) | # residual = np.sqrt(prob.value) | ||||
| if rw_constraints == 'inequality': | |||||
| # c_vs <= c_vi + c_vr. | |||||
| if not self.__triangle_rule and self.__allow_zeros: | |||||
| nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] | nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] | ||||
| x = cp.Variable(nb_cost_mat_new.shape[1]) | x = cp.Variable(nb_cost_mat_new.shape[1]) | ||||
| cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) | cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) | ||||
| constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])], | |||||
| np.array([1.0, 1.0, -1.0, 0.0, 0.0]).T@x >= 0.0] | |||||
| constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], | |||||
| np.array([1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 1.0, 0.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 0.0, 0.0, 1.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 0.0, 0.0, 0.0, 1.0]).T@x >= 0.01] | |||||
| prob = cp.Problem(cp.Minimize(cost_fun), constraints) | prob = cp.Problem(cp.Minimize(cost_fun), constraints) | ||||
| self.__execute_cvx(prob) | self.__execute_cvx(prob) | ||||
| edit_costs_new = x.value | edit_costs_new = x.value | ||||
| residual = np.sqrt(prob.value) | residual = np.sqrt(prob.value) | ||||
| elif rw_constraints == '2constraints': | |||||
| # c_vs <= c_vi + c_vr and c_vi == c_vr, c_ei == c_er. | |||||
| elif self.__triangle_rule and self.__allow_zeros: | |||||
| nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] | nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] | ||||
| x = cp.Variable(nb_cost_mat_new.shape[1]) | x = cp.Variable(nb_cost_mat_new.shape[1]) | ||||
| cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) | cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) | ||||
| constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])], | |||||
| np.array([1.0, 1.0, -1.0, 0.0, 0.0]).T@x >= 0.0, | |||||
| np.array([1.0, -1.0, 0.0, 0.0, 0.0]).T@x == 0.0, | |||||
| np.array([0.0, 0.0, 0.0, 1.0, -1.0]).T@x == 0.0] | |||||
| constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], | |||||
| np.array([1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 1.0, 0.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 0.0, 0.0, 1.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 0.0, 0.0, 0.0, 1.0]).T@x >= 0.01, | |||||
| np.array([1.0, 1.0, -1.0, 0.0, 0.0]).T@x >= 0.0] | |||||
| prob = cp.Problem(cp.Minimize(cost_fun), constraints) | prob = cp.Problem(cp.Minimize(cost_fun), constraints) | ||||
| prob.solve() | |||||
| self.__execute_cvx(prob) | |||||
| edit_costs_new = x.value | edit_costs_new = x.value | ||||
| residual = np.sqrt(prob.value) | residual = np.sqrt(prob.value) | ||||
| elif rw_constraints == 'no-constraint': | |||||
| # no constraint. | |||||
| elif not self.__triangle_rule and not self.__allow_zeros: | |||||
| nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] | nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] | ||||
| x = cp.Variable(nb_cost_mat_new.shape[1]) | x = cp.Variable(nb_cost_mat_new.shape[1]) | ||||
| cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) | cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) | ||||
| @@ -508,11 +515,36 @@ class MedianPreimageGenerator(PreimageGenerator): | |||||
| # edit_costs_new = [x.value[0], x.value[0], x.value[1], x.value[2], x.value[2]] | # edit_costs_new = [x.value[0], x.value[0], x.value[1], x.value[2], x.value[2]] | ||||
| # edit_costs_new = np.array(edit_costs_new) | # edit_costs_new = np.array(edit_costs_new) | ||||
| # residual = np.sqrt(prob.value) | # residual = np.sqrt(prob.value) | ||||
| elif self.__triangle_rule and not self.__allow_zeros: | |||||
| # c_vs <= c_vi + c_vr. | |||||
| nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] | |||||
| x = cp.Variable(nb_cost_mat_new.shape[1]) | |||||
| cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) | |||||
| constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])], | |||||
| np.array([1.0, 1.0, -1.0, 0.0, 0.0]).T@x >= 0.0] | |||||
| prob = cp.Problem(cp.Minimize(cost_fun), constraints) | |||||
| self.__execute_cvx(prob) | |||||
| edit_costs_new = x.value | |||||
| residual = np.sqrt(prob.value) | |||||
| elif rw_constraints == '2constraints': # @todo: rearrange it later. | |||||
| # c_vs <= c_vi + c_vr and c_vi == c_vr, c_ei == c_er. | |||||
| nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] | |||||
| x = cp.Variable(nb_cost_mat_new.shape[1]) | |||||
| cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) | |||||
| constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])], | |||||
| np.array([1.0, 1.0, -1.0, 0.0, 0.0]).T@x >= 0.0, | |||||
| np.array([1.0, -1.0, 0.0, 0.0, 0.0]).T@x == 0.0, | |||||
| np.array([0.0, 0.0, 0.0, 1.0, -1.0]).T@x == 0.0] | |||||
| prob = cp.Problem(cp.Minimize(cost_fun), constraints) | |||||
| prob.solve() | |||||
| edit_costs_new = x.value | |||||
| residual = np.sqrt(prob.value) | |||||
| elif self.__ged_options['edit_cost'] == 'NON_SYMBOLIC': | elif self.__ged_options['edit_cost'] == 'NON_SYMBOLIC': | ||||
| is_n_attr = np.count_nonzero(nb_cost_mat[:,2]) | is_n_attr = np.count_nonzero(nb_cost_mat[:,2]) | ||||
| is_e_attr = np.count_nonzero(nb_cost_mat[:,5]) | is_e_attr = np.count_nonzero(nb_cost_mat[:,5]) | ||||
| if self.__ds_name == 'SYNTHETICnew': | |||||
| if self.__ds_name == 'SYNTHETICnew': # @todo: rearrenge this later. | |||||
| # nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4]] | # nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4]] | ||||
| nb_cost_mat_new = nb_cost_mat[:,[2,3,4]] | nb_cost_mat_new = nb_cost_mat[:,[2,3,4]] | ||||
| x = cp.Variable(nb_cost_mat_new.shape[1]) | x = cp.Variable(nb_cost_mat_new.shape[1]) | ||||
| @@ -529,7 +561,149 @@ class MedianPreimageGenerator(PreimageGenerator): | |||||
| np.array([0.0]))) | np.array([0.0]))) | ||||
| residual = np.sqrt(prob.value) | residual = np.sqrt(prob.value) | ||||
| elif rw_constraints == 'inequality': | |||||
| elif not self.__triangle_rule and self.__allow_zeros: | |||||
| if is_n_attr and is_e_attr: | |||||
| nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4,5]] | |||||
| x = cp.Variable(nb_cost_mat_new.shape[1]) | |||||
| cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) | |||||
| constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], | |||||
| np.array([1.0, 0.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 0.0, 0.0, 1.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 0.0, 0.0, 0.0, 1.0, 0.0]).T@x >= 0.01] | |||||
| prob = cp.Problem(cp.Minimize(cost_fun), constraints) | |||||
| self.__execute_cvx(prob) | |||||
| edit_costs_new = x.value | |||||
| residual = np.sqrt(prob.value) | |||||
| elif is_n_attr and not is_e_attr: | |||||
| nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4]] | |||||
| x = cp.Variable(nb_cost_mat_new.shape[1]) | |||||
| cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) | |||||
| constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], | |||||
| np.array([1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 1.0, 0.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 0.0, 0.0, 1.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 0.0, 0.0, 0.0, 1.0]).T@x >= 0.01] | |||||
| prob = cp.Problem(cp.Minimize(cost_fun), constraints) | |||||
| self.__execute_cvx(prob) | |||||
| edit_costs_new = np.concatenate((x.value, np.array([0.0]))) | |||||
| residual = np.sqrt(prob.value) | |||||
| elif not is_n_attr and is_e_attr: | |||||
| nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] | |||||
| x = cp.Variable(nb_cost_mat_new.shape[1]) | |||||
| cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) | |||||
| constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], | |||||
| np.array([1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 1.0, 0.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 0.0, 1.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 0.0, 0.0, 1.0, 0.0]).T@x >= 0.01] | |||||
| prob = cp.Problem(cp.Minimize(cost_fun), constraints) | |||||
| self.__execute_cvx(prob) | |||||
| edit_costs_new = np.concatenate((x.value[0:2], np.array([0.0]), x.value[2:])) | |||||
| residual = np.sqrt(prob.value) | |||||
| else: | |||||
| nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4]] | |||||
| x = cp.Variable(nb_cost_mat_new.shape[1]) | |||||
| cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) | |||||
| constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])]] | |||||
| prob = cp.Problem(cp.Minimize(cost_fun), constraints) | |||||
| self.__execute_cvx(prob) | |||||
| edit_costs_new = np.concatenate((x.value[0:2], np.array([0.0]), | |||||
| x.value[2:], np.array([0.0]))) | |||||
| residual = np.sqrt(prob.value) | |||||
| elif self.__triangle_rule and self.__allow_zeros: | |||||
| if is_n_attr and is_e_attr: | |||||
| nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4,5]] | |||||
| x = cp.Variable(nb_cost_mat_new.shape[1]) | |||||
| cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) | |||||
| constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], | |||||
| np.array([1.0, 0.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 0.0, 0.0, 1.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 0.0, 0.0, 0.0, 1.0, 0.0]).T@x >= 0.01, | |||||
| np.array([1.0, 1.0, -1.0, 0.0, 0.0, 0.0]).T@x >= 0.0, | |||||
| np.array([0.0, 0.0, 0.0, 1.0, 1.0, -1.0]).T@x >= 0.0] | |||||
| prob = cp.Problem(cp.Minimize(cost_fun), constraints) | |||||
| self.__execute_cvx(prob) | |||||
| edit_costs_new = x.value | |||||
| residual = np.sqrt(prob.value) | |||||
| elif is_n_attr and not is_e_attr: | |||||
| nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4]] | |||||
| x = cp.Variable(nb_cost_mat_new.shape[1]) | |||||
| cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) | |||||
| constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], | |||||
| np.array([1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 1.0, 0.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 0.0, 0.0, 1.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 0.0, 0.0, 0.0, 1.0]).T@x >= 0.01, | |||||
| np.array([1.0, 1.0, -1.0, 0.0, 0.0]).T@x >= 0.0] | |||||
| prob = cp.Problem(cp.Minimize(cost_fun), constraints) | |||||
| self.__execute_cvx(prob) | |||||
| edit_costs_new = np.concatenate((x.value, np.array([0.0]))) | |||||
| residual = np.sqrt(prob.value) | |||||
| elif not is_n_attr and is_e_attr: | |||||
| nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] | |||||
| x = cp.Variable(nb_cost_mat_new.shape[1]) | |||||
| cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) | |||||
| constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], | |||||
| np.array([1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 1.0, 0.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 0.0, 1.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 0.0, 0.0, 1.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 0.0, 1.0, 1.0, -1.0]).T@x >= 0.0] | |||||
| prob = cp.Problem(cp.Minimize(cost_fun), constraints) | |||||
| self.__execute_cvx(prob) | |||||
| edit_costs_new = np.concatenate((x.value[0:2], np.array([0.0]), x.value[2:])) | |||||
| residual = np.sqrt(prob.value) | |||||
| else: | |||||
| nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4]] | |||||
| x = cp.Variable(nb_cost_mat_new.shape[1]) | |||||
| cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) | |||||
| constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])]] | |||||
| prob = cp.Problem(cp.Minimize(cost_fun), constraints) | |||||
| self.__execute_cvx(prob) | |||||
| edit_costs_new = np.concatenate((x.value[0:2], np.array([0.0]), | |||||
| x.value[2:], np.array([0.0]))) | |||||
| residual = np.sqrt(prob.value) | |||||
| elif not self.__triangle_rule and not self.__allow_zeros: | |||||
| if is_n_attr and is_e_attr: | |||||
| nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4,5]] | |||||
| x = cp.Variable(nb_cost_mat_new.shape[1]) | |||||
| cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) | |||||
| constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])]] | |||||
| prob = cp.Problem(cp.Minimize(cost_fun), constraints) | |||||
| self.__execute_cvx(prob) | |||||
| edit_costs_new = x.value | |||||
| residual = np.sqrt(prob.value) | |||||
| elif is_n_attr and not is_e_attr: | |||||
| nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4]] | |||||
| x = cp.Variable(nb_cost_mat_new.shape[1]) | |||||
| cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) | |||||
| constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])]] | |||||
| prob = cp.Problem(cp.Minimize(cost_fun), constraints) | |||||
| self.__execute_cvx(prob) | |||||
| edit_costs_new = np.concatenate((x.value, np.array([0.0]))) | |||||
| residual = np.sqrt(prob.value) | |||||
| elif not is_n_attr and is_e_attr: | |||||
| nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] | |||||
| x = cp.Variable(nb_cost_mat_new.shape[1]) | |||||
| cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) | |||||
| constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])]] | |||||
| prob = cp.Problem(cp.Minimize(cost_fun), constraints) | |||||
| self.__execute_cvx(prob) | |||||
| edit_costs_new = np.concatenate((x.value[0:2], np.array([0.0]), x.value[2:])) | |||||
| residual = np.sqrt(prob.value) | |||||
| else: | |||||
| nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4]] | |||||
| x = cp.Variable(nb_cost_mat_new.shape[1]) | |||||
| cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) | |||||
| constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])]] | |||||
| prob = cp.Problem(cp.Minimize(cost_fun), constraints) | |||||
| self.__execute_cvx(prob) | |||||
| edit_costs_new = np.concatenate((x.value[0:2], np.array([0.0]), | |||||
| x.value[2:], np.array([0.0]))) | |||||
| residual = np.sqrt(prob.value) | |||||
| elif self.__triangle_rule and not self.__allow_zeros: | |||||
| # c_vs <= c_vi + c_vr. | # c_vs <= c_vi + c_vr. | ||||
| if is_n_attr and is_e_attr: | if is_n_attr and is_e_attr: | ||||
| nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4,5]] | nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4,5]] | ||||
| @@ -572,17 +746,54 @@ class MedianPreimageGenerator(PreimageGenerator): | |||||
| edit_costs_new = np.concatenate((x.value[0:2], np.array([0.0]), | edit_costs_new = np.concatenate((x.value[0:2], np.array([0.0]), | ||||
| x.value[2:], np.array([0.0]))) | x.value[2:], np.array([0.0]))) | ||||
| residual = np.sqrt(prob.value) | residual = np.sqrt(prob.value) | ||||
| elif self.__ged_options['edit_cost'] == 'CONSTANT': # @todo: node/edge may not labeled. | elif self.__ged_options['edit_cost'] == 'CONSTANT': # @todo: node/edge may not labeled. | ||||
| x = cp.Variable(nb_cost_mat.shape[1]) | |||||
| cost_fun = cp.sum_squares(nb_cost_mat * x - dis_k_vec) | |||||
| constraints = [x >= [0.01 for i in range(nb_cost_mat.shape[1])], | |||||
| np.array([1.0, 1.0, -1.0, 0.0, 0.0, 0.0]).T@x >= 0.0, | |||||
| np.array([0.0, 0.0, 0.0, 1.0, 1.0, -1.0]).T@x >= 0.0] | |||||
| prob = cp.Problem(cp.Minimize(cost_fun), constraints) | |||||
| self.__execute_cvx(prob) | |||||
| edit_costs_new = x.value | |||||
| residual = np.sqrt(prob.value) | |||||
| if not self.__triangle_rule and self.__allow_zeros: | |||||
| x = cp.Variable(nb_cost_mat.shape[1]) | |||||
| cost_fun = cp.sum_squares(nb_cost_mat * x - dis_k_vec) | |||||
| constraints = [x >= [0.0 for i in range(nb_cost_mat.shape[1])], | |||||
| np.array([1.0, 0.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 0.0, 0.0, 1.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 0.0, 0.0, 0.0, 1.0, 0.0]).T@x >= 0.01] | |||||
| prob = cp.Problem(cp.Minimize(cost_fun), constraints) | |||||
| self.__execute_cvx(prob) | |||||
| edit_costs_new = x.value | |||||
| residual = np.sqrt(prob.value) | |||||
| elif self.__triangle_rule and self.__allow_zeros: | |||||
| x = cp.Variable(nb_cost_mat.shape[1]) | |||||
| cost_fun = cp.sum_squares(nb_cost_mat * x - dis_k_vec) | |||||
| constraints = [x >= [0.0 for i in range(nb_cost_mat.shape[1])], | |||||
| np.array([1.0, 0.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 0.0, 0.0, 1.0, 0.0, 0.0]).T@x >= 0.01, | |||||
| np.array([0.0, 0.0, 0.0, 0.0, 1.0, 0.0]).T@x >= 0.01, | |||||
| np.array([1.0, 1.0, -1.0, 0.0, 0.0, 0.0]).T@x >= 0.0, | |||||
| np.array([0.0, 0.0, 0.0, 1.0, 1.0, -1.0]).T@x >= 0.0] | |||||
| prob = cp.Problem(cp.Minimize(cost_fun), constraints) | |||||
| self.__execute_cvx(prob) | |||||
| edit_costs_new = x.value | |||||
| residual = np.sqrt(prob.value) | |||||
| elif not self.__triangle_rule and not self.__allow_zeros: | |||||
| x = cp.Variable(nb_cost_mat.shape[1]) | |||||
| cost_fun = cp.sum_squares(nb_cost_mat * x - dis_k_vec) | |||||
| constraints = [x >= [0.01 for i in range(nb_cost_mat.shape[1])]] | |||||
| prob = cp.Problem(cp.Minimize(cost_fun), constraints) | |||||
| self.__execute_cvx(prob) | |||||
| edit_costs_new = x.value | |||||
| residual = np.sqrt(prob.value) | |||||
| elif self.__triangle_rule and not self.__allow_zeros: | |||||
| x = cp.Variable(nb_cost_mat.shape[1]) | |||||
| cost_fun = cp.sum_squares(nb_cost_mat * x - dis_k_vec) | |||||
| constraints = [x >= [0.01 for i in range(nb_cost_mat.shape[1])], | |||||
| np.array([1.0, 1.0, -1.0, 0.0, 0.0, 0.0]).T@x >= 0.0, | |||||
| np.array([0.0, 0.0, 0.0, 1.0, 1.0, -1.0]).T@x >= 0.0] | |||||
| prob = cp.Problem(cp.Minimize(cost_fun), constraints) | |||||
| self.__execute_cvx(prob) | |||||
| edit_costs_new = x.value | |||||
| residual = np.sqrt(prob.value) | |||||
| else: | else: | ||||
| raise Exception('The edit cost "', self.__ged_options['edit_cost'], '" is not supported for update progress.') | |||||
| # # method 1: simple least square method. | # # method 1: simple least square method. | ||||
| # edit_costs_new, residual, _, _ = np.linalg.lstsq(nb_cost_mat, dis_k_vec, | # edit_costs_new, residual, _, _ = np.linalg.lstsq(nb_cost_mat, dis_k_vec, | ||||
| # rcond=None) | # rcond=None) | ||||