Spaces:
Running on Zero
Running on Zero
| """rustworkx-backed Living Mycelial Hypergraph.""" | |
| import rustworkx as rx | |
| from typing import Dict | |
| from ..schema import HypergraphDelta | |
| class Hypergraph: | |
| def __init__(self): | |
| self.g = rx.PyDiGraph(multigraph=True) | |
| self._idx: Dict[str, int] = {} | |
| def apply_delta(self, delta: HypergraphDelta): | |
| for n in delta.nodes_added: | |
| if n.node_id in self._idx: | |
| continue | |
| i = self.g.add_node({ | |
| "node_id": n.node_id, "node_type": n.node_type, "label": n.label, | |
| "payload": n.payload, "embedding_hint": n.embedding_hint, | |
| }) | |
| self._idx[n.node_id] = i | |
| for u in delta.nodes_updated: | |
| if u.node_id in self._idx: | |
| d = self.g[self._idx[u.node_id]] | |
| d.update(u.fields_changed) | |
| for e in delta.edges_added: | |
| s = self._idx.get(e.source_node_id) | |
| t = self._idx.get(e.target_node_id) | |
| if s is None or t is None: | |
| continue | |
| self.g.add_edge(s, t, { | |
| "edge_id": e.edge_id, "edge_type": e.edge_type, | |
| "weight": e.weight, "payload": e.payload, | |
| }) | |
| def conflict_centrality(self) -> Dict[str, float]: | |
| try: | |
| bc = rx.betweenness_centrality(self.g) | |
| return {self.g[i]["node_id"]: v for i, v in enumerate(bc)} | |
| except Exception: | |
| return {} | |
| def context_summary(self, max_nodes: int = 12) -> str: | |
| items = [] | |
| for i in list(self.g.node_indexes())[-max_nodes:]: | |
| n = self.g[i] | |
| items.append(f"{n['label']}({n['node_type']})") | |
| return "; ".join(items) | |
| def node_count(self) -> int: return self.g.num_nodes() | |
| def edge_count(self) -> int: return self.g.num_edges() | |