Module pywander.algorithm.graph.undirected_graph
Classes
class UndirectedGraph (graph_data=None)
-
graph_data structure as: { 'a': {'b','z'} }
Initialize a graph.
Expand source code
class UndirectedGraph(Graph): """ graph_data structure as: { 'a': {'b','z'} } """ DIRECTED = False def __init__(self, graph_data=None): """ Initialize a graph. """ self.graph_data = graph_data if graph_data is not None else {} def nodes(self): """ Return node list. """ return self.graph_data.keys() def neighbors(self, node) -> list: """ Return all nodes that are directly accessible from given node. """ return list(self.graph_data[node]) def _generate_edges(self): """ represent edge as {a,b} """ edges = [] for node in self.nodes(): for neighbour in self.neighbors(node): if {neighbour, node} not in edges: edges.append({node, neighbour}) return edges def edges(self): """ Return all edges in the graph. """ return self._generate_edges() def has_node(self, node) -> bool: """ Return whether the requested node exists. """ return node in self.graph_data def _read_edge(self, edge): data = copy(edge) if len(data) == 1: u = v = data.pop() elif len(data) == 2: u, v = data else: raise Exception("wrong edge format") return u, v def has_edge(self, edge) -> bool: """ Return whether an edge exists. """ u, v = self._read_edge(edge) return {u, v} in self.edges() def add_node(self, node): """ Add given node to the graph. """ if self.has_node(node): raise AdditionError("Node %s already in graph" % node) self.graph_data[node] = set() def add_edge(self, edge): """ Add an edge to the graph connecting two nodes. """ u, v = self._read_edge(edge) if self.has_edge(edge): raise AdditionError("Edge ({0}, {1}) already in graph".format(u, v)) for n in [u, v]: if n not in self.graph_data: self.add_node(n) self.graph_data[u].add(v) if u != v: self.graph_data[v].add(u) def del_node(self, node): """ Remove a node from the graph. """ for each in list(self.neighbors(node)): if each != node: self.del_edge((each, node)) del (self.graph_data[node]) def del_edge(self, edge): """ Remove an edge from the graph. """ u, v = self._read_edge(edge) self.graph_data[u].remove(v) if u != v: self.graph_data[v].remove(u) def __ne__(self, other): """ Return whether this graph is not equal to another one. """ return not (self == other)
Ancestors
- Graph
- abc.ABC
Class variables
var DIRECTED
Methods
def add_edge(self, edge)
-
Add an edge to the graph connecting two nodes.
def add_node(self, node)
-
Add given node to the graph.
def del_edge(self, edge)
-
Remove an edge from the graph.
def del_node(self, node)
-
Remove a node from the graph.
def edges(self)
-
Return all edges in the graph.
def has_edge(self, edge) ‑> bool
-
Return whether an edge exists.
def has_node(self, node) ‑> bool
-
Return whether the requested node exists.
def neighbors(self, node) ‑> list
-
Return all nodes that are directly accessible from given node.
def nodes(self)
-
Return node list.
Inherited members