Source code for gerrychain.partition.subgraphs

from typing import List, Any, Tuple
from ..graph import Graph


[docs]class SubgraphView: """ A view for accessing subgraphs of :class:`Graph` objects. This class makes use of a subgraph cache to avoid recomputing subgraphs which can speed up computations when working with district assignments within a partition class. :ivar graph: The parent graph from which subgraphs are derived. :type graph: Graph :ivar parts: A list-of-lists dictionary (so a dict with key values indicated by the list index) mapping keys to subsets of nodes in the graph. :type parts: List[List[Any]] :ivar subgraphs_cache: Cache to store subgraph views for quick access. :type subgraphs_cache: Dict """ __slots__ = ["graph", "parts", "subgraphs_cache"] def __init__(self, graph: Graph, parts: List[List[Any]]) -> None: """ :param graph: The parent graph from which subgraphs are derived. :type graph: Graph :param parts: A list of lists of nodes corresponding the different parts of the partition of the graph. :type parts: List[List[Any]] :returns: None """ self.graph = graph self.parts = parts self.subgraphs_cache = {} def __getitem__(self, part: int) -> Graph: """ :param part: The the id of the partition to return the subgraph for. :type part: int :returns: The subgraph of the parent graph corresponding to the partition with id `part`. :rtype: Graph """ if part not in self.subgraphs_cache: self.subgraphs_cache[part] = self.graph.subgraph(self.parts[part]) return self.subgraphs_cache[part] def __iter__(self) -> Graph: for part in self.parts: yield self[part]
[docs] def items(self) -> Tuple[int, Graph]: for part in self.parts: yield part, self[part]
def __repr__(self) -> str: return ( f"<SubgraphView with {len(self.parts)}" f" and {len(self.subgraphs_cache)} cached graphs>" )