Source code for twon_lss.schemas.network

import typing
import json

import pydantic

import networkx

from twon_lss.schemas.user import User


[docs] class Network(pydantic.RootModel): root: networkx.Graph = networkx.Graph() model_config = pydantic.ConfigDict(arbitrary_types_allowed=True) def __iter__(self): return iter(self.root.nodes()) def __len__(self): return len(self.root.nodes()) def get_neighbors(self, user: User) -> typing.List[User]: return list(self.root.neighbors(user)) @classmethod def from_graph(cls, graph: networkx.Graph, users: typing.List[User]) -> "Network": return cls(Network._relabel_to_users(graph, users)) @staticmethod def _relabel_to_users( graph: networkx.Graph, users: typing.List[User] ) -> networkx.Graph: assert len(graph) == len(users) return networkx.relabel_nodes(graph, mapping=lambda node_id: users[node_id]) def to_json(self, path: str) -> None: json.dump( networkx.node_link_data( networkx.relabel_nodes(self.root, mapping=lambda user: user.id), edges="edges", ), open(path, "w"), indent=4, )