Source code for linchemin.cgu.iron

from dataclasses import dataclass, field
from typing import Optional

"""
Module containing the definitions of the Iron class.

"""


@dataclass(frozen=True, order=True)
class Properties:
    pass


[docs] class Direction: """Class representing the direction of an Iron edge. Attributes: ------------ string: a string representing the direction ('parent_node>child_node') tup: a tuple representing the direction (parent_node, child_node) """
[docs] def __init__(self, dir_string: str): """ Parameters: ------------ dir_string: str The string corresponding to the direction in the form 'parent_node>child_node' """ self.string = dir_string self.tup = (dir_string.split(">")[0], dir_string.split(">")[1])
def __eq__(self, other): return isinstance(other, Direction) and self.string == other.string
[docs] @dataclass(frozen=True, order=True) class Node: """Class representing a node in an Iron instance. Attributes: ------------- iid: a string representing the id of the node properties: a dictionary to store node properties labels: a list to store the labels of the node """ iid: str = field() properties: dict = field(hash=False, compare=False, repr=True) labels: list = field(default_factory=list, repr=True) def get_properties_names(self): self.properties.keys()
[docs] @dataclass(frozen=True, order=True) class Edge: """Class representing an edge in an Iron instance. Attributes: ------------- iid: a string representing the id of the edge a_iid: a string representing the id of the parent node b_iid: a string representing the id of the child node direction: a Direction object indicating the direction of the edge properties: a dictionary to store the properties of the edge labels: a list to store the labels of the edge """ iid: str a_iid: str b_iid: str direction: Direction properties: dict = field(hash=False, compare=False, repr=True) labels: list = field(default_factory=list, repr=True) def get_properties_names(self): self.properties.keys()
[docs] class Iron: """Class representing a graph in the Internal Representation Of Networks (IRON) format. Attributes: ------------- nodes: a dictionary storing the nodes of the graph edges: a dictionary storing the edges of the graph name: a string representing the name of the graph """
[docs] def __init__(self): """ Parameters: ------------- None. When a new Iron instance is created, an empty graph is initialized. It can be populated by adding nodes and edges. """ self.nodes = {} self.edges = {} self.name: Optional[str] = None
def __str__(self): return f"Nodes: {self.nodes} \nEdges: {self.edges}"
[docs] def add_node(self, k: str, node: Node): """To add a node to an Iron instance.""" self.nodes[k] = node
[docs] def add_edge(self, k: str, edge: Edge): """To add an edge to an Iron instance.""" self.edges[k] = edge
def i_node_number(self): """To get the number of nodes in an Iron instance""" return len(self.nodes) def i_edge_number(self) -> int: """To get the number of edges in an Iron instance""" return len(self.edges) def get_neighbors(self, a: Node) -> list: """To get the list of nodes sharing an edge with a given node""" neigh_lst = [] for id_e, edge in self.edges.items(): if edge.a_iid == str(a): neigh_lst.append(edge.b_iid) elif edge.b_iid == str(a): neigh_lst.append(edge.a_iid) return neigh_lst def get_child_nodes(self, b_iid: str) -> list: """To get the list of 'child' nodes of a given node""" return [edge.a_iid for id_e, edge in self.edges.items() if edge.b_iid == b_iid] def get_parent_nodes(self, a_iid: str) -> list: """To get the list of 'parent' nodes of a given node""" return [edge.b_iid for id_e, edge in self.edges.items() if edge.a_iid == a_iid] def get_edge_id(self, a: Node, b: Node) -> list: """To get the list of edge ids connecting the nodes a and b (direction ignored)""" ids_lst = [] for id_e, edge in self.edges.items(): if ( edge.a_iid == str(a) and edge.b_iid == str(b) or edge.b_iid == str(a) and edge.a_iid == str(b) ): ids_lst.append(id_e) return ids_lst def get_degree_sequence(self) -> list: """To get the degree sequence of an Iron instance.""" degrees = [] for id_n in self.nodes: node_degree = len(self.get_neighbors(id_n)) degrees.append(node_degree) return sorted(degrees, reverse=True)