示例#1
0
 def __init__(self, vertices, use_pydot=False):
     self.__verts__ = vertices
     self.__adjmx__ = [[] for i in range(vertices)]
     self.__arest__ = 0
     if use_pydot:
         self.__graph__ = Dot(graph_type='graph')
         for i in range(vertices):
             self.__graph__.add_node(Node(str(i)))
     else:
         self.__graph__ = None
示例#2
0
    def graph(self, model_classes):
        graph = Dot(**self.graph_options)
        relations = set()

        # Create nodes from mappers
        mappers = list(map(class_mapper, model_classes))
        for mapper in mappers:
            graph.add_node(
                Node(
                    self.quote(mapper),
                    label=self.node_table(
                        mapper.class_.__name__,
                        self._model_columns(mapper),
                        self._model_operations(mapper),
                    ),
                    **self.style["node"],
                )
            )
            if mapper.inherits:
                graph.add_edge(
                    Edge(
                        *map(self.quote, (mapper.inherits, mapper)),
                        **self.style["inheritance"],
                    )
                )
            for loader in mapper.iterate_properties:
                if (
                    isinstance(loader, RelationshipProperty)
                    and loader.mapper in mappers
                ):
                    reverse = getattr(loader, "_reverse_property")
                    if len(reverse) == 1:
                        relations.add(frozenset((loader, next(iter(reverse)))))
                    else:
                        relations.add((loader,))

        # Create edges from relationships between mappers
        for relation in relations:
            options = self.style["relationship"].copy()
            if len(relation) == 2:
                src, dest = relation
                if src.viewonly and dest.viewonly:
                    options.update(self.style["relationship-viewonly"])
                between = src.parent, dest.parent
                options["headlabel"] = self._format_relationship(src)
                options["taillabel"] = self._format_relationship(dest)
                options["dir"] = "both"
            else:
                (prop,) = relation
                between = prop.parent, prop.mapper
                options["headlabel"] = self._format_relationship(prop)
                if prop.viewonly:
                    options.update(self.style["relationship-viewonly"])
            graph.add_edge(Edge(*map(self.quote, between), **options))
        return graph
示例#3
0
def render_graph(root, hierarchy, args):
    g = Dot()
    g.set_root(root[0])

    for manager in hierarchy:
        g.add_node(Node(manager[0], shape='box'))
        for subordinate in hierarchy[manager]:
            g.add_node(Node(subordinate[0], shape='box'))
            g.add_edge(Edge(manager[0], subordinate[0]))

    g.write_svg(args.file, args.imageType, args.layout)
示例#4
0
 def dump(self,file_name = None):
     """export to a png file"""
     for nm in self.node_dict.keys():
         self.get_node_by_name(nm).dumped = False
     g = Dot()
     for n in self.target_nodes:
         n.dump_to(g)
     from time import time
     if file_name is None:
         file_name = '_'.join([n.name for n in self.target_nodes])
         file_name += '_%d.png'%(time()%100003)
     g.write_png(file_name)
示例#5
0
 def draw(self, name, dname, draw_branches=True):
     from pydot import Dot, Edge
     g = Dot()
     g.set_node_defaults(color='lightgray', style='filled', shape='box',
                         fontname='Courier', fontsize='10')
     for node in sorted(self.nodes, key=lambda x: x.num):
         if draw_branches and node.type.is_cond:
             g.add_edge(Edge(str(node), str(node.true), color='green'))
             g.add_edge(Edge(str(node), str(node.false), color='red'))
         else:
             for suc in self.sucs(node):
                 g.add_edge(Edge(str(node), str(suc), color='blue'))
     g.write_png('%s/%s.png' % (dname, name))
示例#6
0
 def make_pydot_graph(self, figname='tree'):
     ''' Use Graphviz to generate a graphical representation of the tree.
 Args:
   figname (str): where to store the figure.
 '''
     graph = Dot(graph_type='graph')
     #graph.add_node(Node(self.root.display(),shape='diamond'))
     edgelist = self.root.append_edgelist()
     for edge in edgelist:
         graph.add_node(edge[0])
         graph.add_node(edge[1])
         graph.add_edge(Edge(*edge))
     graph.write_png(figname + '.png')
