OpenCores
URL https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk

Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc

[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [remove_cycle/] [remove_cycle_edges_by_minimum_feedback_arc_set_greedy.py] - Blame information for rev 48

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 alirezamon
from s_c_c import filter_big_scc
2
from s_c_c import scc_nodes_edges
3
from s_c_c import get_big_sccs
4
from file_io import write_pairs_to_file
5
import networkx as nx
6
 
7
 
8
def get_nodes_degree_dict(g,nodes):
9
        # get nodes degree dict: key = node, value = (max(d(in)/d(out),d(out)/d(in),"in" or "out")
10
        in_degrees = g.in_degree(nodes)
11
        out_degrees = g.out_degree(nodes)
12
        degree_dict = {}
13
        for node in nodes:
14
                in_d = in_degrees[node]
15
                out_d = out_degrees[node]
16
                if in_d >= out_d:
17
                        try:
18
                                value = in_d * 1.0 / out_d
19
                        except Exception as e:
20
                                value = 0
21
                        f = "in"
22
                else:
23
                        try:
24
                                value = out_d * 1.0 / in_d
25
                        except Exception as e:
26
                                value = 0
27
                        f = "out"
28
                degree_dict[node] = (value,f)
29
                #print("node: %d: %s" % (node,degree_dict[node]))
30
        return degree_dict
31
 
32
 
33
def greedy_local_heuristic(sccs,degree_dict,edges_to_be_removed):
34
        while True:
35
                graph = sccs.pop()
36
                temp_nodes_degree_dict = {}
37
                for node in graph.nodes():
38
                        temp_nodes_degree_dict[node] = degree_dict[node][0]
39
                from helper_funs import pick_from_dict
40
                max_node,_ = pick_from_dict(temp_nodes_degree_dict)
41
                max_value = degree_dict[max_node]
42
                #degrees = [(node,degree_dict[node]) for node in list(graph.nodes())]
43
                #max_node,max_value = max(degrees,key = lambda x: x[1][0])
44
                if max_value[1] == "in":
45
                        # indegree > outdegree, remove out-edges
46
                        edges = [(max_node,o) for o in graph.neighbors(max_node)]
47
                else:
48
                        # outdegree > indegree, remove in-edges
49
                        edges = [(i,max_node) for i in graph.predecessors(max_node)]
50
                edges_to_be_removed += edges
51
                sub_graphs = filter_big_scc(graph,edges_to_be_removed)
52
                if sub_graphs:
53
                        for index,sub in enumerate(sub_graphs):
54
                                sccs.append(sub)
55
                if not sccs:
56
                        return
57
 
58
def remove_cycle_edges_by_mfas(graph_file):
59
        g = nx.read_edgelist(graph_file,create_using = nx.DiGraph(),nodetype = int)
60
        from remove_self_loops import remove_self_loops_from_graph
61
        self_loops = remove_self_loops_from_graph(g)
62
 
63
        scc_nodes,_,_,_ = scc_nodes_edges(g)
64
        degree_dict = get_nodes_degree_dict(g,scc_nodes)
65
        sccs = get_big_sccs(g)
66
        if len(sccs) == 0:
67
                print("After removal of self loop edgs: %s" % nx.is_directed_acyclic_graph(g))
68
                return self_loops
69
        edges_to_be_removed = []
70
        import timeit
71
        t1 = timeit.default_timer()
72
        greedy_local_heuristic(sccs,degree_dict,edges_to_be_removed)
73
        t2 = timeit.default_timer()
74
        print("mfas time usage: %0.4f s" % (t2 - t1))
75
        edges_to_be_removed = list(set(edges_to_be_removed))
76
        g.remove_edges_from(edges_to_be_removed)
77
        edges_to_be_removed += self_loops
78
        edges_to_be_removed_file = graph_file[:len(graph_file)-6] + "_removed_by_mfas.edges"
79
        write_pairs_to_file(edges_to_be_removed,edges_to_be_removed_file)
80
        return edges_to_be_removed
81
 
82
def mfas_performance(graph_file,gt_edges_file):
83
        edges_to_be_removed = remove_cycle_edges_by_mfas(graph_file)
84
        from measures import report_performance
85
        report_performance(gt_edges_file,edges_to_be_removed,"MFAS")
86
 
87
import argparse
88
if __name__ == "__main__":
89
        parser = argparse.ArgumentParser()
90
        parser.add_argument("-g","--graph_file",default= " ", help = "input graph file name (edges list)")
91
        parser.add_argument("-t","--gt_edges_file",default = None, help = "ground truth edges")
92
        args = parser.parse_args()
93
        graph_file = args.graph_file
94
        gt_file = args.gt_edges_file
95
        mfas_performance(graph_file,gt_file)
96
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.