|
@@ -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) |
|
|