def RenderSIPCollection(sipGraph, dot=None):
    try:
        from pydot import Node, Edge, Dot
    except:
        import warnings
        warnings.warn("Missing pydot library", ImportWarning)
    if not dot:
        dot = Dot(graph_type='digraph')
        dot.leftNodesLookup = {}
    nodes = {}
    for N, prop, q in sipGraph.query(
            'SELECT ?N ?prop ?q {  ?prop a magic:SipArc . ?N ?prop ?q . }',
            initNs={u'magic': MAGIC}):

        if MAGIC.BoundHeadPredicate in sipGraph.objects(subject=N,
                                                        predicate=RDF.type):
            NCol = [N]
        else:
            NCol = Collection(sipGraph, N)

        if q not in nodes:
            newNode = Node(makeMD5Digest(q),
                           label=normalizeTerm(q, sipGraph),
                           shape='plaintext')
            nodes[q] = newNode
            dot.add_node(newNode)

        bNode = BNode()
        nodeLabel = ', '.join([normalizeTerm(term, sipGraph) for term in NCol])
        edgeLabel = ', '.join([
            var.n3() for var in Collection(
                sipGraph, first(sipGraph.objects(prop, MAGIC.bindings)))
        ])
        markedEdgeLabel = ''
        if nodeLabel in dot.leftNodesLookup:
            bNode, leftNode, markedEdgeLabel = dot.leftNodesLookup[nodeLabel]


#            print "\t",nodeLabel,edgeLabel, markedEdgeLabel,not edgeLabel == markedEdgeLabel
        else:
            leftNode = Node(makeMD5Digest(bNode),
                            label=nodeLabel,
                            shape='plaintext')
            dot.leftNodesLookup[nodeLabel] = (bNode, leftNode, edgeLabel)
            nodes[bNode] = leftNode
            dot.add_node(leftNode)

        if not edgeLabel == markedEdgeLabel:
            edge = Edge(leftNode, nodes[q], label=edgeLabel)
            dot.add_edge(edge)
    return dot
示例#8
0
def test_BioProvDocument():
    """
    Tests the construction of an instance of BioProvDocument.
    :return:
    """
    # The BioProvDocument constructor with add_attributes=True
    # is tested in the test_src_main.py module
    prov = BioProvDocument(project)

    # __repr__
    assert str(prov).startswith("BioProvDocument")

    # dot property
    assert type(prov.dot) == Dot
    prov.dot = Dot()
示例#9
0
def plot_tree(sent_id):
    global sentences

    graph = Dot(graph_type='digraph')

    basic_dependencies = sentences[sent_id].findall(
        "./dependencies[@type='collapsed-dependencies']/dep")
    for dep in basic_dependencies:

        gov = "{}\n{}".format(dep[0].get("idx"), dep[0].text)
        dep = "{}\n{}".format(dep[1].get("idx"), dep[1].text)
        graph.add_node(Node(gov))
        graph.add_node(Node(dep))
        graph.add_edge(Edge(dep, gov))
    graph.write_png(f"sentence_{sent_id}.png")
示例#10
0
def main(input):
    state_obj = yaml.load(input)
    graph = Dot("states", graph_type='digraph')

    rules = {
        'require': {
            'color': 'blue'
        },
        'require_in': {
            'color': 'blue',
            'reverse': True
        },
        'watch': {
            'color': 'red'
        },
        'watch_in': {
            'color': 'red',
            'reverse': True
        },
    }

    for top_key, props in state_obj.iteritems():
        # Add a node for each state type embedded in this state
        # keys starting with underscores are not candidates

        if top_key == '__extend__':
            # TODO - merge these into the main states and remove them
            sys.stderr.write("Removing __extend__ states:\n{0}\n".format(
                str(props)))
            continue

        for top_key_type, states in props.iteritems():
            if top_key_type[:2] == '__':
                continue

            node_name = make_node_name(top_key_type, top_key)
            graph.add_node(Node(node_name))

            for edge_type, ruleset in rules.iteritems():
                for relname in find_edges(states, edge_type):
                    if 'reverse' in ruleset and ruleset['reverse']:
                        graph.add_edge(
                            Edge(node_name, relname, color=ruleset['color']))
                    else:
                        graph.add_edge(
                            Edge(relname, node_name, color=ruleset['color']))

    graph.write('/dev/stdout')
