X-Git-Url: https://wannabe.guru.org/gitweb/?a=blobdiff_plain;f=src%2Fpyutils%2Fgraph.py;h=3e08159dee861f37c88a2d00f353f496045f75e9;hb=HEAD;hp=faa0ec3ef69edf186dce6752289beb6cf4dda700;hpb=553bc01ade915a6b6e7ed60c30103750a25c3e0d;p=pyutils.git diff --git a/src/pyutils/graph.py b/src/pyutils/graph.py index faa0ec3..3e08159 100644 --- a/src/pyutils/graph.py +++ b/src/pyutils/graph.py @@ -10,7 +10,7 @@ import math from typing import Dict, Generator, List, Optional, Set, Tuple from pyutils import list_utils -from pyutils.typez.simple import Numeric +from pyutils.typez.typing import Numeric class Graph(object): @@ -145,6 +145,55 @@ class Graph(object): """ return self.graph + def __repr__(self) -> str: + """ + Returns: + A string representation of the graph in GraphViz format. + + >>> g = Graph(directed=True) + >>> g.add_edge('a', 'b', weight=2) + >>> g.add_edge('b', 'a', weight=4) + >>> g.add_edge('a', 'c', weight=10) + >>> print(g) + digraph G { + node [shape=record]; + a -> b [weight=2] + a -> c [weight=10] + b -> a [weight=4] + } + + >>> h = Graph(directed=False) + >>> h.add_edge('A', 'B') + >>> h.add_edge('B', 'C') + >>> h.add_edge('B', 'D') + >>> h.add_edge('D', 'A') + >>> print(h) + graph G { + node [shape=record]; + A -- B [weight=1] + A -- D [weight=1] + B -- A [weight=1] + B -- C [weight=1] + B -- D [weight=1] + C -- B [weight=1] + D -- B [weight=1] + D -- A [weight=1] + } + """ + if self.directed: + edge = '->' + out = 'digraph G {\n' + else: + edge = '--' + out = 'graph G {\n' + out += ' node [shape=record];\n' + edges = self.get_edges() + for src, dests in edges.items(): + for dest, weight in dests.items(): + out += f' {src} {edge} {dest} [weight={weight}]\n' + out += '}\n' + return out.strip() + def _dfs(self, vertex: str, visited: Set[str]): yield vertex visited.add(vertex)