Source code for pyreco.node_analyzer

from typing import Union
import numpy as np
import networkx as nx

from pyreco.utils_networks import (
    extract_node_degree,
    extract_node_in_degree,
    extract_node_out_degree,
    extract_node_clustering_coefficient,
    extract_node_betweenness_centrality,
    extract_node_pagerank,
)


[docs] def available_extractors(): """ Return a dictionary mapping network property names to their corresponding extractor functions. Make changes here if you want to add more network properties. Returns: dict: A dictionary mapping network property names to their corresponding extractor functions. """ # Define a dictionary mapping network property names to their corresponding extractor functions # as implemented in utils_networks.py all_extractors = { "degree": extract_node_degree, "in_degree": extract_node_in_degree, "out_degree": extract_node_out_degree, "clustering_coefficient": extract_node_clustering_coefficient, "betweenness_centrality": extract_node_betweenness_centrality, "pagerank": extract_node_pagerank, } return all_extractors
[docs] def map_extractor_names(prop_names: str): """ Return a dictionary mapping network property names to their corresponding extractor functions for the given property names. Returns: dict: A dictionary mapping network property names to their corresponding extractor functions. """ # Define a dictionary mapping network property names to their corresponding extractor functions # as implemented in utils_networks.py all_extractors = available_extractors() # now return those extractors that are in prop_names extractor_dict = {} extractor_funs = [] for prop in prop_names: if prop not in all_extractors: print(f"Warning: {prop} is not a recognized node property.") prop_names.remove(prop) else: extractor_dict[prop] = all_extractors[prop] extractor_funs.append(all_extractors[prop]) return extractor_dict, extractor_funs
[docs] class NodeAnalyzer: """ A class for analyzing node properties in a graph. """ def __init__(self, quantities=None): """ Initialize the NodeAnalyzer with specified quantities to extract. Args: quantities (list, optional): List of network properties to extract. Defaults to ['degree', 'in_degree', 'out_degree', 'clustering_coefficient', 'betweenness_centrality', 'pagerank']. """ all_extractors = available_extractors().keys() self.quantities = quantities or list(all_extractors) # map given property names to their corresponding extractor functions self.extractors, self.extractor_funs = map_extractor_names(self.quantities)
[docs] def extract_properties( self, graph: Union[nx.Graph, nx.DiGraph, np.ndarray], node: int ) -> dict: """ Extract the specified network properties from the given graph at the given node(s). Args: graph (nx.Graph, nx.DiGraph, np.ndarray): The graph to analyze. nodes (int): The node to analyze. Returns: dict: A dictionary containing the extracted network properties. """ if not isinstance(node, int): raise ValueError( "node must be an integer, we currently support only one node at a time" ) graph_props = {} for extr_name, extr_fun in self.extractors.items(): graph_props[extr_name] = extr_fun(graph=graph, node=node) return graph_props
[docs] def list_properties(self): """ Return a list of available node properties. Returns: list: A list of available node properties. """ return available_extractors().keys()
if __name__ == "__main__": # Create a sample graph G = nx.erdos_renyi_graph(10, 0.5, directed=True) # Specify the node for which you want to extract the PageRank node = 3 extractor = NodeAnalyzer() graph_props = extractor.extract_properties(graph=G, node=node) print(graph_props)