示例#11
0
    def __init__(self, functions):
        self.node_dic = {}
        self.edge_dic = {}
        self.graph = Dot()
        self.html = None

        for f in functions:
            if f.name in [
                    'slitherConstructorVariables',
                    'slitherConstructorConstantVariables'
            ]:
                continue
            self.construct_node(f)

        self.construct_graph(functions)
        self.html = svg_to_html(self.graph.create_svg().decode('utf-8'))
示例#12
0
def visualize_fpta(red):
    red_sorted = sorted(list(red), key=lambda x: len(x.prefix))
    graph = Dot('fpta', graph_type='digraph')

    for i, r in enumerate(red_sorted):
        r.state_id = f'q{i}'
        graph.add_node(Node(r.state_id, label=r.state_id))

    for r in red_sorted:
        for i, c in r.children.items():
            graph.add_edge(Edge(r.state_id, c.state_id, label=i))

    graph.add_node(Node('__start0', shape='none', label=''))
    graph.add_edge(Edge('__start0', red_sorted[0].state_id, label=''))

    return graph
示例#13
0
def graph(nodes, name="HEX", dname="graphs", initial_player=Player.PLAYER_1):
    g = Dot(graph_type="digraph", nodesep=0.5)
    g.set_node_defaults(color='lightgray', style='filled', shape='box',
                        fontname='Courier', fontsize='10')
    added = []
    for node in nodes:
        xlabel = str(node.owner) if node.owner is not None else ""
        if xlabel == "both": xlabel = ""
        g.add_node(pydot.Node(hash(node), label=node_str(node), shape="hexagon", width=0.1, height=0.1,
                              color=color_of_node(node), xlabel=xlabel))
        for suc in node.neighbours:
            if suc not in added:
                g.add_edge(Edge(node.__hash__(), suc.__hash__(), color=color_of_node(suc, True), arrowhead="None"))
        added.append(node)

    g.write_png('%s/%s.png' % (dname, name), prog='neato')
示例#14
0
 def draw(self, prob, targetFile):
     # Do the graphing stuff here...
     # Root graph
     g = Dot(graph_type="digraph", nodesep=2, overlap=False)
     #g.set_edge_defaults(weight="0", minlen="10")
     # Organise by adding constraints (adds edges too)
     for constr in prob.constrs:
         # Node for constraint
         constrNode = Node(constr.name, shape="ellipse", style="filled", fillcolor = "#aaaaff")
         constrNode.set_label(constr.name + ": " + constr.getTextFormula())
         g.add_node(constrNode)
         # Associated expressions
         for expr in constr.exprs:
             self.addNodesForChildren(g, expr, constr)
     # Finally, render
     #g.write_png("problem_structure.png", prog="dot")
     g.write_png(targetFile, prog="neato")
示例#15
0
文件: Util.py 项目: roisevege/FuXi
def renderNetwork(network, nsMap={}):
    """
    Takes an instance of a compiled ReteNetwork and a namespace mapping (for constructing QNames
    for rule pattern terms) and returns a BGL Digraph instance representing the Rete network
    #(from which GraphViz diagrams can be generated)
    """
    # from FuXi.Rete import BuiltInAlphaNode
    # from BetaNode import LEFT_MEMORY, RIGHT_MEMORY, LEFT_UNLINKING
    dot = Dot(graph_type='digraph')
    namespace_manager = NamespaceManager(Graph())
    for prefix, uri in list(nsMap.items()):
        namespace_manager.bind(prefix, uri, override=False)

    visitedNodes = {}
    edges = []
    idx = 0
    for node in list(network.nodes.values()):
        if node not in visitedNodes:
            idx += 1
            visitedNodes[node] = generateBGLNode(dot, node, namespace_manager,
                                                 str(idx))
            dot.add_node(visitedNodes[node])
    nodeIdxs = {}
    for node in list(network.nodes.values()):
        for mem in node.descendentMemory:
            if not mem:
                continue
            bNode = mem.successor
        for bNode in node.descendentBetaNodes:
            for idx, otherNode in enumerate([bNode.leftNode, bNode.rightNode]):
                if node == otherNode and (node, otherNode) not in edges:
                    for i in [node, bNode]:
                        if i not in visitedNodes:
                            idx += 1
                            nodeIdxs[i] = idx
                            visitedNodes[i] = generateBGLNode(
                                dot, i, namespace_manager, str(idx))
                            dot.add_node(visitedNodes[i])
                    edge = Edge(visitedNodes[node],
                                visitedNodes[bNode],
                                label=idx == 0 and 'left' or 'right')
                    dot.add_edge(edge)
                    edges.append((node, bNode))

    return dot
