diff --git a/README.md b/README.md index 6bfb060..b009f68 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ## SGL: Scalable Graph Learning **SGL** is a Graph Neural Network (GNN) toolkit targeting scalable graph learning, which supports deep graph learning on -extremely large datasets. SGL allows users to easily implement scalable graph neural networks and evalaute its +extremely large datasets. SGL allows users to easily implement scalable graph neural networks and evaluate its performance on various downstream tasks like node classification, node clustering, and link prediction. Further, SGL supports auto neural architecture search functionality based on OpenBox. SGL is designed and @@ -12,7 +12,7 @@ the PaSca, SGL scale to graph data with - billions of nodes and edegs. + billions of nodes and edges. + **Auto neural architecture search**: Automatically choose decent neural architectures according to specific tasks, and pre-defined objectives (e.g., inference time). + **Ease of use**: User-friendly interfaces of implementing existing scalable GNNs and executing various downstream @@ -20,13 +20,21 @@ the PyG. Please follow the +link below to install PyG first before installing +SGL: https://pytorch-geometric.readthedocs.io/en/latest/notes/installation.html. -#### Install from source +### Install from pip + +To install SGL from PyPI: + +```bash +pip install sgl-dair +``` ## Quick Start (TODO) -**TODO** A quick start example is given by: ```python @@ -39,7 +47,6 @@ model = SGC(prop_steps=3, feat_dim=dataset.num_features, num_classes=dataset.num device = "cuda:0" test_acc = NodeClassification(dataset, model, lr=0.1, weight_decay=5e-5, epochs=200, device=device).test_acc -print(test_acc) ``` **TODO** diff --git a/__init__.py b/__init__.py deleted file mode 100644 index d8a87a9..0000000 --- a/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -__version__ = "0.0.1" - -__all__ = [ - "__version__", -] diff --git a/test.py b/examples/sgc_pubmed.py similarity index 70% rename from test.py rename to examples/sgc_pubmed.py index 2f447e7..82ac8e4 100644 --- a/test.py +++ b/examples/sgc_pubmed.py @@ -1,10 +1,9 @@ -from dataset import Planetoid -from models.homo import SGC -from tasks import NodeClassification +from sgl.dataset import Planetoid +from sgl.models.homo import SGC +from sgl.tasks import NodeClassification dataset = Planetoid("pubmed", "./", "official") model = SGC(prop_steps=3, feat_dim=dataset.num_features, num_classes=dataset.num_classes) device = "cuda:0" test_acc = NodeClassification(dataset, model, lr=0.1, weight_decay=5e-5, epochs=200, device=device).test_acc -print(test_acc) diff --git a/test_nas.py b/examples/test_nas.py similarity index 95% rename from test_nas.py rename to examples/test_nas.py index 7ea8ce5..5cd9039 100644 --- a/test_nas.py +++ b/examples/test_nas.py @@ -1,9 +1,9 @@ import numpy as np import torch -from dataset import Planetoid -from models.search_models import SearchModel -from search.auto_search import SearchManager +from sgl.dataset import Planetoid +from sgl.models.search_models import SearchModel +from sgl.search.auto_search import SearchManager dataset = Planetoid("cora", "./", "official") diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..b5a3c46 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,6 @@ +[build-system] +requires = [ + "setuptools>=42", + "wheel" +] +build-backend = "setuptools.build_meta" \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 8d472ef..cddb960 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,9 @@ -torch==1.11.0 -scipy==1.5.2 -ogb==1.3.3 -numpy==1.22.3 -torch-geometric +torch>=1.8 +networkx +tqdm +numpy>=1.21 +scipy +gensim +scikit_learn +ogb +openbox \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..c7121c0 --- /dev/null +++ b/setup.py @@ -0,0 +1,26 @@ +import setuptools + +with open("README.md", "r", encoding="utf-8") as readme: + long_description = readme.read() + +with open("requirements.txt", "r", encoding="utf-8") as require: + requirements = [r for r in require.read().splitlines() if r != ''] + +setuptools.setup( + name="sgl-dair", + version="0.1.0", + author="DAIR Lab @PKU", + description="Graph Neural Network (GNN) toolkit targeting scalable graph learning", + long_description=long_description, + long_description_content_type="text/markdown", + url="https://github.com/PKU-DAIR/SGL", + classifiers=[ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + ], + packages=setuptools.find_packages(), + python_requires='>=3.6', + install_requires=requirements, + data_files=["requirements.txt"], +) diff --git a/sgl/__init__.py b/sgl/__init__.py new file mode 100644 index 0000000..e82d5b1 --- /dev/null +++ b/sgl/__init__.py @@ -0,0 +1 @@ +name = "sgl" diff --git a/sgl/data/__init__.py b/sgl/data/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/data/base_data.py b/sgl/data/base_data.py similarity index 100% rename from data/base_data.py rename to sgl/data/base_data.py diff --git a/data/base_dataset.py b/sgl/data/base_dataset.py similarity index 98% rename from data/base_dataset.py rename to sgl/data/base_dataset.py index 5657144..0a1d1fe 100644 --- a/data/base_dataset.py +++ b/sgl/data/base_dataset.py @@ -6,9 +6,9 @@ import warnings from scipy.sparse import csr_matrix -from data.base_data import Node, Edge -from data.utils import file_exist, to_undirected -from dataset.choose_edge_type import ChooseMultiSubgraphs +from sgl.data.base_data import Node, Edge +from sgl.data.utils import file_exist, to_undirected +from sgl.dataset.choose_edge_type import ChooseMultiSubgraphs # Base class for node-level tasks diff --git a/data/utils.py b/sgl/data/utils.py similarity index 100% rename from data/utils.py rename to sgl/data/utils.py diff --git a/dataset/__init__.py b/sgl/dataset/__init__.py similarity index 100% rename from dataset/__init__.py rename to sgl/dataset/__init__.py diff --git a/dataset/acm.py b/sgl/dataset/acm.py similarity index 97% rename from dataset/acm.py rename to sgl/dataset/acm.py index 569d998..7299d3c 100644 --- a/dataset/acm.py +++ b/sgl/dataset/acm.py @@ -4,9 +4,9 @@ from torch_geometric.datasets import HGBDataset from typing import Tuple -from data.base_data import HeteroGraph -from data.base_dataset import HeteroNodeDataset -from dataset.utils import pkl_read_file +from sgl.data.base_data import HeteroGraph +from sgl.data.base_dataset import HeteroNodeDataset +from sgl.dataset.utils import pkl_read_file class Acm(HeteroNodeDataset): diff --git a/dataset/actor.py b/sgl/dataset/actor.py similarity index 96% rename from dataset/actor.py rename to sgl/dataset/actor.py index 7cb6b1e..eed6b2f 100644 --- a/dataset/actor.py +++ b/sgl/dataset/actor.py @@ -4,9 +4,9 @@ import torch from torch_sparse import SparseTensor, coalesce -from data.base_data import Graph -from data.base_dataset import NodeDataset -from dataset.utils import pkl_read_file, download_to +from sgl.data.base_data import Graph +from sgl.data.base_dataset import NodeDataset +from sgl.dataset.utils import pkl_read_file, download_to class Actor(NodeDataset): diff --git a/dataset/airports.py b/sgl/dataset/airports.py similarity index 96% rename from dataset/airports.py rename to sgl/dataset/airports.py index 73150c4..a893402 100644 --- a/dataset/airports.py +++ b/sgl/dataset/airports.py @@ -3,9 +3,9 @@ import pickle as pkl import torch -from data.base_data import Graph -from data.base_dataset import NodeDataset -from dataset.utils import pkl_read_file, download_to, random_split_dataset +from sgl.data.base_data import Graph +from sgl.data.base_dataset import NodeDataset +from sgl.dataset.utils import pkl_read_file, download_to, random_split_dataset class Airports(NodeDataset): diff --git a/dataset/amazon.py b/sgl/dataset/amazon.py similarity index 91% rename from dataset/amazon.py rename to sgl/dataset/amazon.py index adc86d4..156be36 100644 --- a/dataset/amazon.py +++ b/sgl/dataset/amazon.py @@ -2,9 +2,9 @@ import pickle as pkl import torch -from data.base_data import Graph -from data.base_dataset import NodeDataset -from dataset.utils import pkl_read_file, download_to, read_npz, random_split_dataset +from sgl.data.base_data import Graph +from sgl.data.base_dataset import NodeDataset +from sgl.dataset.utils import pkl_read_file, download_to, read_npz, random_split_dataset class Amazon(NodeDataset): diff --git a/dataset/amazon_product.py b/sgl/dataset/amazon_product.py similarity index 95% rename from dataset/amazon_product.py rename to sgl/dataset/amazon_product.py index 7cfb797..bec11aa 100644 --- a/dataset/amazon_product.py +++ b/sgl/dataset/amazon_product.py @@ -6,9 +6,9 @@ import scipy.sparse as sp import torch -from data.base_data import Graph -from data.base_dataset import NodeDataset -from dataset.utils import pkl_read_file, download_to +from sgl.data.base_data import Graph +from sgl.data.base_dataset import NodeDataset +from sgl.dataset.utils import pkl_read_file, download_to class AmazonProduct(NodeDataset): diff --git a/dataset/choose_edge_type.py b/sgl/dataset/choose_edge_type.py similarity index 100% rename from dataset/choose_edge_type.py rename to sgl/dataset/choose_edge_type.py diff --git a/dataset/coauthor.py b/sgl/dataset/coauthor.py similarity index 91% rename from dataset/coauthor.py rename to sgl/dataset/coauthor.py index 386b52d..271e3ef 100644 --- a/dataset/coauthor.py +++ b/sgl/dataset/coauthor.py @@ -2,9 +2,9 @@ import pickle as pkl import torch -from data.base_data import Graph -from data.base_dataset import NodeDataset -from dataset.utils import pkl_read_file, download_to, read_npz, random_split_dataset +from sgl.data.base_data import Graph +from sgl.data.base_dataset import NodeDataset +from sgl.dataset.utils import pkl_read_file, download_to, read_npz, random_split_dataset class Coauthor(NodeDataset): diff --git a/dataset/dblp.py b/sgl/dataset/dblp.py similarity index 97% rename from dataset/dblp.py rename to sgl/dataset/dblp.py index fb42326..7584e55 100644 --- a/dataset/dblp.py +++ b/sgl/dataset/dblp.py @@ -3,10 +3,10 @@ import torch from typing import Tuple -from data.base_data import HeteroGraph -from data.base_dataset import HeteroNodeDataset -from dataset.dblp_original import DBLP -from dataset.utils import pkl_read_file +from sgl.data.base_data import HeteroGraph +from sgl.data.base_dataset import HeteroNodeDataset +from sgl.dataset.dblp_original import DBLP +from sgl.dataset.utils import pkl_read_file class Dblp(HeteroNodeDataset): diff --git a/dataset/dblp_original.py b/sgl/dataset/dblp_original.py similarity index 100% rename from dataset/dblp_original.py rename to sgl/dataset/dblp_original.py diff --git a/dataset/facebook.py b/sgl/dataset/facebook.py similarity index 94% rename from dataset/facebook.py rename to sgl/dataset/facebook.py index e1dde6c..1bf19cf 100644 --- a/dataset/facebook.py +++ b/sgl/dataset/facebook.py @@ -3,9 +3,9 @@ import pickle as pkl import torch -from data.base_data import Graph -from data.base_dataset import NodeDataset -from dataset.utils import pkl_read_file, download_to, random_split_dataset +from sgl.data.base_data import Graph +from sgl.data.base_dataset import NodeDataset +from sgl.dataset.utils import pkl_read_file, download_to, random_split_dataset class Facebook(NodeDataset): diff --git a/dataset/flickr.py b/sgl/dataset/flickr.py similarity index 95% rename from dataset/flickr.py rename to sgl/dataset/flickr.py index 77a3def..f3e7c2b 100644 --- a/dataset/flickr.py +++ b/sgl/dataset/flickr.py @@ -5,9 +5,9 @@ import scipy.sparse as sp import torch -from data.base_data import Graph -from data.base_dataset import NodeDataset -from dataset.utils import pkl_read_file, download_to +from sgl.data.base_data import Graph +from sgl.data.base_dataset import NodeDataset +from sgl.dataset.utils import pkl_read_file, download_to class Flickr(NodeDataset): diff --git a/dataset/github.py b/sgl/dataset/github.py similarity index 94% rename from dataset/github.py rename to sgl/dataset/github.py index dc1ec72..c219454 100644 --- a/dataset/github.py +++ b/sgl/dataset/github.py @@ -3,9 +3,9 @@ import pickle as pkl import torch -from data.base_data import Graph -from data.base_dataset import NodeDataset -from dataset.utils import download_to, pkl_read_file, random_split_dataset +from sgl.data.base_data import Graph +from sgl.data.base_dataset import NodeDataset +from sgl.dataset.utils import download_to, pkl_read_file, random_split_dataset class Github(NodeDataset): diff --git a/dataset/karateclub.py b/sgl/dataset/karateclub.py similarity index 95% rename from dataset/karateclub.py rename to sgl/dataset/karateclub.py index 2a3fef7..8a79edf 100644 --- a/dataset/karateclub.py +++ b/sgl/dataset/karateclub.py @@ -4,9 +4,9 @@ import pickle as pkl import torch -from data.base_data import Graph -from data.base_dataset import NodeDataset -from dataset.utils import pkl_read_file +from sgl.data.base_data import Graph +from sgl.data.base_dataset import NodeDataset +from sgl.dataset.utils import pkl_read_file class KarateClub(NodeDataset): diff --git a/dataset/linkx_dataset.py b/sgl/dataset/linkx_dataset.py similarity index 97% rename from dataset/linkx_dataset.py rename to sgl/dataset/linkx_dataset.py index 29ebd83..0dd94b1 100644 --- a/dataset/linkx_dataset.py +++ b/sgl/dataset/linkx_dataset.py @@ -5,9 +5,9 @@ import torch.nn.functional as F from scipy.io import loadmat -from data.base_data import Graph -from data.base_dataset import NodeDataset -from dataset.utils import pkl_read_file, download_to +from sgl.data.base_data import Graph +from sgl.data.base_dataset import NodeDataset +from sgl.dataset.utils import pkl_read_file, download_to # A variety of non-homophilous graph datasets diff --git a/dataset/nell.py b/sgl/dataset/nell.py similarity index 96% rename from dataset/nell.py rename to sgl/dataset/nell.py index bdf2934..139400f 100644 --- a/dataset/nell.py +++ b/sgl/dataset/nell.py @@ -8,9 +8,9 @@ from torch_geometric.data import extract_tar from torch_geometric.io import read_txt_array -from data.base_data import Graph -from data.base_dataset import NodeDataset -from dataset.utils import pkl_read_file, download_to +from sgl.data.base_data import Graph +from sgl.data.base_dataset import NodeDataset +from sgl.dataset.utils import pkl_read_file, download_to class Nell(NodeDataset): diff --git a/dataset/ogbn.py b/sgl/dataset/ogbn.py similarity index 94% rename from dataset/ogbn.py rename to sgl/dataset/ogbn.py index aa41870..c25684a 100644 --- a/dataset/ogbn.py +++ b/sgl/dataset/ogbn.py @@ -4,9 +4,9 @@ import torch from ogb.nodeproppred import PygNodePropPredDataset -from data.base_data import Graph -from data.base_dataset import NodeDataset -from dataset.utils import pkl_read_file, to_undirected +from sgl.data.base_data import Graph +from sgl.data.base_dataset import NodeDataset +from sgl.dataset.utils import pkl_read_file, to_undirected class Ogbn(NodeDataset): diff --git a/dataset/ogbn_mag.py b/sgl/dataset/ogbn_mag.py similarity index 97% rename from dataset/ogbn_mag.py rename to sgl/dataset/ogbn_mag.py index 689f670..f920cfa 100644 --- a/dataset/ogbn_mag.py +++ b/sgl/dataset/ogbn_mag.py @@ -4,9 +4,9 @@ import torch from ogb.nodeproppred import PygNodePropPredDataset -from data.base_data import HeteroGraph -from data.base_dataset import HeteroNodeDataset -from dataset.utils import pkl_read_file, to_undirected +from sgl.data.base_data import HeteroGraph +from sgl.data.base_dataset import HeteroNodeDataset +from sgl.dataset.utils import pkl_read_file, to_undirected class OgbnMag(HeteroNodeDataset): diff --git a/dataset/planetoid.py b/sgl/dataset/planetoid.py similarity index 96% rename from dataset/planetoid.py rename to sgl/dataset/planetoid.py index afbfee4..2552ad6 100644 --- a/dataset/planetoid.py +++ b/sgl/dataset/planetoid.py @@ -5,9 +5,9 @@ import scipy.sparse as sp import torch -from data.base_data import Graph -from data.base_dataset import NodeDataset -from dataset.utils import pkl_read_file, download_to +from sgl.data.base_data import Graph +from sgl.data.base_dataset import NodeDataset +from sgl.dataset.utils import pkl_read_file, download_to class Planetoid(NodeDataset): diff --git a/dataset/reddit.py b/sgl/dataset/reddit.py similarity index 94% rename from dataset/reddit.py rename to sgl/dataset/reddit.py index f9a6bad..8421bfc 100644 --- a/dataset/reddit.py +++ b/sgl/dataset/reddit.py @@ -6,9 +6,9 @@ import torch from torch_geometric.data import extract_zip -from data.base_data import Graph -from data.base_dataset import NodeDataset -from dataset.utils import pkl_read_file, download_to +from sgl.data.base_data import Graph +from sgl.data.base_dataset import NodeDataset +from sgl.dataset.utils import pkl_read_file, download_to class Reddit(NodeDataset): diff --git a/dataset/twitch.py b/sgl/dataset/twitch.py similarity index 95% rename from dataset/twitch.py rename to sgl/dataset/twitch.py index fbed8c4..3bc15d8 100644 --- a/dataset/twitch.py +++ b/sgl/dataset/twitch.py @@ -3,9 +3,9 @@ import pickle as pkl import torch -from data.base_data import Graph -from data.base_dataset import NodeDataset -from dataset.utils import pkl_read_file, download_to, random_split_dataset +from sgl.data.base_data import Graph +from sgl.data.base_dataset import NodeDataset +from sgl.dataset.utils import pkl_read_file, download_to, random_split_dataset class Twitch(NodeDataset): diff --git a/dataset/utils.py b/sgl/dataset/utils.py similarity index 100% rename from dataset/utils.py rename to sgl/dataset/utils.py diff --git a/dataset/webkb.py b/sgl/dataset/webkb.py similarity index 96% rename from dataset/webkb.py rename to sgl/dataset/webkb.py index 7b3c2ce..f3735c0 100644 --- a/dataset/webkb.py +++ b/sgl/dataset/webkb.py @@ -4,9 +4,9 @@ import torch from torch_sparse import coalesce -from data.base_data import Graph -from data.base_dataset import NodeDataset -from dataset.utils import pkl_read_file, download_to +from sgl.data.base_data import Graph +from sgl.data.base_dataset import NodeDataset +from sgl.dataset.utils import pkl_read_file, download_to class WebKB(NodeDataset): diff --git a/dataset/wikics.py b/sgl/dataset/wikics.py similarity index 96% rename from dataset/wikics.py rename to sgl/dataset/wikics.py index f0b0be8..b69f5e4 100644 --- a/dataset/wikics.py +++ b/sgl/dataset/wikics.py @@ -5,9 +5,9 @@ import torch from itertools import chain -from data.base_data import Graph -from data.base_dataset import NodeDataset -from dataset.utils import pkl_read_file, download_to, to_undirected +from sgl.data.base_data import Graph +from sgl.data.base_dataset import NodeDataset +from sgl.dataset.utils import pkl_read_file, download_to, to_undirected class Wikics(NodeDataset): diff --git a/sgl/etc/__init__.py b/sgl/etc/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/etc/auto_select_edge_type_for_nars.py b/sgl/etc/auto_select_edge_type_for_nars.py similarity index 97% rename from etc/auto_select_edge_type_for_nars.py rename to sgl/etc/auto_select_edge_type_for_nars.py index 8cbb225..eadad4f 100644 --- a/etc/auto_select_edge_type_for_nars.py +++ b/sgl/etc/auto_select_edge_type_for_nars.py @@ -5,10 +5,10 @@ from functools import reduce from typing import Dict, List, Tuple -from dataset.dblp import Dblp -from models.hetero import NARS_SIGN, Fast_NARS_SGC_WithLearnableWeights -from tasks.node_classification import HeteroNodeClassification -from utils import GpuWithMaxFreeMem +from sgl.dataset import Dblp +from sgl.models.hetero import NARS_SIGN, Fast_NARS_SGC_WithLearnableWeights +from sgl.tasks import HeteroNodeClassification +from sgl.utils import GpuWithMaxFreeMem # Hyperparameters PROP_STEPS = 3 diff --git a/etc/hetero_search.py b/sgl/etc/hetero_search.py similarity index 92% rename from etc/hetero_search.py rename to sgl/etc/hetero_search.py index fc0efff..50ae995 100644 --- a/etc/hetero_search.py +++ b/sgl/etc/hetero_search.py @@ -1,10 +1,10 @@ import time import torch -from dataset.dblp import Dblp -from models.hetero import NARS_SIGN, Fast_NARS_SGC_WithLearnableWeights -from tasks.node_classification import HeteroNodeClassification -from utils import GpuWithMaxFreeMem +from sgl.dataset import Dblp +from sgl.models.hetero import NARS_SIGN, Fast_NARS_SGC_WithLearnableWeights +from sgl.tasks import HeteroNodeClassification +from sgl.utils import GpuWithMaxFreeMem # Hyperparameters PROP_STEPS = 3 diff --git a/hetero_test.py b/sgl/etc/hetero_test.py similarity index 78% rename from hetero_test.py rename to sgl/etc/hetero_test.py index dc710d4..9ab90d3 100644 --- a/hetero_test.py +++ b/sgl/etc/hetero_test.py @@ -1,18 +1,18 @@ -import torch - -from dataset.ogbn_mag import OgbnMag -from models.hetero import NARS_SIGN -from tasks.node_classification import HeteroNodeClassification -from utils import GpuWithMaxFreeMem - -dataset = OgbnMag("mag", "./") -predict_class = 'paper' -random_subgraph_num = 2 -subgraph_edge_type_num = 1 -model = NARS_SIGN(prop_steps=3, feat_dim=dataset.data.num_features[predict_class], - num_classes=dataset.data.num_classes[predict_class], hidden_dim=256, num_layers=2, - random_subgraph_num=random_subgraph_num, subgraph_edge_type_num=subgraph_edge_type_num) - -device = torch.device(f"cuda:{0}" if torch.cuda.is_available() else "cpu") -test_acc = HeteroNodeClassification(dataset, predict_class, model, lr=0.001, weight_decay=0, epochs=200, device=device, - train_batch_size=10000, eval_batch_size=10000).test_acc +import torch + +from sgl.dataset import OgbnMag +from sgl.models.hetero import NARS_SIGN +from sgl.tasks import HeteroNodeClassification +from sgl.utils import GpuWithMaxFreeMem + +dataset = OgbnMag("mag", "./") +predict_class = 'paper' +random_subgraph_num = 2 +subgraph_edge_type_num = 1 +model = NARS_SIGN(prop_steps=3, feat_dim=dataset.data.num_features[predict_class], + num_classes=dataset.data.num_classes[predict_class], hidden_dim=256, num_layers=2, + random_subgraph_num=random_subgraph_num, subgraph_edge_type_num=subgraph_edge_type_num) + +device = torch.device(f"cuda:{0}" if torch.cuda.is_available() else "cpu") +test_acc = HeteroNodeClassification(dataset, predict_class, model, lr=0.001, weight_decay=0, epochs=200, device=device, + train_batch_size=10000, eval_batch_size=10000).test_acc diff --git a/etc/stability_of_subgraph_weight.py b/sgl/etc/stability_of_subgraph_weight.py similarity index 88% rename from etc/stability_of_subgraph_weight.py rename to sgl/etc/stability_of_subgraph_weight.py index c183973..0f96c2b 100644 --- a/etc/stability_of_subgraph_weight.py +++ b/sgl/etc/stability_of_subgraph_weight.py @@ -1,7 +1,7 @@ import numpy as np -from auto_select_edge_type_for_nars import GenerateSubgraphList, OneTrialWithSubgraphList -from dataset.dblp import Dblp +from sgl.dataset import Dblp +from sgl.etc.auto_select_edge_type_for_nars import GenerateSubgraphList, OneTrialWithSubgraphList SUBGRAPH_COMBINATIONS = 20 NUM_REPEAT = 5 diff --git a/sgl/models/__init__.py b/sgl/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/models/base_model.py b/sgl/models/base_model.py similarity index 99% rename from models/base_model.py rename to sgl/models/base_model.py index 5febc26..86443ad 100644 --- a/models/base_model.py +++ b/sgl/models/base_model.py @@ -2,7 +2,7 @@ import torch.nn as nn import torch.nn.functional as F -from data.base_dataset import HeteroNodeDataset +from sgl.data.base_dataset import HeteroNodeDataset class BaseSGAPModel(nn.Module): diff --git a/models/hetero/__init__.py b/sgl/models/hetero/__init__.py similarity index 100% rename from models/hetero/__init__.py rename to sgl/models/hetero/__init__.py diff --git a/models/hetero/fast_nars_sgc.py b/sgl/models/hetero/fast_nars_sgc.py similarity index 77% rename from models/hetero/fast_nars_sgc.py rename to sgl/models/hetero/fast_nars_sgc.py index c02e716..41be789 100644 --- a/models/hetero/fast_nars_sgc.py +++ b/sgl/models/hetero/fast_nars_sgc.py @@ -1,6 +1,6 @@ -from models.base_model import FastBaseHeteroSGAPModel -from models.simple_models import MultiLayerPerceptron, FastOneDimConvolution -from operators.graph_op import LaplacianGraphOp +from sgl.models.base_model import FastBaseHeteroSGAPModel +from sgl.models.simple_models import MultiLayerPerceptron, FastOneDimConvolution +from sgl.operators.graph_op import LaplacianGraphOp class Fast_NARS_SGC_WithLearnableWeights(FastBaseHeteroSGAPModel): diff --git a/models/hetero/nars_sign.py b/sgl/models/hetero/nars_sign.py similarity index 72% rename from models/hetero/nars_sign.py rename to sgl/models/hetero/nars_sign.py index e48d6f6..bf663c1 100644 --- a/models/hetero/nars_sign.py +++ b/sgl/models/hetero/nars_sign.py @@ -1,7 +1,7 @@ -from models.base_model import BaseHeteroSGAPModel -from models.simple_models import OneDimConvolution, MultiLayerPerceptron -from operators.graph_op import LaplacianGraphOp -from operators.message_op import ProjectedConcatMessageOp +from sgl.models.base_model import BaseHeteroSGAPModel +from sgl.models.simple_models import OneDimConvolution, MultiLayerPerceptron +from sgl.operators.graph_op import LaplacianGraphOp +from sgl.operators.message_op import ProjectedConcatMessageOp class NARS_SIGN(BaseHeteroSGAPModel): diff --git a/models/homo/__init__.py b/sgl/models/homo/__init__.py similarity index 100% rename from models/homo/__init__.py rename to sgl/models/homo/__init__.py diff --git a/models/homo/gamlp.py b/sgl/models/homo/gamlp.py similarity index 66% rename from models/homo/gamlp.py rename to sgl/models/homo/gamlp.py index e1c5616..f125eea 100644 --- a/models/homo/gamlp.py +++ b/sgl/models/homo/gamlp.py @@ -1,7 +1,7 @@ -from models.base_model import BaseSGAPModel -from models.simple_models import MultiLayerPerceptron -from operators.graph_op import LaplacianGraphOp -from operators.message_op import LearnableWeightedMessageOp +from sgl.models.base_model import BaseSGAPModel +from sgl.models.simple_models import MultiLayerPerceptron +from sgl.operators.graph_op import LaplacianGraphOp +from sgl.operators.message_op import LearnableWeightedMessageOp class GAMLP(BaseSGAPModel): diff --git a/models/homo/gamlp_recursive.py b/sgl/models/homo/gamlp_recursive.py similarity index 67% rename from models/homo/gamlp_recursive.py rename to sgl/models/homo/gamlp_recursive.py index 2e50629..62da416 100644 --- a/models/homo/gamlp_recursive.py +++ b/sgl/models/homo/gamlp_recursive.py @@ -1,7 +1,7 @@ -from models.base_model import BaseSGAPModel -from models.simple_models import MultiLayerPerceptron -from operators.graph_op import LaplacianGraphOp -from operators.message_op import IterateLearnableWeightedMessageOp +from sgl.models.base_model import BaseSGAPModel +from sgl.models.simple_models import MultiLayerPerceptron +from sgl.operators.graph_op import LaplacianGraphOp +from sgl.operators.message_op import IterateLearnableWeightedMessageOp class GAMLPRecursive(BaseSGAPModel): diff --git a/models/homo/gbp.py b/sgl/models/homo/gbp.py similarity index 67% rename from models/homo/gbp.py rename to sgl/models/homo/gbp.py index 9dd7ae8..3ef44cf 100644 --- a/models/homo/gbp.py +++ b/sgl/models/homo/gbp.py @@ -1,7 +1,7 @@ -from models.base_model import BaseSGAPModel -from models.simple_models import MultiLayerPerceptron -from operators.graph_op import LaplacianGraphOp -from operators.message_op import SimpleWeightedMessageOp +from sgl.models.base_model import BaseSGAPModel +from sgl.models.simple_models import MultiLayerPerceptron +from sgl.operators.graph_op import LaplacianGraphOp +from sgl.operators.message_op import SimpleWeightedMessageOp class GBP(BaseSGAPModel): diff --git a/models/homo/sgc.py b/sgl/models/homo/sgc.py similarity index 61% rename from models/homo/sgc.py rename to sgl/models/homo/sgc.py index 7bdea22..a029566 100644 --- a/models/homo/sgc.py +++ b/sgl/models/homo/sgc.py @@ -1,7 +1,7 @@ -from models.base_model import BaseSGAPModel -from models.simple_models import LogisticRegression -from operators.graph_op import LaplacianGraphOp -from operators.message_op import LastMessageOp +from sgl.models.base_model import BaseSGAPModel +from sgl.models.simple_models import LogisticRegression +from sgl.operators.graph_op import LaplacianGraphOp +from sgl.operators.message_op import LastMessageOp class SGC(BaseSGAPModel): diff --git a/models/homo/sign.py b/sgl/models/homo/sign.py similarity index 70% rename from models/homo/sign.py rename to sgl/models/homo/sign.py index 901ee64..781d9a9 100644 --- a/models/homo/sign.py +++ b/sgl/models/homo/sign.py @@ -1,7 +1,7 @@ -from models.base_model import BaseSGAPModel -from models.simple_models import MultiLayerPerceptron -from operators.graph_op import LaplacianGraphOp -from operators.message_op import ConcatMessageOp, ProjectedConcatMessageOp +from sgl.models.base_model import BaseSGAPModel +from sgl.models.simple_models import MultiLayerPerceptron +from sgl.operators.graph_op import LaplacianGraphOp +from sgl.operators.message_op import ConcatMessageOp, ProjectedConcatMessageOp # slightly different from the original design diff --git a/models/homo/ssgc.py b/sgl/models/homo/ssgc.py similarity index 63% rename from models/homo/ssgc.py rename to sgl/models/homo/ssgc.py index 7cdabce..fee0817 100644 --- a/models/homo/ssgc.py +++ b/sgl/models/homo/ssgc.py @@ -1,7 +1,7 @@ -from models.base_model import BaseSGAPModel -from models.simple_models import LogisticRegression -from operators.graph_op import LaplacianGraphOp -from operators.message_op import MeanMessageOp +from sgl.models.base_model import BaseSGAPModel +from sgl.models.simple_models import LogisticRegression +from sgl.operators.graph_op import LaplacianGraphOp +from sgl.operators.message_op import MeanMessageOp class SSGC(BaseSGAPModel): diff --git a/models/search_models.py b/sgl/models/search_models.py similarity index 90% rename from models/search_models.py rename to sgl/models/search_models.py index 7f3594c..94dbc55 100644 --- a/models/search_models.py +++ b/sgl/models/search_models.py @@ -1,7 +1,7 @@ -from models.base_model import BaseSGAPModel -from models.simple_models import LogisticRegression, MultiLayerPerceptron -from operators.graph_op import LaplacianGraphOp, PprGraphOp -from operators.message_op import LastMessageOp, ConcatMessageOp, MeanMessageOp, SimpleWeightedMessageOp, \ +from sgl.models.base_model import BaseSGAPModel +from sgl.models.simple_models import LogisticRegression, MultiLayerPerceptron +from sgl.operators.graph_op import LaplacianGraphOp, PprGraphOp +from sgl.operators.message_op import LastMessageOp, ConcatMessageOp, MeanMessageOp, SimpleWeightedMessageOp, \ LearnableWeightedMessageOp, IterateLearnableWeightedMessageOp, SumMessageOp, MaxMessageOp, MinMessageOp diff --git a/models/simple_models.py b/sgl/models/simple_models.py similarity index 100% rename from models/simple_models.py rename to sgl/models/simple_models.py diff --git a/sgl/operators/__init__.py b/sgl/operators/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/operators/base_op.py b/sgl/operators/base_op.py similarity index 95% rename from operators/base_op.py rename to sgl/operators/base_op.py index 1d3e227..1047352 100644 --- a/operators/base_op.py +++ b/sgl/operators/base_op.py @@ -5,7 +5,7 @@ import torch.nn as nn from torch import Tensor -from operators.utils import csr_sparse_dense_matmul, cuda_csr_sparse_dense_matmul +from sgl.operators.utils import csr_sparse_dense_matmul, cuda_csr_sparse_dense_matmul class GraphOp: diff --git a/operators/csrc/cudamatmul.c b/sgl/operators/csrc/cudamatmul.c similarity index 100% rename from operators/csrc/cudamatmul.c rename to sgl/operators/csrc/cudamatmul.c diff --git a/operators/csrc/cudamatmul.h b/sgl/operators/csrc/cudamatmul.h similarity index 100% rename from operators/csrc/cudamatmul.h rename to sgl/operators/csrc/cudamatmul.h diff --git a/operators/csrc/cudamatmul.o b/sgl/operators/csrc/cudamatmul.o similarity index 100% rename from operators/csrc/cudamatmul.o rename to sgl/operators/csrc/cudamatmul.o diff --git a/operators/csrc/libcudamatmul.so b/sgl/operators/csrc/libcudamatmul.so similarity index 100% rename from operators/csrc/libcudamatmul.so rename to sgl/operators/csrc/libcudamatmul.so diff --git a/operators/csrc/libmatmul.so b/sgl/operators/csrc/libmatmul.so similarity index 100% rename from operators/csrc/libmatmul.so rename to sgl/operators/csrc/libmatmul.so diff --git a/operators/csrc/matmul.c b/sgl/operators/csrc/matmul.c similarity index 100% rename from operators/csrc/matmul.c rename to sgl/operators/csrc/matmul.c diff --git a/operators/csrc/matmul.h b/sgl/operators/csrc/matmul.h similarity index 100% rename from operators/csrc/matmul.h rename to sgl/operators/csrc/matmul.h diff --git a/operators/graph_op/__init__.py b/sgl/operators/graph_op/__init__.py similarity index 100% rename from operators/graph_op/__init__.py rename to sgl/operators/graph_op/__init__.py diff --git a/operators/graph_op/laplacian_graph_op.py b/sgl/operators/graph_op/laplacian_graph_op.py similarity index 84% rename from operators/graph_op/laplacian_graph_op.py rename to sgl/operators/graph_op/laplacian_graph_op.py index e411b67..8973a03 100644 --- a/operators/graph_op/laplacian_graph_op.py +++ b/sgl/operators/graph_op/laplacian_graph_op.py @@ -1,7 +1,7 @@ import scipy.sparse as sp -from operators.base_op import GraphOp -from operators.utils import adj_to_symmetric_norm +from sgl.operators.base_op import GraphOp +from sgl.operators.utils import adj_to_symmetric_norm class LaplacianGraphOp(GraphOp): diff --git a/operators/graph_op/ppr_graph_op.py b/sgl/operators/graph_op/ppr_graph_op.py similarity index 87% rename from operators/graph_op/ppr_graph_op.py rename to sgl/operators/graph_op/ppr_graph_op.py index 6c5c960..3ce43eb 100644 --- a/operators/graph_op/ppr_graph_op.py +++ b/sgl/operators/graph_op/ppr_graph_op.py @@ -1,7 +1,7 @@ import scipy.sparse as sp -from operators.base_op import GraphOp -from operators.utils import adj_to_symmetric_norm +from sgl.operators.base_op import GraphOp +from sgl.operators.utils import adj_to_symmetric_norm class PprGraphOp(GraphOp): diff --git a/operators/message_op/__init__.py b/sgl/operators/message_op/__init__.py similarity index 100% rename from operators/message_op/__init__.py rename to sgl/operators/message_op/__init__.py diff --git a/operators/message_op/concat_message_op.py b/sgl/operators/message_op/concat_message_op.py similarity index 86% rename from operators/message_op/concat_message_op.py rename to sgl/operators/message_op/concat_message_op.py index 120d8e0..2d6557a 100644 --- a/operators/message_op/concat_message_op.py +++ b/sgl/operators/message_op/concat_message_op.py @@ -1,6 +1,6 @@ import torch -from operators.base_op import MessageOp +from sgl.operators.base_op import MessageOp class ConcatMessageOp(MessageOp): diff --git a/operators/message_op/iterate_learnable_weighted_message_op.py b/sgl/operators/message_op/iterate_learnable_weighted_message_op.py similarity index 97% rename from operators/message_op/iterate_learnable_weighted_message_op.py rename to sgl/operators/message_op/iterate_learnable_weighted_message_op.py index 2874c85..6dcaafe 100644 --- a/operators/message_op/iterate_learnable_weighted_message_op.py +++ b/sgl/operators/message_op/iterate_learnable_weighted_message_op.py @@ -2,7 +2,7 @@ import torch.nn.functional as F from torch.nn import Linear -from operators.base_op import MessageOp +from sgl.operators.base_op import MessageOp class IterateLearnableWeightedMessageOp(MessageOp): diff --git a/operators/message_op/last_message_op.py b/sgl/operators/message_op/last_message_op.py similarity index 82% rename from operators/message_op/last_message_op.py rename to sgl/operators/message_op/last_message_op.py index 4068ddf..1b516f0 100644 --- a/operators/message_op/last_message_op.py +++ b/sgl/operators/message_op/last_message_op.py @@ -1,4 +1,4 @@ -from operators.base_op import MessageOp +from sgl.operators.base_op import MessageOp class LastMessageOp(MessageOp): diff --git a/operators/message_op/learnable_weighted_messahe_op.py b/sgl/operators/message_op/learnable_weighted_messahe_op.py similarity index 97% rename from operators/message_op/learnable_weighted_messahe_op.py rename to sgl/operators/message_op/learnable_weighted_messahe_op.py index c54b64b..b65c969 100644 --- a/operators/message_op/learnable_weighted_messahe_op.py +++ b/sgl/operators/message_op/learnable_weighted_messahe_op.py @@ -3,8 +3,8 @@ from torch import nn from torch.nn import Parameter, Linear -from operators.base_op import MessageOp -from operators.utils import one_dim_weighted_add, two_dim_weighted_add +from sgl.operators.base_op import MessageOp +from sgl.operators.utils import one_dim_weighted_add, two_dim_weighted_add class LearnableWeightedMessageOp(MessageOp): diff --git a/operators/message_op/max_message_op.py b/sgl/operators/message_op/max_message_op.py similarity index 86% rename from operators/message_op/max_message_op.py rename to sgl/operators/message_op/max_message_op.py index 3c5115d..8c74afb 100644 --- a/operators/message_op/max_message_op.py +++ b/sgl/operators/message_op/max_message_op.py @@ -1,6 +1,6 @@ import torch -from operators.base_op import MessageOp +from sgl.operators.base_op import MessageOp class MaxMessageOp(MessageOp): diff --git a/operators/message_op/mean_message_op.py b/sgl/operators/message_op/mean_message_op.py similarity index 86% rename from operators/message_op/mean_message_op.py rename to sgl/operators/message_op/mean_message_op.py index 49dc6ce..86b2f18 100644 --- a/operators/message_op/mean_message_op.py +++ b/sgl/operators/message_op/mean_message_op.py @@ -1,4 +1,4 @@ -from operators.base_op import MessageOp +from sgl.operators.base_op import MessageOp class MeanMessageOp(MessageOp): diff --git a/operators/message_op/min_message_op.py b/sgl/operators/message_op/min_message_op.py similarity index 86% rename from operators/message_op/min_message_op.py rename to sgl/operators/message_op/min_message_op.py index 5415c61..9af6322 100644 --- a/operators/message_op/min_message_op.py +++ b/sgl/operators/message_op/min_message_op.py @@ -1,6 +1,6 @@ import torch -from operators.base_op import MessageOp +from sgl.operators.base_op import MessageOp class MinMessageOp(MessageOp): diff --git a/operators/message_op/projected_concat_message_op.py b/sgl/operators/message_op/projected_concat_message_op.py similarity index 90% rename from operators/message_op/projected_concat_message_op.py rename to sgl/operators/message_op/projected_concat_message_op.py index 903dcbe..f43c198 100644 --- a/operators/message_op/projected_concat_message_op.py +++ b/sgl/operators/message_op/projected_concat_message_op.py @@ -2,8 +2,8 @@ import torch.nn.functional as F from torch.nn import ModuleList -from models.simple_models import MultiLayerPerceptron -from operators.base_op import MessageOp +from sgl.models.simple_models import MultiLayerPerceptron +from sgl.operators.base_op import MessageOp class ProjectedConcatMessageOp(MessageOp): diff --git a/operators/message_op/simple_weighted_message_op.py b/sgl/operators/message_op/simple_weighted_message_op.py similarity index 95% rename from operators/message_op/simple_weighted_message_op.py rename to sgl/operators/message_op/simple_weighted_message_op.py index 292c437..f09a029 100644 --- a/operators/message_op/simple_weighted_message_op.py +++ b/sgl/operators/message_op/simple_weighted_message_op.py @@ -1,8 +1,8 @@ import torch from torch import Tensor -from operators.base_op import MessageOp -from operators.utils import one_dim_weighted_add +from sgl.operators.base_op import MessageOp +from sgl.operators.utils import one_dim_weighted_add class SimpleWeightedMessageOp(MessageOp): diff --git a/operators/message_op/sum_message_op.py b/sgl/operators/message_op/sum_message_op.py similarity index 84% rename from operators/message_op/sum_message_op.py rename to sgl/operators/message_op/sum_message_op.py index 1a2e1d8..ffcf8d0 100644 --- a/operators/message_op/sum_message_op.py +++ b/sgl/operators/message_op/sum_message_op.py @@ -1,4 +1,4 @@ -from operators.base_op import MessageOp +from sgl.operators.base_op import MessageOp class SumMessageOp(MessageOp): diff --git a/operators/utils.py b/sgl/operators/utils.py similarity index 100% rename from operators/utils.py rename to sgl/operators/utils.py diff --git a/sgl/search/__init__.py b/sgl/search/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/search/auto_search.py b/sgl/search/auto_search.py similarity index 97% rename from search/auto_search.py rename to sgl/search/auto_search.py index 5f5dbf1..00c9ce6 100644 --- a/search/auto_search.py +++ b/sgl/search/auto_search.py @@ -2,8 +2,8 @@ import torch.nn as nn from torch.optim import Adam -from search.base_search import BaseSearch -from search.utils import accuracy, set_seed +from sgl.search.base_search import BaseSearch +from sgl.search.utils import accuracy, set_seed class SearchManager(BaseSearch): diff --git a/search/base_search.py b/sgl/search/base_search.py similarity index 89% rename from search/base_search.py rename to sgl/search/base_search.py index 63f0155..6726d48 100644 --- a/search/base_search.py +++ b/sgl/search/base_search.py @@ -1,5 +1,5 @@ class BaseSearch: - def __init(self): + def __init__(self): pass def _execute(self): diff --git a/search/utils.py b/sgl/search/utils.py similarity index 100% rename from search/utils.py rename to sgl/search/utils.py diff --git a/tasks/__init__.py b/sgl/tasks/__init__.py similarity index 63% rename from tasks/__init__.py rename to sgl/tasks/__init__.py index 35ea9be..d6d6097 100644 --- a/tasks/__init__.py +++ b/sgl/tasks/__init__.py @@ -1,7 +1,9 @@ +from .node_classification import HeteroNodeClassification from .node_classification import NodeClassification from .node_clustering import NodeClustering __all__ = [ "NodeClassification", + "HeteroNodeClassification", "NodeClustering", ] diff --git a/tasks/base_task.py b/sgl/tasks/base_task.py similarity index 89% rename from tasks/base_task.py rename to sgl/tasks/base_task.py index 7a7bc1b..727a7ae 100644 --- a/tasks/base_task.py +++ b/sgl/tasks/base_task.py @@ -1,5 +1,5 @@ class BaseTask: - def __init(self): + def __init__(self): pass def _execute(self): diff --git a/tasks/clustering_metrics.py b/sgl/tasks/clustering_metrics.py similarity index 100% rename from tasks/clustering_metrics.py rename to sgl/tasks/clustering_metrics.py diff --git a/tasks/node_classification.py b/sgl/tasks/node_classification.py similarity index 98% rename from tasks/node_classification.py rename to sgl/tasks/node_classification.py index 4c82b92..fd4509c 100644 --- a/tasks/node_classification.py +++ b/sgl/tasks/node_classification.py @@ -4,8 +4,8 @@ from torch.optim import Adam from torch.utils.data import DataLoader -from tasks.base_task import BaseTask -from tasks.utils import accuracy, set_seed, train, mini_batch_train, evaluate, mini_batch_evaluate +from sgl.tasks.base_task import BaseTask +from sgl.tasks.utils import accuracy, set_seed, train, mini_batch_train, evaluate, mini_batch_evaluate class NodeClassification(BaseTask): diff --git a/tasks/node_clustering.py b/sgl/tasks/node_clustering.py similarity index 95% rename from tasks/node_clustering.py rename to sgl/tasks/node_clustering.py index 2bce0ab..cc34618 100644 --- a/tasks/node_clustering.py +++ b/sgl/tasks/node_clustering.py @@ -4,9 +4,9 @@ from sqlalchemy import null from torch.optim import Adam -from tasks.base_task import BaseTask -from tasks.clustering_metrics import clustering_metrics -from tasks.utils import set_seed, clustering_train, cluster_loss +from sgl.tasks.base_task import BaseTask +from sgl.tasks.clustering_metrics import clustering_metrics +from sgl.tasks.utils import set_seed, clustering_train, cluster_loss class NodeClustering(BaseTask): diff --git a/tasks/utils.py b/sgl/tasks/utils.py similarity index 98% rename from tasks/utils.py rename to sgl/tasks/utils.py index 2512e4b..9465933 100644 --- a/tasks/utils.py +++ b/sgl/tasks/utils.py @@ -3,7 +3,7 @@ import torch from sklearn.cluster import KMeans -from tasks.clustering_metrics import clustering_metrics +from sgl.tasks.clustering_metrics import clustering_metrics def accuracy(output, labels): diff --git a/utils/__init__.py b/sgl/utils/__init__.py similarity index 100% rename from utils/__init__.py rename to sgl/utils/__init__.py diff --git a/utils/auto_choose_gpu.py b/sgl/utils/auto_choose_gpu.py similarity index 100% rename from utils/auto_choose_gpu.py rename to sgl/utils/auto_choose_gpu.py