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)
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()