# ========================= # 🔥 SAFE GNN (NO CRASH) # ========================= def run_gnn(nodes, edges): try: import torch from torch_geometric.nn import GCNConv from torch_geometric.data import Data if len(nodes) == 0 or len(edges) == 0: return [] edge_index = [] for e in edges: edge_index.append([e["source"], e["target"]]) edge_index = torch.tensor(edge_index).t().contiguous() x = torch.rand((len(nodes), 16)) class GNN(torch.nn.Module): def __init__(self): super().__init__() self.conv1 = GCNConv(16, 16) self.conv2 = GCNConv(16, 2) def forward(self, x, edge_index): x = self.conv1(x, edge_index) x = torch.relu(x) x = self.conv2(x, edge_index) return x model = GNN() out = model(x, edge_index) return [ {"node": i, "score": float(out[i][0])} for i in range(len(nodes)) ] except Exception as e: print("⚠️ GNN fallback aktif:", e) # 🔥 fallback TANPA torch return [ {"node": i, "score": 0.5} for i in range(len(nodes)) ]