Beispiel #1
0
class AnalyzerBase():
    def __init__(self, graph_name):
        G = pydotplus.graphviz.graph_from_dot_file(graph_name)
        self.g = Graph()
        node_num = len(G.get_nodes())
        edge_num = len(G.get_edges())
        nodes = [None] * node_num
        edges = [None] * edge_num
        for i in range(node_num):
            nodes[i] = self.g.CreateNode()
        for n in G.get_nodes():
            size = int(n.get_label().split()[1].split(':')[1].replace(
                ',', '').replace('"', ''))
            nodes[int(n.get_name())].SetSize(size)
        for i in range(edge_num):
            e = G.get_edges()[i]
            src = int(e.get_source())
            dst = int(e.get_destination())
            weight = float(e.get_weight())
            edge = self.g.CreateEdge(nodes[src], nodes[dst])
            edge.SetReload(weight)
            assert edge.idx == i
        self.res = {}
        self.analysis = {}
        self.name = "Base"
        #print(self.g)
    def Run(self):
        print("not yet implement")

    def SetName(self, name):
        self.name = name

    def GetName(self):
        return self.name

    def SaveRes(self):
        frozen = jsonpickle.encode(self.res, indent=4, separators=(', ', ': '))
        with open(self.name + ".json", 'w') as outf:
            outf.write(frozen)

    def GetRes(self, name):
        with open(name + ".json", 'r') as outf:
            frozen = outf.read()
        self.analysis[name] = jsonpickle.decode(frozen)
Beispiel #2
0
class Builder():
    def __init__(self):
        self.g = Graph()
    def GetGraph(self):
        return self.g
    def PickRandomNode(self):
        nodes =  self.g.GetNodes()
        node_size = len(nodes)
        if node_size == 0:
            return None
        i = int(random() * node_size)
        return nodes[i]
    def PickRandomNodePair(self):
        nodes = self.g.GetNodes()
        node_size = len(nodes)
        if len(nodes) < 2:
            return (None, None)
        i = int(random() * node_size)
        j = i
        while j == i:
            j = int(random() * node_size)
        assert i is not j, "cannot pick a pair of a same node"
        return (nodes[min(i, j)], nodes[max(i,j)])

    def CreateRandomNode(self):
        x = self.PickRandomNode()
        y = self.g.CreateNode()
        if x is not None:
            assert x.idx is not y.idx
            e = self.g.CreateEdge(x, y)
        return y

    def CreateRandomEdge(self):
        x, y = builder.PickRandomNodePair()
        if x is None or y is None:
            self.CreateRandomNode()
            return None
        else:
            assert x.idx is not y.idx
            e = builder.g.CreateEdge(x, y)
            return e

    def DumpToDot(self, graph_name="rand_graph"):
        G = Digraph('G', format='png', filename="{}.dot".format(graph_name))
        for n in self.g.nodes:
            half_mb = int(n.size * 2 / (1024 * 1024))
            if half_mb < 9:
                color = "/greys9/{}".format(half_mb+1)
            else:
                color = "/greys9/9"
            if half_mb < 6:
                fontcolor = 'black'
            else:
                fontcolor = 'white'
            G.node(str(n.idx),
                "<{}> s:{:,}".format(n.idx, n.size),
                fillcolor=color, style='filled',
                fontcolor=fontcolor, comment=str(n.size), id=str(n.idx))
        for e in self.g.edges:
            if (e.reload * 2) < 9:
                color = '/rdylgn9/{}'.format(9 - int(e.reload * 2))
            else:
                color = '/rdylgn9/9'
            G.edge(str(e.begin.idx), str(e.end.idx),
                weight=str(e.reload),
                label="{:4.3f}".format(e.reload),
                arrowType='normal',
                color=color, id=str(e.idx))
        G.render()