From 0375069c332df39cba47b5847f8de4de9708d75e Mon Sep 17 00:00:00 2001 From: Chendi Qian <1049653012@qq.com> Date: Sat, 10 Dec 2022 20:58:15 +0800 Subject: [PATCH] rm unnecessart --- Untitled.ipynb | 1351 ---------------------------- new_loaders/BaseLoader.py | 109 --- new_loaders/ClusterGCNLoader.py | 121 --- new_loaders/GraphSAINTRWSampler.py | 227 ----- new_loaders/IBMBBatchLoader.py | 214 ----- new_loaders/IBMBNodeLoader.py | 349 ------- new_loaders/IBMBRandLoader.py | 79 -- new_loaders/ShaDowLoader.py | 79 -- new_loaders/__init__.py | 0 new_loaders/utils.py | 160 ---- 10 files changed, 2689 deletions(-) delete mode 100644 Untitled.ipynb delete mode 100644 new_loaders/BaseLoader.py delete mode 100644 new_loaders/ClusterGCNLoader.py delete mode 100644 new_loaders/GraphSAINTRWSampler.py delete mode 100644 new_loaders/IBMBBatchLoader.py delete mode 100644 new_loaders/IBMBNodeLoader.py delete mode 100644 new_loaders/IBMBRandLoader.py delete mode 100644 new_loaders/ShaDowLoader.py delete mode 100644 new_loaders/__init__.py delete mode 100644 new_loaders/utils.py diff --git a/Untitled.ipynb b/Untitled.ipynb deleted file mode 100644 index b69a0f6..0000000 --- a/Untitled.ipynb +++ /dev/null @@ -1,1351 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "ca88a501-39ed-4247-87d5-65bb37bddeb9", - "metadata": {}, - "outputs": [], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "0ea6ee85-ccae-4644-b713-bfc59929217d", - "metadata": {}, - "outputs": [], - "source": [ - "import torch\n", - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "9cfeacfd-e139-483f-8042-9afe33a2de0c", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:root:The OGB package is out of date. Your version is 1.3.3, while the latest version is 1.3.5.\n" - ] - } - ], - "source": [ - "from ogb.nodeproppred import PygNodePropPredDataset\n", - "from torch_geometric.utils import to_undirected\n", - "\n", - "dataset = PygNodePropPredDataset(name = 'ogbn-arxiv')\n", - "g = dataset[0]\n", - "\n", - "train_indices = dataset.get_idx_split()['train']\n", - "g.edge_index = to_undirected(g.edge_index, num_nodes=g.num_nodes)" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "c1cee292-37eb-4511-87c8-2489c1d6d21c", - "metadata": {}, - "outputs": [], - "source": [ - "from new_loaders.IBMBNodeLoader import IBMBNodeLoader" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "1570efe7-985c-44a0-afa8-94f5853d3d02", - "metadata": {}, - "outputs": [], - "source": [ - "loader = IBMBNodeLoader(\n", - " g,\n", - " train_indices,\n", - " 'edge_index',\n", - " 32,\n", - " 10000,\n", - " eps=1e-3, batch_size=2, shuffle=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9c950955-54f3-4889-8c59-984e16c3e820", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 42, - "id": "0dc5644e-6441-46f4-a223-ec907d6c8b9b", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 32/32 [00:00<00:00, 632.37it/s]\n" - ] - } - ], - "source": [ - "from new_loaders.ClusterGCNLoader import ClusterGCNLoader\n", - "\n", - "loader = ClusterGCNLoader(\n", - " g,\n", - " 32,\n", - " train_indices,\n", - " 'edge_index',\n", - " batch_size=4, shuffle=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "id": "a4cb05ab-81e5-4f2c-80c3-0f82c31b47c7", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Data(x=[21029, 128], edge_index=[2, 196436], y=[21029, 1], output_node_mask=[21029])\n", - "Data(x=[21063, 128], edge_index=[2, 251270], y=[21063, 1], output_node_mask=[21063])\n", - "Data(x=[21726, 128], edge_index=[2, 237088], y=[21726, 1], output_node_mask=[21726])\n", - "Data(x=[21176, 128], edge_index=[2, 192808], y=[21176, 1], output_node_mask=[21176])\n", - "Data(x=[20906, 128], edge_index=[2, 143066], y=[20906, 1], output_node_mask=[20906])\n", - "Data(x=[20870, 128], edge_index=[2, 211458], y=[20870, 1], output_node_mask=[20870])\n", - "Data(x=[21401, 128], edge_index=[2, 220560], y=[21401, 1], output_node_mask=[21401])\n", - "Data(x=[21172, 128], edge_index=[2, 215720], y=[21172, 1], output_node_mask=[21172])\n" - ] - } - ], - "source": [ - "for b in loader:\n", - " print(b)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1192ca4a-2e14-4307-825e-949a89d1df2e", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "344ede17-6ce2-4e05-91dc-e5651f4af6dc", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 43, - "id": "c1e6282e-9d7e-4ebd-a620-cbcabc3e782c", - "metadata": {}, - "outputs": [], - "source": [ - "from new_loaders.ShaDowLoader import ShaDowLoader" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "id": "cfd029fe-4b00-4bdb-b21c-2f848eede288", - "metadata": {}, - "outputs": [], - "source": [ - "loader = ShaDowLoader(\n", - " g,\n", - " train_indices,\n", - " 'adj',\n", - " 32,\n", - " alpha=0.2,\n", - " eps=1.e-3, \n", - " batch_size=2048)" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "d98ab2d6-e391-4d7e-aced-ef779c086680", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Data(x=[78674, 128], edge_index=[2, 532450], y=[78674, 1], output_node_mask=[78674])\n", - "Data(x=[90164, 128], edge_index=[2, 626238], y=[90164, 1], output_node_mask=[90164])\n", - "Data(x=[65306, 128], edge_index=[2, 449678], y=[65306, 1], output_node_mask=[65306])\n", - "Data(x=[67498, 128], edge_index=[2, 407782], y=[67498, 1], output_node_mask=[67498])\n", - "Data(x=[82364, 128], edge_index=[2, 626702], y=[82364, 1], output_node_mask=[82364])\n" - ] - } - ], - "source": [ - "for b in loader:\n", - " print(b)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a9f3b3b4-cf4b-4c48-bd87-3c611f617803", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "e1d0ee43-f9c9-47ce-a49e-d0b1c8c2efdb", - "metadata": {}, - "outputs": [], - "source": [ - "from torch_geometric.loader import NeighborSampler" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "4f899f9d-251f-43fc-900d-a848dcb85f8e", - "metadata": {}, - "outputs": [], - "source": [ - "loader = NeighborSampler(g.edge_index,\n", - " sizes=[5] * 2,\n", - " node_idx=train_indices,\n", - " num_nodes=g.num_nodes,\n", - " batch_size=1024,\n", - " shuffle=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "6c4fc1f0-acfc-4967-acf3-bac224bdf29a", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(829,\n", - " tensor([ 92142, 26930, 46016, ..., 77928, 167821, 73307]),\n", - " [EdgeIndex(edge_index=tensor([[ 829, 830, 831, ..., 12795, 12796, 12797],\n", - " [ 0, 0, 0, ..., 3739, 3739, 3739]]), e_id=tensor([2042746, 1312461, 1566473, ..., 1088294, 2298468, 1023934]), size=(12798, 3740)),\n", - " EdgeIndex(edge_index=tensor([[ 829, 830, 831, ..., 3737, 3738, 3739],\n", - " [ 0, 0, 0, ..., 828, 828, 828]]), e_id=tensor([2042746, 1312461, 1566473, ..., 1127752, 165026, 214806]), size=(3740, 829))])" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "batchsize, n_id, " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b2d74f13-78bd-4b86-bac1-7fb01bfcfbf2", - "metadata": {}, - "outputs": [], - "source": [ - "for b in loader:\n", - " batchsize, \n", - " print(b)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9a74926e-1a29-4f1e-8b10-1d06a973510e", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "99b115b8-cbc3-41e2-aa17-52b54f1c4bcc", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "5cbcdd4c-c7a2-4864-a98f-c96c78b79446", - "metadata": {}, - "outputs": [], - "source": [ - "from torch_geometric.loader import NeighborLoader\n", - "\n", - "loader = NeighborLoader(\n", - " g,\n", - " # Sample 30 neighbors for each node for 2 iterations\n", - " num_neighbors=[5] * 2,\n", - " # Use a batch size of 128 for sampling training nodes\n", - " batch_size=128,\n", - " input_nodes=train_indices,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3655fa0f-3af4-40d3-af27-690f87fd1e06", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "22c7fff2-fe1f-43f5-b00b-f4a52f4e2e55", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 108, - "id": "8817be91-cbdd-4453-b688-2d92df1f5843", - "metadata": {}, - "outputs": [], - "source": [ - "from new_loaders.GraphSAINTRWSampler import SaintRWTrainSampler, SaintRWValSampler" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3ccbeaf0-fb03-454d-9b4d-c5e42720098a", - "metadata": {}, - "outputs": [], - "source": [ - "loader = SaintRWTrainSampler(\n", - " g,\n", - " train_indices,\n", - " 'adj',\n", - " g.num_nodes,\n", - " 256,\n", - " 2,\n", - " 4,\n", - " sample_coverage=10,\n", - " save_dir=None,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "id": "f3f1c4a2-c5cb-44ed-b403-50eeb68a920f", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Data(x=[736, 128], edge_index=[736, 736, nnz=1740], y=[736, 1], output_node_mask=[736], node_norm=[446])\n", - "Data(x=[732, 128], edge_index=[732, 732, nnz=2154], y=[732, 1], output_node_mask=[732], node_norm=[438])\n", - "Data(x=[725, 128], edge_index=[725, 725, nnz=1858], y=[725, 1], output_node_mask=[725], node_norm=[450])\n", - "Data(x=[728, 128], edge_index=[728, 728, nnz=2010], y=[728, 1], output_node_mask=[728], node_norm=[426])\n" - ] - } - ], - "source": [ - "for b in loader:\n", - " print(b)" - ] - }, - { - "cell_type": "code", - "execution_count": 111, - "id": "85221d16-065a-417e-a96d-18dc6cafaa8f", - "metadata": {}, - "outputs": [], - "source": [ - "loader = SaintRWValSampler(\n", - " g,\n", - " train_indices,\n", - " 'edge_index',\n", - " g.num_nodes,\n", - " 2,\n", - "batch_size=100)" - ] - }, - { - "cell_type": "code", - "execution_count": 112, - "id": "ce17b9fe-1638-4a10-9cc1-01c068ba570d", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Data(x=[273, 128], edge_index=[2, 384], y=[273, 1], output_node_mask=[273], node_norm=[100])\n", - "Data(x=[275, 128], edge_index=[2, 398], y=[275, 1], output_node_mask=[275], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 454], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 486], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 548], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 440], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 430], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 404], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 404], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 496], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 540], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 510], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 416], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 434], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 400], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 398], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 426], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 632], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 480], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 422], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 410], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 430], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 418], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 458], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 506], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 408], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 426], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 412], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 398], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 428], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 472], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 530], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 426], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 450], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 414], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 400], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 458], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 558], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 498], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 410], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 402], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[276, 128], edge_index=[2, 374], y=[276, 1], output_node_mask=[276], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 406], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 540], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 590], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 504], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 446], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 396], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 406], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[274, 128], edge_index=[2, 384], y=[274, 1], output_node_mask=[274], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 476], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 652], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 572], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 418], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 392], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 388], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 442], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 480], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 644], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 662], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 418], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 470], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 396], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 404], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 394], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 486], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 652], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 466], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 456], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 412], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 408], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 418], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 446], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 610], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 584], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 426], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[274, 128], edge_index=[2, 402], y=[274, 1], output_node_mask=[274], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 386], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 392], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 472], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 490], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 606], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 616], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 428], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 414], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 450], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 412], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 482], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 534], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 640], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 424], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 500], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 410], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 404], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 418], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 554], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 552], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 436], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 442], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 422], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 430], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 422], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 538], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 650], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[276, 128], edge_index=[2, 412], y=[276, 1], output_node_mask=[276], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 432], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 400], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 422], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 448], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 628], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 626], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 452], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 396], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 394], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 398], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 400], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 532], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 468], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 440], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 490], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 432], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 430], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 398], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 470], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 566], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 640], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 454], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[275, 128], edge_index=[2, 420], y=[275, 1], output_node_mask=[275], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 410], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[275, 128], edge_index=[2, 390], y=[275, 1], output_node_mask=[275], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 442], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 476], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 554], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 428], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 448], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[276, 128], edge_index=[2, 400], y=[276, 1], output_node_mask=[276], node_norm=[100])\n", - "Data(x=[274, 128], edge_index=[2, 416], y=[274, 1], output_node_mask=[274], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 424], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 610], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 734], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 470], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 392], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 424], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[274, 128], edge_index=[2, 396], y=[274, 1], output_node_mask=[274], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 572], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 474], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 470], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 428], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 432], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 388], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 412], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 408], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 494], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 744], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 448], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 390], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 408], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[273, 128], edge_index=[2, 404], y=[273, 1], output_node_mask=[273], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 426], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 556], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 564], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 420], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 454], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 404], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 388], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 422], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 512], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 598], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 462], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 436], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 398], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 418], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 402], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 476], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 656], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 412], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 428], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 434], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 386], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 432], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 442], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 550], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 454], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 456], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 432], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[274, 128], edge_index=[2, 390], y=[274, 1], output_node_mask=[274], node_norm=[100])\n", - "Data(x=[273, 128], edge_index=[2, 392], y=[273, 1], output_node_mask=[273], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 436], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 658], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[291, 128], edge_index=[2, 594], y=[291, 1], output_node_mask=[291], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 410], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 462], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 452], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[276, 128], edge_index=[2, 388], y=[276, 1], output_node_mask=[276], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 480], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 458], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 778], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 436], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 402], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 406], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[276, 128], edge_index=[2, 410], y=[276, 1], output_node_mask=[276], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 436], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 478], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 600], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 454], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 416], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 378], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 396], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 406], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 482], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 824], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 422], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 400], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[275, 128], edge_index=[2, 400], y=[275, 1], output_node_mask=[275], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 406], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 414], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 536], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 758], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 444], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 402], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 414], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 416], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 432], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 502], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 596], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 462], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 446], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 416], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 402], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 430], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 516], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[292, 128], edge_index=[2, 580], y=[292, 1], output_node_mask=[292], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 430], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 454], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 424], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 446], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 404], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[291, 128], edge_index=[2, 556], y=[291, 1], output_node_mask=[291], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 536], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[291, 128], edge_index=[2, 520], y=[291, 1], output_node_mask=[291], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 430], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 400], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 406], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 420], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 490], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 536], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 586], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 420], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 452], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 416], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 418], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 392], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 488], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 522], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 484], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[292, 128], edge_index=[2, 448], y=[292, 1], output_node_mask=[292], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 426], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 396], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 422], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 456], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 556], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 534], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 398], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 414], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 420], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 430], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 492], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 498], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 464], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 452], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 450], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 400], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 432], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[291, 128], edge_index=[2, 500], y=[291, 1], output_node_mask=[291], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 450], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 498], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[276, 128], edge_index=[2, 404], y=[276, 1], output_node_mask=[276], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 434], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 404], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 422], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 428], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 578], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 644], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 450], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[275, 128], edge_index=[2, 428], y=[275, 1], output_node_mask=[275], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 388], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 406], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 428], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[291, 128], edge_index=[2, 532], y=[291, 1], output_node_mask=[291], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 678], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 498], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 440], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 430], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[276, 128], edge_index=[2, 388], y=[276, 1], output_node_mask=[276], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 434], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 486], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 652], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 472], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 426], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 430], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 408], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 400], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[292, 128], edge_index=[2, 490], y=[292, 1], output_node_mask=[292], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 588], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 466], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 426], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 412], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 410], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 480], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 514], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[292, 128], edge_index=[2, 598], y=[292, 1], output_node_mask=[292], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 438], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 414], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 428], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[271, 128], edge_index=[2, 376], y=[271, 1], output_node_mask=[271], node_norm=[100])\n", - "Data(x=[274, 128], edge_index=[2, 392], y=[274, 1], output_node_mask=[274], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 514], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 566], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 504], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 478], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 406], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 398], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 408], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 474], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 524], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 512], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 424], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 402], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 412], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 406], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 576], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 694], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 490], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 420], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 440], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 404], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 440], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 506], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 648], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 446], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 434], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 422], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 404], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 406], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 484], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 698], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 478], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 438], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 412], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 428], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 424], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 520], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 584], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 528], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 426], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 404], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 420], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 422], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 510], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 598], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 502], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 478], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 472], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 410], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 392], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 404], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 610], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 524], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 460], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 408], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 430], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 400], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 426], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 482], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 582], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 448], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 416], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 422], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 404], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 412], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 504], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 800], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 460], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 432], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 444], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 444], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 444], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 464], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 644], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[273, 128], edge_index=[2, 396], y=[273, 1], output_node_mask=[273], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 438], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 466], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 450], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 424], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 496], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 404], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 542], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 412], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 458], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 412], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 434], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 432], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 584], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 532], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 458], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 414], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 398], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 416], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 438], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 476], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 564], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 432], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 408], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 406], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 396], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 446], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 520], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 830], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 408], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 432], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 414], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 400], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 432], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 672], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 458], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 430], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 436], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[276, 128], edge_index=[2, 394], y=[276, 1], output_node_mask=[276], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 402], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 412], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 510], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 532], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 448], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 450], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 384], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 432], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 486], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 570], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 458], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 412], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 526], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[291, 128], edge_index=[2, 476], y=[291, 1], output_node_mask=[291], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 422], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 492], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 524], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 560], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 426], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 392], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[271, 128], edge_index=[2, 372], y=[271, 1], output_node_mask=[271], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 468], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 444], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[293, 128], edge_index=[2, 510], y=[293, 1], output_node_mask=[293], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 504], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 434], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 420], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 392], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 430], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 448], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 640], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 440], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 448], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 418], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 406], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 398], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 452], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 652], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 652], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 416], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 402], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 402], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 400], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[291, 128], edge_index=[2, 458], y=[291, 1], output_node_mask=[291], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 592], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 470], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 448], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 426], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 422], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 412], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 420], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 514], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 492], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 500], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 436], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 482], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 408], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[274, 128], edge_index=[2, 386], y=[274, 1], output_node_mask=[274], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 462], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 474], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 490], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 438], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 404], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[272, 128], edge_index=[2, 392], y=[272, 1], output_node_mask=[272], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 406], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 426], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 558], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 542], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 470], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 444], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 392], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 422], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 460], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 554], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 582], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 454], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 458], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 394], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 406], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 406], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 526], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 606], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 462], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 394], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 426], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 396], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 478], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 516], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 586], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 406], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 468], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 388], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 404], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 472], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 626], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 550], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 430], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 432], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 412], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 412], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 448], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 596], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 588], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 420], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 432], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 398], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 414], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 404], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 518], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 712], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 426], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 500], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 396], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 416], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 402], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 614], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 542], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 424], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 418], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 428], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 412], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[273, 128], edge_index=[2, 384], y=[273, 1], output_node_mask=[273], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 566], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 550], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 420], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 414], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 404], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 424], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 398], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 446], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 660], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 440], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 400], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 424], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 388], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 406], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 534], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 578], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 416], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 422], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 432], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 416], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 414], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[291, 128], edge_index=[2, 472], y=[291, 1], output_node_mask=[291], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 666], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 604], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[274, 128], edge_index=[2, 396], y=[274, 1], output_node_mask=[274], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 410], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[276, 128], edge_index=[2, 384], y=[276, 1], output_node_mask=[276], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 428], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 466], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 584], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 486], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 468], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 418], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 410], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 406], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 454], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 538], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 512], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 452], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 410], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 444], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 424], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 392], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 588], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 608], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 436], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 458], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 390], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 424], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 404], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 458], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 606], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 448], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 456], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 424], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 398], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 400], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 490], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 546], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 540], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 442], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 426], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 420], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 422], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 434], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 538], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 530], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[291, 128], edge_index=[2, 468], y=[291, 1], output_node_mask=[291], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 410], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[276, 128], edge_index=[2, 394], y=[276, 1], output_node_mask=[276], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 412], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 430], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 544], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[291, 128], edge_index=[2, 734], y=[291, 1], output_node_mask=[291], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 466], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 444], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 408], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[273, 128], edge_index=[2, 384], y=[273, 1], output_node_mask=[273], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 420], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 456], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 520], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[291, 128], edge_index=[2, 426], y=[291, 1], output_node_mask=[291], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 434], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 430], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 400], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 418], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 560], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[295, 128], edge_index=[2, 612], y=[295, 1], output_node_mask=[295], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 490], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 410], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 380], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 420], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 442], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 568], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 512], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 448], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 430], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 392], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 426], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 446], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 532], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 552], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[276, 128], edge_index=[2, 442], y=[276, 1], output_node_mask=[276], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 408], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 426], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 398], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 470], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 486], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 522], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 418], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 402], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 422], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[275, 128], edge_index=[2, 380], y=[275, 1], output_node_mask=[275], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 422], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 534], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 548], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 434], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 458], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 418], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[274, 128], edge_index=[2, 366], y=[274, 1], output_node_mask=[274], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 418], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 578], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 596], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 454], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 464], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 400], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 400], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 426], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 596], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 622], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[276, 128], edge_index=[2, 412], y=[276, 1], output_node_mask=[276], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 424], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[271, 128], edge_index=[2, 388], y=[271, 1], output_node_mask=[271], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 408], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 402], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 542], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 508], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[275, 128], edge_index=[2, 434], y=[275, 1], output_node_mask=[275], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 444], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 424], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 398], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 442], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[291, 128], edge_index=[2, 478], y=[291, 1], output_node_mask=[291], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 574], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[291, 128], edge_index=[2, 590], y=[291, 1], output_node_mask=[291], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 440], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 444], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 398], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 424], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 422], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 490], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[291, 128], edge_index=[2, 710], y=[291, 1], output_node_mask=[291], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 432], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 508], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 418], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 390], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 410], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 420], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 516], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 448], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 422], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 434], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 394], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 410], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 462], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 564], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 508], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 468], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 430], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 394], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 408], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 446], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 590], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 468], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 472], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 420], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[274, 128], edge_index=[2, 394], y=[274, 1], output_node_mask=[274], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 420], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[291, 128], edge_index=[2, 546], y=[291, 1], output_node_mask=[291], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 540], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 420], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 460], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[276, 128], edge_index=[2, 386], y=[276, 1], output_node_mask=[276], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 420], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[291, 128], edge_index=[2, 502], y=[291, 1], output_node_mask=[291], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 496], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[292, 128], edge_index=[2, 618], y=[292, 1], output_node_mask=[292], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 424], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 428], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 408], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 406], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 446], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[292, 128], edge_index=[2, 572], y=[292, 1], output_node_mask=[292], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 434], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 436], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 456], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 440], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 410], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 426], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 520], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 602], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 404], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 426], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 410], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 412], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 408], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 486], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 616], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 402], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 512], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 402], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 430], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 422], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 436], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 566], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 480], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 424], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 492], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 404], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 474], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 426], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 534], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 660], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 414], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 406], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 430], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 390], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 442], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 592], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 510], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 424], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 472], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 400], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[275, 128], edge_index=[2, 412], y=[275, 1], output_node_mask=[275], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 400], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 488], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 480], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 480], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 472], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 420], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 402], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 416], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 496], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 698], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 524], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 464], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 426], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 392], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 424], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 520], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 502], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 506], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 472], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 432], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 388], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 408], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 514], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 588], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 504], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 414], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 404], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 394], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 422], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 526], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[291, 128], edge_index=[2, 600], y=[291, 1], output_node_mask=[291], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 486], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 406], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 394], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 416], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 468], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 580], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 522], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 428], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 426], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 420], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 400], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 432], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 488], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 594], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 448], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 450], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 418], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[276, 128], edge_index=[2, 386], y=[276, 1], output_node_mask=[276], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 472], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 646], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 562], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 464], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 404], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[275, 128], edge_index=[2, 388], y=[275, 1], output_node_mask=[275], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 426], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 458], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 534], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[293, 128], edge_index=[2, 624], y=[293, 1], output_node_mask=[293], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 418], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[273, 128], edge_index=[2, 392], y=[273, 1], output_node_mask=[273], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 406], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[276, 128], edge_index=[2, 418], y=[276, 1], output_node_mask=[276], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 420], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 630], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 900], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 436], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 456], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 414], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[276, 128], edge_index=[2, 408], y=[276, 1], output_node_mask=[276], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 422], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 454], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 482], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 524], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 442], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 430], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 406], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 414], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 452], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 550], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 442], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 428], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 440], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 408], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[271, 128], edge_index=[2, 398], y=[271, 1], output_node_mask=[271], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 444], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 552], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 482], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[277, 128], edge_index=[2, 380], y=[277, 1], output_node_mask=[277], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 424], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 416], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 440], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 462], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 684], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 486], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 448], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 378], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[279, 128], edge_index=[2, 420], y=[279, 1], output_node_mask=[279], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 442], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 476], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 708], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 520], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 428], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[284, 128], edge_index=[2, 404], y=[284, 1], output_node_mask=[284], node_norm=[100])\n", - "Data(x=[281, 128], edge_index=[2, 390], y=[281, 1], output_node_mask=[281], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 416], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 516], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[290, 128], edge_index=[2, 590], y=[290, 1], output_node_mask=[290], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 476], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 432], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 444], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 414], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[278, 128], edge_index=[2, 394], y=[278, 1], output_node_mask=[278], node_norm=[100])\n", - "Data(x=[285, 128], edge_index=[2, 502], y=[285, 1], output_node_mask=[285], node_norm=[100])\n", - "Data(x=[283, 128], edge_index=[2, 626], y=[283, 1], output_node_mask=[283], node_norm=[100])\n", - "Data(x=[287, 128], edge_index=[2, 714], y=[287, 1], output_node_mask=[287], node_norm=[100])\n", - "Data(x=[289, 128], edge_index=[2, 496], y=[289, 1], output_node_mask=[289], node_norm=[100])\n", - "Data(x=[293, 128], edge_index=[2, 456], y=[293, 1], output_node_mask=[293], node_norm=[100])\n", - "Data(x=[280, 128], edge_index=[2, 410], y=[280, 1], output_node_mask=[280], node_norm=[100])\n", - "Data(x=[282, 128], edge_index=[2, 412], y=[282, 1], output_node_mask=[282], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 410], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 520], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[288, 128], edge_index=[2, 452], y=[288, 1], output_node_mask=[288], node_norm=[100])\n", - "Data(x=[276, 128], edge_index=[2, 434], y=[276, 1], output_node_mask=[276], node_norm=[100])\n", - "Data(x=[286, 128], edge_index=[2, 436], y=[286, 1], output_node_mask=[286], node_norm=[100])\n", - "Data(x=[114, 128], edge_index=[2, 158], y=[114, 1], output_node_mask=[114], node_norm=[41])\n" - ] - } - ], - "source": [ - "for b in loader:\n", - " print(b)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b89756e6-be8d-4132-b460-4d5193ac295b", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.15" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/new_loaders/BaseLoader.py b/new_loaders/BaseLoader.py deleted file mode 100644 index 8f92a2d..0000000 --- a/new_loaders/BaseLoader.py +++ /dev/null @@ -1,109 +0,0 @@ -from typing import List, Union, Tuple - -import numpy as np -import torch -from torch_geometric.data import Data -from torch_geometric.utils import subgraph -from torch_sparse import SparseTensor - - -class BaseLoader(torch.utils.data.DataLoader): - """ - Batch-wise IBMB dataloader from paper Influence-Based Mini-Batching for Graph Neural Networks - """ - - def __init__(self, - dataset, - *args, - **kwargs): - super().__init__(dataset, collate_fn=self.__collate__, **kwargs) - - def __getitem__(self, *args, **kwargs): - raise NotImplementedError - - def __len__(self, *args, **kwargs): - raise NotImplementedError - - def __collate__(self, *args, **kwargs): - raise NotImplementedError - - @classmethod - def normalize_adjmat(cls, adj: SparseTensor, normalization: str): - """ - Normalize SparseTensor adjacency matrix. - - :param adj: - :param normalization: - :return: - """ - - assert normalization in ['sym', 'rw'], f"Unsupported normalization type {normalization}" - assert isinstance(adj, SparseTensor), f"Expect SparseTensor type, got {type(adj)}" - - adj = adj.fill_value(1.) - degree = adj.sum(0) - - degree[degree == 0.] = 1e-12 - deg_inv = 1 / degree - - if normalization == 'sym': - deg_inv_sqrt = deg_inv ** 0.5 - adj = adj * deg_inv_sqrt.reshape(1, -1) - adj = adj * deg_inv_sqrt.reshape(-1, 1) - elif normalization == 'rw': - adj = adj * deg_inv.reshape(-1, 1) - - return adj - - @classmethod - def indices_complete_check(cls, - loader: List[Tuple[Union[torch.Tensor, np.ndarray], Union[torch.Tensor, np.ndarray]]], - output_indices: Union[torch.Tensor, np.ndarray]): - if isinstance(output_indices, torch.Tensor): - output_indices = output_indices.cpu().numpy() - - outs = [] - for out, aux in loader: - if isinstance(out, torch.Tensor): - out = out.cpu().numpy() - if isinstance(aux, torch.Tensor): - aux = aux.cpu().numpy() - - assert np.all(np.in1d(out, aux)), "Not all output nodes are in aux nodes!" - outs.append(out) - - outs = np.sort(np.concatenate(outs)) - assert np.all(outs == np.sort(output_indices)), "Output nodes missing or duplicate!" - - @classmethod - def get_subgraph(cls, - out_indices: torch.Tensor, - graph: Data, - return_edge_index_type: str, - adj: SparseTensor, - **kwargs): - if return_edge_index_type == 'adj': - assert adj is not None - - if return_edge_index_type == 'adj': - subg = Data(x=graph.x[out_indices], - y=graph.y[out_indices], - edge_index=adj[out_indices, :][:, out_indices]) - elif return_edge_index_type == 'edge_index': - edge_index, edge_attr = subgraph(out_indices, - graph.edge_index, - graph.edge_attr, - relabel_nodes=True, - num_nodes=graph.num_nodes, - return_edge_mask=False) - subg = Data(x=graph.x[out_indices], - y=graph.y[out_indices], - edge_index=edge_index, - edge_attr=edge_attr) - else: - raise NotImplementedError - - for k, v in kwargs.items(): - subg[k] = v - - return subg diff --git a/new_loaders/ClusterGCNLoader.py b/new_loaders/ClusterGCNLoader.py deleted file mode 100644 index 5f13476..0000000 --- a/new_loaders/ClusterGCNLoader.py +++ /dev/null @@ -1,121 +0,0 @@ -from typing import Optional, List, Tuple - -import numpy as np -import torch -from torch_geometric.data import Data -from torch_geometric.utils import is_undirected -from torch_sparse import SparseTensor -from tqdm import tqdm - -from new_loaders.utils import get_partitions -from .BaseLoader import BaseLoader - - -def cluster_loader(partitions: List[np.ndarray], prime_indices: np.ndarray) -> List[Tuple[np.ndarray, np.ndarray]]: - loader = [] - for n, second_nodes in enumerate(tqdm(partitions)): - primes_in_part, *_ = np.intersect1d(second_nodes, prime_indices, return_indices=True) - if len(primes_in_part): - loader.append((primes_in_part, second_nodes)) - - return loader - - -class ClusterGCNLoader(BaseLoader): - """ - Batch-wise IBMB dataloader from paper Influence-Based Mini-Batching for Graph Neural Networks - """ - - def __init__(self, graph: Data, - num_partitions: int, - output_indices: torch.LongTensor, - return_edge_index_type: str, - metis_output_weight: Optional[float] = None, - **kwargs): - - self.subgraphs = [] - self.batch_wise_out_aux_pairs = [] - - self.original_graph = None - self.adj = None - - assert is_undirected(graph.edge_index, num_nodes=graph.num_nodes), "Assume the graph to be undirected" - self.cache_data = kwargs['batch_size'] == 1 - self.num_partitions = num_partitions - self.output_indices = output_indices - assert return_edge_index_type in ['adj', 'edge_index'] - self.return_edge_index_type = return_edge_index_type - self.metis_output_weight = metis_output_weight - - self.create_batch_wise_loader(graph) - - if not self.cache_data: - self.original_graph = graph # need to cache the original graph - - super().__init__(self.subgraphs if self.cache_data else self.batch_wise_out_aux_pairs, **kwargs) - - def create_batch_wise_loader(self, graph: Data): - adj = SparseTensor.from_edge_index(graph.edge_index, sparse_sizes=(graph.num_nodes, graph.num_nodes)) - adj = self.normalize_adjmat(adj, normalization='rw') - - # graph partitioning - partitions = get_partitions(adj, - self.num_partitions, - self.output_indices, - graph.num_nodes, - self.metis_output_weight) - - batch_wise_out_aux_pairs = cluster_loader([p.numpy() for p in partitions], self.output_indices.numpy()) - - self.indices_complete_check(batch_wise_out_aux_pairs, self.output_indices) - self.batch_wise_out_aux_pairs = batch_wise_out_aux_pairs - - if self.cache_data: - self.prepare_cache(graph, batch_wise_out_aux_pairs, adj) - else: - if self.return_edge_index_type == 'adj': - self.adj = adj - - def prepare_cache(self, graph: Data, - batch_wise_out_aux_pairs: List[Tuple[np.ndarray, np.ndarray]], - adj: Optional[SparseTensor]): - - pbar = tqdm(batch_wise_out_aux_pairs) - pbar.set_description(f"Caching data with type {self.return_edge_index_type}") - - if self.return_edge_index_type == 'adj': - assert adj is not None, "Trying to cache adjacency matrix, got None type." - - for out, aux in pbar: - mask = torch.from_numpy(np.in1d(aux, out)) - - if isinstance(aux, np.ndarray): - aux = torch.from_numpy(aux) - - subg = self.get_subgraph(aux, graph, self.return_edge_index_type, adj, output_node_mask=mask) - self.subgraphs.append(subg) - - def __getitem__(self, idx): - return self.subgraphs[idx] if self.cache_data else self.batch_wise_out_aux_pairs[idx] - - def __len__(self): - assert self.num_partitions == len(self.subgraphs) == len(self.batch_wise_out_aux_pairs) - return self.num_partitions - - def __collate__(self, data_list): - if len(data_list) == 1: - assert isinstance(data_list[0], Data) - return data_list[0] - else: - out, aux = zip(*data_list) - out = np.concatenate(out) - aux = np.unique(np.concatenate(aux)) - mask = torch.from_numpy(np.in1d(aux, out)) - aux = torch.from_numpy(aux) - - subg = self.get_subgraph(aux, - self.original_graph, - self.return_edge_index_type, - self.adj, - output_node_mask=mask) - return subg diff --git a/new_loaders/GraphSAINTRWSampler.py b/new_loaders/GraphSAINTRWSampler.py deleted file mode 100644 index 7a22e6f..0000000 --- a/new_loaders/GraphSAINTRWSampler.py +++ /dev/null @@ -1,227 +0,0 @@ -import os.path as osp -from math import ceil -from typing import Optional - -import numpy as np -import torch -from torch_geometric.data import Data -from torch_sparse import SparseTensor -from tqdm import tqdm - -from new_loaders.BaseLoader import BaseLoader - - -class SaintRWTrainSampler(BaseLoader): - - def __init__(self, - graph: Data, - output_indices: torch.LongTensor, - return_edge_index_type: str, - num_nodes: int, - batch_size: int, - walk_length: int, - num_steps: int = 1, - sample_coverage: int = 0, - save_dir: Optional[str] = None, - log: bool = True, - **kwargs): - - self.walk_length = walk_length - self.num_steps = num_steps - self.__batch_size__ = batch_size - self.sample_coverage = sample_coverage - self.log = log - - self.N = num_nodes - self.E = graph.num_edges - - self.adj = SparseTensor.from_edge_index(graph.edge_index, sparse_sizes=(graph.num_nodes, graph.num_nodes)) - self.adj = self.normalize_adjmat(self.adj, normalization='rw') - self.edge_weight = self.adj.storage.value() - self.adj.set_value_(torch.arange(self.E)) - - self.original_graph = graph - self.output_indices = output_indices - - assert return_edge_index_type in ['adj', 'edge_index'] - self.return_edge_index_type = return_edge_index_type - - super().__init__(self, batch_size=1, **kwargs) - - if self.sample_coverage > 0: - path = osp.join(save_dir or '', self.__filename__) - if save_dir is not None and osp.exists(path): # pragma: no cover - self.node_norm, self.edge_norm = torch.load(path) - else: - self.node_norm, self.edge_norm = self.__compute_norm__() - if save_dir is not None: # pragma: no cover - torch.save((self.node_norm, self.edge_norm), path) - - @property - def __filename__(self): - return (f'{self.N}_{self.walk_length}_' - f'{self.sample_coverage}.pt') - - def __len__(self): - return self.num_steps - - def loader_len(self): - return self.num_steps - - def __sample_nodes__(self, batch_size): - start = torch.randint(0, self.N, (batch_size,), dtype=torch.long) - node_idx = self.adj.random_walk(start.flatten(), self.walk_length) - return node_idx.view(-1) - - def __getitem__(self, idx): - node_idx = self.__sample_nodes__(self.__batch_size__).unique() - adj, edge_mask = self.adj.saint_subgraph(node_idx) - return node_idx, adj - - def __collate__(self, data_list): - assert len(data_list) == 1 - node_idx, adj = data_list[0] - - mask = torch.from_numpy(np.in1d(node_idx.cpu().numpy(), self.output_indices)) - - if self.sample_coverage > 0: - node_norm = self.node_norm[node_idx] - node_norm = node_norm[mask] - node_norm /= node_norm.sum() - else: - node_norm = None - - _, _, edge_idx = adj.coo() - if self.return_edge_index_type == 'adj': - if self.sample_coverage > 0: - adj.set_value_(self.edge_norm[edge_idx] * self.edge_weight[edge_idx], layout='csr') - else: - adj.set_value_(self.edge_weight[edge_idx], layout='csr') - else: - adj = torch.vstack([adj.storage.row(), adj.storage.col()]) - - graph = Data(x=self.original_graph.x[node_idx], - y=self.original_graph.y[node_idx], - edge_index=adj, - output_node_mask=mask, - node_norm=node_norm) - - return graph - - def __compute_norm__(self): - node_count = torch.zeros(self.N, dtype=torch.float) - edge_count = torch.zeros(self.E, dtype=torch.float) - - loader = torch.utils.data.DataLoader(self, batch_size=200, - collate_fn=lambda x: x, - num_workers=self.num_workers) - - if self.log: # pragma: no cover - pbar = tqdm(total=self.N * self.sample_coverage) - pbar.set_description('Compute GraphSAINT normalization') - - num_samples = 0 - total_sampled_nodes = 0 - while total_sampled_nodes < self.N * self.sample_coverage: - for data in loader: - for node_idx, adj in data: - edge_idx = adj.storage.value() - node_count[node_idx] += 1 - edge_count[edge_idx] += 1 - total_sampled_nodes += node_idx.size(0) - - if self.log: # pragma: no cover - pbar.update(node_idx.size(0)) - num_samples += self.num_steps - - if self.log: # pragma: no cover - pbar.close() - - row, _, edge_idx = self.adj.coo() - t = torch.empty_like(edge_count).scatter_(0, edge_idx, node_count[row]) - edge_norm = (t / edge_count) - edge_norm[edge_norm == float('inf')] = 0.1 - edge_norm[torch.isnan(edge_norm)] = 0.1 - - node_count[node_count == 0] = 0.1 - node_norm = num_samples / node_count / self.N - - return node_norm, edge_norm - - -class SaintRWValSampler(BaseLoader): - - def __init__(self, - graph: Data, - output_indices: torch.LongTensor, - return_edge_index_type: str, - num_nodes: int, - walk_length: int, - sample_coverage: int = 0, - save_dir: Optional[str] = None, - **kwargs): - - self.walk_length = walk_length - self.sample_coverage = sample_coverage - - self.N = num_nodes - self.E = graph.num_edges - - self.adj = SparseTensor.from_edge_index(graph.edge_index, sparse_sizes=(graph.num_nodes, graph.num_nodes)) - self.adj = self.normalize_adjmat(self.adj, normalization='rw') - self.edge_weight = self.adj.storage.value() - self.adj.set_value_(torch.arange(self.E)) - - self.original_graph = graph - self.output_indices = output_indices - - assert return_edge_index_type in ['adj', 'edge_index'] - self.return_edge_index_type = return_edge_index_type - - super().__init__(self, **kwargs) - - if self.sample_coverage > 0: - path = osp.join(save_dir or '', self.__filename__) - assert save_dir is not None and osp.exists(path) - self.node_norm, self.edge_norm = torch.load(path) - else: - self.node_norm = torch.ones(self.N) - self.edge_norm = torch.ones(self.E) - - @property - def __filename__(self): - return (f'{self.N}_{self.walk_length}_' - f'{self.sample_coverage}.pt') - - def __len__(self): - return len(self.output_indices) - - def loader_len(self): - return ceil(len(self.output_indices) / self.batch_size) - - def __getitem__(self, idx): - return self.output_indices[idx] - - def __collate__(self, data_list): - prime_nodes = torch.tensor(data_list, dtype=torch.long) - node_idx = self.adj.random_walk(prime_nodes.flatten(), self.walk_length).view(-1).unique() - adj, _ = self.adj.saint_subgraph(node_idx) - - _, _, edge_idx = adj.coo() - if self.return_edge_index_type == 'adj': - if self.sample_coverage > 0: - adj.set_value_(self.edge_norm[edge_idx] * self.edge_weight[edge_idx], layout='csr') - else: - adj.set_value_(self.edge_weight[edge_idx], layout='csr') - else: - adj = torch.vstack([adj.storage.row(), adj.storage.col()]) - - node_norm = self.node_norm[prime_nodes] - node_norm /= node_norm.sum() - graph = Data(x=self.original_graph.x[node_idx], - y=self.original_graph.y[node_idx], - edge_index=adj, - output_node_mask=torch.from_numpy(np.in1d(node_idx.numpy(), prime_nodes.numpy())), - node_norm=node_norm) - - return graph diff --git a/new_loaders/IBMBBatchLoader.py b/new_loaders/IBMBBatchLoader.py deleted file mode 100644 index c73f3dc..0000000 --- a/new_loaders/IBMBBatchLoader.py +++ /dev/null @@ -1,214 +0,0 @@ -from math import ceil -from typing import Optional, Union, List, Tuple - -import numpy as np -import torch -from torch_geometric.data import Data -from torch_geometric.utils import is_undirected -from torch_sparse import SparseTensor -from tqdm import tqdm - -from new_loaders.utils import get_partitions -from .BaseLoader import BaseLoader - - -def ppr_power_method(adj: SparseTensor, - batch: List[Union[np.ndarray, torch.LongTensor]], - topk: int, - num_iter: int, - alpha: float) -> List[np.ndarray]: - """ - PPR power iteration. - - :param adj: - :param batch: - :param topk: - :param num_iter: - :param alpha: - :return: - """ - topk_neighbors = [] - logits = torch.zeros(adj.size(0), len(batch), device=adj.device()) # each column contains a set of output nodes - for i, tele_set in enumerate(batch): - logits[tele_set, i] = 1. / len(tele_set) - - new_logits = logits.clone() - for i in range(num_iter): - new_logits = adj @ new_logits * (1 - alpha) + alpha * logits - - inds = new_logits.argsort(0) - nonzeros = (new_logits > 0).sum(0) - nonzeros = torch.minimum(nonzeros, torch.tensor([topk], dtype=torch.int64, device=adj.device())) - for i in range(new_logits.shape[1]): - topk_neighbors.append(inds[-nonzeros[i]:, i].cpu().numpy()) - - return topk_neighbors - - -def create_batchwise_out_aux_pairs(adj: SparseTensor, - partitions: List[Union[torch.LongTensor, np.ndarray]], - prime_indices: Union[torch.LongTensor, np.ndarray], - topk: int, - num_outnodeset_per_batch: int = 50, - alpha: float = 0.2, - ppr_iterations: int = 50) -> List[Tuple[np.ndarray, np.ndarray]]: - """ - - :param adj: - :param partitions: - :param prime_indices: - :param topk: - :param num_outnodeset_per_batch: - :param alpha: - :param ppr_iterations: - :return: - """ - device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu') - if isinstance(prime_indices, torch.Tensor): - prime_indices = prime_indices.cpu().numpy() - - adj = adj.to(device) - - cur_output_nodes = [] - loader = [] - - pbar = tqdm(range(len(partitions))) - pbar.set_description("Processing topic-sensitive PPR batches") - for n in pbar: - part = partitions[n] - if isinstance(part, torch.Tensor): - part = part.cpu().numpy() - - primes_in_part, *_ = np.intersect1d(part, prime_indices, assume_unique=True, return_indices=True) - if len(primes_in_part): # There ARE output nodes in this partition - cur_output_nodes.append(primes_in_part) - - # accumulate enough output nodes for a batch, to make good use of GPU memory - if len(cur_output_nodes) >= num_outnodeset_per_batch or n == len(partitions) - 1: - topk_neighbors = ppr_power_method(adj, cur_output_nodes, topk, ppr_iterations, alpha) - for i in range(len(cur_output_nodes)): - # force output nodes to be aux nodes - auxiliary_nodes = np.union1d(cur_output_nodes[i], topk_neighbors[i]) - loader.append((cur_output_nodes[i], auxiliary_nodes)) - cur_output_nodes = [] - - if torch.cuda.is_available(): - torch.cuda.empty_cache() - - return loader - - -class IBMBBatchLoader(BaseLoader): - """ - Batch-wise IBMB dataloader from paper Influence-Based Mini-Batching for Graph Neural Networks - """ - - def __init__(self, graph: Data, - num_partitions: int, - output_indices: torch.LongTensor, - return_edge_index_type: str, - batch_expand_ratio: Optional[float] = 1., - metis_output_weight: Optional[float] = None, - num_outnodeset_per_batch: Optional[int] = 50, - alpha: float = 0.2, - approximate_ppr_iterations: int = 50, - **kwargs): - - self.subgraphs = [] - self.batch_wise_out_aux_pairs = [] - - self.original_graph = None - self.adj = None - - assert is_undirected(graph.edge_index, num_nodes=graph.num_nodes), "Assume the graph to be undirected" - self.cache_data = kwargs['batch_size'] == 1 - self.num_partitions = num_partitions - self.output_indices = output_indices - assert return_edge_index_type in ['adj', 'edge_index'] - self.return_edge_index_type = return_edge_index_type - self.batch_expand_ratio = batch_expand_ratio - self.metis_output_weight = metis_output_weight - self.num_outnodeset_per_batch = num_outnodeset_per_batch - self.alpha = alpha - self.approximate_ppr_iterations = approximate_ppr_iterations - - self.create_batch_wise_loader(graph) - - if not self.cache_data: - self.original_graph = graph # need to cache the original graph - - super().__init__(self.subgraphs if self.cache_data else self.batch_wise_out_aux_pairs, **kwargs) - - def create_batch_wise_loader(self, graph: Data): - adj = SparseTensor.from_edge_index(graph.edge_index, sparse_sizes=(graph.num_nodes, graph.num_nodes)) - adj = self.normalize_adjmat(adj, normalization='rw') - - # graph partitioning - partitions = get_partitions(adj, - self.num_partitions, - self.output_indices, - graph.num_nodes, - self.metis_output_weight) - - # get output - auxiliary node pairs - topk = ceil(self.batch_expand_ratio * graph.num_nodes / self.num_partitions) - batch_wise_out_aux_pairs = create_batchwise_out_aux_pairs(adj, - partitions, - self.output_indices, - topk, - self.num_outnodeset_per_batch, - self.alpha, - self.approximate_ppr_iterations) - - self.indices_complete_check(batch_wise_out_aux_pairs, self.output_indices) - self.batch_wise_out_aux_pairs = batch_wise_out_aux_pairs - - if self.cache_data: - self.prepare_cache(graph, batch_wise_out_aux_pairs, adj) - else: - if self.return_edge_index_type == 'adj': - self.adj = adj - - def prepare_cache(self, graph: Data, - batch_wise_out_aux_pairs: List[Tuple[np.ndarray, np.ndarray]], - adj: Optional[SparseTensor]): - - pbar = tqdm(batch_wise_out_aux_pairs) - pbar.set_description(f"Caching data with type {self.return_edge_index_type}") - - if self.return_edge_index_type == 'adj': - assert adj is not None, "Trying to cache adjacency matrix, got None type." - - for out, aux in pbar: - mask = torch.from_numpy(np.in1d(aux, out)) - - if isinstance(aux, np.ndarray): - aux = torch.from_numpy(aux) - - subg = self.get_subgraph(aux, graph, self.return_edge_index_type, adj, output_node_mask=mask) - self.subgraphs.append(subg) - - def __getitem__(self, idx): - return self.subgraphs[idx] if self.cache_data else self.batch_wise_out_aux_pairs[idx] - - def __len__(self): - assert self.num_partitions == len(self.subgraphs) == len(self.batch_wise_out_aux_pairs) - return self.num_partitions - - def __collate__(self, data_list): - if len(data_list) == 1: - assert isinstance(data_list[0], Data) - return data_list[0] - else: - out, aux = zip(*data_list) - out = np.concatenate(out) - aux = np.unique(np.concatenate(aux)) - mask = torch.from_numpy(np.in1d(aux, out)) - aux = torch.from_numpy(aux) - - subg = self.get_subgraph(aux, - self.original_graph, - self.return_edge_index_type, - self.adj, - output_node_mask=mask) - return subg diff --git a/new_loaders/IBMBNodeLoader.py b/new_loaders/IBMBNodeLoader.py deleted file mode 100644 index 68df906..0000000 --- a/new_loaders/IBMBNodeLoader.py +++ /dev/null @@ -1,349 +0,0 @@ -import logging -import queue as Q -from heapq import heappush, heappop, heapify -from typing import Optional, List, Tuple - -import numba -import numpy as np -import torch -from scipy.sparse import csr_matrix -from torch_geometric.data import Data -from torch_geometric.utils import is_undirected -# from torch_geometric.transforms.gdc import get_calc_ppr -from torch_sparse import SparseTensor -from tqdm import tqdm - -from new_loaders.utils import topk_ppr_matrix -from .BaseLoader import BaseLoader - - -def get_pairs(ppr_mat: csr_matrix) -> np.ndarray: - """ - Get symmetric ppr pairs. (Only upper triangle) - - :param ppr_mat: - :return: - """ - ppr_mat = ppr_mat + ppr_mat.transpose() - - ppr_mat = ppr_mat.tocoo() # find issue: https://github.com/scipy/scipy/blob/v1.7.1/scipy/sparse/extract.py#L12-L40 - row, col, data = ppr_mat.row, ppr_mat.col, ppr_mat.data - mask = (row > col) # lu - - row, col, data = row[mask], col[mask], data[mask] - sort_arg = np.argsort(data)[::-1] - # sort_arg = parallel_sort.parallel_argsort(data)[::-1] - - # map prime_nodes to arange - ppr_pairs = np.vstack((row[sort_arg], col[sort_arg])).T - return ppr_pairs - - -@numba.njit(cache=True) -def prime_orient_merge(ppr_pairs: np.ndarray, primes_per_batch: int, num_nodes: int): - """ - - :param ppr_pairs: - :param primes_per_batch: - :param num_nodes: - :return: - """ - # cannot use list for id_primes_list, updating node_id_list[id_primes_list[id2]] require id_primes_list to be array - id_primes_list = list(np.arange(num_nodes, dtype=np.int32).reshape(-1, 1)) - node_id_list = np.arange(num_nodes, dtype=np.int32) - placeholder = np.zeros(0, dtype=np.int32) - # size_flag = [{a} for a in np.arange(num_nodes, dtype=np.int32)] - - for i, j in ppr_pairs: - id1, id2 = node_id_list[i], node_id_list[j] - if id1 > id2: - id1, id2 = id2, id1 - - # if not (id1 in size_flag[id2] or id2 in size_flag[id1]) - if id1 != id2 and len(id_primes_list[id1]) + len(id_primes_list[id2]) <= primes_per_batch: - id_primes_list[id1] = np.concatenate((id_primes_list[id1], id_primes_list[id2])) - node_id_list[id_primes_list[id2]] = id1 - # node_id_list[j] = id1 - id_primes_list[id2] = placeholder - - prime_lst = list() - ids = np.unique(node_id_list) - - for _id in ids: - prime_lst.append(list(id_primes_list[_id])) - - return list(prime_lst) - - -def prime_post_process(loader, merge_max_size): - h = [(len(p), p,) for p in loader] - heapify(h) - - while len(h) > 1: - len1, p1 = heappop(h) - len2, p2 = heappop(h) - if len1 + len2 <= merge_max_size: - heappush(h, (len1 + len2, p1 + p2)) - else: - heappush(h, (len1, p1,)) - heappush(h, (len2, p2,)) - break - - new_batch = [] - - while len(h): - _, p = heappop(h) - new_batch.append(p) - - return new_batch - - -@numba.njit(cache=True, locals={'p1': numba.int64, - 'p2': numba.int64, - 'p3': numba.int64, - 'new_list': numba.int64[::1]}) -def merge_lists(lst1, lst2): - p1, p2, p3 = numba.int64(0), numba.int64(0), numba.int64(0) - new_list = np.zeros(len(lst1) + len(lst2), dtype=np.int64) - - while p2 < len(lst2) and p1 < len(lst1): - if lst2[p2] <= lst1[p1]: - new_list[p3] = lst2[p2] - p2 += 1 - - if lst2[p2 - 1] == lst1[p1]: - p1 += 1 - - elif lst2[p2] > lst1[p1]: - new_list[p3] = lst1[p1] - p1 += 1 - p3 += 1 - - if p2 == len(lst2) and p1 == len(lst1): - return new_list[:p3] - elif p1 == len(lst1): - rest = lst2[p2:] - else: - rest = lst1[p1:] - - p3_ = p3 + len(rest) - new_list[p3: p3_] = rest - - return new_list[:p3_] - - -@numba.njit(cache=True, locals={'node_id_list': numba.int64[::1], - 'placeholder': numba.int64[::1], - 'id1': numba.int64, - 'id2': numba.int64}) -def aux_orient_merge(ppr_pairs, prime_indices, id_second_list, merge_max_size): - thresh = numba.int64(merge_max_size * 1.0005) - num_nodes = len(prime_indices) - node_id_list = np.arange(num_nodes, dtype=np.int64) - - id_prime_list = list(np.arange(num_nodes, dtype=np.int64).reshape(-1, 1)) - size_flag = [{a} for a in np.arange(num_nodes, dtype=np.int64)] - - placeholder = np.zeros(0, dtype=np.int64) - - for (n1, n2) in ppr_pairs: - id1, id2 = node_id_list[n1], node_id_list[n2] - id1, id2 = (id1, id2) if id1 < id2 else (id2, id1) - - if id1 != id2 and not (id2 in size_flag[id1]) and not (id1 in size_flag[id2]): - - batch_second1 = id_second_list[id1] - batch_second2 = id_second_list[id2] - - if len(batch_second1) + len(batch_second2) <= thresh: - new_batch_second = merge_lists(batch_second1, batch_second2) - if len(new_batch_second) <= merge_max_size: - batch_prime1 = id_prime_list[id1] - batch_prime2 = id_prime_list[id2] - - new_batch_prime = np.concatenate((batch_prime1, batch_prime2)) - - id_prime_list[id1] = new_batch_prime - id_second_list[id1] = new_batch_second - id_second_list[id2] = placeholder - - id_prime_list[id2] = placeholder - - node_id_list[batch_prime2] = id1 - size_flag[id1].update(size_flag[id2]) - size_flag[id2].clear() - else: - size_flag[id1].add(id2) - size_flag[id2].add(id1) - else: - size_flag[id1].add(id2) - size_flag[id2].add(id1) - - prime_second_lst = list() - ids = np.unique(node_id_list) - - for _id in ids: - prime_second_lst.append((prime_indices[id_prime_list[_id]], - id_second_list[_id])) - - return list(prime_second_lst) - - -def aux_post_process(loader, merge_max_size): - # merge smallest clusters first - que = Q.PriorityQueue() - for p, n in loader: - que.put((len(n), (list(p), list(n)))) - - while que.qsize() > 1: - len1, (p1, n1) = que.get() - len2, (p2, n2) = que.get() - n = merge_lists(np.array(n1), np.array(n2)) - - if len(n) > merge_max_size: - que.put((len1, (p1, n1))) - que.put((len2, (p2, n2))) - break - - else: - que.put((len(n), (p1 + p2, list(n)))) - - new_batch = [] - - while not que.empty(): - _, (p, n) = que.get() - new_batch.append((np.array(p), np.array(n))) - - return new_batch - - -class IBMBNodeLoader(BaseLoader): - """ - Batch-wise IBMB dataloader from paper Influence-Based Mini-Batching for Graph Neural Networks - """ - - def __init__(self, graph: Data, - output_indices: torch.LongTensor, - return_edge_index_type: str, - num_auxiliary_node_per_output: int, - num_output_nodes_per_batch: Optional[int] = None, - num_auxiliary_nodes_per_batch: Optional[int] = None, - alpha: float = 0.2, - eps: float = 1.e-4, - **kwargs): - - self.subgraphs = [] - self.node_wise_out_aux_pairs = [] - - self.original_graph = None - self.adj = None - - assert is_undirected(graph.edge_index, num_nodes=graph.num_nodes), "Assume the graph to be undirected" - self.cache_data = kwargs['batch_size'] == 1 - self.output_indices = output_indices - assert return_edge_index_type in ['adj', 'edge_index'] - self.return_edge_index_type = return_edge_index_type - self.num_auxiliary_node_per_output = num_auxiliary_node_per_output - self.num_output_nodes_per_batch = num_output_nodes_per_batch - self.num_auxiliary_nodes_per_batch = num_auxiliary_nodes_per_batch - self.alpha = alpha - self.eps = eps - - self.create_node_wise_loader(graph) - - if not self.cache_data: - self.original_graph = graph # need to cache the original graph - - super().__init__(self.subgraphs if self.cache_data else self.node_wise_out_aux_pairs, **kwargs) - - def create_node_wise_loader(self, graph: Data): - logging.info("Start PPR calculation") - ppr_matrix, neighbors = topk_ppr_matrix(graph.edge_index, - graph.num_nodes, - self.alpha, - self.eps, - self.output_indices, self.num_auxiliary_node_per_output) - - ppr_matrix = ppr_matrix[:, self.output_indices.numpy()] - - logging.info("Getting PPR pairs") - ppr_pairs = get_pairs(ppr_matrix) - - assert (self.num_output_nodes_per_batch is not None) ^ (self.num_auxiliary_nodes_per_batch is not None) - if self.num_output_nodes_per_batch is not None: - logging.info("Output node oriented merging") - output_list = prime_orient_merge(ppr_pairs, self.num_output_nodes_per_batch, len(self.output_indices)) - output_list = prime_post_process(output_list, self.num_output_nodes_per_batch) - node_wise_out_aux_pairs = [] - - if isinstance(neighbors, list): - neighbors = np.array(neighbors, dtype=object) - - _union = lambda inputs: np.unique(np.concatenate(inputs)) - for p in output_list: - node_wise_out_aux_pairs.append((self.output_indices[p], _union(neighbors[p]).astype(np.int64))) - else: - logging.info("Auxiliary node oriented merging") - prime_second_lst = aux_orient_merge(ppr_pairs, - self.output_indices, - list(neighbors), - merge_max_size=self.num_auxiliary_nodes_per_batch) - node_wise_out_aux_pairs = aux_post_process(prime_second_lst, self.num_auxiliary_nodes_per_batch) - - self.indices_complete_check(node_wise_out_aux_pairs, self.output_indices) - self.node_wise_out_aux_pairs = node_wise_out_aux_pairs - - if self.return_edge_index_type == 'adj': - adj = SparseTensor.from_edge_index(graph.edge_index, sparse_sizes=(graph.num_nodes, graph.num_nodes)) - adj = self.normalize_adjmat(adj, normalization='rw') - else: - adj = None - - if self.cache_data: - self.prepare_cache(graph, node_wise_out_aux_pairs, adj) - else: - if self.return_edge_index_type == 'adj': - self.adj = adj - - def prepare_cache(self, graph: Data, - batch_wise_out_aux_pairs: List[Tuple[np.ndarray, np.ndarray]], - adj: Optional[SparseTensor]): - - pbar = tqdm(batch_wise_out_aux_pairs) - pbar.set_description(f"Caching data with type {self.return_edge_index_type}") - - if self.return_edge_index_type == 'adj': - assert adj is not None, "Trying to cache adjacency matrix, got None type." - - for out, aux in pbar: - mask = torch.from_numpy(np.in1d(aux, out)) - - if isinstance(aux, np.ndarray): - aux = torch.from_numpy(aux) - - subg = self.get_subgraph(aux, graph, self.return_edge_index_type, adj, output_node_mask=mask) - self.subgraphs.append(subg) - - def __getitem__(self, idx): - return self.subgraphs[idx] if self.cache_data else self.node_wise_out_aux_pairs[idx] - - def __len__(self): - return len(self.node_wise_out_aux_pairs) - - def __collate__(self, data_list): - if len(data_list) == 1: - assert isinstance(data_list[0], Data) - return data_list[0] - else: - out, aux = zip(*data_list) - out = np.concatenate(out) - aux = np.unique(np.concatenate(aux)) # still need it to be overlapping - mask = torch.from_numpy(np.in1d(aux, out)) - aux = torch.from_numpy(aux) - - subg = self.get_subgraph(aux, - self.original_graph, - self.return_edge_index_type, - self.adj, - output_node_mask=mask) - return subg diff --git a/new_loaders/IBMBRandLoader.py b/new_loaders/IBMBRandLoader.py deleted file mode 100644 index dd1f991..0000000 --- a/new_loaders/IBMBRandLoader.py +++ /dev/null @@ -1,79 +0,0 @@ -import logging - -import numpy as np -import torch -from torch_geometric.data import Data -from torch_geometric.utils import is_undirected -from torch_sparse import SparseTensor - -from new_loaders.utils import topk_ppr_matrix -from .BaseLoader import BaseLoader - - -class IBMBRandLoader(BaseLoader): - - def __init__(self, graph: Data, - output_indices: torch.LongTensor, - return_edge_index_type: str, - num_auxiliary_node_per_output: int, - alpha: float = 0.2, - eps: float = 1.e-4, - batch_size: int = 1, - **kwargs): - - self.out_aux_pairs = [] - - assert is_undirected(graph.edge_index, num_nodes=graph.num_nodes), "Assume the graph to be undirected" - self.output_indices = output_indices - assert return_edge_index_type in ['adj', 'edge_index'] - self.return_edge_index_type = return_edge_index_type - self.num_auxiliary_node_per_output = num_auxiliary_node_per_output - self.batch_size = batch_size - self.alpha = alpha - self.eps = eps - - self.original_graph = graph # need to cache the original graph - self.adj = None - self.create_node_wise_loader(graph) - - super().__init__(self.out_aux_pairs, - batch_size=batch_size, **kwargs) - - def create_node_wise_loader(self, graph: Data): - logging.info("Start PPR calculation") - _, neighbors = topk_ppr_matrix(graph.edge_index, - graph.num_nodes, - self.alpha, - self.eps, - self.output_indices, - self.num_auxiliary_node_per_output) - - for p, n in zip(self.output_indices.numpy(), neighbors): - self.out_aux_pairs.append((np.array([p]), n)) - - self.indices_complete_check(self.out_aux_pairs, self.output_indices) - - if self.return_edge_index_type == 'adj': - adj = SparseTensor.from_edge_index(graph.edge_index, sparse_sizes=(graph.num_nodes, graph.num_nodes)) - adj = self.normalize_adjmat(adj, normalization='rw') - self.adj = adj - - def __getitem__(self, idx): - return self.out_aux_pairs[idx] - - def __len__(self): - return len(self.out_aux_pairs) - - def __collate__(self, data_list): - out, aux = zip(*data_list) - out = np.concatenate(out) - aux = np.unique(np.concatenate(aux)) # DO UNION! - mask = torch.from_numpy(np.in1d(aux, out)) - aux = torch.from_numpy(aux) - - subg = self.get_subgraph(aux, - self.original_graph, - self.return_edge_index_type, - self.adj, - output_node_mask=mask) - return subg diff --git a/new_loaders/ShaDowLoader.py b/new_loaders/ShaDowLoader.py deleted file mode 100644 index baf06f5..0000000 --- a/new_loaders/ShaDowLoader.py +++ /dev/null @@ -1,79 +0,0 @@ -import logging - -import numpy as np -import torch -from torch_geometric.data import Data -from torch_geometric.utils import is_undirected -from torch_sparse import SparseTensor - -from new_loaders.utils import topk_ppr_matrix -from .BaseLoader import BaseLoader - - -class ShaDowLoader(BaseLoader): - - def __init__(self, graph: Data, - output_indices: torch.LongTensor, - return_edge_index_type: str, - num_auxiliary_node_per_output: int, - alpha: float = 0.2, - eps: float = 1.e-4, - batch_size: int = 1, - **kwargs): - - self.out_aux_pairs = [] - - assert is_undirected(graph.edge_index, num_nodes=graph.num_nodes), "Assume the graph to be undirected" - self.output_indices = output_indices - assert return_edge_index_type in ['adj', 'edge_index'] - self.return_edge_index_type = return_edge_index_type - self.num_auxiliary_node_per_output = num_auxiliary_node_per_output - self.batch_size = batch_size - self.alpha = alpha - self.eps = eps - - self.original_graph = graph # need to cache the original graph - self.adj = None - self.create_node_wise_loader(graph) - - super().__init__(self.out_aux_pairs, - batch_size=batch_size, **kwargs) - - def create_node_wise_loader(self, graph: Data): - logging.info("Start PPR calculation") - _, neighbors = topk_ppr_matrix(graph.edge_index, - graph.num_nodes, - self.alpha, - self.eps, - self.output_indices, - self.num_auxiliary_node_per_output) - - for p, n in zip(self.output_indices.numpy(), neighbors): - self.out_aux_pairs.append((np.array([p]), n)) - - self.indices_complete_check(self.out_aux_pairs, self.output_indices) - - if self.return_edge_index_type == 'adj': - adj = SparseTensor.from_edge_index(graph.edge_index, sparse_sizes=(graph.num_nodes, graph.num_nodes)) - adj = self.normalize_adjmat(adj, normalization='rw') - self.adj = adj - - def __getitem__(self, idx): - return self.out_aux_pairs[idx] - - def __len__(self): - return len(self.out_aux_pairs) - - def __collate__(self, data_list): - out, aux = zip(*data_list) - out = np.concatenate(out) - aux = np.concatenate(aux) # DO NOT UNION! - mask = torch.from_numpy(np.in1d(aux, out)) - aux = torch.from_numpy(aux) - - subg = self.get_subgraph(aux, - self.original_graph, - self.return_edge_index_type, - self.adj, - output_node_mask=mask) - return subg diff --git a/new_loaders/__init__.py b/new_loaders/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/new_loaders/utils.py b/new_loaders/utils.py deleted file mode 100644 index b967bd2..0000000 --- a/new_loaders/utils.py +++ /dev/null @@ -1,160 +0,0 @@ -from typing import List, Union, Tuple, Optional - -import numba -import numpy as np -import torch -from scipy.sparse import csr_matrix, coo_matrix -from torch_geometric.utils import coalesce -from torch_sparse import SparseTensor - - -def topk_ppr_matrix(edge_index: torch.Tensor, - num_nodes: int, - alpha: float, - eps: float, - output_node_indices: Union[np.ndarray, torch.LongTensor], - topk: int, - normalization='row') -> Tuple[csr_matrix, List[np.ndarray]]: - """Create a sparse matrix where each node has up to the topk PPR neighbors and their weights.""" - if isinstance(output_node_indices, torch.Tensor): - output_node_indices = output_node_indices.numpy() - - edge_index = coalesce(edge_index, num_nodes=num_nodes) - edge_index_np = edge_index.cpu().numpy() - - _, indptr, out_degree = np.unique(edge_index_np[0], - return_index=True, - return_counts=True) - indptr = np.append(indptr, len(edge_index_np[0])) - - neighbors, weights = calc_ppr_topk_parallel(indptr, edge_index_np[1], out_degree, - alpha, eps, output_node_indices) - - # neighbors, weights = get_calc_ppr()(indptr, edge_index_np[1], out_degree, alpha, eps) - - ppr_matrix = construct_sparse(neighbors, weights, (len(output_node_indices), num_nodes)) - ppr_matrix = ppr_matrix.tocsr() - - neighbors = sparsify(neighbors, weights, topk) - neighbors = [np.union1d(nei, pr) for nei, pr in zip(neighbors, output_node_indices)] - - if normalization == 'sym': - # Assume undirected (symmetric) adjacency matrix - deg_sqrt = np.sqrt(np.maximum(out_degree, 1e-12)) - deg_inv_sqrt = 1. / deg_sqrt - - row, col = ppr_matrix.nonzero() - ppr_matrix.data = deg_sqrt[output_node_indices[row]] * ppr_matrix.data * deg_inv_sqrt[col] - elif normalization == 'col': - # Assume undirected (symmetric) adjacency matrix - deg_inv = 1. / np.maximum(out_degree, 1e-12) - - row, col = ppr_matrix.nonzero() - ppr_matrix.data = out_degree[output_node_indices[row]] * ppr_matrix.data * deg_inv[col] - elif normalization == 'row': - pass - else: - raise ValueError(f"Unknown PPR normalization: {normalization}") - - return ppr_matrix, neighbors - - -def construct_sparse(neighbors, weights, shape): - i = np.repeat(np.arange(len(neighbors)), np.fromiter(map(len, neighbors), dtype=np.int)) - j = np.concatenate(neighbors) - return coo_matrix((np.concatenate(weights), (i, j)), shape) - - -# https://pytorch-geometric.readthedocs.io/en/latest/_modules/torch_geometric/transforms/gdc.html#GDC.diffusion_matrix_approx -@numba.njit(cache=True, parallel=True) -def calc_ppr_topk_parallel(indptr, indices, deg, alpha, epsilon, nodes) \ - -> Tuple[List[np.ndarray], List[np.ndarray]]: - js = [np.zeros(0, dtype=np.int64)] * len(nodes) - vals = [np.zeros(0, dtype=np.float32)] * len(nodes) - for i in numba.prange(len(nodes)): - j, val = _calc_ppr_node(nodes[i], indptr, indices, deg, alpha, epsilon) - js[i] = np.array(j) - vals[i] = np.array(val) - return js, vals - - -@numba.njit(cache=True, locals={'_val': numba.float32, 'res': numba.float32, 'res_vnode': numba.float32}) -def _calc_ppr_node(inode, indptr, indices, deg, alpha, epsilon): - alpha_eps = alpha * epsilon - f32_0 = numba.float32(0) - p = {inode: f32_0} - r = {} - r[inode] = alpha - q = [inode] - - while len(q) > 0: - unode = q.pop() - - res = r[unode] if unode in r else f32_0 - if unode in p: - p[unode] += res - else: - p[unode] = res - r[unode] = f32_0 - for vnode in indices[indptr[unode]:indptr[unode + 1]]: - _val = (1 - alpha) * res / deg[unode] - if vnode in r: - r[vnode] += _val - else: - r[vnode] = _val - - res_vnode = r[vnode] if vnode in r else f32_0 - if res_vnode >= alpha_eps * deg[vnode]: - if vnode not in q: - q.append(vnode) - - return list(p.keys()), list(p.values()) - - -def sparsify(neighbors: List[np.ndarray], weights: List[np.ndarray], topk: int): - new_neighbors = [] - for n, w in zip(neighbors, weights): - idx_topk = np.argsort(w)[-topk:] - new_neighbor = n[idx_topk] - new_neighbors.append(new_neighbor) - - return new_neighbors - - -def get_partitions(edge_index: Union[torch.LongTensor, SparseTensor], - num_partitions: int, - indices: torch.LongTensor, - num_nodes: int, - output_weight: Optional[float] = None) -> List[torch.LongTensor]: - """ - Graph partitioning using METIS. - If output_weight is given, assign weights on output nodes. - - :param edge_index: - :param num_partitions: - :param indices: - :param num_nodes: - :param output_weight: - :return: - """ - - assert isinstance(edge_index, (torch.LongTensor, SparseTensor)), f'Unsupported edge_index type {type(edge_index)}' - if isinstance(edge_index, torch.LongTensor): - edge_index = SparseTensor.from_edge_index(edge_index, sparse_sizes=(num_nodes, num_nodes)) - - if output_weight is not None and output_weight != 1: - node_weight = torch.ones(num_nodes) - node_weight[indices] = output_weight - else: - node_weight = None - - _, partptr, perm = edge_index.partition(num_parts=num_partitions, - recursive=False, - weighted=False, - node_weight=node_weight) - - partitions = [] - for i in range(len(partptr) - 1): - partitions.append(perm[partptr[i]: partptr[i + 1]]) - - return partitions