| | |
| | | class Graph: |
| | | def __init__(self): |
| | | self.adjacent: dict[int, set] = {} |
| | | self.vertex_attribute: dict[int, dict] = {} |
| | | self._adjacent: dict[int, set] = {} |
| | | self._vertex_attribute: dict[int, dict] = {} |
| | | |
| | | def add_vertex(self, vertex): |
| | | if vertex not in self.adjacent: |
| | | if vertex not in self._adjacent: |
| | | if not isinstance(vertex, int): |
| | | raise TypeError(f"Argument {vertex} is not a valid vertex") |
| | | self.adjacent[vertex] = set() |
| | | self._adjacent[vertex] = set() |
| | | |
| | | pass |
| | | |
| | | def add_edge(self, u, v): |
| | | self.add_vertex(u) |
| | | self.add_vertex(v) |
| | | v_neighbor = self.adjacent[v] |
| | | v_neighbor = self._adjacent[v] |
| | | if u not in v_neighbor: |
| | | v_neighbor.add(u) |
| | | u_neighbor = self.adjacent[u] |
| | | u_neighbor = self._adjacent[u] |
| | | if v not in u_neighbor: |
| | | u_neighbor.add(v) |
| | | pass |
| | |
| | | :param properties: |
| | | :return: self |
| | | """ |
| | | if vertex not in self.adjacent: |
| | | if vertex not in self._adjacent: |
| | | raise ValueError(f"Graph does not include vertex {vertex}") |
| | | old_attributes = self.vertex_attribute[vertex] |
| | | self.vertex_attribute[vertex] = old_attributes | properties |
| | | old_attributes = self._vertex_attribute[vertex] |
| | | self._vertex_attribute[vertex] = old_attributes | properties |
| | | return self |
| | | pass |
| | | |
| | | def get_attribute(self, vertex): |
| | | if vertex in self.adjacent: |
| | | return self.vertex_attribute[vertex] |
| | | if vertex in self._adjacent: |
| | | return self._vertex_attribute[vertex] |
| | | else: |
| | | raise ValueError(f"Graph does not include vertex {vertex}") |
| | | pass |
| | | |
| | | def vertices(self): |
| | | return self.adjacent.keys() |
| | | return self._adjacent.keys() |
| | | |
| | | def for_each_vertices(self, action): |
| | | for v in self.vertices(): |
| | | action(v) |
| | | |
| | | def adjacent_of(self, vertex): |
| | | if vertex not in self.adjacent: |
| | | if vertex not in self._adjacent: |
| | | raise ValueError(f"Graph does not include vertex {vertex}") |
| | | return self.adjacent.get(vertex) |
| | | return self._adjacent.get(vertex) |
| | | |
| | | def for_each_edges(self, action): |
| | | visited_edges: dict[int, set] = {} |
| | |
| | | adjacent.add(second) |
| | | action(start, end) |
| | | |
| | | def get_lecture_name(self, vertex): |
| | | pass |
| | | |
| | | def set_lecture_name(self, vertex, name): |
| | | pass |
| | | |
| | | def __repr__(self): |
| | | text = "" |
| | | sorted_key = sorted(self.adjacent.keys()) |
| | | sorted_key = sorted(self._adjacent.keys()) |
| | | last_key = sorted_key.pop() |
| | | def adjacent_fn(vertex): return "[" + ", ".join( [str(v) for v in self.adjacent[vertex]] ) + "]" |
| | | def adjacent_fn(vertex): return "[" + ", ".join([str(v) for v in self._adjacent[vertex]]) + "]" |
| | | for key in sorted_key: |
| | | text += f"{key} → {adjacent_fn(key)}\n" |
| | | text += f"{last_key} → {adjacent_fn(last_key)}" |
| | | return text |
| | | |
| | | def to_dot(self) -> str: |
| | | pass |