Source code for pynetim.py.graph.graph

from __future__ import annotations

from networkx import Graph, DiGraph

from ...utils import set_edge_weight


[docs] class IMGraph: """ 影响最大化图类,用于封装网络图结构和边权重设置。 该类提供了对NetworkX图对象的封装,支持设置不同类型的边权重, 并提供了便捷的图属性访问接口。 Attributes: graph (Graph | DiGraph): networkx图对象,可以是有向图或无向图 direction (bool): 指示图是否有向 number_of_nodes (int): 图中节点总数 number_of_edges (int): 图中边总数 edge_weight_type (str): 边权重类型 """ def __init__(self, graph: Graph | DiGraph, edge_weight_type: str, constant_weight: float = None): """ 初始化IMGraph实例。 Args: graph (Graph | DiGraph): networkx图对象,可以是有向图或无向图 edge_weight_type (str): 边权重类型,支持' CONSTANT '、' TV '、' WC '等模式 constant_weight (float, optional): 当使用常量权重模式时的权重值 """ self.nx_graph = graph self.direction = graph.is_directed() self.number_of_nodes = graph.number_of_nodes() self.number_of_edges = graph.number_of_edges() self.edge_weight_type = edge_weight_type set_edge_weight(self.nx_graph, edge_weight_type, constant_weight) @property def nodes(self): """ 获取图中所有节点。 Returns: NodeView: 图中所有节点的视图 """ return self.nx_graph.nodes @property def edges(self): """ 获取图中所有边。 Returns: EdgeView: 图中所有边的视图 """ return self.nx_graph.edges
[docs] def neighbors(self, node): """ 获取指定节点的邻居节点。 Args: node: 节点标识符 Returns: iterator: 指定节点的所有邻居节点迭代器 """ return self.nx_graph.neighbors(node)
[docs] def in_neighbors(self, node): """ 获取指定节点的入邻居节点。 对于有向图,返回前驱节点;对于无向图,返回所有邻居节点。 Args: node: 节点标识符 Returns: iterator: 指定节点的入邻居节点迭代器 """ return self.nx_graph.predecessors(node) if self.direction else self.nx_graph.neighbors(node)
[docs] def out_neighbors(self, node): """ 获取指定节点的出邻居节点。(同neighbors方法) Args: node: 节点标识符 Returns: iterator: 指定节点的出邻居节点迭代器 """ return self.nx_graph.neighbors(node)
@property def in_degree(self): """ 获取图的入度。 Returns: int: 图的入度视图 """ return self.nx_graph.in_degree if self.direction else self.nx_graph.degree() @property def out_degree(self): """ 获取图的出度。 Returns: int: 图的出度视图 """ return self.nx_graph.out_degree if self.direction else self.nx_graph.degree()
[docs] def degree(self): """ 获取图的度。 Returns: int: 图的度视图 """ return self.nx_graph.degree()
[docs] def batch_out_degree(self, nodes): """ 批量获取指定节点的出度。 Args: nodes: 节点列表 Returns: list: 每个节点的出度列表 """ if self.direction: return [self.nx_graph.out_degree(node) for node in nodes] else: return [self.nx_graph.degree(node) for node in nodes]
[docs] def batch_in_degree(self, nodes): """ 批量获取指定节点的入度。 Args: nodes: 节点列表 Returns: list: 每个节点的入度列表 """ if self.direction: return [self.nx_graph.in_degree(node) for node in nodes] else: return [self.nx_graph.degree(node) for node in nodes]
[docs] def batch_degree(self, nodes): """ 批量获取指定节点的度。 Args: nodes: 节点列表 Returns: list: 每个节点的度列表 """ return [self.nx_graph.degree(node) for node in nodes]
def __str__(self): """ 返回图对象的字符串表示。 Returns: str: 图对象的字符串描述 """ return f'{self.nx_graph} and edge_weight_type: {self.edge_weight_type}' def __repr__(self): """ 返回图对象的详细字符串表示。 Returns: str: 图对象的详细字符串描述 """ return self.__str__()