import sys import math def getNetwork(fileName): data = open(fileName) edges = {} nodes = set([]) for line in data: atts = line.strip().split("\t") edges[atts[0]+"|"+atts[1]] = (float(atts[2])) nodes.add(atts[0]); nodes.add(atts[1]) return [nodes, edges] def parseNetwork(data): edges = {} nodes = set([]) for line in data.strip().split("\n"): atts = line.strip().split("\t") print atts edges[atts[0]+"|"+atts[1]] = (float(atts[2])) nodes.add(atts[0]); nodes.add(atts[1]) return [nodes, edges] def getOverlap(net1, net2): net3_nodes = net1[0]&net2[0] all_edges = set([]) for edge in net2[1].keys(): all_edges.add(edge) rev_edge = edge.split("|")[1] + "|" + edge.split("|")[0] all_edges.add(rev_edge) net31_edges = all_edges & set(net1[1].keys()) all_edges = set([]) for edge in net1[1].keys(): all_edges.add(edge) rev_edge = edge.split("|")[1] + "|" + edge.split("|")[0] all_edges.add(rev_edge) net32_edges = all_edges & set(net2[1].keys()) return [net3_nodes, net31_edges, net32_edges] def getMeasure(net1, net2): net1_val = net1[1].values(); net2_val = net2[1].values(); net3 = getOverlap(net1, net2) net13_val = {x: net1[1][x] for x in net3[1]} net23_val = {x: net2[1][x] for x in net3[2]} mean1 = math.fsum(net1_val)/float(len(net1_val)) mean2 = math.fsum(net2_val)/float(len(net2_val)) sum3 = 0; for edge in net3[1]: rev_edge = edge.split("|")[1] + "|" + edge.split("|")[0] if net23_val.has_key(edge): sum3 += (net13_val[edge] + net23_val[edge])/2 else: sum3 += (net13_val[edge] + net23_val[rev_edge])/2 # mean3 = sum3 / len(net3[1].keys()) if len(net3[1])==0: mean3 = 0 else: mean3 = (math.fsum(net13_val.values())/float(len(net13_val))+math.fsum(net23_val.values())/float(len(net23_val)))/2 sig = mean3 / (math.sqrt(mean1)*math.sqrt(mean2)) size = len(net3[0]) /(math.sqrt(len(net1[0]))*math.sqrt(len(net2[0]))) measure = sig * size print mean1, mean2, mean3, measure, sig, size return [len(net1[0]), len(net2[0]), len(net3[0]), measure, sig, size] def coexAPI(net1, net2): net1 = parseNetwork(net1) net2 = parseNetwork(net2) sim = getMeasure(net1, net2) API_result = {"size1":sim[0], "size2":sim[1], "size3":sim[2], "sim": sim[3], "sig": sim[4], "rel_size": sim[5]} return API_result if __name__ == '__main__': #compute from two tab-delimited networks net1_path = sys.argv[1] net2_path = sys.argv[2] print coexAPI(net1_path, net2_path) #import function coexAPI for use