示例#16
0
def indiv_with_sub(df, outfolder):
    thislist, deptlist = get_reports(df)
    for x in list(set([i[1] for i in thislist])):
        graph = Dot(graph_type='graph',
                    ratio='auto',
                    size=150,
                    dpi=150,
                    splines='ortho')
        #people who report to x
        reports = [y for y in thislist if y[1] == x]
        #and the people they report to
        reports2 = [y for y in thislist if y[1] in [z[0] for z in reports]]
        reporting = reports + reports2
        reporting = list(set(reporting))
        for report_to, report in reporting:
            graph.add_edge(Edge(report, report_to))
        print(f"Now writing file for {x}")
        graph.write_png(f"{outfolder}\\{x}.png")
示例#17
0
    def build_graph_parser(subparsers):
        try:
            from pydot import Dot
            formats = Dot().formats
        except ImportError:
            return

        p_graph = subparsers.add_parser(
            'graph',
            help='Build a graph from the XML tags relationships.',
            description='Build a graph from the XML tags relationships.')

        def act(ns):
            extension = ns.outfile.split('.')[-1]
            if ns.format:
                if extension != ns.format:
                    ns.outfile += '.' + ns.format
            else:
                if extension in formats:
                    ns.format = extension

            root = etree.parse(ns.infile).getroot()
            write_tag_graph(ns.path(root), ns.outfile, ns.format)

        p_graph.set_defaults(action=act)
        p_graph.add_argument('--format',
                             choices=formats,
                             metavar='FORMAT',
                             help='The format for the graph image.\n'
                             'It will be appended to the filename '
                             'unless they already concur '
                             'or -F is passed.\n'
                             'Choose from ' + str(formats))
        p_graph.add_argument('-F',
                             '--force-extension',
                             help='Allow the filename extension to differ '
                             'from the file format.\n'
                             'Without this option, the format extension '
                             'will be appended to the filename.')
        p_graph.add_argument(dest='outfile',
                             default=None,
                             help='The filename for the graph image.\n'
                             'If no --format is given, '
                             'it will be based on this name.')
    def __init__(self, _contract: Contract):
        """
        Takes a Contract object and constructs the DDG for it.

        *** To be completed
            Currently cannot detect indirect read.
            Indirect write can be detected.
        """
        self.contract = _contract
        self.node_dic = {}
        self.edge_dic = {}
        self.graph = Dot()

        for f in _contract.functions + _contract.constructor_as_list:
            if f.name in ['slitherConstructorVariables', 'slitherConstructorConstantVariables'] or not f.is_public_or_external:
                continue
            self.construct_node(f)

        self.construct_graph(_contract)
示例#19
0
def make_pydot(nodes, edges, direction='LR', sep='_', **kwargs):
    from pydot import Dot, Cluster, Node, Edge
    class Subgraphs(dict):
        def __missing__(self, path):
            *parent, label = path
            subgraph = Cluster(sep.join(path), label=label, style='rounded, filled', fillcolor='#77777744')
            self[tuple(parent)].add_subgraph(subgraph)
            return subgraph
    g = Dot(rankdir=direction, directed=True, **kwargs)
    g.set_node_defaults(
        shape='box', style='rounded, filled', fillcolor='#ffffff')
    subgraphs = Subgraphs({(): g})
    for path, attr in nodes:
        *parent, label = path.split(sep)
        subgraphs[tuple(parent)].add_node(
            Node(name=path, label=label, **attr))
    for src, dst, attr in edges:
        g.add_edge(Edge(src, dst, **attr))
    return g
