1 |
48 |
alirezamon |
import networkx as nx
|
2 |
|
|
from remove_cycle_edges_by_hierarchy_greedy import scc_based_to_remove_cycle_edges_iterately
|
3 |
|
|
from remove_cycle_edges_by_hierarchy_BF import remove_cycle_edges_BF_iterately
|
4 |
|
|
from remove_cycle_edges_by_hierarchy_voting import remove_cycle_edges_heuristic
|
5 |
|
|
from measures import F1
|
6 |
|
|
from file_io import read_dict_from_file
|
7 |
|
|
from file_io import write_pairs_to_file
|
8 |
|
|
|
9 |
|
|
def get_edges_voting_scores(set_edges_list):
|
10 |
|
|
total_edges = set()
|
11 |
|
|
for edges in set_edges_list:
|
12 |
|
|
total_edges = total_edges | edges
|
13 |
|
|
edges_score = {}
|
14 |
|
|
for e in total_edges:
|
15 |
|
|
edges_score[e] = len(filter(lambda x: e in x, set_edges_list))
|
16 |
|
|
return edges_score
|
17 |
|
|
|
18 |
|
|
|
19 |
|
|
def remove_cycle_edges_strategies(graph_file,nodes_score_dict,score_name = "socialagony", nodetype = int):
|
20 |
|
|
|
21 |
|
|
|
22 |
|
|
g = nx.read_edgelist(graph_file,create_using = nx.DiGraph(),nodetype = nodetype)
|
23 |
|
|
# greedy
|
24 |
|
|
e1 = scc_based_to_remove_cycle_edges_iterately(g,nodes_score_dict)
|
25 |
|
|
g = nx.read_edgelist(graph_file,create_using = nx.DiGraph(),nodetype = nodetype)
|
26 |
|
|
# forward
|
27 |
|
|
e2 = remove_cycle_edges_BF_iterately(g,nodes_score_dict,is_Forward = True,score_name = score_name)
|
28 |
|
|
# backward
|
29 |
|
|
g = nx.read_edgelist(graph_file,create_using = nx.DiGraph(),nodetype = nodetype)
|
30 |
|
|
e3 = remove_cycle_edges_BF_iterately(g,nodes_score_dict,is_Forward = False,score_name = score_name)
|
31 |
|
|
return e1,e2,e3
|
32 |
|
|
|
33 |
|
|
def remove_cycle_edges_by_voting(graph_file,set_edges_list,nodetype = int):
|
34 |
|
|
edges_score = get_edges_voting_scores(set_edges_list)
|
35 |
|
|
e = remove_cycle_edges_heuristic(graph_file,edges_score,nodetype = nodetype)
|
36 |
|
|
return e
|
37 |
|
|
|
38 |
|
|
def remove_cycle_edges_by_hierarchy(graph_file,nodes_score_dict,score_name = "socialagony",nodetype = int):
|
39 |
|
|
e1,e2,e3 = remove_cycle_edges_strategies(graph_file,nodes_score_dict,score_name = score_name,nodetype = nodetype)
|
40 |
|
|
e4 = remove_cycle_edges_by_voting(graph_file,[set(e1),set(e2),set(e3)],nodetype = nodetype)
|
41 |
|
|
return e1,e2,e3,e4
|
42 |
|
|
|
43 |
|
|
def computing_hierarchy(graph_file,players_score_func_name, nodetype = int):
|
44 |
|
|
import os.path
|
45 |
|
|
if players_score_func_name == "socialagony":
|
46 |
|
|
from helper_funs import dir_tail_name
|
47 |
|
|
dir_name,tail = dir_tail_name(graph_file)
|
48 |
|
|
agony_file = os.path.join(dir_name,tail.split(".")[0] + "_socialagony.txt")
|
49 |
|
|
#agony_file = graph_file[:len(graph_file)-6] + "_socialagony.txt"
|
50 |
|
|
#from compute_social_agony import compute_social_agony
|
51 |
|
|
#players = compute_social_agony(graph_file,agony_path = "agony/agony ")
|
52 |
|
|
if False:
|
53 |
|
|
#if os.path.isfile(agony_file):
|
54 |
|
|
print("load pre-computed socialagony from: %s" % agony_file)
|
55 |
|
|
players = read_dict_from_file(agony_file)
|
56 |
|
|
else:
|
57 |
|
|
print("start computing socialagony...")
|
58 |
|
|
from compute_social_agony import compute_social_agony
|
59 |
|
|
players = compute_social_agony(graph_file,agony_path = "agony/agony ")
|
60 |
|
|
print("write socialagony to file: %s" % agony_file)
|
61 |
|
|
return players
|
62 |
|
|
g = nx.read_edgelist(graph_file,create_using = nx.DiGraph(),nodetype = nodetype)
|
63 |
|
|
if players_score_func_name == "pagerank":
|
64 |
|
|
#print("computing pagerank...")
|
65 |
|
|
players = nx.pagerank(g, alpha = 0.85)
|
66 |
|
|
return players
|
67 |
|
|
elif players_score_func_name == "trueskill":
|
68 |
|
|
output_file = graph_file[:len(graph_file)-6] + "_trueskill.txt"
|
69 |
|
|
output_file_2 = graph_file[:len(graph_file)-6] + "_trueskill.pkl"
|
70 |
|
|
#from true_skill import graphbased_trueskill
|
71 |
|
|
#players = graphbased_trueskill(g)
|
72 |
|
|
#from file_io import write_dict_to_file
|
73 |
|
|
#write_dict_to_file(players,output_file)
|
74 |
|
|
|
75 |
|
|
'''
|
76 |
|
|
if os.path.isfile(output_file):
|
77 |
|
|
print("load pre-computed trueskill from: %s" % output_file)
|
78 |
|
|
players = read_dict_from_file(output_file,key_type = int, value_type = float)
|
79 |
|
|
elif os.path.isfile(output_file_2):
|
80 |
|
|
print("load pre-computed trueskill from: %s" % output_file_2)
|
81 |
|
|
players = read_from_pickle(output_file_2)
|
82 |
|
|
'''
|
83 |
|
|
if True:
|
84 |
|
|
print("start computing trueskill...")
|
85 |
|
|
from true_skill import graphbased_trueskill
|
86 |
|
|
players = graphbased_trueskill(g)
|
87 |
|
|
from file_io import write_dict_to_file
|
88 |
|
|
print("write trueskill to file: %s" % output_file)
|
89 |
|
|
write_dict_to_file(players,output_file)
|
90 |
|
|
|
91 |
|
|
return players
|
92 |
|
|
|
93 |
|
|
def breaking_cycles_by_hierarchy_performance(graph_file,gt_file,players_score_name,nodetype = int):
|
94 |
|
|
|
95 |
|
|
from measures import report_performance
|
96 |
|
|
if players_score_name != "ensembling":
|
97 |
|
|
players_score_dict = computing_hierarchy(graph_file,players_score_name,nodetype = nodetype)
|
98 |
|
|
e1,e2,e3,e4 = remove_cycle_edges_by_hierarchy(graph_file,players_score_dict,players_score_name,nodetype = nodetype)
|
99 |
|
|
|
100 |
|
|
if players_score_name == "pagerank":
|
101 |
|
|
report_performance(gt_file,e1,"PR")
|
102 |
|
|
return
|
103 |
|
|
|
104 |
|
|
if players_score_name == "socialagony":
|
105 |
|
|
note = "SA_"
|
106 |
|
|
elif players_score_name == "trueskill":
|
107 |
|
|
note = "TS_"
|
108 |
|
|
|
109 |
|
|
report_performance(gt_file,e1, note+"G")
|
110 |
|
|
report_performance(gt_file,e2, note+"F")
|
111 |
|
|
report_performance(gt_file,e3, note+"B")
|
112 |
|
|
report_performance(gt_file,e4, note+"Voting")
|
113 |
|
|
else:
|
114 |
|
|
players_score_dict = computing_hierarchy(graph_file,"socialagony",nodetype = nodetype)
|
115 |
|
|
e1,e2,e3,e4 = remove_cycle_edges_by_hierarchy(graph_file,players_score_dict,"socialagony",nodetype = nodetype)
|
116 |
|
|
report_performance(gt_file,e1, "SA_G")
|
117 |
|
|
write_pairs_to_file(e1,graph_file[:len(graph_file)-6] + "_removed_by_SA-G.edges")
|
118 |
|
|
report_performance(gt_file,e2, "SA_F")
|
119 |
|
|
write_pairs_to_file(e2,graph_file[:len(graph_file)-6] + "_removed_by_SA-F.edges")
|
120 |
|
|
report_performance(gt_file,e3, "SA_B")
|
121 |
|
|
write_pairs_to_file(e3,graph_file[:len(graph_file)-6] + "_removed_by_SA-B.edges")
|
122 |
|
|
report_performance(gt_file,e4, "SA_Voting")
|
123 |
|
|
write_pairs_to_file(e4,graph_file[:len(graph_file)-6] + "_removed_by_SA-Voting.edges")
|
124 |
|
|
|
125 |
|
|
players_score_dict = computing_hierarchy(graph_file,"trueskill",nodetype = nodetype)
|
126 |
|
|
e5,e6,e7,e8 = remove_cycle_edges_by_hierarchy(graph_file,players_score_dict,"trueskill",nodetype = nodetype)
|
127 |
|
|
report_performance(gt_file,e5, "TS_G")
|
128 |
|
|
write_pairs_to_file(e5,graph_file[:len(graph_file)-6] + "_removed_by_TS-G.edges")
|
129 |
|
|
report_performance(gt_file,e6, "TS_F")
|
130 |
|
|
write_pairs_to_file(e6,graph_file[:len(graph_file)-6] + "_removed_by_TS-F.edges")
|
131 |
|
|
report_performance(gt_file,e7, "TS_B")
|
132 |
|
|
write_pairs_to_file(e7,graph_file[:len(graph_file)-6] + "_removed_by_TS-B.edges")
|
133 |
|
|
report_performance(gt_file,e8, "TS_Voting")
|
134 |
|
|
write_pairs_to_file(e7,graph_file[:len(graph_file)-6] + "_removed_by_TS-Voting.edges")
|
135 |
|
|
|
136 |
|
|
e9 = remove_cycle_edges_by_voting(graph_file,[set(e1),set(e2),set(e3),set(e5),set(e6),set(e7)],nodetype = nodetype)
|
137 |
|
|
report_performance(gt_file,e9,"H_Voting")
|
138 |
|
|
write_pairs_to_file(e9,graph_file[:len(graph_file)-6] + "_removed_by_H-Voting.edges")
|
139 |
|
|
|
140 |
|
|
|
141 |
|
|
|
142 |
|
|
import argparse
|
143 |
|
|
if __name__ == "__main__":
|
144 |
|
|
parser = argparse.ArgumentParser()
|
145 |
|
|
parser.add_argument("-g","--graph_file",default= " ", help = "input graph file name (edges list)")
|
146 |
|
|
parser.add_argument("-s","--score_name",default = "pagerank",help = "nodes score function: trueskill, socialagony, ensembling, pagerank...")
|
147 |
|
|
parser.add_argument("-t","--gt_edges_file",default = None, help = "ground truth edges file")
|
148 |
|
|
|
149 |
|
|
args = parser.parse_args()
|
150 |
|
|
graph_file = args.graph_file
|
151 |
|
|
players_score_name = args.score_name
|
152 |
|
|
gt_file = args.gt_edges_file
|
153 |
|
|
|
154 |
|
|
breaking_cycles_by_hierarchy_performance(graph_file,gt_file,players_score_name)
|
155 |
|
|
|