Source code for hypergraphx.readwrite.hif

import json
import logging

from hypergraphx import Hypergraph


[docs] def read_hif(path: str) -> Hypergraph: """ Load a hypergraph from a HIF file. Parameters ---------- path : str The path to the HIF file Returns ------- Hypergraph The loaded hypergraph """ edge_name_to_uid = {} node_name_to_uid = {} eid = 0 nid = 0 with open(path) as file: data = json.loads(file.read()) if "type" not in data: logging.getLogger(__name__).warning("No hypergraph type - assume undirected") data["type"] = "undirected" if data["type"] == "undirected" or data["type"] == "asc": H = Hypergraph() elif data["type"] == "directed": H = Hypergraph(directed=True) else: raise ValueError(f"Unknown hypergraph type: {data['type']}") if "metadata" in data: H.set_hypergraph_metadata(data["metadata"]) tmp_edges = {} for incidence in data["incidences"]: if incidence["edge"] not in edge_name_to_uid: edge_name_to_uid[incidence["edge"]] = eid eid += 1 edge = edge_name_to_uid[incidence["edge"]] if incidence["node"] not in node_name_to_uid: node_name_to_uid[incidence["node"]] = nid nid += 1 node = node_name_to_uid[incidence["node"]] if edge not in tmp_edges: tmp_edges[edge] = [] tmp_edges[edge].append(node) for record in data["nodes"]: node_name = record["node"] if node_name not in node_name_to_uid: node_name_to_uid[node_name] = nid nid += 1 node = node_name_to_uid[node_name] H.add_node(node) H.set_node_metadata(node, record) added = {} for record in data["edges"]: edge_name = record["edge"] if edge_name not in edge_name_to_uid: edge_name_to_uid[edge_name] = eid eid += 1 edge = edge_name_to_uid[edge_name] if edge in tmp_edges: H.add_edge(tuple(sorted(tmp_edges[edge]))) added[tuple(sorted(tmp_edges[edge]))] = True H.set_edge_metadata(tuple(sorted(tmp_edges[edge])), record) else: H.add_empty_edge(edge_name, record) for incidence in data["incidences"]: edge = edge_name_to_uid[incidence["edge"]] node = node_name_to_uid[incidence["node"]] if tuple(sorted(tmp_edges[edge])) not in added: H.add_edge(tuple(sorted(tmp_edges[edge]))) added[tuple(sorted(tmp_edges[edge]))] = True H.set_incidence_metadata(tuple(sorted(tmp_edges[edge])), node, incidence) return H
[docs] def write_hif(H: Hypergraph, path: str): """ Save a hypergraph to a HIF file. Parameters ---------- H: Hypergraph The hypergraph to save. path: str The path to save the hypergraph to. """ data = { "type": "undirected", "metadata": H.get_hypergraph_metadata(), "edges": H.get_all_edges_metadata(), "nodes": H.get_all_nodes_metadata(), "incidences": H.get_all_incidences_metadata(), } with open(path, "w") as file: file.write(json.dumps(data))