示例#20
0
def plant2dot(plantinfo):
    qn = str(plantinfo.plant._qname)
    # Create the hierarchical graph with all the nodes (no edges for now)
    plantd = Dot(qn,
                 simplify=True,
                 comment="Generated by radler for {}".format(qn))
    v = AstVisitor({'node' : node,
                    'lynxsecure_vm' : machine,
                    'certikos_vm'   : machine,
                    'machine'       : machine },
                   onleaf=follow_links(AstVisitor.leaf_bf), #@UndefinedVariable
                   kind='bf')
    v.visit(plantinfo.plant, plantd)

    # Add all edges
    for cl in plantinfo.channels.values():
        for c in cl:
            if c.incoming:
                plantd.add_edge(Edge(str(c.pub), str(c.sub)))
    print(plantd.to_string())
示例#21
0
def leveler(df):
    thislist, deptlist = get_reports(df)
    newdict = {"Berenecea Johnson-Eanes": 1}
    newdict.update({x[0]: 0 for x in thislist})
    while True:
        if len([value for value in newdict.values() if value == 0]) == 0:
            break
        for person in newdict.keys():
            if newdict[person] == 0:
                try:
                    if newdict[[x[1] for x in thislist
                                if x[0] == person][0]] == 0:
                        pass
                    else:
                        newnum = newdict[[
                            x[1] for x in thislist if x[0] == person
                        ][0]] + 1
                        newdict.update({person: newnum})
                except:
                    print(f'{person} not found')
            else:
                pass
    for i in range(max([value for value in newdict.values()])):
        graph = Dot(graph_type='graph',
                    ratio='.3',
                    size=150,
                    dpi=150,
                    splines='ortho')
        #graph.set_node_defaults(style="filled", fillcolor="grey")
        graph.set_edge_defaults(color="blue", arrowhead="vee", weight="1")
        for report_to, report in thislist:
            try:
                if newdict[report_to] in [
                        i, i + 1, i + 2
                ] or newdict[report] in [i, i + 1, i + 2]:
                    graph.add_edge(Edge(report, report_to))
            except:
                print(report_to, report)
        #graph.write("c:\\users\\shane\\desktop\\out.dot")
        graph.write_png(f"c:\\users\\shane\\desktop\\orgcharts\\level{i}.png")
示例#22
0
    def draw(self, name, dname, draw_branches=True):
        from pydot import Dot, Edge, Node
        g = Dot()
        g.set_node_defaults(color='lightgray',
                            style='filled',
                            shape='box',
                            fontname='Courier',
                            fontsize='10')
        if len(self.nodes) == 1:
            g.add_node(Node(str(self.nodes[0])))
        else:
            for node in sorted(self.nodes, key=lambda x: x.num):
                for suc in self.sucs(node):
                    g.add_edge(Edge(str(node), str(suc), color='blue'))
                for except_node in self.catch_edges.get(node, []):
                    g.add_edge(
                        Edge(str(node),
                             str(except_node),
                             color='black',
                             style='dashed'))

        g.write_png('%s/%s.png' % (dname, name))
示例#23
0
    def graph_representation(self):
        """
        Construct a dot graph representation of these results.
        :return: The dot graph
        """
        from pydot import Dot, Edge, Node

        g = Dot()

        for r in self.resources:
            g.add_node(
                Node('i_' + r,
                     label='{:.3} {}'.format(
                         float(self.produced(r) + self.supplied(r)), r),
                     style='dashed'))
        for recipe, batches in self.recipes.items():
            g.add_node(
                Node('r_' + recipe,
                     label='{:.3} {}'.format(batches[1], recipe),
                     shape='box'))

            r: Recipe = self.book[recipe]
            for output in r.outputs():
                weight = r.produced(output, batches[1])
                g.add_edge(
                    Edge('r_' + recipe,
                         'i_' + output,
                         label='{:.3}'.format(weight),
                         weight=weight))
            for input in r.inputs():
                weight = r.consumed(input, batches[1])
                g.add_edge(
                    Edge('i_' + input,
                         'r_' + recipe,
                         label='{:.3}'.format(weight),
                         weight=weight))

        return g
