From 605edb9c7f4d20383a4d79d5ff8d013c4c89fbe6 Mon Sep 17 00:00:00 2001 From: Abd Errahmane Kiouche <abd-errahmane.kiouche@etu.univ-lyon1.fr> Date: Thu, 14 Jan 2021 16:06:04 +0100 Subject: [PATCH] Update PL_order/PL_order.py --- PL_order/PL_order.py | 232 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 232 insertions(+) create mode 100644 PL_order/PL_order.py diff --git a/PL_order/PL_order.py b/PL_order/PL_order.py new file mode 100644 index 0000000..facc2c7 --- /dev/null +++ b/PL_order/PL_order.py @@ -0,0 +1,232 @@ +import numpy as np +from cylp.cy import CyClpSimplex +from cylp.py.modeling.CyLPModel import CyLPModel, CyLPArray +from cylp.py.mip import SimpleNodeCompare +from cylp.cy.CyCgl import CyCglGomory, CyCglClique, CyCglKnapsackCover + +from cylp.py.utils.sparseUtil import csr_matrixPlus +import networkx as nx +import numpy as np +import time +import sys + + + +from scipy.sparse import csc_matrix + + +def load_graph(file_path, isdirected): + f = open(file_path,"r") + if isdirected : + G = nx.DiGraph() # the graph is directed + else: + G = nx.Graph() # the graph is undirected + lines = f.readlines() + for line in lines : + nodes = line.split('\t') + if int(nodes[0])!=int(nodes[1]): + #G.add_node(int(nodes[0])) + #G.add_node(int(nodes[1])) + G.add_edge(int(nodes[0]),int(nodes[1])) + return G + + +def PL_variables(G,t,pr): + + all_paths = [] + edges_dict ={} # key : edge , value : edge index + dict_paths ={} # key : edge , value : path index + # init + for n in G.nodes() : + for n2 in list(G.neighbors(n)): + dict_paths[(n,n2)] = [] + #dict_paths[(n2,n)] = [] + # Extract all simple path with length <= t + edges= list(G.edges()) + i = 0 + nodes = list(G.nodes()) + for i1 in range(len(nodes)-1): + n = nodes[i1] + for i2 in range(i1+1,len(nodes)) : + l = nodes[i2] + paths = nx.all_simple_paths(G,source =n ,target = l, cutoff= t) + l_path = [ list(p) for p in map(nx.utils.pairwise, paths)] + for p in l_path : + all_paths.append(p) + if l in list(G.neighbors(n)) : + dict_paths[(n,l)].append(len(edges)+i) + dict_paths[(l,n)].append(len(edges)+i) + i+=1 + + print("The number of paths : " + str(len(all_paths))) + # creating edges dict + + + edges_dict ={} + i = 0 + for e in edges : + u = e[0] + v = e[1] + edges_dict[(u,v)] = i + edges_dict[(v,u)] = i + i+=1 + # creating pl variables + objs = [1 for i in range(len(edges))] + [0 for j in range(len(all_paths))] + lhs_ineqs_r = [] + lhs_ineqs_c = [] + lhs_ineqs_d = [] + + lhs_ineqs2_r = [] + lhs_ineqs2_c = [] + lhs_ineqs2_d = [] + + + rhs_ineqs = [] + rhs_ineqs2 = [] + # inequality (3) + r_i = 0 + path_index = len(edges) + for path in all_paths : + for e in path : + lhs_ineqs_r.append(r_i) + lhs_ineqs_c.append(edges_dict[e]) + lhs_ineqs_d.append(-1) + lhs_ineqs_r.append(r_i) + lhs_ineqs_c.append(path_index) + lhs_ineqs_d.append(1) + rhs_ineqs.append(0) + r_i+=1 + path_index+=1 + + # inequality (4) + for e in edges : + u,v = e + if v < u: + e =(v,u) + find =False + for i in dict_paths[e] : + find = True + lhs_ineqs_r.append(r_i) + lhs_ineqs_c.append(i) + lhs_ineqs_d.append(1) + if find : + r_i+=1 + rhs_ineqs.append(1) + + # inequality (5) + r_i2 = 0 + for i in range(1,t+1): + for u in G.nodes(): + find = False + for v in list(G.neighbors(u)): + pis = dict_paths[(u,v)] + if v < u : + pis = dict_paths[(v,u)] + for pi in pis: + if (len(all_paths[pi-len(edges)])<= i): + find = True + lhs_ineqs2_r.append(r_i2) + lhs_ineqs2_c.append(pi) + lhs_ineqs2_d.append(1) + if find : + r_i2+=1 + prsn = pr[i]*len(list(G.neighbors(u))) + rhs_ineqs2.append(prsn) + + row = np.array(lhs_ineqs_r) + col = np.array(lhs_ineqs_c) + data = np.array(lhs_ineqs_d) + lhs_ineqs = csc_matrix((data, (row, col)), shape=(r_i, len(objs))) + row = np.array(lhs_ineqs2_r) + col = np.array(lhs_ineqs2_c) + data = np.array(lhs_ineqs2_d) + lhs_ineqs2 = csc_matrix((data, (row, col)), shape=(r_i2, len(objs))) + return objs,lhs_ineqs,rhs_ineqs,lhs_ineqs2,rhs_ineqs2 + + + + + +def save_graph(G,filename): + file = open(file_name,"w") + for e in G.edges(): + file.write(str(e[0])+'\t'+str(e[1])+ "\n") + file.close() + + + + + + + + + +if __name__ == "__main__": + + np.set_printoptions(threshold=sys.maxsize) + for i in range(30): + file_name = sys.argv[1] + str(i) + ".txt" + file_name_o = sys.argv[2] + str(i) + "_PL.txt" + algo = sys.argv[3] + G = load_graph( file_name , False) + t = 2 + p = [0,0.0,0.5] + print ("Computing variables . . . ") + start = time.time() + objs,lhs_ineqs,rhs_ineqs,lhs_ineqs2,rhs_ineqs2 = PL_variables(G,t,p) + end = time.time() + print("Runtime : " + str( end-start )) + + print("Solving the linear problem . . . ") + s = CyClpSimplex() + x = s.addVariable('x',len(objs),isInt=True) + #s.setInteger(x[0:len(objs)]) + # Create coefficients and bounds + A = lhs_ineqs + a = CyLPArray(rhs_ineqs) + B = lhs_ineqs2 + b = CyLPArray(rhs_ineqs2) + + # Add constraints + s += A * x <= a + s += 0 <= x <= 1 + s += B * x >= b + + + # Set the objective function + c = CyLPArray(objs) + s.objective = c * x + if ( algo == '1' ) : + print("Relaxed problem") + s.primal() + sol = s.primalVariableSolution['x'] + else : + print("Integer linear programming") + s.copyInIntegerInformation(np.array ( s.nCols * [ True ], np.uint8 )) + cbcModel = s.getCbcModel () + cbcModel.solve() + sol = cbcModel.primalVariableSolution['x'] + + end = time.time() + print("Runtime : " + str( end-start )) + data = np.asarray(sol) + + score_list = list(data) + scores = score_list[0:len(list(G.edges()))] + edges = list(G.edges()) + + for i in range(len(scores)) : + if scores[i] < 0 : + scores[i] = 0 + # sorting the edges + dict_edges_scores = {} + for i in range(len(scores)) : + dict_edges_scores[i] = scores[i] + + sorted_edges = list({k: v for k, v in sorted(dict_edges_scores.items(), key=lambda item: item[1],reverse=True)}.keys()) + + + file = open(file_name_o,"w") + for s in sorted_edges: + file.write(str(edges[s][0])+'\t'+str(edges[s][1])+'\t'+ str(dict_edges_scores[s])+ "\n") + file.close() \ No newline at end of file -- GitLab