diff --git a/gurobi.py b/gurobi.py index ad88723..893f97b 100644 --- a/gurobi.py +++ b/gurobi.py @@ -1,113 +1,112 @@ # -*- coding: utf-8 -*- """ Spyder Editor This is a temporary script file. """ import numpy as np import gurobipy as gp from gurobipy import GRB # This function places the molecule M optimally within the target T such that # the charges of the molecule CM and the charges of the target CT are # compatible def OptimalPlacement(M,CM,T,CT): try: #Dimemsion of the Molecule and Target m = len(M) n = len(T) - print("Sizes of Matrices to match: ", m, n, print("\n")) + print("-----------------------------------") + print("Sizes of Matrices to match: ", m, n) + print("-----------------------------------") # Create a new model Z = gp.Model("QP") #Create Variables x = Z.addVars(m, n, name='X', vtype=GRB.BINARY) Z.addConstrs(x.sum(i, '*') == 1 for i in range(m)) Z.addConstrs(x.sum('*',j) <= 1 for j in range(n)) # if the charges of atom i in molecule and atom j in target do not # match, then we forbid the assignment i-> j for i in range(m): for j in range(n): if(CM[i] != CT[j]): Z.addConstr(x[i,j] == 0) # Set objective by building a long expression expr = 2*x[1,1] * x[1,2] expr.clear() for i in range(m): for j in range(m): for k in range(n): for l in range(n): expr.add(x[i,k] * x[j,l], (T[k,l]-M[i,j])**2) Z.setObjective(expr, GRB.MINIMIZE) # Optimize model print("\n----------------\n Optimisation... \n----------------\n") Z.optimize() print("\n------------------\n Best match... \n------------------\n") matched_target = [] for v in Z.getVars(): if v.x == 1: i,j = v.varName.split("[")[-1].split("]")[0].split(",") j = int(j) matched_target.append(j) print("Indices of the target:") print(matched_target) # print("\n------------------\n Best match... \n------------------\n") # Z.printAttr('X') # print(Z.getObjective() ) return matched_target except gp.GurobiError as e: print('Error code ' + str(e.errno) + ': ' + str(e)) except AttributeError: print('Encountered an attribute error') #A shortcut to call the OptimalPlacement function -def Assignment(i,j): - OptimalPlacement(data['database_CMs'][i],data['database_ncharges'][i],data['target_CMs'][j],data['target_ncharges'][j]) +def Assignment(database_index, target_index): + target_CM = data['target_CMs'][target_index] + target_ncharges = data['target_ncharges'][target_index] + target_label = data['target_labels'][target_index] + assert len(target_CM) == len(target_ncharges) + + database_CM = data['database_CMs'][database_index] + database_ncharges = data['database_ncharges'][database_index] + database_label = data['database_labels'][database_index] + assert len(database_CM) == len(database_ncharges) + + print("----------------------------------------") + print("Trying to place", database_label, "inside", target_label, "...") + print("----------------------------------------") + target_indices = OptimalPlacement(database_CM, database_ncharges, target_CM, target_ncharges) + return target_indices if __name__ == "__main__": data = np.load("data.npz", allow_pickle=True) - 'target_ncharges' and 'database_ncharges' - # temporarily commented out the line below - - Assignment(2,2) - - #print("Molecule nuclear charges: \n", data['database_ncharges'][0], "\n") - #print("Target nuclear charges: \n", data['target_ncharges'][2], "\n") - # L = [2,8,7,1,4,9,10] - - # T = data['target_CMs'][0][L][:,L] - - # print("\n T = ", T) - - # T = T - data['database_CMs'][2] - - # print ("\n Error: ", np.sum(T ** 2)) - - #print("\n Molecule:", data['database_CMs'][2]) - #print("\n Target:",data['target_CMs'][0]) - - - + #'target_ncharges' and 'database_ncharges' + + database_index = 2 + target_index = 0 + Assignment(database_index, target_index)