示例#24
0
    def save(self, cfg, filename, print_ir=False, format='dot', options=None):
        """Save basic block graph into a file.
        """
        if options is None:
            options = {}

        try:
            dot_graph = Dot(**self.graph_format)

            # Add nodes.
            nodes = {}
            for bb in cfg.basic_blocks:
                nodes[bb.address] = self._create_node(bb, cfg.name, print_ir,
                                                      options)

                dot_graph.add_node(nodes[bb.address])

            # Add edges.
            for bb_src in cfg.basic_blocks:
                for bb_dst_addr, branch_type in bb_src.branches:
                    if bb_dst_addr in nodes:
                        edge = self._create_edge(nodes[bb_src.address],
                                                 nodes[bb_dst_addr],
                                                 branch_type)

                        dot_graph.add_edge(edge)
                    else:
                        logger.warning(
                            "Destination basic block not found! (0x%x)",
                            bb_dst_addr)

            # Save graph.
            dot_graph.write("{}.{}".format(filename, format), format=format)
        except Exception:
            logger.error("Failed to save basic block graph: %s (%s)",
                         filename,
                         format,
                         exc_info=True)
示例#25
0
    def graph_representation(self):
        """
        Construct a dot graph representation of these results.
        :return: The dot graph
        """
        from pydot import Dot, Edge, Node

        g = Dot()

        for resource in self.resources:
            color = 'black'
            if resource in self.targets and self.consumed(resource) == 0:
                color = 'darkgreen'
            elif self.consumed(resource) == 0:
                color = 'brown'
            g.add_node(Node('i_' + resource, label='{:.3} {}'.format(float(self.produced(resource) + self.supplied(resource)), resource), color=color, style='dashed'))
            if resource in self.targets and self.consumed(resource) > 0:
                # add a second node if requested and consumed so we can see a terminal node
                g.add_node(Node('ir_' + resource, label='{:.3} {}'.format(float(self.requested(resource)), resource), color='darkgreen', style='dashed'))
                weight = self.requested(resource)
                g.add_edge(Edge('i_' + resource, 'ir_' + resource, label='{:.3}'.format(weight), weight=weight))
        for recipe, batches in self.recipes.items():
            if self.book.crafters_defined():
                crafter = self.book.get_crafter_for(recipe) or Crafter('', 1)
                label = '{:.3} {}\n{}'.format(batches[1], crafter.name, recipe)
            else:
                label = '{:.3} {}'.format(batches[1], recipe)
            g.add_node(Node('r_' + recipe, label=label, shape='box'))

            r: Recipe = self.book[recipe]
            for output in r.outputs():
                weight = r.produced(output, batches[1])
                g.add_edge(Edge('r_' + recipe, 'i_' + output, label='{:.3}'.format(weight), weight=weight))
            for input in r.inputs():
                weight = r.consumed(input, batches[1])
                g.add_edge(Edge('i_' + input, 'r_' + recipe, label='{:.3}'.format(weight), weight=weight))

        return g
示例#26
0
    def graph(self, tables, skip_tables=()):
        graph = Dot(**self.graph_options)
        for table in tables:
            if table.name in skip_tables:
                continue

            graph.add_node(
                Node(
                    self.quote(table.name),
                    label=self.node_table(
                        table.name,
                        self._table_columns(table),
                        self._table_indices(table),
                    ),
                    **self.style["node"],
                )
            )
            for fk in table.foreign_keys:
                fk_table = fk.column.table
                if fk_table not in tables or fk_table.name in skip_tables:
                    continue
                is_single_parent = fk.parent.primary_key or fk.parent.unique
                options = self.style["edge"].copy()
                options["arrowtail"] = "empty" if is_single_parent else "crow"
                options["dir"] = "both"
                if fk.parent.primary_key and fk.column.primary_key:
                    # Inheritance relationship
                    edge = fk_table.name, table.name
                    options["arrowhead"] = "none"
                    options["tailport"] = fk.column.name
                    options["headport"] = fk.parent.name
                else:
                    edge = table.name, fk_table.name
                    options["arrowhead"] = "odot"
                    options["tailport"] = fk.parent.name
                    options["headport"] = fk.column.name
                graph.add_edge(Edge(*map(self.quote, edge), **options))
        return graph
示例#27
0
    def save(self, cf, filename, format='dot'):
        """Save basic block graph into a file.
        """
        try:
            dot_graph = Dot(**self.graph_format)

            # add nodes
            nodes = {}
            for cfg_addr in cf._graph.node.keys():
                nodes[cfg_addr] = self._create_node(cfg_addr, cf)

                dot_graph.add_node(nodes[cfg_addr])

            # add edges
            for cfg_src_addr in cf._graph.node.keys():
                for cfg_dst_addr in cf._edges.get(cfg_src_addr, []):
                    edge = self._create_edge(nodes, cfg_src_addr, cfg_dst_addr)

                    dot_graph.add_edge(edge)

            dot_graph.write("{}.{}".format(filename, format), format=format)
        except Exception as err:
           logger.error("Failed to save call graph: %s (%s)", filename, format, exc_info=True)
示例#28
0
def visualize_pta(root_node, path='pta.pdf'):
    from pydot import Dot, Node, Edge
    graph = Dot('fpta', graph_type='digraph')

    graph.add_node(Node(str(root_node.prefix), label=f'{root_node.output}'))

    queue = [root_node]
    visited = set()
    visited.add(root_node.prefix)
    while queue:
        curr = queue.pop(0)
        for i, c in curr.children.items():
            if c.prefix not in visited:
                graph.add_node(Node(str(c.prefix), label=f'{c.output}'))
            graph.add_edge(Edge(str(curr.prefix), str(c.prefix), label=f'{i}'))
            if c.prefix not in visited:
                queue.append(c)
            visited.add(c.prefix)

    graph.add_node(Node('__start0', shape='none', label=''))
    graph.add_edge(Edge('__start0', str(root_node.prefix), label=''))

    graph.write(path=path, format='pdf')
示例#29
0
文件: utils.py 项目: TMVector/gamma
def draw_pydot(nodes, edges, direction='LR', **kwargs):
    def make_subgraph(path, parent_graph):
        subgraph = Cluster(path,
                           label=split(path)[1],
                           style='rounded, filled',
                           fillcolor='#77777744')
        parent_graph.add_subgraph(subgraph)
        return subgraph

    subgraphs = cache(
        lambda path: make_subgraph(path, subgraphs[parent(path)]))
    subgraphs[''] = g = Dot(rankdir=direction, directed=True, **kwargs)
    g.set_node_defaults(shape='box',
                        style='rounded, filled',
                        fillcolor='#ffffff')

    for node, path, attr in nodes:
        p, stub = split(path)
        subgraphs[p].add_node(Node(name=node, label=stub, **attr))
    for src, dst, attr in edges:
        g.add_edge(Edge(src, dst, **attr))

    return g.create_svg()
示例#30
0
    def show_diagram(self, path=None):
        """
            Creates the graph associated with this DFA
        """
        # Nodes are set of states

        graph = Dot(graph_type='digraph', rankdir='LR')
        nodes = {}
        for state in self.states:
            if state == self.initial_state:
                # color start state with green
                if state in self.final_states:
                    initial_state_node = Node(state,
                                              style='filled',
                                              peripheries=2,
                                              fillcolor='#66cc33')
                else:
                    initial_state_node = Node(state,
                                              style='filled',
                                              fillcolor='#66cc33')
                nodes[state] = initial_state_node
                graph.add_node(initial_state_node)
            else:
                if state in self.final_states:
                    state_node = Node(state, peripheries=2)
                else:
                    state_node = Node(state)
                nodes[state] = state_node
                graph.add_node(state_node)
        # adding edges
        for from_state, lookup in self.transitions.items():
            for to_label, to_state in lookup.items():
                graph.add_edge(
                    Edge(nodes[from_state], nodes[to_state], label=to_label))
        if path:
            graph.write_png(path)
        return graph