From a49304f337da51a5b0cbaa2cb4d0b6809581f93d Mon Sep 17 00:00:00 2001
From: Looong01
Date: Sat, 13 Apr 2024 14:41:35 +0200
Subject: [PATCH] 2024-4-13
---
README.md | 4 +-
pytorch_geometric-2.4.0/.gitattributes | 1 -
pytorch_geometric-2.4.0/.github/labeler.yml | 41 -
.../.github/workflows/linting.yml | 69 -
pytorch_geometric-2.4.0/.gitignore | 32 -
.../docs/source/.gitignore | 1 -
.../docs/source/_figures/.gitignore | 3 -
.../docs/source/advanced/jit.rst | 125 --
.../docs/source/tutorial/multi_gpu.rst | 7 -
.../distributed/pyg/partition_graph.py | 56 -
.../distributed/pyg/partition_hetero_graph.py | 55 -
.../examples/multi_gpu/papers100m_multigpu.py | 137 --
.../distributed/test_local_graph_store.py | 74 -
.../test/distributed/test_partition.py | 166 --
.../test/nn/conv/test_fa_conv.py | 87 -
.../test/nn/conv/test_fused_gat_conv.py | 21 -
.../test/nn/test_data_parallel.py | 15 -
.../test/transforms/test_gdc.py | 92 -
.../test/utils/test_segment.py | 20 -
.../torch_geometric/compile.py | 95 -
.../torch_geometric/data/__init__.py | 96 -
.../torch_geometric/data/makedirs.py | 16 -
.../torch_geometric/distributed/__init__.py | 9 -
.../distributed/dist_neighbor_sampler.py | 678 -------
.../torch_geometric/distributed/partition.py | 253 ---
.../torch_geometric/distributed/utils.py | 122 --
.../torch_geometric/io/tu.py | 126 --
.../torch_geometric/io/txt_array.py | 17 -
.../torch_geometric/loader/mixin.py | 167 --
.../nn/conv/message_passing.jinja | 300 ---
.../torch_geometric/nn/conv/utils/helpers.py | 7 -
.../nn/conv/utils/inspector.py | 86 -
.../torch_geometric/nn/conv/utils/jit.py | 20 -
.../torch_geometric/nn/conv/utils/typing.py | 110 -
.../torch_geometric/nn/models/rect.py | 188 --
.../torch_geometric/nn/sequential.jinja | 33 -
.../torch_geometric/nn/sequential.py | 131 --
.../transforms/remove_isolated_nodes.py | 67 -
.../torch_geometric/utils/cross_entropy.py | 66 -
.../torch_geometric/utils/loop.py | 418 ----
.../torch_geometric/utils/mixin.py | 20 -
.../torch_geometric/warnings.py | 24 -
.../.github/CODEOWNERS | 0
.../.github/CONTRIBUTING.md | 32 +-
.../.github/ISSUE_TEMPLATE/bug-report.yml | 19 +-
.../.github/ISSUE_TEMPLATE/config.yml | 0
.../.github/ISSUE_TEMPLATE/documentation.yml | 0
.../ISSUE_TEMPLATE/feature-request.yml | 0
.../.github/ISSUE_TEMPLATE/installation.yml | 0
.../.github/ISSUE_TEMPLATE/refactor.yml | 0
.../.github/actions/setup/action.yml | 8 +-
pytorch_geometric-2.5.2/.github/labeler.yml | 58 +
.../.github/workflows/building_pyg_conda.yml | 22 +-
.../workflows/building_rusty1s_conda.yml | 22 +-
.../.github/workflows/changelog.yml | 0
.../.github/workflows/dist_testing.yml | 43 +
.../.github/workflows/documentation.yml | 2 +-
.../.github/workflows/examples.yml | 0
.../.github/workflows/full_gpu_testing.yml | 5 +-
.../.github/workflows/full_testing.yml | 7 +-
.../.github/workflows/labeler.yml | 4 +-
.../.github/workflows/latest_testing.yml | 5 +-
.../.github/workflows/linting.yml | 48 +
.../.github/workflows/minimal_testing.yml | 5 +-
.../.github/workflows/nightly.yml | 0
.../.github/workflows/prev_testing.yml | 11 +-
.../.github/workflows/testing.yml | 7 +-
.../.pre-commit-config.yaml | 37 +-
.../CHANGELOG.md | 126 +-
.../CITATION.cff | 0
.../LICENSE | 0
.../README.md | 356 ++--
.../benchmark/README.md | 0
.../benchmark/citation/README.md | 12 +-
.../benchmark/citation/__init__.py | 0
.../benchmark/citation/appnp.py | 0
.../benchmark/citation/arma.py | 0
.../benchmark/citation/cheb.py | 0
.../benchmark/citation/datasets.py | 0
.../benchmark/citation/gat.py | 0
.../benchmark/citation/gcn.py | 0
.../benchmark/citation/inference.sh | 0
.../benchmark/citation/run.sh | 0
.../benchmark/citation/sgc.py | 0
.../benchmark/citation/statistics.py | 0
.../benchmark/citation/train_eval.py | 5 +-
.../benchmark/inference/README.md | 8 +-
.../inference/inference_benchmark.py | 0
.../benchmark/kernel/README.md | 24 +-
.../benchmark/kernel/__init__.py | 0
.../benchmark/kernel/asap.py | 0
.../benchmark/kernel/datasets.py | 0
.../benchmark/kernel/diff_pool.py | 0
.../benchmark/kernel/edge_pool.py | 0
.../benchmark/kernel/gcn.py | 0
.../benchmark/kernel/gin.py | 0
.../benchmark/kernel/global_attention.py | 0
.../benchmark/kernel/graclus.py | 0
.../benchmark/kernel/graph_sage.py | 6 +-
.../benchmark/kernel/main.py | 0
.../benchmark/kernel/main_performance.py | 5 +-
.../benchmark/kernel/sag_pool.py | 0
.../benchmark/kernel/set2set.py | 0
.../benchmark/kernel/sort_pool.py | 0
.../benchmark/kernel/statistics.py | 0
.../benchmark/kernel/top_k.py | 0
.../benchmark/kernel/train_eval.py | 0
.../benchmark/loader/neighbor_loader.py | 0
.../benchmark/multi_gpu/training/README.md | 24 +
.../benchmark/multi_gpu/training/common.py | 279 +++
.../training/training_benchmark_cuda.py | 51 +
.../training/training_benchmark_xpu.py | 53 +
.../benchmark/points/README.md | 10 +-
.../benchmark/points/__init__.py | 0
.../benchmark/points/datasets.py | 0
.../benchmark/points/edge_cnn.py | 0
.../benchmark/points/mpnn.py | 0
.../benchmark/points/point_cnn.py | 0
.../benchmark/points/point_net.py | 0
.../benchmark/points/spline_cnn.py | 0
.../benchmark/points/statistics.py | 0
.../benchmark/points/train_eval.py | 5 +-
.../benchmark/runtime/README.md | 0
.../benchmark/runtime/__init__.py | 0
.../benchmark/runtime/dgl/gat.py | 0
.../benchmark/runtime/dgl/gcn.py | 0
.../benchmark/runtime/dgl/hidden.py | 0
.../benchmark/runtime/dgl/main.py | 0
.../benchmark/runtime/dgl/rgcn.py | 0
.../benchmark/runtime/dgl/train.py | 0
.../benchmark/runtime/gat.py | 0
.../benchmark/runtime/gcn.py | 0
.../benchmark/runtime/main.py | 0
.../benchmark/runtime/rgcn.py | 0
.../benchmark/runtime/train.py | 0
.../benchmark/setup.py | 0
.../benchmark/training/README.md | 8 +-
.../benchmark/training/training_benchmark.py | 0
.../benchmark/utils/__init__.py | 0
.../benchmark/utils/hetero_gat.py | 0
.../benchmark/utils/hetero_sage.py | 0
.../benchmark/utils/utils.py | 0
.../codecov.yml | 0
.../conda/pyg/README.md | 0
.../conda/pyg/build_conda.sh | 0
.../conda/pyg/meta.yaml | 7 +-
.../conda/pytorch-geometric/README.md | 0
.../conda/pytorch-geometric/build_conda.sh | 0
.../conda/pytorch-geometric/meta.yaml | 7 +-
.../docker/Dockerfile | 0
.../docker/README.md | 6 +-
.../docker/singularity | 0
.../docs/Makefile | 0
.../docs/README.md | 4 +-
.../docs/requirements.txt | 0
.../docs/source/_figures/architecture.svg | 0
.../docs/source/_figures/build.sh | 0
.../docs/source/_figures/dist_part.png | Bin 0 -> 115493 bytes
.../docs/source/_figures/dist_proc.png | Bin 0 -> 75694 bytes
.../docs/source/_figures/dist_sampling.png | Bin 0 -> 60985 bytes
.../docs/source/_figures/graph.svg | 0
.../docs/source/_figures/graph.tex | 0
.../source/_figures/graphgym_design_space.png | Bin
.../source/_figures/graphgym_evaluation.png | Bin
.../docs/source/_figures/graphgym_results.png | Bin
.../docs/source/_figures/hg_example.svg | 0
.../docs/source/_figures/hg_example.tex | 0
.../docs/source/_figures/intel_kumo.png | Bin 0 -> 29952 bytes
.../docs/source/_figures/point_cloud1.png | Bin 0 -> 65390 bytes
.../docs/source/_figures/point_cloud2.png | Bin 0 -> 42965 bytes
.../docs/source/_figures/point_cloud3.png | Bin 0 -> 100483 bytes
.../docs/source/_figures/point_cloud4.png | Bin 0 -> 192386 bytes
.../docs/source/_figures/remote_1.png | Bin
.../docs/source/_figures/remote_2.png | Bin
.../docs/source/_figures/remote_3.png | Bin
.../_figures/shallow_node_embeddings.png | Bin
.../docs/source/_figures/to_hetero.svg | 0
.../docs/source/_figures/to_hetero.tex | 0
.../source/_figures/to_hetero_with_bases.svg | 0
.../source/_figures/to_hetero_with_bases.tex | 0
.../source/_figures/training_affinity.png | Bin
.../docs/source/_static/js/version_alert.js | 0
.../_static/thumbnails/create_dataset.png | Bin
.../source/_static/thumbnails/create_gnn.png | Bin
.../_static/thumbnails/distributed_pyg.png | Bin 0 -> 60352 bytes
.../source/_static/thumbnails/explain.png | Bin
.../_static/thumbnails/heterogeneous.png | Bin
.../source/_static/thumbnails/load_csv.png | Bin
.../_static/thumbnails/multi_gpu_vanilla.png | Bin
.../_static/thumbnails/neighbor_loader.png | Bin
.../source/_static/thumbnails/point_cloud.png | Bin 0 -> 94922 bytes
.../thumbnails/shallow_node_embeddings.png | Bin
.../source/_templates/autosummary/class.rst | 0
.../autosummary/inherited_class.rst | 0
.../source/_templates/autosummary/metrics.rst | 7 +
.../docs/source/_templates/autosummary/nn.rst | 0
.../_templates/autosummary/only_class.rst | 0
.../docs/source/advanced/batching.rst | 0
.../docs/source/advanced/compile.rst | 48 +-
.../docs/source/advanced/cpu_affinity.rst | 0
.../docs/source/advanced/graphgym.rst | 20 +-
.../docs/source/advanced/hgam.rst | 0
.../docs/source/advanced/jit.rst | 94 +
.../docs/source/advanced/remote.rst | 2 +-
.../docs/source/advanced/sparse_tensor.rst | 0
.../source/cheatsheet/data_cheatsheet.rst | 0
.../docs/source/cheatsheet/gnn_cheatsheet.rst | 0
.../docs/source/conf.py | 35 +-
.../docs/source/external/resources.rst | 10 +-
.../docs/source/get_started/colabs.rst | 0
.../docs/source/get_started/introduction.rst | 0
.../docs/source/index.rst | 4 +-
.../docs/source/install/installation.rst | 29 +-
.../docs/source/install/quick-start.html | 7 +-
.../docs/source/modules/contrib.rst | 0
.../docs/source/modules/data.rst | 0
.../docs/source/modules/datasets.rst | 0
.../docs/source/modules/distributed.rst | 13 +
.../docs/source/modules/explain.rst | 0
.../docs/source/modules/graphgym.rst | 0
.../docs/source/modules/loader.rst | 0
.../docs/source/modules/metrics.rst | 19 +
.../docs/source/modules/nn.rst | 2 +-
.../docs/source/modules/profile.rst | 0
.../docs/source/modules/root.rst | 14 +
.../docs/source/modules/sampler.rst | 0
.../docs/source/modules/transforms.rst | 0
.../docs/source/modules/utils.rst | 0
.../docs/source/notes/batching.rst | 0
.../docs/source/notes/cheatsheet.rst | 0
.../docs/source/notes/colabs.rst | 0
.../docs/source/notes/create_dataset.rst | 0
.../docs/source/notes/create_gnn.rst | 0
.../docs/source/notes/data_cheatsheet.rst | 0
.../docs/source/notes/explain.rst | 0
.../docs/source/notes/graphgym.rst | 0
.../docs/source/notes/heterogeneous.rst | 0
.../docs/source/notes/installation.rst | 0
.../docs/source/notes/introduction.rst | 0
.../docs/source/notes/jit.rst | 0
.../docs/source/notes/load_csv.rst | 0
.../docs/source/notes/remote.rst | 0
.../docs/source/notes/resources.rst | 0
.../docs/source/notes/sparse_tensor.rst | 0
.../docs/source/tutorial/application.rst | 1 +
.../docs/source/tutorial/compile.rst | 0
.../docs/source/tutorial/create_dataset.rst | 24 +-
.../docs/source/tutorial/create_gnn.rst | 0
.../docs/source/tutorial/dataset.rst | 0
.../docs/source/tutorial/distributed.rst | 9 +
.../docs/source/tutorial/distributed_pyg.rst | 268 +++
.../docs/source/tutorial/explain.rst | 0
.../docs/source/tutorial/gnn_design.rst | 0
.../docs/source/tutorial/heterogeneous.rst | 0
.../docs/source/tutorial/load_csv.rst | 0
.../source/tutorial/multi_gpu_vanilla.rst | 55 +-
.../tutorial/multi_node_multi_gpu_vanilla.rst | 108 +
.../docs/source/tutorial/neighbor_loader.rst | 0
.../docs/source/tutorial/point_cloud.rst | 289 +++
.../tutorial/shallow_node_embeddings.rst | 0
pytorch_geometric-2.5.2/examples/README.md | 20 +
.../examples/agnn.py | 0
.../examples/argva_node_clustering.py | 0
.../examples/arma.py | 0
.../examples/attentive_fp.py | 0
.../examples/autoencoder.py | 0
.../examples/cluster_gcn_ppi.py | 0
.../examples/cluster_gcn_reddit.py | 0
.../examples/colors_topk_pool.py | 0
.../examples/compile/gcn.py | 5 +-
.../examples/compile/gin.py | 4 +-
.../examples/contrib/README.md | 12 +
.../pgm_explainer_graph_classification.py | 5 +-
.../pgm_explainer_node_classification.py | 5 +-
.../examples/contrib/rbcd_attack.py | 0
.../examples/contrib/rbcd_attack_poisoning.py | 0
.../examples/cora.py | 0
.../examples/correct_and_smooth.py | 0
.../examples/cpp/CMakeLists.txt | 0
.../examples/cpp/README.md | 8 +-
.../examples/cpp/main.cpp | 0
.../examples/cpp/save_model.py | 2 +-
.../examples/datapipe.py | 0
.../examples/dgcnn_classification.py | 0
.../examples/dgcnn_segmentation.py | 0
.../examples/dir_gnn.py | 0
.../examples/distributed/README.md | 8 +
.../graphlearn_for_pytorch/README.md | 9 +-
.../dist_train_sage_sup_config.yml | 0
.../dist_train_sage_supervised.py | 0
.../graphlearn_for_pytorch/launch.py | 0
.../partition_ogbn_dataset.py | 0
.../examples/distributed}/kuzu/README.md | 0
.../distributed}/kuzu/papers_100M/README.md | 2 +-
.../kuzu/papers_100M/prepare_data.py | 0
.../distributed}/kuzu/papers_100M/train.py | 17 +-
.../examples/distributed/pyg/README.md | 119 ++
.../examples/distributed/pyg/launch.py | 435 ++++
.../examples/distributed/pyg/node_ogb_cpu.py | 471 +++++
.../distributed/pyg/partition_graph.py | 173 ++
.../examples/distributed/pyg/run_dist.sh | 48 +
.../pyg/temporal_link_movielens_cpu.py | 514 +++++
.../examples/dna.py | 0
.../examples/egc.py | 0
.../examples/equilibrium_median.py | 8 +-
.../examples/explain/README.md | 13 +
.../examples/explain/captum_explainer.py | 0
.../explain/captum_explainer_hetero_link.py | 0
.../examples/explain/gnn_explainer.py | 0
.../explain/gnn_explainer_ba_shapes.py | 0
.../explain/gnn_explainer_link_pred.py | 0
.../examples/explain/graphmask_explainer.py | 0
.../examples/faust.py | 0
.../examples/film.py | 0
.../examples/gat.py | 0
.../examples/gcn.py | 0
.../examples/gcn2_cora.py | 0
.../examples/gcn2_ppi.py | 0
.../examples/geniepath.py | 0
.../examples/glnn.py | 0
.../examples/graph_gps.py | 0
.../examples/graph_sage_unsup.py | 0
.../examples/graph_sage_unsup_ppi.py | 0
.../examples/graph_saint.py | 0
.../examples/graph_unet.py | 0
.../examples/hetero/README.md | 17 +
.../examples/hetero/bipartite_sage.py | 0
.../examples/hetero/bipartite_sage_unsup.py | 0
.../examples/hetero/dmgi_unsup.py | 0
.../examples/hetero/han_imdb.py | 0
.../examples/hetero/hetero_conv_dblp.py | 0
.../examples/hetero/hetero_link_pred.py | 0
.../examples/hetero/hgt_dblp.py | 2 +-
.../examples/hetero/hierarchical_sage.py | 2 +-
.../examples/hetero/load_csv.py | 0
.../examples/hetero/metapath2vec.py | 0
.../examples/hetero/recommender_system.py | 221 ++
.../examples/hetero/temporal_link_pred.py | 153 ++
.../examples/hetero/to_hetero_mag.py | 0
.../examples/hierarchical_sampling.py | 0
.../examples/infomax_inductive.py | 0
.../examples/infomax_transductive.py | 0
.../examples/jit/README.md | 10 +
.../examples/jit/film.py | 7 +-
.../examples/jit/gat.py | 9 +-
.../examples/jit/gcn.py | 4 +-
.../examples/jit/gin.py | 6 +-
.../examples/kge_fb15k_237.py | 9 +-
.../examples/label_prop.py | 0
.../examples/lcm_aggr_2nd_min.py | 3 +-
.../examples/lightgcn.py | 0
.../examples/link_pred.py | 0
.../examples/linkx.py | 0
.../examples/mem_pool.py | 0
.../examples/mixhop.py | 0
.../examples/mnist_graclus.py | 0
.../examples/mnist_nn_conv.py | 0
.../examples/mnist_voxel_grid.py | 0
.../examples/multi_gpu/README.md | 21 +
.../examples/multi_gpu/data_parallel.py | 0
.../multi_gpu/distributed_batching.py | 0
.../multi_gpu/distributed_sampling.py | 135 ++
.../distributed_sampling_multinode.py | 86 +-
.../distributed_sampling_multinode.sbatch | 25 +
.../multi_gpu/distributed_sampling_xpu.py | 217 ++
.../examples/multi_gpu/model_parallel.py | 75 +
.../examples/multi_gpu/papers100m_gcn.py | 142 ++
.../multi_gpu/papers100m_gcn_multinode.py | 150 ++
.../examples/multi_gpu/taobao.py | 0
.../examples/mutag_gin.py | 0
.../examples/node2vec.py | 0
.../examples/ogbn_papers_100m.py | 6 +-
.../examples/ogbn_products_gat.py | 0
.../examples/ogbn_products_sage.py | 0
.../examples/ogbn_proteins_deepgcn.py | 0
.../examples/ogc.py | 0
.../examples/pmlp.py | 0
.../examples/pna.py | 0
.../point_transformer_classification.py | 7 +-
.../point_transformer_segmentation.py | 7 +-
.../examples/pointnet2_classification.py | 0
.../examples/pointnet2_segmentation.py | 0
.../examples/ppi.py | 0
.../examples/proteins_diff_pool.py | 0
.../examples/proteins_dmon_pool.py | 0
.../examples/proteins_gmt.py | 0
.../examples/proteins_mincut_pool.py | 0
.../examples/proteins_topk_pool.py | 0
.../examples/pytorch_ignite/README.md | 7 +
.../examples/pytorch_ignite/gin.py | 0
.../examples/pytorch_lightning/README.md | 9 +
.../examples/pytorch_lightning/gin.py | 0
.../examples/pytorch_lightning/graph_sage.py | 0
.../pytorch_lightning/relational_gnn.py | 0
.../examples/qm9_nn_conv.py | 0
.../examples/qm9_pretrained_dimenet.py | 0
.../examples/qm9_pretrained_schnet.py | 0
.../examples/quiver/README.md | 0
.../examples/quiver/multi_gpu_quiver.py | 0
.../examples/quiver/single_gpu_quiver.py | 0
.../examples/randlanet_classification.py | 10 +-
.../examples/randlanet_segmentation.py | 7 +-
.../examples/rect.py | 0
.../examples/reddit.py | 0
.../examples/renet.py | 33 +-
.../examples/rev_gnn.py | 3 +-
.../examples/rgat.py | 0
.../examples/rgcn.py | 12 +-
.../examples/rgcn_link_pred.py | 0
.../examples/seal_link_pred.py | 14 +-
.../examples/sgc.py | 0
.../examples/shadow.py | 0
.../examples/sign.py | 0
.../examples/signed_gcn.py | 0
.../examples/super_gat.py | 0
.../examples/tagcn.py | 0
.../examples/tensorboard_logging.py | 0
.../examples/tgn.py | 0
.../examples/triangles_sag_pool.py | 0
.../examples/unimp_arxiv.py | 0
.../examples/upfd.py | 0
.../examples/wl_kernel.py | 0
.../graphgym/agg_batch.py | 0
.../graphgym/configs/example.yaml | 0
.../graphgym/configs/pyg/example_graph.yaml | 0
.../graphgym/configs/pyg/example_link.yaml | 0
.../graphgym/configs/pyg/example_node.yaml | 0
.../graphgym/configs_gen.py | 6 +-
.../graphgym/custom_graphgym/__init__.py | 0
.../graphgym/custom_graphgym/act/__init__.py | 0
.../graphgym/custom_graphgym/act/example.py | 0
.../custom_graphgym/config/__init__.py | 0
.../custom_graphgym/config/example.py | 6 +-
.../custom_graphgym/encoder/__init__.py | 0
.../custom_graphgym/encoder/example.py | 8 +-
.../graphgym/custom_graphgym/head/__init__.py | 0
.../graphgym/custom_graphgym/head/example.py | 2 +-
.../custom_graphgym/layer/__init__.py | 0
.../graphgym/custom_graphgym/layer/example.py | 8 +-
.../custom_graphgym/loader/__init__.py | 0
.../custom_graphgym/loader/example.py | 0
.../graphgym/custom_graphgym/loss/__init__.py | 0
.../graphgym/custom_graphgym/loss/example.py | 0
.../custom_graphgym/network/__init__.py | 0
.../custom_graphgym/network/example.py | 0
.../custom_graphgym/optimizer/__init__.py | 0
.../custom_graphgym/optimizer/example.py | 0
.../custom_graphgym/pooling/__init__.py | 0
.../custom_graphgym/pooling/example.py | 0
.../custom_graphgym/stage/__init__.py | 0
.../graphgym/custom_graphgym/stage/example.py | 2 +-
.../custom_graphgym/train/__init__.py | 0
.../graphgym/custom_graphgym/train/example.py | 0
.../custom_graphgym/transform/__init__.py | 0
.../graphgym/grids/example.txt | 0
.../graphgym/grids/pyg/example.txt | 0
.../graphgym/main.py | 0
.../graphgym/parallel.sh | 0
.../graphgym/run_batch.sh | 0
.../graphgym/run_single.sh | 0
.../graphgym/sample/dimensions.txt | 0
.../graphgym/sample/dimensionsatt.txt | 0
.../pyproject.toml | 85 +-
.../readthedocs.yml | 0
.../test/conftest.py | 54 +-
.../contrib/explain/test_pgm_explainer.py | 0
.../contrib/nn/models/test_rbcd_attack.py | 0
.../test/data/lightning/test_datamodule.py | 0
.../test/data/test_batch.py | 43 +-
.../test/data/test_data.py | 75 +
.../test/data/test_database.py | 57 +-
.../test/data/test_datapipes.py | 0
.../test/data/test_dataset.py | 39 +-
.../test/data/test_dataset_summary.py | 0
.../test/data/test_feature_store.py | 0
.../test/data/test_graph_store.py | 0
.../test/data/test_hetero_data.py | 40 +-
.../test/data/test_hypergraph_data.py | 0
.../test/data/test_inherit.py | 0
.../test/data/test_on_disk_dataset.py | 0
.../test/data/test_remote_backend_utils.py | 0
.../test/data/test_storage.py | 0
.../test/data/test_temporal.py | 0
.../test/data/test_view.py | 0
.../datasets/graph_generator/test_ba_graph.py | 0
.../datasets/graph_generator/test_er_graph.py | 0
.../graph_generator/test_grid_graph.py | 0
.../graph_generator/test_tree_graph.py | 25 +
.../motif_generator/test_custom_motif.py | 0
.../motif_generator/test_cycle_motif.py | 0
.../motif_generator/test_grid_motif.py | 17 +
.../motif_generator/test_house_motif.py | 0
.../test/datasets/test_ba_shapes.py | 0
.../test/datasets/test_bzr.py | 0
.../test/datasets/test_elliptic.py | 0
.../test/datasets/test_enzymes.py | 0
.../test/datasets/test_explainer_dataset.py | 0
.../test/datasets/test_fake.py | 0
.../test/datasets/test_imdb_binary.py | 0
.../test/datasets/test_infection_dataset.py | 0
.../test/datasets/test_karate.py | 0
.../test/datasets/test_mutag.py | 0
.../test/datasets/test_planetoid.py | 6 +
.../test/datasets/test_snap_dataset.py | 0
.../test/datasets/test_suite_sparse.py | 0
.../test_dist_link_neighbor_loader.py | 232 +++
.../test_dist_link_neighbor_sampler.py | 664 ++++++
.../distributed/test_dist_neighbor_loader.py | 228 +++
.../distributed/test_dist_neighbor_sampler.py | 613 ++++++
.../test/distributed/test_dist_utils.py | 3 +
.../distributed/test_local_feature_store.py | 5 +
.../distributed/test_local_graph_store.py | 140 ++
.../test/distributed/test_partition.py | 364 ++++
.../test/distributed/test_rpc.py | 24 +-
.../algorithm/test_attention_explainer.py | 23 +-
.../test/explain/algorithm/test_captum.py | 0
.../algorithm/test_captum_explainer.py | 0
.../explain/algorithm/test_captum_hetero.py | 0
.../algorithm/test_explain_algorithm_utils.py | 0
.../explain/algorithm/test_gnn_explainer.py | 27 +-
.../algorithm/test_graphmask_explainer.py | 0
.../explain/algorithm/test_pg_explainer.py | 0
.../test/explain/conftest.py | 0
.../test/explain/metric/test_basic_metric.py | 0
.../test/explain/metric/test_faithfulness.py | 0
.../test/explain/metric/test_fidelity.py | 0
.../test/explain/test_explain_config.py | 0
.../test/explain/test_explainer.py | 0
.../test/explain/test_explanation.py | 0
.../test/explain/test_hetero_explainer.py | 0
.../test/explain/test_hetero_explanation.py | 0
.../test/graphgym/example_node.yml | 0
.../test/graphgym/test_config.py | 0
.../test/graphgym/test_graphgym.py | 0
.../test/graphgym/test_logger.py | 0
.../test/graphgym/test_register.py | 0
.../test/io/example1.off | 0
.../test/io/example2.off | 0
pytorch_geometric-2.5.2/test/io/test_fs.py | 132 ++
.../test/io/test_off.py | 0
.../test/loader/test_cache.py | 0
.../test/loader/test_cluster.py | 15 +-
.../test/loader/test_dataloader.py | 32 +
.../test/loader/test_dynamic_batch_sampler.py | 0
.../test/loader/test_graph_saint.py | 0
.../test/loader/test_hgt_loader.py | 0
.../test/loader/test_ibmb_loader.py | 0
.../test/loader/test_imbalanced_sampler.py | 0
.../test/loader/test_link_neighbor_loader.py | 0
.../test/loader/test_mixin.py | 53 +
.../test/loader/test_neighbor_loader.py | 244 ++-
.../test/loader/test_neighbor_sampler.py | 0
.../test/loader/test_prefetch.py | 0
.../test/loader/test_random_node_loader.py | 0
.../test/loader/test_shadow.py | 0
.../test/loader/test_temporal_dataloader.py | 0
.../test/loader/test_utils.py | 0
.../test/loader/test_zip_loader.py | 0
.../test/metrics/test_link_pred_metric.py | 100 +
.../test/my_config.yaml | 0
.../test/nn/aggr/test_aggr_utils.py | 0
.../test/nn/aggr/test_attention.py | 3 +-
.../test/nn/aggr/test_basic.py | 6 +-
.../test/nn/aggr/test_deep_sets.py | 0
.../test/nn/aggr/test_equilibrium.py | 0
.../test/nn/aggr/test_fused.py | 0
.../test/nn/aggr/test_gmt.py | 0
.../test/nn/aggr/test_gru.py | 0
.../test/nn/aggr/test_lcm.py | 0
.../test/nn/aggr/test_lstm.py | 0
.../test/nn/aggr/test_mlp_aggr.py | 0
.../test/nn/aggr/test_multi.py | 2 +-
.../test/nn/aggr/test_quantile.py | 0
.../test/nn/aggr/test_scaler.py | 2 +-
.../test/nn/aggr/test_set2set.py | 0
.../test/nn/aggr/test_set_transformer.py | 0
.../test/nn/aggr/test_sort.py | 0
.../test/nn/attention/test_performer.py | 0
.../nn/conv/cugraph/test_cugraph_gat_conv.py | 6 +-
.../nn/conv/cugraph/test_cugraph_rgcn_conv.py | 0
.../nn/conv/cugraph/test_cugraph_sage_conv.py | 0
.../test/nn/conv/test_agnn_conv.py | 9 +-
.../test/nn/conv/test_antisymmetric_conv.py | 0
.../test/nn/conv/test_appnp.py | 9 +-
.../test/nn/conv/test_arma_conv.py | 18 +-
.../test/nn/conv/test_cg_conv.py | 42 +-
.../test/nn/conv/test_cheb_conv.py | 2 +-
.../test/nn/conv/test_cluster_gcn_conv.py | 9 +-
.../test/nn/conv/test_create_gnn.py | 0
.../test/nn/conv/test_dir_gnn_conv.py | 0
.../test/nn/conv/test_dna_conv.py | 20 +-
.../test/nn/conv/test_edge_conv.py | 35 +-
.../test/nn/conv/test_eg_conv.py | 9 +-
.../test/nn/conv/test_fa_conv.py | 125 ++
.../test/nn/conv/test_feast_conv.py | 17 +-
.../test/nn/conv/test_film_conv.py | 36 +-
.../test/nn/conv/test_fused_gat_conv.py | 38 +
.../test/nn/conv/test_gat_conv.py | 99 +-
.../test/nn/conv/test_gated_graph_conv.py | 11 +-
.../test/nn/conv/test_gatv2_conv.py | 98 +-
.../test/nn/conv/test_gcn2_conv.py | 11 +-
.../test/nn/conv/test_gcn_conv.py | 44 +-
.../test/nn/conv/test_gen_conv.py | 48 +-
.../test/nn/conv/test_general_conv.py | 0
.../test/nn/conv/test_gin_conv.py | 38 +-
.../test/nn/conv/test_gmm_conv.py | 20 +-
.../test/nn/conv/test_gps_conv.py | 0
.../test/nn/conv/test_graph_conv.py | 40 +-
.../test/nn/conv/test_gravnet_conv.py | 7 +-
.../test/nn/conv/test_han_conv.py | 0
.../test/nn/conv/test_heat_conv.py | 11 +-
.../test/nn/conv/test_hetero_conv.py | 102 +-
.../test/nn/conv/test_hgt_conv.py | 2 +-
.../test/nn/conv/test_hypergraph_conv.py | 0
.../test/nn/conv/test_le_conv.py | 9 +-
.../test/nn/conv/test_lg_conv.py | 25 +-
.../test/nn/conv/test_message_passing.py | 119 +-
.../test/nn/conv/test_mf_conv.py | 20 +-
.../test/nn/conv/test_mixhop_conv.py | 11 +-
.../test/nn/conv/test_nn_conv.py | 20 +-
.../test/nn/conv/test_pan_conv.py | 0
.../test/nn/conv/test_pdn_conv.py | 18 +-
.../test/nn/conv/test_pna_conv.py | 9 +-
.../test/nn/conv/test_point_conv.py | 24 +-
.../test/nn/conv/test_point_gnn_conv.py | 9 +-
.../nn/conv/test_point_transformer_conv.py | 18 +-
.../test/nn/conv/test_ppf_conv.py | 23 +-
.../test/nn/conv/test_res_gated_graph_conv.py | 18 +-
.../test/nn/conv/test_rgat_conv.py | 5 +-
.../test/nn/conv/test_rgcn_conv.py | 32 +-
.../test/nn/conv/test_sage_conv.py | 57 +-
.../test/nn/conv/test_sg_conv.py | 11 +-
.../test/nn/conv/test_signed_conv.py | 34 +-
.../test/nn/conv/test_simple_conv.py | 9 +-
.../test/nn/conv/test_spline_conv.py | 20 +-
.../test/nn/conv/test_ssg_conv.py | 11 +-
.../test/nn/conv/test_static_graph.py | 0
.../test/nn/conv/test_supergat_conv.py | 0
.../test/nn/conv/test_tag_conv.py | 11 +-
.../test/nn/conv/test_transformer_conv.py | 100 +-
.../test/nn/conv/test_wl_conv.py | 0
.../test/nn/conv/test_wl_conv_continuous.py | 20 +-
.../test/nn/conv/test_x_conv.py | 0
.../test/nn/conv/utils/test_gnn_cheatsheet.py | 0
.../test/nn/dense/test_dense_gat_conv.py | 2 +-
.../test/nn/dense/test_dense_gcn_conv.py | 0
.../test/nn/dense/test_dense_gin_conv.py | 0
.../test/nn/dense/test_dense_graph_conv.py | 0
.../test/nn/dense/test_dense_sage_conv.py | 0
.../test/nn/dense/test_diff_pool.py | 0
.../test/nn/dense/test_dmon_pool.py | 8 +-
.../test/nn/dense/test_linear.py | 29 +-
.../test/nn/dense/test_mincut_pool.py | 4 +-
.../test/nn/functional/test_bro.py | 0
.../test/nn/functional/test_gini.py | 0
.../test/nn/kge/test_complex.py | 7 +-
.../test/nn/kge/test_distmult.py | 7 +-
.../test/nn/kge/test_rotate.py | 7 +-
.../test/nn/kge/test_transe.py | 7 +-
.../test/nn/models/test_attentive_fp.py | 2 +-
.../test/nn/models/test_autoencoder.py | 0
.../test/nn/models/test_basic_gnn.py | 45 +-
.../test/nn/models/test_correct_and_smooth.py | 0
.../test/nn/models/test_deep_graph_infomax.py | 0
.../test/nn/models/test_deepgcn.py | 0
.../test/nn/models/test_dimenet.py | 0
.../test/nn/models/test_gnnff.py | 0
.../test/nn/models/test_graph_mixer.py | 0
.../test/nn/models/test_graph_unet.py | 0
.../test/nn/models/test_jumping_knowledge.py | 0
.../test/nn/models/test_label_prop.py | 0
.../test/nn/models/test_lightgcn.py | 0
.../test/nn/models/test_linkx.py | 7 +-
.../test/nn/models/test_mask_label.py | 0
.../test/nn/models/test_meta.py | 0
.../test/nn/models/test_metapath2vec.py | 22 +
.../test/nn/models/test_mlp.py | 0
.../test/nn/models/test_neural_fingerprint.py | 0
.../test/nn/models/test_node2vec.py | 0
.../test/nn/models/test_pmlp.py | 0
.../test/nn/models/test_re_net.py | 6 +-
.../test/nn/models/test_rect.py | 18 +-
.../test/nn/models/test_rev_gnn.py | 0
.../test/nn/models/test_schnet.py | 0
.../test/nn/models/test_signed_gcn.py | 0
.../test/nn/models/test_tgn.py | 0
.../test/nn/models/test_visnet.py | 29 +
.../test/nn/norm/test_batch_norm.py | 0
.../test/nn/norm/test_diff_group_norm.py | 0
.../test/nn/norm/test_graph_norm.py | 0
.../test/nn/norm/test_graph_size_norm.py | 0
.../test/nn/norm/test_instance_norm.py | 0
.../test/nn/norm/test_layer_norm.py | 0
.../nn/norm/test_mean_subtraction_norm.py | 0
.../test/nn/norm/test_msg_norm.py | 0
.../test/nn/norm/test_pair_norm.py | 0
.../test/nn/pool/connect/test_filter_edges.py | 0
.../test/nn/pool/select/test_select_topk.py | 0
.../test/nn/pool/test_approx_knn.py | 0
.../test/nn/pool/test_asap.py | 10 +-
.../test/nn/pool/test_avg_pool.py | 0
.../test/nn/pool/test_consecutive.py | 0
.../test/nn/pool/test_decimation.py | 0
.../test/nn/pool/test_edge_pool.py | 0
.../test/nn/pool/test_glob.py | 0
.../test/nn/pool/test_graclus.py | 0
.../test/nn/pool/test_knn.py | 37 +-
.../test/nn/pool/test_max_pool.py | 0
.../test/nn/pool/test_mem_pool.py | 0
.../test/nn/pool/test_pan_pool.py | 0
.../test/nn/pool/test_pool.py | 0
.../test/nn/pool/test_sag_pool.py | 3 -
.../test/nn/pool/test_topk_pool.py | 0
.../test/nn/pool/test_voxel_grid.py | 0
.../test/nn/test_compile_basic.py | 23 +-
.../test/nn/test_compile_conv.py | 9 +-
.../test/nn/test_compile_dynamic.py | 5 +-
.../test/nn/test_data_parallel.py | 25 +
.../test/nn/test_encoding.py | 0
.../test/nn/test_fvcore.py | 0
.../test/nn/test_fx.py | 0
.../test/nn/test_inits.py | 0
.../test/nn/test_model_hub.py | 0
.../test/nn/test_model_summary.py | 0
.../test/nn/test_module_dict.py | 0
.../test/nn/test_parameter_dict.py | 0
.../test/nn/test_reshape.py | 0
.../test/nn/test_resolver.py | 0
.../test/nn/test_sequential.py | 20 +-
.../test/nn/test_to_fixed_size_transformer.py | 0
.../test/nn/test_to_hetero_module.py | 2 +-
.../test/nn/test_to_hetero_transformer.py | 56 +-
.../test_to_hetero_with_bases_transformer.py | 21 +
.../test/nn/unpool/test_knn_interpolate.py | 0
.../test/profile/test_benchmark.py | 0
.../test/profile/test_profile.py | 67 +-
.../test/profile/test_profile_utils.py | 11 +-
.../test/profile/test_profiler.py | 0
.../test/sampler/test_sampler_base.py | 0
.../test/test_config_store.py | 29 +-
.../test/test_debug.py | 0
.../test/test_edge_index.py | 1197 +++++++++++
.../test/test_experimental.py | 0
.../test/test_home.py | 0
.../test/test_inspector.py | 138 ++
.../test/test_isinstance.py | 16 +
.../test/test_seed.py | 0
.../test/test_typing.py | 0
.../test/test_warnings.py | 3 +-
.../test/testing/test_decorators.py | 0
.../test/transforms/test_add_metapaths.py | 13 +-
.../test_add_positional_encoding.py | 2 -
.../test_add_remaining_self_loops.py | 0
.../test/transforms/test_add_self_loops.py | 0
.../test/transforms/test_cartesian.py | 0
.../test/transforms/test_center.py | 0
.../test/transforms/test_compose.py | 0
.../test/transforms/test_constant.py | 0
.../test/transforms/test_delaunay.py | 0
.../test/transforms/test_distance.py | 0
.../test/transforms/test_face_to_edge.py | 0
.../transforms/test_feature_propagation.py | 0
.../test/transforms/test_fixed_points.py | 0
.../test/transforms/test_gcn_norm.py | 0
.../test/transforms/test_gdc.py | 103 +
.../transforms/test_generate_mesh_normals.py | 0
.../test/transforms/test_grid_sampling.py | 0
.../test/transforms/test_half_hop.py | 0
.../test/transforms/test_knn_graph.py | 0
.../transforms/test_laplacian_lambda_max.py | 0
.../test_largest_connected_components.py | 0
.../test/transforms/test_line_graph.py | 0
.../transforms/test_linear_transformation.py | 0
.../test/transforms/test_local_cartesian.py | 0
.../transforms/test_local_degree_profile.py | 0
.../test/transforms/test_mask_transform.py | 0
.../transforms/test_node_property_split.py | 0
.../transforms/test_normalize_features.py | 0
.../transforms/test_normalize_rotation.py | 0
.../test/transforms/test_normalize_scale.py | 0
.../test/transforms/test_one_hot_degree.py | 0
.../test/transforms/test_pad.py | 2 +-
.../transforms/test_point_pair_features.py | 0
.../test/transforms/test_polar.py | 0
.../test/transforms/test_radius_graph.py | 0
.../test/transforms/test_random_flip.py | 0
.../test/transforms/test_random_jitter.py | 0
.../test/transforms/test_random_link_split.py | 0
.../test/transforms/test_random_node_split.py | 0
.../test/transforms/test_random_rotate.py | 0
.../test/transforms/test_random_scale.py | 0
.../test/transforms/test_random_shear.py | 0
.../test_remove_duplicated_edges.py | 0
.../transforms/test_remove_isolated_nodes.py | 0
.../test_remove_training_classes.py | 0
.../test/transforms/test_rooted_subgraph.py | 0
.../test/transforms/test_sample_points.py | 0
.../test/transforms/test_sign.py | 0
.../test/transforms/test_spherical.py | 0
.../transforms/test_svd_feature_reduction.py | 0
.../test/transforms/test_target_indegree.py | 0
.../test/transforms/test_to_dense.py | 0
.../test/transforms/test_to_device.py | 0
.../test/transforms/test_to_sparse_tensor.py | 0
.../test/transforms/test_to_superpixels.py | 6 +-
.../test/transforms/test_to_undirected.py | 0
.../test/transforms/test_two_hop.py | 2 -
.../test/transforms/test_virtual_node.py | 0
.../test/utils/test_assortativity.py | 0
.../test/utils/test_augmentation.py | 0
.../test/utils/test_coalesce.py | 0
.../test/utils/test_convert.py | 33 +-
.../test/utils/test_cross_entropy.py | 21 +-
.../test/utils/test_degree.py | 0
.../test/utils/test_dropout.py | 0
.../test/utils/test_embedding.py | 0
.../test/utils/test_functions.py | 0
.../test/utils/test_geodesic.py | 0
.../test/utils/test_grid.py | 0
.../test/utils/test_hetero.py | 0
.../test/utils/test_homophily.py | 0
.../test/utils/test_index_sort.py | 16 +
.../test/utils/test_isolated.py | 0
.../test/utils/test_laplacian.py | 0
.../test/utils/test_lexsort.py | 0
.../test/utils/test_loop.py | 75 +
.../test/utils/test_map.py | 0
.../test/utils/test_mask.py | 0
.../test/utils/test_mesh_laplacian.py | 0
.../test/utils/test_negative_sampling.py | 2 +-
.../test/utils/test_nested.py | 0
.../test/utils/test_noise_scheduler.py | 34 +
.../test/utils/test_normalized_cut.py | 0
.../test/utils/test_num_nodes.py | 0
.../test/utils/test_one_hot.py | 0
.../test/utils/test_ppr.py | 0
.../test/utils/test_random.py | 0
.../test/utils/test_repeat.py | 0
.../test/utils/test_scatter.py | 13 +-
.../test/utils/test_segment.py | 107 +
.../test/utils/test_select.py | 0
.../test/utils/test_smiles.py | 0
.../test/utils/test_softmax.py | 23 +-
.../test/utils/test_sort_edge_index.py | 7 +
.../test/utils/test_sparse.py | 46 +-
.../test/utils/test_spmm.py | 0
.../test/utils/test_subgraph.py | 0
.../test/utils/test_to_dense_adj.py | 0
.../test/utils/test_to_dense_batch.py | 0
.../test/utils/test_train_test_split_edges.py | 0
.../test/utils/test_tree_decomposition.py | 15 +
.../test/utils/test_trim_to_layer.py | 4 +-
.../test/utils/test_unbatch.py | 0
.../test/utils/test_undirected.py | 21 +-
.../visualization/test_graph_visualization.py | 15 +
.../test/visualization/test_influence.py | 0
.../torch_geometric/__init__.py | 16 +-
.../torch_geometric/_compile.py | 34 +
.../torch_geometric/backend.py | 4 +-
.../torch_geometric/config_store.py | 147 +-
.../torch_geometric/contrib/__init__.py | 0
.../contrib/datasets/__init__.py | 0
.../contrib/explain/__init__.py | 0
.../contrib/explain/pgm_explainer.py | 31 +-
.../torch_geometric/contrib/nn/__init__.py | 0
.../contrib/nn/conv/__init__.py | 0
.../contrib/nn/models/__init__.py | 0
.../contrib/nn/models/rbcd_attack.py | 10 +-
.../contrib/transforms/__init__.py | 0
.../torch_geometric/data/__init__.py | 118 ++
.../torch_geometric/data/batch.py | 65 +-
.../torch_geometric/data/collate.py | 73 +-
.../torch_geometric/data/data.py | 248 ++-
.../torch_geometric/data/database.py | 197 +-
.../torch_geometric/data/datapipes.py | 19 +-
.../torch_geometric/data/dataset.py | 109 +-
.../torch_geometric/data/download.py | 34 +-
.../torch_geometric/data/extract.py | 15 +-
.../torch_geometric/data/feature_store.py | 74 +-
.../torch_geometric/data/graph_store.py | 53 +-
.../torch_geometric/data/hetero_data.py | 56 +-
.../torch_geometric/data/hypergraph_data.py | 61 +-
.../torch_geometric/data/in_memory_dataset.py | 81 +-
.../data/lightning/__init__.py | 0
.../data/lightning/datamodule.py | 111 +-
.../torch_geometric/data/makedirs.py | 17 +
.../torch_geometric/data/on_disk_dataset.py | 26 +-
.../data/remote_backend_utils.py | 66 +-
.../torch_geometric/data/separate.py | 76 +-
.../torch_geometric/data/storage.py | 330 ++-
.../torch_geometric/data/summary.py | 40 +-
.../torch_geometric/data/temporal.py | 7 +-
.../torch_geometric/data/view.py | 17 +-
.../torch_geometric/datasets/__init__.py | 4 +-
.../torch_geometric/datasets/actor.py | 46 +-
.../torch_geometric/datasets/airfrans.py | 20 +-
.../torch_geometric/datasets/airports.py | 36 +-
.../torch_geometric/datasets/amazon.py | 19 +-
.../torch_geometric/datasets/amazon_book.py | 24 +-
.../datasets/amazon_products.py | 42 +-
.../torch_geometric/datasets/aminer.py | 26 +-
.../torch_geometric/datasets/aqsol.py | 30 +-
.../datasets/attributed_graph_dataset.py | 50 +-
.../datasets/ba2motif_dataset.py | 17 +-
.../datasets/ba_multi_shapes.py | 17 +-
.../torch_geometric/datasets/ba_shapes.py | 12 +-
.../torch_geometric/datasets/bitcoin_otc.py | 57 +-
.../torch_geometric/datasets/brca_tgca.py | 20 +-
.../torch_geometric/datasets/citation_full.py | 31 +-
.../torch_geometric/datasets/coauthor.py | 19 +-
.../torch_geometric/datasets/coma.py | 28 +-
.../torch_geometric/datasets/dblp.py | 22 +-
.../torch_geometric/datasets/dbp15k.py | 38 +-
.../torch_geometric/datasets/deezer_europe.py | 22 +-
.../torch_geometric/datasets/dgraph.py | 29 +-
.../torch_geometric/datasets/dynamic_faust.py | 28 +-
.../torch_geometric/datasets/elliptic.py | 35 +-
.../datasets/elliptic_temporal.py | 6 +-
.../torch_geometric/datasets/email_eu_core.py | 22 +-
.../torch_geometric/datasets/entities.py | 55 +-
.../datasets/explainer_dataset.py | 11 +-
.../torch_geometric/datasets/facebook.py | 22 +-
.../torch_geometric/datasets/fake.py | 68 +-
.../torch_geometric/datasets/faust.py | 33 +-
.../torch_geometric/datasets/flickr.py | 42 +-
.../torch_geometric/datasets/freebase.py | 39 +-
.../torch_geometric/datasets/gdelt.py | 35 +-
.../torch_geometric/datasets/gdelt_lite.py | 12 +-
.../torch_geometric/datasets/ged_dataset.py | 57 +-
.../torch_geometric/datasets/gemsec.py | 24 +-
.../torch_geometric/datasets/geometry.py | 40 +-
.../torch_geometric/datasets/github.py | 22 +-
.../datasets/gnn_benchmark_dataset.py | 29 +-
.../datasets/graph_generator/__init__.py | 2 +
.../datasets/graph_generator/ba_graph.py | 0
.../datasets/graph_generator/base.py | 12 +-
.../datasets/graph_generator/er_graph.py | 0
.../datasets/graph_generator/grid_graph.py | 0
.../datasets/graph_generator/tree_graph.py | 80 +
.../datasets/heterophilous_graph_dataset.py | 16 +-
.../torch_geometric/datasets/hgb_dataset.py | 40 +-
.../torch_geometric/datasets/hm.py | 12 +-
.../torch_geometric/datasets/hydro_net.py | 69 +-
.../torch_geometric/datasets/icews.py | 35 +-
.../torch_geometric/datasets/igmc_dataset.py | 12 +-
.../torch_geometric/datasets/imdb.py | 23 +-
.../datasets/infection_dataset.py | 4 +
.../torch_geometric/datasets/jodie.py | 16 +-
.../torch_geometric/datasets/karate.py | 0
.../torch_geometric/datasets/last_fm.py | 23 +-
.../torch_geometric/datasets/lastfm_asia.py | 22 +-
.../torch_geometric/datasets/linkx_dataset.py | 41 +-
.../torch_geometric/datasets/lrgb.py | 32 +-
.../torch_geometric/datasets/malnet_tiny.py | 25 +-
.../torch_geometric/datasets/md17.py | 23 +-
.../datasets/mixhop_synthetic_dataset.py | 16 +-
.../datasets/mnist_superpixels.py | 16 +-
.../torch_geometric/datasets/modelnet.py | 32 +-
.../torch_geometric/datasets/molecule_net.py | 62 +-
.../datasets/motif_generator/__init__.py | 2 +
.../datasets/motif_generator/base.py | 12 +-
.../datasets/motif_generator/custom.py | 6 +-
.../datasets/motif_generator/cycle.py | 1 -
.../datasets/motif_generator/grid.py | 44 +
.../datasets/motif_generator/house.py | 5 +-
.../torch_geometric/datasets/movie_lens.py | 19 +-
.../datasets/movie_lens_100k.py | 16 +-
.../torch_geometric/datasets/movie_lens_1m.py | 16 +-
.../torch_geometric/datasets/myket.py | 12 +-
.../torch_geometric/datasets/nell.py | 27 +-
.../torch_geometric/datasets/neurograph.py | 27 +-
.../torch_geometric/datasets/ogb_mag.py | 28 +-
.../torch_geometric/datasets/omdb.py | 28 +-
.../torch_geometric/datasets/ose_gvcs.py | 27 +-
.../torch_geometric/datasets/particle.py | 21 +-
.../torch_geometric/datasets/pascal.py | 92 +-
.../torch_geometric/datasets/pascal_pf.py | 22 +-
.../datasets/pcpnet_dataset.py | 16 +-
.../torch_geometric/datasets/pcqm4m.py | 12 +-
.../torch_geometric/datasets/planetoid.py | 33 +-
.../torch_geometric/datasets/polblogs.py | 22 +-
.../torch_geometric/datasets/ppi.py | 24 +-
.../torch_geometric/datasets/qm7.py | 17 +-
.../torch_geometric/datasets/qm9.py | 53 +-
.../torch_geometric/datasets/rcdd.py | 143 ++
.../torch_geometric/datasets/reddit.py | 16 +-
.../torch_geometric/datasets/reddit2.py | 36 +-
.../datasets/rel_link_pred_dataset.py | 31 +-
.../torch_geometric/datasets/s3dis.py | 28 +-
.../torch_geometric/datasets/sbm_dataset.py | 94 +-
.../torch_geometric/datasets/shapenet.py | 35 +-
.../torch_geometric/datasets/shrec2016.py | 18 +-
.../torch_geometric/datasets/snap_dataset.py | 79 +-
.../torch_geometric/datasets/suite_sparse.py | 33 +-
.../torch_geometric/datasets/taobao.py | 24 +-
.../torch_geometric/datasets/tosca.py | 16 +-
.../torch_geometric/datasets/tu_dataset.py | 78 +-
.../torch_geometric/datasets/twitch.py | 24 +-
.../torch_geometric/datasets/upfd.py | 34 +-
.../datasets/utils/__init__.py | 0
.../datasets/utils/cheatsheet.py | 10 +-
.../torch_geometric/datasets/webkb.py | 38 +-
.../torch_geometric/datasets/wikics.py | 26 +-
.../torch_geometric/datasets/wikidata.py | 34 +-
.../datasets/wikipedia_network.py | 54 +-
.../datasets/willow_object_class.py | 30 +-
.../torch_geometric/datasets/word_net.py | 78 +-
.../torch_geometric/datasets/yelp.py | 36 +-
.../torch_geometric/datasets/zinc.py | 23 +-
.../torch_geometric/debug.py | 18 +-
.../torch_geometric/deprecation.py | 14 +-
.../torch_geometric/distributed/__init__.py | 19 +
.../distributed/dist_context.py | 0
.../distributed/dist_link_neighbor_loader.py | 124 ++
.../distributed/dist_loader.py | 69 +-
.../distributed/dist_neighbor_loader.py | 114 ++
.../distributed/dist_neighbor_sampler.py | 1074 ++++++++++
.../torch_geometric/distributed/event_loop.py | 26 +-
.../distributed/local_feature_store.py | 151 +-
.../distributed/local_graph_store.py | 131 +-
.../torch_geometric/distributed/partition.py | 401 ++++
.../torch_geometric/distributed/rpc.py | 63 +-
.../torch_geometric/distributed/utils.py | 188 ++
.../torch_geometric/edge_index.py | 1805 +++++++++++++++++
.../torch_geometric/experimental.py | 23 +-
.../torch_geometric/explain/__init__.py | 0
.../explain/algorithm/__init__.py | 0
.../explain/algorithm/attention_explainer.py | 3 +-
.../torch_geometric/explain/algorithm/base.py | 12 +-
.../explain/algorithm/captum.py | 9 +-
.../explain/algorithm/captum_explainer.py | 23 +-
.../explain/algorithm/dummy_explainer.py | 3 +-
.../explain/algorithm/gnn_explainer.py | 12 +
.../explain/algorithm/graphmask_explainer.py | 18 +-
.../explain/algorithm/pg_explainer.py | 1 +
.../explain/algorithm/utils.py | 9 +-
.../torch_geometric/explain/config.py | 0
.../torch_geometric/explain/explainer.py | 3 +-
.../torch_geometric/explain/explanation.py | 27 +-
.../explain/metric/__init__.py | 0
.../torch_geometric/explain/metric/basic.py | 2 +-
.../explain/metric/faithfulness.py | 0
.../explain/metric/fidelity.py | 2 +-
.../torch_geometric/graphgym/__init__.py | 0
.../torch_geometric/graphgym/benchmark.py | 0
.../torch_geometric/graphgym/checkpoint.py | 0
.../torch_geometric/graphgym/cmd_args.py | 0
.../torch_geometric/graphgym/config.py | 52 +-
.../graphgym/contrib/__init__.py | 0
.../graphgym/contrib/act/__init__.py | 0
.../graphgym/contrib/config/__init__.py | 0
.../graphgym/contrib/encoder/__init__.py | 0
.../graphgym/contrib/head/__init__.py | 0
.../graphgym/contrib/layer/__init__.py | 0
.../graphgym/contrib/layer/generalconv.py | 3 +-
.../graphgym/contrib/loader/__init__.py | 0
.../graphgym/contrib/loss/__init__.py | 0
.../graphgym/contrib/network/__init__.py | 0
.../graphgym/contrib/optimizer/__init__.py | 0
.../graphgym/contrib/pooling/__init__.py | 0
.../graphgym/contrib/stage/__init__.py | 0
.../graphgym/contrib/train/__init__.py | 0
.../graphgym/contrib/transform/__init__.py | 0
.../torch_geometric/graphgym/imports.py | 0
.../torch_geometric/graphgym/init.py | 3 +-
.../torch_geometric/graphgym/loader.py | 22 +-
.../torch_geometric/graphgym/logger.py | 11 +-
.../torch_geometric/graphgym/loss.py | 3 +-
.../torch_geometric/graphgym/model_builder.py | 0
.../graphgym/models/__init__.py | 0
.../torch_geometric/graphgym/models/act.py | 0
.../graphgym/models/encoder.py | 3 -
.../torch_geometric/graphgym/models/gnn.py | 0
.../torch_geometric/graphgym/models/head.py | 0
.../torch_geometric/graphgym/models/layer.py | 2 +-
.../graphgym/models/pooling.py | 0
.../graphgym/models/transform.py | 6 +-
.../torch_geometric/graphgym/optim.py | 0
.../torch_geometric/graphgym/register.py | 2 +-
.../torch_geometric/graphgym/train.py | 0
.../torch_geometric/graphgym/utils/LICENSE | 0
.../graphgym/utils/__init__.py | 0
.../graphgym/utils/agg_runs.py | 72 +-
.../graphgym/utils/comp_budget.py | 15 +-
.../torch_geometric/graphgym/utils/device.py | 6 +-
.../torch_geometric/graphgym/utils/epoch.py | 0
.../torch_geometric/graphgym/utils/io.py | 46 +-
.../torch_geometric/graphgym/utils/plot.py | 6 +-
.../torch_geometric/graphgym/utils/tools.py | 2 +-
.../torch_geometric/home.py | 6 +-
.../torch_geometric/inspector.py | 537 +++++
.../torch_geometric/io/__init__.py | 0
.../torch_geometric/io/fs.py | 215 ++
.../torch_geometric/io/npz.py | 0
.../torch_geometric/io/obj.py | 13 +-
.../torch_geometric/io/off.py | 26 +-
.../torch_geometric/io/planetoid.py | 81 +-
.../torch_geometric/io/ply.py | 2 +-
.../torch_geometric/io/sdf.py | 12 +-
.../torch_geometric/io/tu.py | 136 ++
.../torch_geometric/io/txt_array.py | 33 +
.../torch_geometric/isinstance.py | 25 +
.../torch_geometric/lazy_loader.py | 14 +-
.../torch_geometric/loader/__init__.py | 0
.../torch_geometric/loader/base.py | 9 +-
.../torch_geometric/loader/cache.py | 0
.../torch_geometric/loader/cluster.py | 103 +-
.../loader/data_list_loader.py | 2 +-
.../torch_geometric/loader/dataloader.py | 15 +-
.../loader/dense_data_loader.py | 0
.../loader/dynamic_batch_sampler.py | 0
.../torch_geometric/loader/graph_saint.py | 0
.../torch_geometric/loader/hgt_loader.py | 0
.../torch_geometric/loader/ibmb_loader.py | 0
.../loader/imbalanced_sampler.py | 0
.../torch_geometric/loader/link_loader.py | 65 +-
.../loader/link_neighbor_loader.py | 17 +-
.../torch_geometric/loader/mixin.py | 289 +++
.../torch_geometric/loader/neighbor_loader.py | 2 +-
.../loader/neighbor_sampler.py | 0
.../torch_geometric/loader/node_loader.py | 99 +-
.../torch_geometric/loader/prefetch.py | 3 +-
.../loader/random_node_loader.py | 0
.../torch_geometric/loader/shadow.py | 0
.../loader/temporal_dataloader.py | 0
.../torch_geometric/loader/utils.py | 105 +-
.../torch_geometric/loader/zip_loader.py | 0
.../torch_geometric/logging.py | 4 +-
.../torch_geometric/metrics/__init__.py | 14 +
.../torch_geometric/metrics/link_pred.py | 218 ++
.../torch_geometric/nn/__init__.py | 0
.../torch_geometric/nn/aggr/__init__.py | 0
.../torch_geometric/nn/aggr/attention.py | 42 +-
.../torch_geometric/nn/aggr/base.py | 12 +-
.../torch_geometric/nn/aggr/basic.py | 19 +-
.../torch_geometric/nn/aggr/deep_sets.py | 39 +-
.../torch_geometric/nn/aggr/equilibrium.py | 4 +-
.../torch_geometric/nn/aggr/fused.py | 11 +-
.../torch_geometric/nn/aggr/gmt.py | 0
.../torch_geometric/nn/aggr/gru.py | 0
.../torch_geometric/nn/aggr/lcm.py | 0
.../torch_geometric/nn/aggr/lstm.py | 0
.../torch_geometric/nn/aggr/mlp.py | 18 +-
.../torch_geometric/nn/aggr/multi.py | 0
.../torch_geometric/nn/aggr/quantile.py | 6 +-
.../torch_geometric/nn/aggr/scaler.py | 0
.../torch_geometric/nn/aggr/set2set.py | 2 +-
.../nn/aggr/set_transformer.py | 0
.../torch_geometric/nn/aggr/sort.py | 0
.../torch_geometric/nn/aggr/utils.py | 10 +-
.../torch_geometric/nn/attention/__init__.py | 0
.../torch_geometric/nn/attention/performer.py | 5 +-
.../torch_geometric/nn/conv/__init__.py | 2 +
.../torch_geometric/nn/conv/agnn_conv.py | 4 +-
.../nn/conv/antisymmetric_conv.py | 2 +-
.../torch_geometric/nn/conv/appnp.py | 15 +-
.../torch_geometric/nn/conv/arma_conv.py | 8 +-
.../torch_geometric/nn/conv/cg_conv.py | 6 +-
.../torch_geometric/nn/conv/cheb_conv.py | 6 +-
.../nn/conv/cluster_gcn_conv.py | 7 +-
.../torch_geometric/nn/conv/collect.jinja | 153 ++
.../nn/conv/cugraph/__init__.py | 0
.../torch_geometric/nn/conv/cugraph/base.py | 5 +-
.../nn/conv/cugraph/gat_conv.py | 0
.../nn/conv/cugraph/rgcn_conv.py | 0
.../nn/conv/cugraph/sage_conv.py | 0
.../torch_geometric/nn/conv/dir_gnn_conv.py | 2 +-
.../torch_geometric/nn/conv/dna_conv.py | 16 +-
.../torch_geometric/nn/conv/edge_conv.py | 19 +-
.../nn/conv/edge_updater.jinja | 74 +
.../torch_geometric/nn/conv/eg_conv.py | 4 +-
.../torch_geometric/nn/conv/fa_conv.py | 80 +-
.../torch_geometric/nn/conv/feast_conv.py | 7 +-
.../torch_geometric/nn/conv/film_conv.py | 24 +-
.../torch_geometric/nn/conv/fused_gat_conv.py | 39 +-
.../torch_geometric/nn/conv/gat_conv.py | 154 +-
.../nn/conv/gated_graph_conv.py | 9 +-
.../torch_geometric/nn/conv/gatv2_conv.py | 117 +-
.../torch_geometric/nn/conv/gcn2_conv.py | 6 +-
.../torch_geometric/nn/conv/gcn_conv.py | 48 +-
.../torch_geometric/nn/conv/gen_conv.py | 38 +-
.../torch_geometric/nn/conv/general_conv.py | 11 +-
.../torch_geometric/nn/conv/gin_conv.py | 28 +-
.../torch_geometric/nn/conv/gmm_conv.py | 6 +-
.../torch_geometric/nn/conv/gps_conv.py | 0
.../torch_geometric/nn/conv/graph_conv.py | 15 +-
.../torch_geometric/nn/conv/gravnet_conv.py | 11 +-
.../torch_geometric/nn/conv/han_conv.py | 10 +-
.../torch_geometric/nn/conv/heat_conv.py | 10 +-
.../torch_geometric/nn/conv/hetero_conv.py | 13 +-
.../torch_geometric/nn/conv/hgt_conv.py | 10 +-
.../nn/conv/hypergraph_conv.py | 6 +-
.../torch_geometric/nn/conv/le_conv.py | 10 +-
.../torch_geometric/nn/conv/lg_conv.py | 7 +-
.../nn/conv/message_passing.py | 780 +++----
.../torch_geometric/nn/conv/mf_conv.py | 19 +-
.../torch_geometric/nn/conv/mixhop_conv.py | 7 +-
.../torch_geometric/nn/conv/nn_conv.py | 12 +-
.../torch_geometric/nn/conv/pan_conv.py | 6 +-
.../torch_geometric/nn/conv/pdn_conv.py | 6 +-
.../torch_geometric/nn/conv/pna_conv.py | 7 +-
.../torch_geometric/nn/conv/point_conv.py | 16 +-
.../torch_geometric/nn/conv/point_gnn_conv.py | 4 +-
.../nn/conv/point_transformer_conv.py | 16 +-
.../torch_geometric/nn/conv/ppf_conv.py | 14 +-
.../torch_geometric/nn/conv/propagate.jinja | 205 ++
.../nn/conv/res_gated_graph_conv.py | 19 +-
.../torch_geometric/nn/conv/rgat_conv.py | 20 +-
.../torch_geometric/nn/conv/rgcn_conv.py | 28 +-
.../torch_geometric/nn/conv/sage_conv.py | 15 +-
.../torch_geometric/nn/conv/sg_conv.py | 7 +-
.../torch_geometric/nn/conv/signed_conv.py | 27 +-
.../torch_geometric/nn/conv/simple_conv.py | 8 +-
.../torch_geometric/nn/conv/spline_conv.py | 4 +-
.../torch_geometric/nn/conv/ssg_conv.py | 7 +-
.../torch_geometric/nn/conv/supergat_conv.py | 21 +-
.../torch_geometric/nn/conv/tag_conv.py | 7 +-
.../nn/conv/transformer_conv.py | 76 +-
.../torch_geometric/nn/conv/utils/__init__.py | 2 +
.../nn/conv/utils/cheatsheet.py | 0
.../torch_geometric/nn/conv/wl_conv.py | 13 +-
.../nn/conv/wl_conv_continuous.py | 14 +-
.../torch_geometric/nn/conv/x_conv.py | 2 +-
.../torch_geometric/nn/data_parallel.py | 22 +-
.../torch_geometric/nn/dense/__init__.py | 6 +
.../nn/dense/dense_gat_conv.py | 3 +-
.../nn/dense/dense_gcn_conv.py | 3 +-
.../nn/dense/dense_gin_conv.py | 3 +-
.../nn/dense/dense_graph_conv.py | 3 +-
.../nn/dense/dense_sage_conv.py | 3 +-
.../torch_geometric/nn/dense/diff_pool.py | 2 +-
.../torch_geometric/nn/dense/dmon_pool.py | 46 +-
.../torch_geometric/nn/dense/linear.py | 211 +-
.../torch_geometric/nn/dense/mincut_pool.py | 3 +-
.../torch_geometric/nn/encoding.py | 9 +-
.../torch_geometric/nn/functional/__init__.py | 2 +
.../torch_geometric/nn/functional/bro.py | 0
.../torch_geometric/nn/functional/gini.py | 0
.../torch_geometric/nn/fx.py | 4 +-
.../torch_geometric/nn/glob.py | 0
.../torch_geometric/nn/inits.py | 0
.../torch_geometric/nn/kge/__init__.py | 2 +
.../torch_geometric/nn/kge/base.py | 14 +-
.../torch_geometric/nn/kge/complex.py | 0
.../torch_geometric/nn/kge/distmult.py | 0
.../torch_geometric/nn/kge/loader.py | 0
.../torch_geometric/nn/kge/rotate.py | 0
.../torch_geometric/nn/kge/transe.py | 0
.../torch_geometric/nn/lr_scheduler.py | 0
.../torch_geometric/nn/model_hub.py | 8 +-
.../torch_geometric/nn/models/__init__.py | 10 +-
.../torch_geometric/nn/models/attentive_fp.py | 32 +-
.../torch_geometric/nn/models/autoencoder.py | 18 +-
.../torch_geometric/nn/models/basic_gnn.py | 123 +-
.../torch_geometric/nn/models/captum.py | 3 -
.../nn/models/correct_and_smooth.py | 9 +-
.../nn/models/deep_graph_infomax.py | 6 +-
.../torch_geometric/nn/models/deepgcn.py | 2 +-
.../torch_geometric/nn/models/dimenet.py | 28 +-
.../nn/models/dimenet_utils.py | 0
.../torch_geometric/nn/models/gnnff.py | 2 +-
.../torch_geometric/nn/models/graph_mixer.py | 12 +-
.../torch_geometric/nn/models/graph_unet.py | 2 +-
.../nn/models/jumping_knowledge.py | 13 +-
.../torch_geometric/nn/models/label_prop.py | 10 +-
.../torch_geometric/nn/models/lightgcn.py | 12 +
.../torch_geometric/nn/models/linkx.py | 79 +-
.../torch_geometric/nn/models/mask_label.py | 2 +-
.../torch_geometric/nn/models/meta.py | 3 +-
.../torch_geometric/nn/models/metapath2vec.py | 24 +-
.../torch_geometric/nn/models/mlp.py | 4 +-
.../nn/models/neural_fingerprint.py | 2 +-
.../torch_geometric/nn/models/node2vec.py | 4 +-
.../torch_geometric/nn/models/pmlp.py | 2 +-
.../torch_geometric/nn/models/re_net.py | 9 +-
.../torch_geometric/nn/models/rect.py | 87 +
.../torch_geometric/nn/models/rev_gnn.py | 11 +-
.../torch_geometric/nn/models/schnet.py | 16 +-
.../torch_geometric/nn/models/signed_gcn.py | 3 +-
.../torch_geometric/nn/models/tgn.py | 11 +-
.../torch_geometric/nn/models/visnet.py | 1179 +++++++++++
.../torch_geometric/nn/module_dict.py | 11 +-
.../torch_geometric/nn/norm/__init__.py | 2 +
.../torch_geometric/nn/norm/batch_norm.py | 8 +-
.../nn/norm/diff_group_norm.py | 7 +-
.../torch_geometric/nn/norm/graph_norm.py | 5 +-
.../nn/norm/graph_size_norm.py | 5 +-
.../torch_geometric/nn/norm/instance_norm.py | 5 +-
.../torch_geometric/nn/norm/layer_norm.py | 8 +-
.../nn/norm/mean_subtraction_norm.py | 5 +-
.../torch_geometric/nn/norm/msg_norm.py | 5 +-
.../torch_geometric/nn/norm/pair_norm.py | 5 +-
.../torch_geometric/nn/parameter_dict.py | 11 +-
.../torch_geometric/nn/pool/__init__.py | 2 +
.../torch_geometric/nn/pool/approx_knn.py | 0
.../torch_geometric/nn/pool/asap.py | 12 +-
.../torch_geometric/nn/pool/avg_pool.py | 0
.../nn/pool/connect/__init__.py | 6 +
.../torch_geometric/nn/pool/connect/base.py | 3 +-
.../nn/pool/connect/filter_edges.py | 2 +-
.../torch_geometric/nn/pool/consecutive.py | 0
.../torch_geometric/nn/pool/decimation.py | 0
.../torch_geometric/nn/pool/edge_pool.py | 3 +-
.../torch_geometric/nn/pool/glob.py | 15 +-
.../torch_geometric/nn/pool/graclus.py | 1 -
.../torch_geometric/nn/pool/knn.py | 88 +-
.../torch_geometric/nn/pool/max_pool.py | 0
.../torch_geometric/nn/pool/mem_pool.py | 9 +-
.../torch_geometric/nn/pool/pan_pool.py | 4 +-
.../torch_geometric/nn/pool/pool.py | 0
.../torch_geometric/nn/pool/sag_pool.py | 3 +-
.../nn/pool/select/__init__.py | 6 +
.../torch_geometric/nn/pool/select/base.py | 0
.../torch_geometric/nn/pool/select/topk.py | 2 +-
.../torch_geometric/nn/pool/topk_pool.py | 3 +-
.../torch_geometric/nn/pool/voxel_grid.py | 1 -
.../torch_geometric/nn/reshape.py | 2 +-
.../torch_geometric/nn/resolver.py | 0
.../torch_geometric/nn/sequential.jinja | 35 +
.../torch_geometric/nn/sequential.py | 147 ++
.../torch_geometric/nn/summary.py | 0
.../nn/to_fixed_size_transformer.py | 0
.../torch_geometric/nn/to_hetero_module.py | 3 +-
.../nn/to_hetero_transformer.py | 2 +-
.../nn/to_hetero_with_bases_transformer.py | 21 +-
.../torch_geometric/nn/unpool/__init__.py | 2 +
.../nn/unpool/knn_interpolate.py | 2 +-
.../torch_geometric/profile/__init__.py | 26 +-
.../torch_geometric/profile/benchmark.py | 7 +-
.../torch_geometric/profile/profile.py | 153 +-
.../torch_geometric/profile/profiler.py | 6 +-
.../torch_geometric/profile/utils.py | 34 +-
.../torch_geometric/resolver.py | 12 +-
.../torch_geometric/sampler/__init__.py | 2 +
.../torch_geometric/sampler/base.py | 66 +-
.../torch_geometric/sampler/hgt_sampler.py | 4 +-
.../sampler/neighbor_sampler.py | 193 +-
.../torch_geometric/sampler/utils.py | 31 +-
.../torch_geometric/seed.py | 4 +-
.../torch_geometric/template.py | 38 +
.../torch_geometric/testing/__init__.py | 11 +
.../torch_geometric/testing/asserts.py | 20 +-
.../torch_geometric/testing/data.py | 0
.../torch_geometric/testing/decorators.py | 95 +-
.../torch_geometric/testing/feature_store.py | 30 +-
.../torch_geometric/testing/graph_store.py | 10 +-
.../torch_geometric/transforms/__init__.py | 0
.../transforms/add_metapaths.py | 142 +-
.../transforms/add_positional_encoding.py | 54 +-
.../transforms/add_remaining_self_loops.py | 20 +-
.../transforms/add_self_loops.py | 20 +-
.../transforms/base_transform.py | 0
.../torch_geometric/transforms/cartesian.py | 6 +-
.../torch_geometric/transforms/center.py | 3 +-
.../torch_geometric/transforms/compose.py | 0
.../torch_geometric/transforms/constant.py | 1 +
.../torch_geometric/transforms/delaunay.py | 5 +-
.../torch_geometric/transforms/distance.py | 6 +-
.../transforms/face_to_edge.py | 3 +-
.../transforms/feature_propagation.py | 18 +-
.../transforms/fixed_points.py | 14 +-
.../torch_geometric/transforms/gcn_norm.py | 0
.../torch_geometric/transforms/gdc.py | 42 +-
.../transforms/generate_mesh_normals.py | 6 +-
.../transforms/grid_sampling.py | 20 +-
.../torch_geometric/transforms/half_hop.py | 10 +-
.../torch_geometric/transforms/knn_graph.py | 8 +-
.../transforms/laplacian_lambda_max.py | 14 +-
.../largest_connected_components.py | 14 +-
.../torch_geometric/transforms/line_graph.py | 22 +-
.../transforms/linear_transformation.py | 2 +-
.../transforms/local_cartesian.py | 2 +
.../transforms/local_degree_profile.py | 11 +-
.../torch_geometric/transforms/mask.py | 22 +-
.../transforms/node_property_split.py | 1 -
.../transforms/normalize_features.py | 0
.../transforms/normalize_rotation.py | 3 +-
.../transforms/normalize_scale.py | 5 +-
.../transforms/one_hot_degree.py | 3 +-
.../torch_geometric/transforms/pad.py | 223 +-
.../transforms/point_pair_features.py | 2 +-
.../torch_geometric/transforms/polar.py | 4 +-
.../transforms/radius_graph.py | 8 +-
.../torch_geometric/transforms/random_flip.py | 4 +-
.../transforms/random_jitter.py | 30 +-
.../transforms/random_link_split.py | 41 +-
.../transforms/random_node_split.py | 4 +-
.../transforms/random_rotate.py | 13 +-
.../transforms/random_scale.py | 6 +-
.../transforms/random_shear.py | 6 +-
.../transforms/remove_duplicated_edges.py | 7 +-
.../transforms/remove_isolated_nodes.py | 69 +
.../transforms/remove_training_classes.py | 0
.../transforms/rooted_subgraph.py | 33 +-
.../transforms/sample_points.py | 3 +
.../torch_geometric/transforms/sign.py | 22 +-
.../torch_geometric/transforms/spherical.py | 2 +
.../transforms/svd_feature_reduction.py | 2 +
.../transforms/target_indegree.py | 5 +-
.../torch_geometric/transforms/to_dense.py | 20 +-
.../torch_geometric/transforms/to_device.py | 4 +-
.../transforms/to_sparse_tensor.py | 18 +-
.../transforms/to_superpixels.py | 9 +-
.../transforms/to_undirected.py | 0
.../torch_geometric/transforms/two_hop.py | 18 +-
.../transforms/virtual_node.py | 7 +-
.../torch_geometric/typing.py | 52 +-
.../torch_geometric/utils/__init__.py | 60 +-
.../torch_geometric/utils/_assortativity.py | 3 +-
.../torch_geometric/utils/_coalesce.py | 83 +-
.../torch_geometric/utils/_degree.py | 1 -
.../torch_geometric/utils/_grid.py | 17 +-
.../torch_geometric/utils/_homophily.py | 32 +-
.../torch_geometric/utils/_index_sort.py | 15 +-
.../torch_geometric/utils/_lexsort.py | 7 +-
.../utils/_negative_sampling.py | 45 +-
.../torch_geometric/utils/_normalized_cut.py | 2 -
.../torch_geometric/utils/_one_hot.py | 0
.../torch_geometric/utils/_scatter.py | 69 +-
.../torch_geometric/utils/_segment.py | 27 +-
.../torch_geometric/utils/_select.py | 2 +-
.../torch_geometric/utils/_softmax.py | 14 +-
.../torch_geometric/utils/_sort_edge_index.py | 75 +-
.../torch_geometric/utils/_spmm.py | 35 +-
.../torch_geometric/utils/_subgraph.py | 209 +-
.../torch_geometric/utils/_to_dense_adj.py | 7 +-
.../torch_geometric/utils/_to_dense_batch.py | 3 +-
.../utils/_train_test_split_edges.py | 7 +-
.../utils/_tree_decomposition.py | 55 +-
.../torch_geometric/utils/_trim_to_layer.py | 45 +-
.../torch_geometric/utils/_unbatch.py | 6 +-
.../torch_geometric/utils/augmentation.py | 5 +-
.../torch_geometric/utils/convert.py | 165 +-
.../torch_geometric/utils/cross_entropy.py | 92 +
.../torch_geometric/utils/dropout.py | 32 +-
.../torch_geometric/utils/embedding.py | 6 +-
.../torch_geometric/utils/functions.py | 1 -
.../torch_geometric/utils/geodesic.py | 34 +-
.../torch_geometric/utils/hetero.py | 48 +-
.../torch_geometric/utils/isolated.py | 4 +-
.../torch_geometric/utils/laplacian.py | 20 +-
.../torch_geometric/utils/loop.py | 768 +++++++
.../torch_geometric/utils/map.py | 11 +-
.../torch_geometric/utils/mask.py | 22 +-
.../torch_geometric/utils/mesh_laplacian.py | 8 +-
.../torch_geometric/utils/mixin.py | 22 +
.../torch_geometric/utils/nested.py | 8 +-
.../torch_geometric/utils/noise_scheduler.py | 109 +
.../torch_geometric/utils/num_nodes.py | 26 +-
.../torch_geometric/utils/ppr.py | 15 +-
.../torch_geometric/utils/random.py | 6 -
.../torch_geometric/utils/repeat.py | 0
.../torch_geometric/utils/smiles.py | 58 +-
.../torch_geometric/utils/sparse.py | 328 ++-
.../torch_geometric/utils/undirected.py | 84 +-
.../torch_geometric/visualization/__init__.py | 2 +
.../torch_geometric/visualization/graph.py | 23 +-
.../visualization/influence.py | 5 +-
.../torch_geometric/warnings.py | 21 +
1459 files changed, 28391 insertions(+), 10474 deletions(-)
delete mode 100644 pytorch_geometric-2.4.0/.gitattributes
delete mode 100644 pytorch_geometric-2.4.0/.github/labeler.yml
delete mode 100644 pytorch_geometric-2.4.0/.github/workflows/linting.yml
delete mode 100644 pytorch_geometric-2.4.0/.gitignore
delete mode 100644 pytorch_geometric-2.4.0/docs/source/.gitignore
delete mode 100644 pytorch_geometric-2.4.0/docs/source/_figures/.gitignore
delete mode 100644 pytorch_geometric-2.4.0/docs/source/advanced/jit.rst
delete mode 100644 pytorch_geometric-2.4.0/docs/source/tutorial/multi_gpu.rst
delete mode 100644 pytorch_geometric-2.4.0/examples/distributed/pyg/partition_graph.py
delete mode 100644 pytorch_geometric-2.4.0/examples/distributed/pyg/partition_hetero_graph.py
delete mode 100644 pytorch_geometric-2.4.0/examples/multi_gpu/papers100m_multigpu.py
delete mode 100644 pytorch_geometric-2.4.0/test/distributed/test_local_graph_store.py
delete mode 100644 pytorch_geometric-2.4.0/test/distributed/test_partition.py
delete mode 100644 pytorch_geometric-2.4.0/test/nn/conv/test_fa_conv.py
delete mode 100644 pytorch_geometric-2.4.0/test/nn/conv/test_fused_gat_conv.py
delete mode 100644 pytorch_geometric-2.4.0/test/nn/test_data_parallel.py
delete mode 100644 pytorch_geometric-2.4.0/test/transforms/test_gdc.py
delete mode 100644 pytorch_geometric-2.4.0/test/utils/test_segment.py
delete mode 100644 pytorch_geometric-2.4.0/torch_geometric/compile.py
delete mode 100644 pytorch_geometric-2.4.0/torch_geometric/data/__init__.py
delete mode 100644 pytorch_geometric-2.4.0/torch_geometric/data/makedirs.py
delete mode 100644 pytorch_geometric-2.4.0/torch_geometric/distributed/__init__.py
delete mode 100644 pytorch_geometric-2.4.0/torch_geometric/distributed/dist_neighbor_sampler.py
delete mode 100644 pytorch_geometric-2.4.0/torch_geometric/distributed/partition.py
delete mode 100644 pytorch_geometric-2.4.0/torch_geometric/distributed/utils.py
delete mode 100644 pytorch_geometric-2.4.0/torch_geometric/io/tu.py
delete mode 100644 pytorch_geometric-2.4.0/torch_geometric/io/txt_array.py
delete mode 100644 pytorch_geometric-2.4.0/torch_geometric/loader/mixin.py
delete mode 100644 pytorch_geometric-2.4.0/torch_geometric/nn/conv/message_passing.jinja
delete mode 100644 pytorch_geometric-2.4.0/torch_geometric/nn/conv/utils/helpers.py
delete mode 100644 pytorch_geometric-2.4.0/torch_geometric/nn/conv/utils/inspector.py
delete mode 100644 pytorch_geometric-2.4.0/torch_geometric/nn/conv/utils/jit.py
delete mode 100644 pytorch_geometric-2.4.0/torch_geometric/nn/conv/utils/typing.py
delete mode 100644 pytorch_geometric-2.4.0/torch_geometric/nn/models/rect.py
delete mode 100644 pytorch_geometric-2.4.0/torch_geometric/nn/sequential.jinja
delete mode 100644 pytorch_geometric-2.4.0/torch_geometric/nn/sequential.py
delete mode 100644 pytorch_geometric-2.4.0/torch_geometric/transforms/remove_isolated_nodes.py
delete mode 100644 pytorch_geometric-2.4.0/torch_geometric/utils/cross_entropy.py
delete mode 100644 pytorch_geometric-2.4.0/torch_geometric/utils/loop.py
delete mode 100644 pytorch_geometric-2.4.0/torch_geometric/utils/mixin.py
delete mode 100644 pytorch_geometric-2.4.0/torch_geometric/warnings.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/.github/CODEOWNERS (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/.github/CONTRIBUTING.md (84%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/.github/ISSUE_TEMPLATE/bug-report.yml (78%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/.github/ISSUE_TEMPLATE/config.yml (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/.github/ISSUE_TEMPLATE/documentation.yml (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/.github/ISSUE_TEMPLATE/feature-request.yml (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/.github/ISSUE_TEMPLATE/installation.yml (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/.github/ISSUE_TEMPLATE/refactor.yml (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/.github/actions/setup/action.yml (92%)
create mode 100644 pytorch_geometric-2.5.2/.github/labeler.yml
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/.github/workflows/building_pyg_conda.yml (80%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/.github/workflows/building_rusty1s_conda.yml (80%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/.github/workflows/changelog.yml (100%)
create mode 100644 pytorch_geometric-2.5.2/.github/workflows/dist_testing.yml
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/.github/workflows/documentation.yml (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/.github/workflows/examples.yml (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/.github/workflows/full_gpu_testing.yml (85%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/.github/workflows/full_testing.yml (90%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/.github/workflows/labeler.yml (91%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/.github/workflows/latest_testing.yml (91%)
create mode 100644 pytorch_geometric-2.5.2/.github/workflows/linting.yml
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/.github/workflows/minimal_testing.yml (91%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/.github/workflows/nightly.yml (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/.github/workflows/prev_testing.yml (85%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/.github/workflows/testing.yml (88%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/.pre-commit-config.yaml (70%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/CHANGELOG.md (88%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/CITATION.cff (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/LICENSE (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/README.md (65%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/README.md (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/citation/README.md (61%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/citation/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/citation/appnp.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/citation/arma.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/citation/cheb.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/citation/datasets.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/citation/gat.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/citation/gcn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/citation/inference.sh (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/citation/run.sh (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/citation/sgc.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/citation/statistics.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/citation/train_eval.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/inference/README.md (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/inference/inference_benchmark.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/kernel/README.md (57%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/kernel/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/kernel/asap.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/kernel/datasets.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/kernel/diff_pool.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/kernel/edge_pool.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/kernel/gcn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/kernel/gin.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/kernel/global_attention.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/kernel/graclus.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/kernel/graph_sage.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/kernel/main.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/kernel/main_performance.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/kernel/sag_pool.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/kernel/set2set.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/kernel/sort_pool.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/kernel/statistics.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/kernel/top_k.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/kernel/train_eval.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/loader/neighbor_loader.py (100%)
create mode 100644 pytorch_geometric-2.5.2/benchmark/multi_gpu/training/README.md
create mode 100644 pytorch_geometric-2.5.2/benchmark/multi_gpu/training/common.py
create mode 100644 pytorch_geometric-2.5.2/benchmark/multi_gpu/training/training_benchmark_cuda.py
create mode 100644 pytorch_geometric-2.5.2/benchmark/multi_gpu/training/training_benchmark_xpu.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/points/README.md (56%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/points/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/points/datasets.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/points/edge_cnn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/points/mpnn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/points/point_cnn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/points/point_net.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/points/spline_cnn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/points/statistics.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/points/train_eval.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/runtime/README.md (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/runtime/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/runtime/dgl/gat.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/runtime/dgl/gcn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/runtime/dgl/hidden.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/runtime/dgl/main.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/runtime/dgl/rgcn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/runtime/dgl/train.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/runtime/gat.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/runtime/gcn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/runtime/main.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/runtime/rgcn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/runtime/train.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/setup.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/training/README.md (90%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/training/training_benchmark.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/utils/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/utils/hetero_gat.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/utils/hetero_sage.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/benchmark/utils/utils.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/codecov.yml (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/conda/pyg/README.md (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/conda/pyg/build_conda.sh (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/conda/pyg/meta.yaml (80%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/conda/pytorch-geometric/README.md (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/conda/pytorch-geometric/build_conda.sh (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/conda/pytorch-geometric/meta.yaml (81%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docker/Dockerfile (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docker/README.md (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docker/singularity (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/Makefile (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/README.md (80%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/requirements.txt (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_figures/architecture.svg (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_figures/build.sh (100%)
create mode 100644 pytorch_geometric-2.5.2/docs/source/_figures/dist_part.png
create mode 100644 pytorch_geometric-2.5.2/docs/source/_figures/dist_proc.png
create mode 100644 pytorch_geometric-2.5.2/docs/source/_figures/dist_sampling.png
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_figures/graph.svg (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_figures/graph.tex (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_figures/graphgym_design_space.png (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_figures/graphgym_evaluation.png (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_figures/graphgym_results.png (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_figures/hg_example.svg (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_figures/hg_example.tex (100%)
create mode 100644 pytorch_geometric-2.5.2/docs/source/_figures/intel_kumo.png
create mode 100644 pytorch_geometric-2.5.2/docs/source/_figures/point_cloud1.png
create mode 100644 pytorch_geometric-2.5.2/docs/source/_figures/point_cloud2.png
create mode 100644 pytorch_geometric-2.5.2/docs/source/_figures/point_cloud3.png
create mode 100644 pytorch_geometric-2.5.2/docs/source/_figures/point_cloud4.png
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_figures/remote_1.png (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_figures/remote_2.png (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_figures/remote_3.png (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_figures/shallow_node_embeddings.png (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_figures/to_hetero.svg (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_figures/to_hetero.tex (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_figures/to_hetero_with_bases.svg (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_figures/to_hetero_with_bases.tex (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_figures/training_affinity.png (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_static/js/version_alert.js (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_static/thumbnails/create_dataset.png (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_static/thumbnails/create_gnn.png (100%)
create mode 100644 pytorch_geometric-2.5.2/docs/source/_static/thumbnails/distributed_pyg.png
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_static/thumbnails/explain.png (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_static/thumbnails/heterogeneous.png (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_static/thumbnails/load_csv.png (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_static/thumbnails/multi_gpu_vanilla.png (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_static/thumbnails/neighbor_loader.png (100%)
create mode 100644 pytorch_geometric-2.5.2/docs/source/_static/thumbnails/point_cloud.png
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_static/thumbnails/shallow_node_embeddings.png (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_templates/autosummary/class.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_templates/autosummary/inherited_class.rst (100%)
create mode 100644 pytorch_geometric-2.5.2/docs/source/_templates/autosummary/metrics.rst
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_templates/autosummary/nn.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/_templates/autosummary/only_class.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/advanced/batching.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/advanced/compile.rst (66%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/advanced/cpu_affinity.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/advanced/graphgym.rst (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/advanced/hgam.rst (100%)
create mode 100644 pytorch_geometric-2.5.2/docs/source/advanced/jit.rst
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/advanced/remote.rst (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/advanced/sparse_tensor.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/cheatsheet/data_cheatsheet.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/cheatsheet/gnn_cheatsheet.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/conf.py (64%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/external/resources.rst (78%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/get_started/colabs.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/get_started/introduction.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/index.rst (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/install/installation.rst (87%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/install/quick-start.html (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/modules/contrib.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/modules/data.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/modules/datasets.rst (100%)
create mode 100644 pytorch_geometric-2.5.2/docs/source/modules/distributed.rst
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/modules/explain.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/modules/graphgym.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/modules/loader.rst (100%)
create mode 100644 pytorch_geometric-2.5.2/docs/source/modules/metrics.rst
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/modules/nn.rst (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/modules/profile.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/modules/root.rst (63%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/modules/sampler.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/modules/transforms.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/modules/utils.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/notes/batching.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/notes/cheatsheet.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/notes/colabs.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/notes/create_dataset.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/notes/create_gnn.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/notes/data_cheatsheet.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/notes/explain.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/notes/graphgym.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/notes/heterogeneous.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/notes/installation.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/notes/introduction.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/notes/jit.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/notes/load_csv.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/notes/remote.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/notes/resources.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/notes/sparse_tensor.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/tutorial/application.rst (90%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/tutorial/compile.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/tutorial/create_dataset.rst (86%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/tutorial/create_gnn.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/tutorial/dataset.rst (100%)
create mode 100644 pytorch_geometric-2.5.2/docs/source/tutorial/distributed.rst
create mode 100644 pytorch_geometric-2.5.2/docs/source/tutorial/distributed_pyg.rst
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/tutorial/explain.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/tutorial/gnn_design.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/tutorial/heterogeneous.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/tutorial/load_csv.rst (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/tutorial/multi_gpu_vanilla.rst (56%)
create mode 100644 pytorch_geometric-2.5.2/docs/source/tutorial/multi_node_multi_gpu_vanilla.rst
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/tutorial/neighbor_loader.rst (100%)
create mode 100644 pytorch_geometric-2.5.2/docs/source/tutorial/point_cloud.rst
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/docs/source/tutorial/shallow_node_embeddings.rst (100%)
create mode 100644 pytorch_geometric-2.5.2/examples/README.md
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/agnn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/argva_node_clustering.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/arma.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/attentive_fp.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/autoencoder.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/cluster_gcn_ppi.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/cluster_gcn_reddit.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/colors_topk_pool.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/compile/gcn.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/compile/gin.py (95%)
create mode 100644 pytorch_geometric-2.5.2/examples/contrib/README.md
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/contrib/pgm_explainer_graph_classification.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/contrib/pgm_explainer_node_classification.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/contrib/rbcd_attack.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/contrib/rbcd_attack_poisoning.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/cora.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/correct_and_smooth.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/cpp/CMakeLists.txt (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/cpp/README.md (83%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/cpp/main.cpp (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/cpp/save_model.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/datapipe.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/dgcnn_classification.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/dgcnn_segmentation.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/dir_gnn.py (100%)
create mode 100644 pytorch_geometric-2.5.2/examples/distributed/README.md
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/distributed/graphlearn_for_pytorch/README.md (94%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/distributed/graphlearn_for_pytorch/dist_train_sage_sup_config.yml (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/distributed/graphlearn_for_pytorch/dist_train_sage_supervised.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/distributed/graphlearn_for_pytorch/launch.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/distributed/graphlearn_for_pytorch/partition_ogbn_dataset.py (100%)
rename {pytorch_geometric-2.4.0/examples => pytorch_geometric-2.5.2/examples/distributed}/kuzu/README.md (100%)
rename {pytorch_geometric-2.4.0/examples => pytorch_geometric-2.5.2/examples/distributed}/kuzu/papers_100M/README.md (96%)
rename {pytorch_geometric-2.4.0/examples => pytorch_geometric-2.5.2/examples/distributed}/kuzu/papers_100M/prepare_data.py (100%)
rename {pytorch_geometric-2.4.0/examples => pytorch_geometric-2.5.2/examples/distributed}/kuzu/papers_100M/train.py (89%)
create mode 100644 pytorch_geometric-2.5.2/examples/distributed/pyg/README.md
create mode 100644 pytorch_geometric-2.5.2/examples/distributed/pyg/launch.py
create mode 100644 pytorch_geometric-2.5.2/examples/distributed/pyg/node_ogb_cpu.py
create mode 100644 pytorch_geometric-2.5.2/examples/distributed/pyg/partition_graph.py
create mode 100644 pytorch_geometric-2.5.2/examples/distributed/pyg/run_dist.sh
create mode 100644 pytorch_geometric-2.5.2/examples/distributed/pyg/temporal_link_movielens_cpu.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/dna.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/egc.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/equilibrium_median.py (83%)
create mode 100644 pytorch_geometric-2.5.2/examples/explain/README.md
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/explain/captum_explainer.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/explain/captum_explainer_hetero_link.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/explain/gnn_explainer.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/explain/gnn_explainer_ba_shapes.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/explain/gnn_explainer_link_pred.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/explain/graphmask_explainer.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/faust.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/film.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/gat.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/gcn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/gcn2_cora.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/gcn2_ppi.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/geniepath.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/glnn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/graph_gps.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/graph_sage_unsup.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/graph_sage_unsup_ppi.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/graph_saint.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/graph_unet.py (100%)
create mode 100644 pytorch_geometric-2.5.2/examples/hetero/README.md
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/hetero/bipartite_sage.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/hetero/bipartite_sage_unsup.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/hetero/dmgi_unsup.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/hetero/han_imdb.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/hetero/hetero_conv_dblp.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/hetero/hetero_link_pred.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/hetero/hgt_dblp.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/hetero/hierarchical_sage.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/hetero/load_csv.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/hetero/metapath2vec.py (100%)
create mode 100644 pytorch_geometric-2.5.2/examples/hetero/recommender_system.py
create mode 100644 pytorch_geometric-2.5.2/examples/hetero/temporal_link_pred.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/hetero/to_hetero_mag.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/hierarchical_sampling.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/infomax_inductive.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/infomax_transductive.py (100%)
create mode 100644 pytorch_geometric-2.5.2/examples/jit/README.md
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/jit/film.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/jit/gat.py (87%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/jit/gcn.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/jit/gin.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/kge_fb15k_237.py (90%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/label_prop.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/lcm_aggr_2nd_min.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/lightgcn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/link_pred.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/linkx.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/mem_pool.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/mixhop.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/mnist_graclus.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/mnist_nn_conv.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/mnist_voxel_grid.py (100%)
create mode 100644 pytorch_geometric-2.5.2/examples/multi_gpu/README.md
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/multi_gpu/data_parallel.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/multi_gpu/distributed_batching.py (100%)
create mode 100644 pytorch_geometric-2.5.2/examples/multi_gpu/distributed_sampling.py
rename pytorch_geometric-2.4.0/examples/multi_gpu/distributed_sampling.py => pytorch_geometric-2.5.2/examples/multi_gpu/distributed_sampling_multinode.py (64%)
create mode 100644 pytorch_geometric-2.5.2/examples/multi_gpu/distributed_sampling_multinode.sbatch
create mode 100644 pytorch_geometric-2.5.2/examples/multi_gpu/distributed_sampling_xpu.py
create mode 100644 pytorch_geometric-2.5.2/examples/multi_gpu/model_parallel.py
create mode 100644 pytorch_geometric-2.5.2/examples/multi_gpu/papers100m_gcn.py
create mode 100644 pytorch_geometric-2.5.2/examples/multi_gpu/papers100m_gcn_multinode.py
rename pytorch_geometric-2.4.0/examples/multi_gpu/taobao_multigpu_large.py => pytorch_geometric-2.5.2/examples/multi_gpu/taobao.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/mutag_gin.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/node2vec.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/ogbn_papers_100m.py (94%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/ogbn_products_gat.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/ogbn_products_sage.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/ogbn_proteins_deepgcn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/ogc.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/pmlp.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/pna.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/point_transformer_classification.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/point_transformer_segmentation.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/pointnet2_classification.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/pointnet2_segmentation.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/ppi.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/proteins_diff_pool.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/proteins_dmon_pool.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/proteins_gmt.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/proteins_mincut_pool.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/proteins_topk_pool.py (100%)
create mode 100644 pytorch_geometric-2.5.2/examples/pytorch_ignite/README.md
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/pytorch_ignite/gin.py (100%)
create mode 100644 pytorch_geometric-2.5.2/examples/pytorch_lightning/README.md
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/pytorch_lightning/gin.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/pytorch_lightning/graph_sage.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/pytorch_lightning/relational_gnn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/qm9_nn_conv.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/qm9_pretrained_dimenet.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/qm9_pretrained_schnet.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/quiver/README.md (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/quiver/multi_gpu_quiver.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/quiver/single_gpu_quiver.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/randlanet_classification.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/randlanet_segmentation.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/rect.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/reddit.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/renet.py (72%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/rev_gnn.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/rgat.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/rgcn.py (91%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/rgcn_link_pred.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/seal_link_pred.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/sgc.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/shadow.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/sign.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/signed_gcn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/super_gat.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/tagcn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/tensorboard_logging.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/tgn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/triangles_sag_pool.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/unimp_arxiv.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/upfd.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/examples/wl_kernel.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/agg_batch.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/configs/example.yaml (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/configs/pyg/example_graph.yaml (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/configs/pyg/example_link.yaml (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/configs/pyg/example_node.yaml (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/configs_gen.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/act/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/act/example.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/config/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/config/example.py (87%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/encoder/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/encoder/example.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/head/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/head/example.py (94%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/layer/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/layer/example.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/loader/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/loader/example.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/loss/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/loss/example.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/network/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/network/example.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/optimizer/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/optimizer/example.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/pooling/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/pooling/example.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/stage/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/stage/example.py (94%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/train/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/train/example.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/custom_graphgym/transform/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/grids/example.txt (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/grids/pyg/example.txt (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/main.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/parallel.sh (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/run_batch.sh (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/run_single.sh (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/sample/dimensions.txt (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/graphgym/sample/dimensionsatt.txt (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/pyproject.toml (65%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/readthedocs.yml (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/conftest.py (65%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/contrib/explain/test_pgm_explainer.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/contrib/nn/models/test_rbcd_attack.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/data/lightning/test_datamodule.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/data/test_batch.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/data/test_data.py (86%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/data/test_database.py (79%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/data/test_datapipes.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/data/test_dataset.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/data/test_dataset_summary.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/data/test_feature_store.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/data/test_graph_store.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/data/test_hetero_data.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/data/test_hypergraph_data.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/data/test_inherit.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/data/test_on_disk_dataset.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/data/test_remote_backend_utils.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/data/test_storage.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/data/test_temporal.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/data/test_view.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/datasets/graph_generator/test_ba_graph.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/datasets/graph_generator/test_er_graph.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/datasets/graph_generator/test_grid_graph.py (100%)
create mode 100644 pytorch_geometric-2.5.2/test/datasets/graph_generator/test_tree_graph.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/datasets/motif_generator/test_custom_motif.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/datasets/motif_generator/test_cycle_motif.py (100%)
create mode 100644 pytorch_geometric-2.5.2/test/datasets/motif_generator/test_grid_motif.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/datasets/motif_generator/test_house_motif.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/datasets/test_ba_shapes.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/datasets/test_bzr.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/datasets/test_elliptic.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/datasets/test_enzymes.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/datasets/test_explainer_dataset.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/datasets/test_fake.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/datasets/test_imdb_binary.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/datasets/test_infection_dataset.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/datasets/test_karate.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/datasets/test_mutag.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/datasets/test_planetoid.py (87%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/datasets/test_snap_dataset.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/datasets/test_suite_sparse.py (100%)
create mode 100644 pytorch_geometric-2.5.2/test/distributed/test_dist_link_neighbor_loader.py
create mode 100644 pytorch_geometric-2.5.2/test/distributed/test_dist_link_neighbor_sampler.py
create mode 100644 pytorch_geometric-2.5.2/test/distributed/test_dist_neighbor_loader.py
create mode 100644 pytorch_geometric-2.5.2/test/distributed/test_dist_neighbor_sampler.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/distributed/test_dist_utils.py (91%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/distributed/test_local_feature_store.py (96%)
create mode 100644 pytorch_geometric-2.5.2/test/distributed/test_local_graph_store.py
create mode 100644 pytorch_geometric-2.5.2/test/distributed/test_partition.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/distributed/test_rpc.py (88%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/explain/algorithm/test_attention_explainer.py (72%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/explain/algorithm/test_captum.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/explain/algorithm/test_captum_explainer.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/explain/algorithm/test_captum_hetero.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/explain/algorithm/test_explain_algorithm_utils.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/explain/algorithm/test_gnn_explainer.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/explain/algorithm/test_graphmask_explainer.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/explain/algorithm/test_pg_explainer.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/explain/conftest.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/explain/metric/test_basic_metric.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/explain/metric/test_faithfulness.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/explain/metric/test_fidelity.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/explain/test_explain_config.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/explain/test_explainer.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/explain/test_explanation.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/explain/test_hetero_explainer.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/explain/test_hetero_explanation.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/graphgym/example_node.yml (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/graphgym/test_config.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/graphgym/test_graphgym.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/graphgym/test_logger.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/graphgym/test_register.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/io/example1.off (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/io/example2.off (100%)
create mode 100644 pytorch_geometric-2.5.2/test/io/test_fs.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/io/test_off.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/loader/test_cache.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/loader/test_cluster.py (94%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/loader/test_dataloader.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/loader/test_dynamic_batch_sampler.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/loader/test_graph_saint.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/loader/test_hgt_loader.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/loader/test_ibmb_loader.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/loader/test_imbalanced_sampler.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/loader/test_link_neighbor_loader.py (100%)
create mode 100644 pytorch_geometric-2.5.2/test/loader/test_mixin.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/loader/test_neighbor_loader.py (79%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/loader/test_neighbor_sampler.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/loader/test_prefetch.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/loader/test_random_node_loader.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/loader/test_shadow.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/loader/test_temporal_dataloader.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/loader/test_utils.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/loader/test_zip_loader.py (100%)
create mode 100644 pytorch_geometric-2.5.2/test/metrics/test_link_pred_metric.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/my_config.yaml (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/aggr/test_aggr_utils.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/aggr/test_attention.py (88%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/aggr/test_basic.py (94%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/aggr/test_deep_sets.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/aggr/test_equilibrium.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/aggr/test_fused.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/aggr/test_gmt.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/aggr/test_gru.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/aggr/test_lcm.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/aggr/test_lstm.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/aggr/test_mlp_aggr.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/aggr/test_multi.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/aggr/test_quantile.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/aggr/test_scaler.py (91%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/aggr/test_set2set.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/aggr/test_set_transformer.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/aggr/test_sort.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/attention/test_performer.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/cugraph/test_cugraph_gat_conv.py (91%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/cugraph/test_cugraph_rgcn_conv.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/cugraph/test_cugraph_sage_conv.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_agnn_conv.py (75%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_antisymmetric_conv.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_appnp.py (85%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_arma_conv.py (69%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_cg_conv.py (61%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_cheb_conv.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_cluster_gcn_conv.py (74%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_create_gnn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_dir_gnn_conv.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_dna_conv.py (81%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_edge_conv.py (71%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_eg_conv.py (87%)
create mode 100644 pytorch_geometric-2.5.2/test/nn/conv/test_fa_conv.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_feast_conv.py (69%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_film_conv.py (62%)
create mode 100644 pytorch_geometric-2.5.2/test/nn/conv/test_fused_gat_conv.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_gat_conv.py (66%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_gated_graph_conv.py (77%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_gatv2_conv.py (59%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_gcn2_conv.py (81%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_gcn_conv.py (79%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_gen_conv.py (73%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_general_conv.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_gin_conv.py (78%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_gmm_conv.py (81%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_gps_conv.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_graph_conv.py (78%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_gravnet_conv.py (77%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_han_conv.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_heat_conv.py (75%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_hetero_conv.py (62%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_hgt_conv.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_hypergraph_conv.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_le_conv.py (71%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_lg_conv.py (56%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_message_passing.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_mf_conv.py (69%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_mixhop_conv.py (77%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_nn_conv.py (79%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_pan_conv.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_pdn_conv.py (69%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_pna_conv.py (88%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_point_conv.py (75%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_point_gnn_conv.py (78%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_point_transformer_conv.py (76%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_ppf_conv.py (76%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_res_gated_graph_conv.py (72%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_rgat_conv.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_rgcn_conv.py (81%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_sage_conv.py (72%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_sg_conv.py (80%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_signed_conv.py (67%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_simple_conv.py (85%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_spline_conv.py (77%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_ssg_conv.py (80%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_static_graph.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_supergat_conv.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_tag_conv.py (79%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_transformer_conv.py (54%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_wl_conv.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_wl_conv_continuous.py (66%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/test_x_conv.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/conv/utils/test_gnn_cheatsheet.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/dense/test_dense_gat_conv.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/dense/test_dense_gcn_conv.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/dense/test_dense_gin_conv.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/dense/test_dense_graph_conv.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/dense/test_dense_sage_conv.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/dense/test_diff_pool.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/dense/test_dmon_pool.py (80%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/dense/test_linear.py (91%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/dense/test_mincut_pool.py (94%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/functional/test_bro.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/functional/test_gini.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/kge/test_complex.py (88%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/kge/test_distmult.py (78%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/kge/test_rotate.py (77%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/kge/test_transe.py (77%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_attentive_fp.py (94%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_autoencoder.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_basic_gnn.py (92%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_correct_and_smooth.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_deep_graph_infomax.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_deepgcn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_dimenet.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_gnnff.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_graph_mixer.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_graph_unet.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_jumping_knowledge.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_label_prop.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_lightgcn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_linkx.py (87%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_mask_label.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_meta.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_metapath2vec.py (65%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_mlp.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_neural_fingerprint.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_node2vec.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_pmlp.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_re_net.py (91%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_rect.py (66%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_rev_gnn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_schnet.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_signed_gcn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/models/test_tgn.py (100%)
create mode 100644 pytorch_geometric-2.5.2/test/nn/models/test_visnet.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/norm/test_batch_norm.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/norm/test_diff_group_norm.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/norm/test_graph_norm.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/norm/test_graph_size_norm.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/norm/test_instance_norm.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/norm/test_layer_norm.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/norm/test_mean_subtraction_norm.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/norm/test_msg_norm.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/norm/test_pair_norm.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/pool/connect/test_filter_edges.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/pool/select/test_select_topk.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/pool/test_approx_knn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/pool/test_asap.py (85%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/pool/test_avg_pool.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/pool/test_consecutive.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/pool/test_decimation.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/pool/test_edge_pool.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/pool/test_glob.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/pool/test_graclus.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/pool/test_knn.py (50%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/pool/test_max_pool.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/pool/test_mem_pool.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/pool/test_pan_pool.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/pool/test_pool.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/pool/test_sag_pool.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/pool/test_topk_pool.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/pool/test_voxel_grid.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/test_compile_basic.py (87%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/test_compile_conv.py (90%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/test_compile_dynamic.py (91%)
create mode 100644 pytorch_geometric-2.5.2/test/nn/test_data_parallel.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/test_encoding.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/test_fvcore.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/test_fx.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/test_inits.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/test_model_hub.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/test_model_summary.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/test_module_dict.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/test_parameter_dict.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/test_reshape.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/test_resolver.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/test_sequential.py (90%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/test_to_fixed_size_transformer.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/test_to_hetero_module.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/test_to_hetero_transformer.py (91%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/test_to_hetero_with_bases_transformer.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/nn/unpool/test_knn_interpolate.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/profile/test_benchmark.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/profile/test_profile.py (63%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/profile/test_profile_utils.py (86%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/profile/test_profiler.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/sampler/test_sampler_base.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/test_config_store.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/test_debug.py (100%)
create mode 100644 pytorch_geometric-2.5.2/test/test_edge_index.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/test_experimental.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/test_home.py (100%)
create mode 100644 pytorch_geometric-2.5.2/test/test_inspector.py
create mode 100644 pytorch_geometric-2.5.2/test/test_isinstance.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/test_seed.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/test_typing.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/test_warnings.py (79%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/testing/test_decorators.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_add_metapaths.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_add_positional_encoding.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_add_remaining_self_loops.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_add_self_loops.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_cartesian.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_center.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_compose.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_constant.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_delaunay.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_distance.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_face_to_edge.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_feature_propagation.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_fixed_points.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_gcn_norm.py (100%)
create mode 100644 pytorch_geometric-2.5.2/test/transforms/test_gdc.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_generate_mesh_normals.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_grid_sampling.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_half_hop.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_knn_graph.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_laplacian_lambda_max.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_largest_connected_components.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_line_graph.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_linear_transformation.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_local_cartesian.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_local_degree_profile.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_mask_transform.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_node_property_split.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_normalize_features.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_normalize_rotation.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_normalize_scale.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_one_hot_degree.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_pad.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_point_pair_features.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_polar.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_radius_graph.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_random_flip.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_random_jitter.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_random_link_split.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_random_node_split.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_random_rotate.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_random_scale.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_random_shear.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_remove_duplicated_edges.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_remove_isolated_nodes.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_remove_training_classes.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_rooted_subgraph.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_sample_points.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_sign.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_spherical.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_svd_feature_reduction.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_target_indegree.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_to_dense.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_to_device.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_to_sparse_tensor.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_to_superpixels.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_to_undirected.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_two_hop.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/transforms/test_virtual_node.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_assortativity.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_augmentation.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_coalesce.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_convert.py (94%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_cross_entropy.py (50%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_degree.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_dropout.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_embedding.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_functions.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_geodesic.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_grid.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_hetero.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_homophily.py (100%)
create mode 100644 pytorch_geometric-2.5.2/test/utils/test_index_sort.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_isolated.py (100%)
rename pytorch_geometric-2.4.0/test/utils/test_get_laplacian.py => pytorch_geometric-2.5.2/test/utils/test_laplacian.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_lexsort.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_loop.py (76%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_map.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_mask.py (100%)
rename pytorch_geometric-2.4.0/test/utils/test_get_mesh_laplacian.py => pytorch_geometric-2.5.2/test/utils/test_mesh_laplacian.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_negative_sampling.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_nested.py (100%)
create mode 100644 pytorch_geometric-2.5.2/test/utils/test_noise_scheduler.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_normalized_cut.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_num_nodes.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_one_hot.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_ppr.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_random.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_repeat.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_scatter.py (93%)
create mode 100644 pytorch_geometric-2.5.2/test/utils/test_segment.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_select.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_smiles.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_softmax.py (82%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_sort_edge_index.py (88%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_sparse.py (84%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_spmm.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_subgraph.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_to_dense_adj.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_to_dense_batch.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_train_test_split_edges.py (100%)
create mode 100644 pytorch_geometric-2.5.2/test/utils/test_tree_decomposition.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_trim_to_layer.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_unbatch.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/utils/test_undirected.py (64%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/visualization/test_graph_visualization.py (67%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/test/visualization/test_influence.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/__init__.py (82%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/_compile.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/backend.py (92%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/config_store.py (76%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/contrib/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/contrib/datasets/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/contrib/explain/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/contrib/explain/pgm_explainer.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/contrib/nn/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/contrib/nn/conv/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/contrib/nn/models/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/contrib/nn/models/rbcd_attack.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/contrib/transforms/__init__.py (100%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/data/__init__.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/data/batch.py (82%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/data/collate.py (82%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/data/data.py (85%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/data/database.py (75%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/data/datapipes.py (85%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/data/dataset.py (83%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/data/download.py (58%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/data/extract.py (84%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/data/feature_store.py (90%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/data/graph_store.py (88%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/data/hetero_data.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/data/hypergraph_data.py (82%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/data/in_memory_dataset.py (82%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/data/lightning/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/data/lightning/datamodule.py (91%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/data/makedirs.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/data/on_disk_dataset.py (90%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/data/remote_backend_utils.py (65%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/data/separate.py (66%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/data/storage.py (75%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/data/summary.py (80%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/data/temporal.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/data/view.py (63%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/__init__.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/actor.py (72%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/airfrans.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/airports.py (78%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/amazon.py (86%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/amazon_book.py (81%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/amazon_products.py (75%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/aminer.py (87%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/aqsol.py (88%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/attributed_graph_dataset.py (82%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/ba2motif_dataset.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/ba_multi_shapes.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/ba_shapes.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/bitcoin_otc.py (65%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/brca_tgca.py (87%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/citation_full.py (85%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/coauthor.py (86%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/coma.py (86%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/dblp.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/dbp15k.py (84%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/deezer_europe.py (77%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/dgraph.py (83%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/dynamic_faust.py (88%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/elliptic.py (83%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/elliptic_temporal.py (92%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/email_eu_core.py (79%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/entities.py (80%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/explainer_dataset.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/facebook.py (76%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/fake.py (84%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/faust.py (81%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/flickr.py (75%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/freebase.py (75%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/gdelt.py (76%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/gdelt_lite.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/ged_dataset.py (86%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/gemsec.py (78%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/geometry.py (78%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/github.py (78%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/gnn_benchmark_dataset.py (90%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/graph_generator/__init__.py (81%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/graph_generator/ba_graph.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/graph_generator/base.py (61%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/graph_generator/er_graph.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/graph_generator/grid_graph.py (100%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/datasets/graph_generator/tree_graph.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/heterophilous_graph_dataset.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/hgb_dataset.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/hm.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/hydro_net.py (86%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/icews.py (82%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/igmc_dataset.py (92%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/imdb.py (85%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/infection_dataset.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/jodie.py (87%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/karate.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/last_fm.py (86%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/lastfm_asia.py (76%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/linkx_dataset.py (85%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/lrgb.py (94%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/malnet_tiny.py (88%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/md17.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/mixhop_synthetic_dataset.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/mnist_superpixels.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/modelnet.py (87%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/molecule_net.py (76%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/motif_generator/__init__.py (83%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/motif_generator/base.py (59%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/motif_generator/custom.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/motif_generator/cycle.py (99%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/datasets/motif_generator/grid.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/motif_generator/house.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/movie_lens.py (85%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/movie_lens_100k.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/movie_lens_1m.py (92%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/myket.py (88%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/nell.py (79%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/neurograph.py (88%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/ogb_mag.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/omdb.py (82%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/ose_gvcs.py (78%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/particle.py (88%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/pascal.py (78%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/pascal_pf.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/pcpnet_dataset.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/pcqm4m.py (92%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/planetoid.py (88%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/polblogs.py (81%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/ppi.py (88%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/qm7.py (88%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/qm9.py (92%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/datasets/rcdd.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/reddit.py (86%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/reddit2.py (79%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/rel_link_pred_dataset.py (82%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/s3dis.py (84%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/sbm_dataset.py (72%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/shapenet.py (91%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/shrec2016.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/snap_dataset.py (81%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/suite_sparse.py (72%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/taobao.py (84%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/tosca.py (91%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/tu_dataset.py (78%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/twitch.py (83%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/upfd.py (90%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/utils/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/utils/cheatsheet.py (85%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/webkb.py (78%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/wikics.py (82%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/wikidata.py (82%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/wikipedia_network.py (75%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/willow_object_class.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/word_net.py (77%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/yelp.py (78%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/datasets/zinc.py (92%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/debug.py (74%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/deprecation.py (59%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/distributed/__init__.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/distributed/dist_context.py (100%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/distributed/dist_link_neighbor_loader.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/distributed/dist_loader.py (71%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/distributed/dist_neighbor_loader.py
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/distributed/dist_neighbor_sampler.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/distributed/event_loop.py (81%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/distributed/local_feature_store.py (77%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/distributed/local_graph_store.py (58%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/distributed/partition.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/distributed/rpc.py (77%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/distributed/utils.py
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/edge_index.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/experimental.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/explain/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/explain/algorithm/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/explain/algorithm/attention_explainer.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/explain/algorithm/base.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/explain/algorithm/captum.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/explain/algorithm/captum_explainer.py (92%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/explain/algorithm/dummy_explainer.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/explain/algorithm/gnn_explainer.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/explain/algorithm/graphmask_explainer.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/explain/algorithm/pg_explainer.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/explain/algorithm/utils.py (90%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/explain/config.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/explain/explainer.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/explain/explanation.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/explain/metric/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/explain/metric/basic.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/explain/metric/faithfulness.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/explain/metric/fidelity.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/benchmark.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/checkpoint.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/cmd_args.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/config.py (94%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/contrib/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/contrib/act/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/contrib/config/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/contrib/encoder/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/contrib/head/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/contrib/layer/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/contrib/layer/generalconv.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/contrib/loader/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/contrib/loss/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/contrib/network/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/contrib/optimizer/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/contrib/pooling/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/contrib/stage/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/contrib/train/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/contrib/transform/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/imports.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/init.py (91%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/loader.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/logger.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/loss.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/model_builder.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/models/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/models/act.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/models/encoder.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/models/gnn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/models/head.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/models/layer.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/models/pooling.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/models/transform.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/optim.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/register.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/train.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/utils/LICENSE (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/utils/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/utils/agg_runs.py (81%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/utils/comp_budget.py (92%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/utils/device.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/utils/epoch.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/utils/io.py (71%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/utils/plot.py (91%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/graphgym/utils/tools.py (73%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/home.py (82%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/inspector.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/io/__init__.py (100%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/io/fs.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/io/npz.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/io/obj.py (68%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/io/off.py (77%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/io/planetoid.py (60%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/io/ply.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/io/sdf.py (76%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/io/tu.py
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/io/txt_array.py
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/isinstance.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/lazy_loader.py (68%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/loader/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/loader/base.py (85%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/loader/cache.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/loader/cluster.py (77%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/loader/data_list_loader.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/loader/dataloader.py (86%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/loader/dense_data_loader.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/loader/dynamic_batch_sampler.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/loader/graph_saint.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/loader/hgt_loader.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/loader/ibmb_loader.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/loader/imbalanced_sampler.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/loader/link_loader.py (85%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/loader/link_neighbor_loader.py (93%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/loader/mixin.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/loader/neighbor_loader.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/loader/neighbor_sampler.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/loader/node_loader.py (73%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/loader/prefetch.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/loader/random_node_loader.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/loader/shadow.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/loader/temporal_dataloader.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/loader/utils.py (79%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/loader/zip_loader.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/logging.py (90%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/metrics/__init__.py
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/metrics/link_pred.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/aggr/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/aggr/attention.py (69%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/aggr/base.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/aggr/basic.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/aggr/deep_sets.py (63%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/aggr/equilibrium.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/aggr/fused.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/aggr/gmt.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/aggr/gru.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/aggr/lcm.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/aggr/lstm.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/aggr/mlp.py (88%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/aggr/multi.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/aggr/quantile.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/aggr/scaler.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/aggr/set2set.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/aggr/set_transformer.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/aggr/sort.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/aggr/utils.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/attention/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/attention/performer.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/__init__.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/agnn_conv.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/antisymmetric_conv.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/appnp.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/arma_conv.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/cg_conv.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/cheb_conv.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/cluster_gcn_conv.py (97%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/nn/conv/collect.jinja
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/cugraph/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/cugraph/base.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/cugraph/gat_conv.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/cugraph/rgcn_conv.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/cugraph/sage_conv.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/dir_gnn_conv.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/dna_conv.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/edge_conv.py (92%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/nn/conv/edge_updater.jinja
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/eg_conv.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/fa_conv.py (78%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/feast_conv.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/film_conv.py (91%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/fused_gat_conv.py (80%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/gat_conv.py (70%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/gated_graph_conv.py (92%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/gatv2_conv.py (77%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/gcn2_conv.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/gcn_conv.py (86%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/gen_conv.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/general_conv.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/gin_conv.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/gmm_conv.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/gps_conv.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/graph_conv.py (91%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/gravnet_conv.py (94%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/han_conv.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/heat_conv.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/hetero_conv.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/hgt_conv.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/hypergraph_conv.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/le_conv.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/lg_conv.py (92%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/message_passing.py (63%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/mf_conv.py (91%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/mixhop_conv.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/nn_conv.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/pan_conv.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/pdn_conv.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/pna_conv.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/point_conv.py (92%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/point_gnn_conv.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/point_transformer_conv.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/ppf_conv.py (94%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/nn/conv/propagate.jinja
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/res_gated_graph_conv.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/rgat_conv.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/rgcn_conv.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/sage_conv.py (94%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/sg_conv.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/signed_conv.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/simple_conv.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/spline_conv.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/ssg_conv.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/supergat_conv.py (94%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/tag_conv.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/transformer_conv.py (82%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/utils/__init__.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/utils/cheatsheet.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/wl_conv.py (90%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/wl_conv_continuous.py (90%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/conv/x_conv.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/data_parallel.py (80%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/dense/__init__.py (84%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/dense/dense_gat_conv.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/dense/dense_gcn_conv.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/dense/dense_gin_conv.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/dense/dense_graph_conv.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/dense/dense_sage_conv.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/dense/diff_pool.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/dense/dmon_pool.py (78%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/dense/linear.py (71%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/dense/mincut_pool.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/encoding.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/functional/__init__.py (71%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/functional/bro.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/functional/gini.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/fx.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/glob.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/inits.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/kge/__init__.py (83%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/kge/base.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/kge/complex.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/kge/distmult.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/kge/loader.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/kge/rotate.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/kge/transe.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/lr_scheduler.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/model_hub.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/__init__.py (86%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/attentive_fp.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/autoencoder.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/basic_gnn.py (88%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/captum.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/correct_and_smooth.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/deep_graph_infomax.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/deepgcn.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/dimenet.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/dimenet_utils.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/gnnff.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/graph_mixer.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/graph_unet.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/jumping_knowledge.py (94%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/label_prop.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/lightgcn.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/linkx.py (69%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/mask_label.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/meta.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/metapath2vec.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/mlp.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/neural_fingerprint.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/node2vec.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/pmlp.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/re_net.py (98%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/nn/models/rect.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/rev_gnn.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/schnet.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/signed_gcn.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/models/tgn.py (96%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/nn/models/visnet.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/module_dict.py (86%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/norm/__init__.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/norm/batch_norm.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/norm/diff_group_norm.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/norm/graph_norm.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/norm/graph_size_norm.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/norm/instance_norm.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/norm/layer_norm.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/norm/mean_subtraction_norm.py (94%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/norm/msg_norm.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/norm/pair_norm.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/parameter_dict.py (86%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/pool/__init__.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/pool/approx_knn.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/pool/asap.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/pool/avg_pool.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/pool/connect/__init__.py (51%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/pool/connect/base.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/pool/connect/filter_edges.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/pool/consecutive.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/pool/decimation.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/pool/edge_pool.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/pool/glob.py (90%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/pool/graclus.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/pool/knn.py (56%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/pool/max_pool.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/pool/mem_pool.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/pool/pan_pool.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/pool/pool.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/pool/sag_pool.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/pool/select/__init__.py (53%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/pool/select/base.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/pool/select/topk.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/pool/topk_pool.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/pool/voxel_grid.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/reshape.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/resolver.py (100%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/nn/sequential.jinja
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/nn/sequential.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/summary.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/to_fixed_size_transformer.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/to_hetero_module.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/to_hetero_transformer.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/to_hetero_with_bases_transformer.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/unpool/__init__.py (79%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/nn/unpool/knn_interpolate.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/profile/__init__.py (63%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/profile/benchmark.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/profile/profile.py (67%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/profile/profiler.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/profile/utils.py (81%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/resolver.py (83%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/sampler/__init__.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/sampler/base.py (91%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/sampler/hgt_sampler.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/sampler/neighbor_sampler.py (83%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/sampler/utils.py (86%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/seed.py (78%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/template.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/testing/__init__.py (78%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/testing/asserts.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/testing/data.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/testing/decorators.py (65%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/testing/feature_store.py (63%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/testing/graph_store.py (83%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/__init__.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/add_metapaths.py (76%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/add_positional_encoding.py (77%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/add_remaining_self_loops.py (80%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/add_self_loops.py (79%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/base_transform.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/cartesian.py (91%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/center.py (92%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/compose.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/constant.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/delaunay.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/distance.py (90%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/face_to_edge.py (90%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/feature_propagation.py (87%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/fixed_points.py (84%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/gcn_norm.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/gdc.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/generate_mesh_normals.py (86%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/grid_sampling.py (79%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/half_hop.py (91%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/knn_graph.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/laplacian_lambda_max.py (86%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/largest_connected_components.py (82%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/line_graph.py (87%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/linear_transformation.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/local_cartesian.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/local_degree_profile.py (80%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/mask.py (87%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/node_property_split.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/normalize_features.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/normalize_rotation.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/normalize_scale.py (81%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/one_hot_degree.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/pad.py (77%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/point_pair_features.py (97%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/polar.py (95%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/radius_graph.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/random_flip.py (90%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/random_jitter.py (60%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/random_link_split.py (92%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/random_node_split.py (98%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/random_rotate.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/random_scale.py (88%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/random_shear.py (89%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/remove_duplicated_edges.py (90%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/transforms/remove_isolated_nodes.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/remove_training_classes.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/rooted_subgraph.py (84%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/sample_points.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/sign.py (72%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/spherical.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/svd_feature_reduction.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/target_indegree.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/to_dense.py (71%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/to_device.py (96%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/to_sparse_tensor.py (91%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/to_superpixels.py (94%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/to_undirected.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/two_hop.py (72%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/transforms/virtual_node.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/typing.py (88%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/utils/__init__.py (74%)
rename pytorch_geometric-2.4.0/torch_geometric/utils/assortativity.py => pytorch_geometric-2.5.2/torch_geometric/utils/_assortativity.py (97%)
rename pytorch_geometric-2.4.0/torch_geometric/utils/coalesce.py => pytorch_geometric-2.5.2/torch_geometric/utils/_coalesce.py (68%)
rename pytorch_geometric-2.4.0/torch_geometric/utils/degree.py => pytorch_geometric-2.5.2/torch_geometric/utils/_degree.py (99%)
rename pytorch_geometric-2.4.0/torch_geometric/utils/grid.py => pytorch_geometric-2.5.2/torch_geometric/utils/_grid.py (84%)
rename pytorch_geometric-2.4.0/torch_geometric/utils/homophily.py => pytorch_geometric-2.5.2/torch_geometric/utils/_homophily.py (91%)
rename pytorch_geometric-2.4.0/torch_geometric/utils/sort.py => pytorch_geometric-2.5.2/torch_geometric/utils/_index_sort.py (65%)
rename pytorch_geometric-2.4.0/torch_geometric/utils/lexsort.py => pytorch_geometric-2.5.2/torch_geometric/utils/_lexsort.py (84%)
rename pytorch_geometric-2.4.0/torch_geometric/utils/negative_sampling.py => pytorch_geometric-2.5.2/torch_geometric/utils/_negative_sampling.py (94%)
rename pytorch_geometric-2.4.0/torch_geometric/utils/normalized_cut.py => pytorch_geometric-2.5.2/torch_geometric/utils/_normalized_cut.py (99%)
rename pytorch_geometric-2.4.0/torch_geometric/utils/one_hot.py => pytorch_geometric-2.5.2/torch_geometric/utils/_one_hot.py (100%)
rename pytorch_geometric-2.4.0/torch_geometric/utils/scatter.py => pytorch_geometric-2.5.2/torch_geometric/utils/_scatter.py (85%)
rename pytorch_geometric-2.4.0/torch_geometric/utils/segment.py => pytorch_geometric-2.5.2/torch_geometric/utils/_segment.py (52%)
rename pytorch_geometric-2.4.0/torch_geometric/utils/select.py => pytorch_geometric-2.5.2/torch_geometric/utils/_select.py (97%)
rename pytorch_geometric-2.4.0/torch_geometric/utils/softmax.py => pytorch_geometric-2.5.2/torch_geometric/utils/_softmax.py (83%)
rename pytorch_geometric-2.4.0/torch_geometric/utils/sort_edge_index.py => pytorch_geometric-2.5.2/torch_geometric/utils/_sort_edge_index.py (56%)
rename pytorch_geometric-2.4.0/torch_geometric/utils/spmm.py => pytorch_geometric-2.5.2/torch_geometric/utils/_spmm.py (86%)
rename pytorch_geometric-2.4.0/torch_geometric/utils/subgraph.py => pytorch_geometric-2.5.2/torch_geometric/utils/_subgraph.py (74%)
rename pytorch_geometric-2.4.0/torch_geometric/utils/to_dense_adj.py => pytorch_geometric-2.5.2/torch_geometric/utils/_to_dense_adj.py (94%)
rename pytorch_geometric-2.4.0/torch_geometric/utils/to_dense_batch.py => pytorch_geometric-2.5.2/torch_geometric/utils/_to_dense_batch.py (98%)
rename pytorch_geometric-2.4.0/torch_geometric/utils/train_test_split_edges.py => pytorch_geometric-2.5.2/torch_geometric/utils/_train_test_split_edges.py (96%)
rename pytorch_geometric-2.4.0/torch_geometric/utils/tree_decomposition.py => pytorch_geometric-2.5.2/torch_geometric/utils/_tree_decomposition.py (76%)
rename pytorch_geometric-2.4.0/torch_geometric/utils/trim_to_layer.py => pytorch_geometric-2.5.2/torch_geometric/utils/_trim_to_layer.py (85%)
rename pytorch_geometric-2.4.0/torch_geometric/utils/unbatch.py => pytorch_geometric-2.5.2/torch_geometric/utils/_unbatch.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/utils/augmentation.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/utils/convert.py (80%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/utils/cross_entropy.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/utils/dropout.py (94%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/utils/embedding.py (93%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/utils/functions.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/utils/geodesic.py (83%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/utils/hetero.py (78%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/utils/isolated.py (97%)
rename pytorch_geometric-2.4.0/torch_geometric/utils/get_laplacian.py => pytorch_geometric-2.5.2/torch_geometric/utils/laplacian.py (86%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/utils/loop.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/utils/map.py (94%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/utils/mask.py (77%)
rename pytorch_geometric-2.4.0/torch_geometric/utils/get_mesh_laplacian.py => pytorch_geometric-2.5.2/torch_geometric/utils/mesh_laplacian.py (94%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/utils/mixin.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/utils/nested.py (95%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/utils/noise_scheduler.py
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/utils/num_nodes.py (80%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/utils/ppr.py (90%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/utils/random.py (99%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/utils/repeat.py (100%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/utils/smiles.py (73%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/utils/sparse.py (62%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/utils/undirected.py (74%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/visualization/__init__.py (79%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/visualization/graph.py (83%)
rename {pytorch_geometric-2.4.0 => pytorch_geometric-2.5.2}/torch_geometric/visualization/influence.py (74%)
create mode 100644 pytorch_geometric-2.5.2/torch_geometric/warnings.py
diff --git a/README.md b/README.md
index b73f46d..5bb78d9 100644
--- a/README.md
+++ b/README.md
@@ -13,13 +13,13 @@
# Build environment
```
Ubuntu 22.04
-PyTorch 2.2.0
+PyTorch 2.2.2
ROCm 6.0.2
```
# Current version
```
-pytorch_geometric-2.4.0
+pytorch_geometric-2.5.2
pytorch_scatter-2.1.2
pytorch_sparse-0.6.18
pytorch_cluster-1.6.3
diff --git a/pytorch_geometric-2.4.0/.gitattributes b/pytorch_geometric-2.4.0/.gitattributes
deleted file mode 100644
index d9bd16b..0000000
--- a/pytorch_geometric-2.4.0/.gitattributes
+++ /dev/null
@@ -1 +0,0 @@
-*.py text eol=lf
diff --git a/pytorch_geometric-2.4.0/.github/labeler.yml b/pytorch_geometric-2.4.0/.github/labeler.yml
deleted file mode 100644
index 2973b4a..0000000
--- a/pytorch_geometric-2.4.0/.github/labeler.yml
+++ /dev/null
@@ -1,41 +0,0 @@
-documentation:
- - docs/**/*
-
-example:
- - examples/**/*
-
-data:
- - torch_geometric/data/**/*
-
-dataset:
- - torch_geometric/io/**/*
- - torch_geometric/datasets/**/*
-
-sampler:
- - torch_geometric/sampler/**/*
-
-loader:
- - torch_geometric/loader/**/*
-
-nn:
- - torch_geometric/nn/**/*
-
-explain:
- - torch_geometric/explain/**/*
-
-transform:
- - torch_geometric/transforms/**/*
-
-utils:
- - torch_geometric/utils/**/*
-
-contrib:
- - torch_geometric/contrib/**/*
-
-graphgym:
- - graphgym/**/*
- - torch_geometric/graphgym/**/*
-
-benchmark:
- - benchmark/**/*
- - torch_geometric/profile/**/*
diff --git a/pytorch_geometric-2.4.0/.github/workflows/linting.yml b/pytorch_geometric-2.4.0/.github/workflows/linting.yml
deleted file mode 100644
index 77da597..0000000
--- a/pytorch_geometric-2.4.0/.github/workflows/linting.yml
+++ /dev/null
@@ -1,69 +0,0 @@
-name: Linting
-
-on: # yamllint disable-line rule:truthy
- push:
- branches:
- - master
- pull_request:
-
-jobs:
-
- pyright:
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout repository
- uses: actions/checkout@v4
-
- - name: Setup packages
- uses: ./.github/actions/setup
- with:
- full_install: false
-
- - name: Install pyright
- run: |
- pip install pyright
-
- - name: Run pyright
- continue-on-error: true
- run: |
- pyright
-
- pylint:
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout repository
- uses: actions/checkout@v4
-
- - name: Set up Python
- uses: actions/setup-python@v4.3.0
- with:
- python-version: 3.8
-
- - name: Install dependencies
- run: pip install pylint
-
- - name: Run linting
- continue-on-error: true
- run: pylint **/*.py
-
- mypy:
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout repository
- uses: actions/checkout@v4
-
- - name: Set up Python
- uses: actions/setup-python@v4.3.0
- with:
- python-version: 3.8
-
- - name: Install dependencies
- run: pip install mypy
-
- - name: Check type hints
- continue-on-error: true
- run: |
- mypy --install-types --non-interactive --ignore-missing-imports -m torch_geometric
diff --git a/pytorch_geometric-2.4.0/.gitignore b/pytorch_geometric-2.4.0/.gitignore
deleted file mode 100644
index 9c2d824..0000000
--- a/pytorch_geometric-2.4.0/.gitignore
+++ /dev/null
@@ -1,32 +0,0 @@
-__pycache__/
-.pytest_cache/
-.DS_Store
-data/
-build/
-dist/
-alpha/
-runs/
-wandb/
-.cache/
-.eggs/
-lightning_logs/
-outputs/
-graphgym/datasets/
-graphgym/results/
-*.egg-info/
-.ipynb_checkpoints
-.coverage
-.coverage.*
-coverage.xml
-.vscode
-.idea
-.venv
-*.out
-*.pt
-*.onnx
-examples/**/*.png
-examples/**/*.pdf
-benchmark/results/
-
-!torch_geometric/data/
-!test/data/
diff --git a/pytorch_geometric-2.4.0/docs/source/.gitignore b/pytorch_geometric-2.4.0/docs/source/.gitignore
deleted file mode 100644
index 9ab870d..0000000
--- a/pytorch_geometric-2.4.0/docs/source/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-generated/
diff --git a/pytorch_geometric-2.4.0/docs/source/_figures/.gitignore b/pytorch_geometric-2.4.0/docs/source/_figures/.gitignore
deleted file mode 100644
index 3eec47d..0000000
--- a/pytorch_geometric-2.4.0/docs/source/_figures/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-*.aux
-*.log
-*.pdf
diff --git a/pytorch_geometric-2.4.0/docs/source/advanced/jit.rst b/pytorch_geometric-2.4.0/docs/source/advanced/jit.rst
deleted file mode 100644
index 174178f..0000000
--- a/pytorch_geometric-2.4.0/docs/source/advanced/jit.rst
+++ /dev/null
@@ -1,125 +0,0 @@
-TorchScript Support
-===================
-
-TorchScript is a way to create serializable and optimizable models from :pytorch:`PyTorch` code.
-Any TorchScript program can be saved from a Python process and loaded in a process where there is no Python dependency.
-If you are unfamilar with TorchScript, we recommend to read the official "`Introduction to TorchScript `_" tutorial first.
-
-Converting GNN Models
----------------------
-
-Converting your :pyg:`PyG` model to a TorchScript program is straightforward and requires only a few code changes.
-
-As always, it is best understood by an example, so let's consider the following model for now:
-
-.. code-block:: python
-
- import torch
- import torch.nn.functional as F
- from torch_geometric.nn import GCNConv
-
- class GNN(torch.nn.Module):
- def __init__(self, in_channels, out_channels):
- super().__init__()
- self.conv1 = GCNConv(in_channels, 64)
- self.conv2 = GCNConv(64, out_channels)
-
- def forward(self, x, edge_index):
- x = self.conv1(x, edge_index)
- x = F.relu(x)
- x = self.conv2(x, edge_index)
- return F.log_softmax(x, dim=1)
-
- model = GNN(dataset.num_features, dataset.num_classes)
-
-For TorchScript support, we need to convert our GNN operators into "jittable" instances.
-This is done by calling the :func:`~torch_geometric.nn.conv.message_passing.MessagePassing.jittable` function provided by the underlying :class:`~torch_geometric.nn.conv.message_passing.MessagePassing` interface:
-
-.. code-block:: python
-
- def __init__(self, in_channels, out_channels):
- super().__init__()
- self.conv1 = GCNConv(in_channels, 64).jittable()
- self.conv2 = GCNConv(64, out_channels).jittable()
-
-This will create temporary instances of the :class:`~torch_geometric.nn.conv.GCNConv` operator that can now be passed into :func:`torch.jit.script`:
-
-.. code-block:: python
-
- model = torch.jit.script(model)
-
-Under the hood, the :func:`~torch_geometric.nn.conv.message_passing.MessagePassing.jittable` call applies the following two modifications to the original class:
-
-1. It parses and converts the arguments of the internal :func:`~torch_geometric.nn.conv.message_passing.MessagePassing.propagate` function into a :obj:`NamedTuple` which can be handled by the TorchScript compiler.
-2. It replaces any :obj:`Union` arguments of the :func:`forward` function (*i.e.*, arguments that may contain different types) with :obj:`@torch.jit._overload_method` annotations.
- With this, we can do the following while everything remains jittable:
-
-.. code-block:: python
-
- from typing import Union, Tuple
- from torch import Tensor
-
- def forward(self, x: Union[Tensor, Tuple[Tensor, Tensor]], edge_index: Tensor) -> Tensor:
- pass
-
- conv(x, edge_index)
- conv((x_src, x_dst), edge_index)
-
-This technique is, *e.g.*, applied in the :class:`~torch_geometric.nn.conv.SAGEConv` class, which can operate on both single node feature matrices and tuples of node feature matrices at the same time.
-
-And that is all you need to know on how to convert your :pyg:`PyG` models to TorchScript programs.
-You can have a further look at our JIT examples that show-case how to obtain TorchScript programs for `node `_ and `graph classification `_ models.
-
-.. note::
- TorchScript support is still experimental.
- If you have problems converting your model to a TorchScript program, *e.g.*, because an internal function does not support TorchScript yet, please `let us know `_.
-
-Creating Jittable GNN Operators
---------------------------------
-
-All :pyg:`PyG` :class:`~torch_geometric.nn.conv.MessagePassing` operators are tested to be convertible to a TorchScript program.
-However, if you want your own GNN module to be jittable, you need to account for the following two things:
-
-1. As one would expect, your :meth:`forward` code may need to be adjusted so that it passes the TorchScript compiler requirements, *e.g.*, by adding type notations.
-2. You need to tell the :class:`~torch_geometric.nn.conv.message_passing.MessagePassing` module the types that you pass to its :func:`~torch_geometric.nn.conv.message_passing.MessagePassing.propagate` function.
- This can be achieved in two different ways:
-
- 1. Declaring the type of propagation arguments in a dictionary called :obj:`propagate_type`:
-
- .. code-block:: python
-
- from typing import Optional
- from torch import Tensor
- from torch_geometric.nn import MessagePassing
-
- class MyConv(MessagePassing):
-
- propagate_type = {'x': Tensor, 'edge_weight': Optional[Tensor] }
-
- def forward(self, x: Tensor, edge_index: Tensor,
- edge_weight: Optional[Tensor]) -> Tensor:
-
- return self.propagate(edge_index, x=x, edge_weight=edge_weight,
- size=None)
-
- 2. Declaring the type of propagation arguments as a comment anywhere inside your module:
-
- .. code-block:: python
-
- from typing import Optional
- from torch import Tensor
- from torch_geometric.nn import MessagePassing
-
- class MyConv(MessagePassing):
-
- def forward(self, x: Tensor, edge_index: Tensor,
- edge_weight: Optional[Tensor]) -> Tensor:
-
- # propagate_type: (x: Tensor, edge_weight: Optional[Tensor])
- return self.propagate(edge_index, x=x, edge_weight=edge_weight,
- size=None)
-
-.. warning::
-
- Importantly, due to TorchScript limitations, one also has to pass in the :obj:`size` attribute to :meth:`~torch_geometric.nn.conv.message_passing.MessagePassing.propagate`.
- In most cases, this can be simply set to :obj:`None` in which case it will be automatically inferred.
diff --git a/pytorch_geometric-2.4.0/docs/source/tutorial/multi_gpu.rst b/pytorch_geometric-2.4.0/docs/source/tutorial/multi_gpu.rst
deleted file mode 100644
index 405426e..0000000
--- a/pytorch_geometric-2.4.0/docs/source/tutorial/multi_gpu.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-Multi-GPU Training
-==================
-
-.. nbgallery::
- :name: rst-gallery
-
- multi_gpu_vanilla
diff --git a/pytorch_geometric-2.4.0/examples/distributed/pyg/partition_graph.py b/pytorch_geometric-2.4.0/examples/distributed/pyg/partition_graph.py
deleted file mode 100644
index 816e050..0000000
--- a/pytorch_geometric-2.4.0/examples/distributed/pyg/partition_graph.py
+++ /dev/null
@@ -1,56 +0,0 @@
-import argparse
-import os
-import os.path as osp
-
-import torch
-from ogb.nodeproppred import PygNodePropPredDataset
-
-from torch_geometric.distributed import Partitioner
-
-
-def partition_dataset(
- ogbn_dataset: str,
- root_dir: str,
- num_parts: int,
- recursive: bool = False,
-):
- save_dir = osp.join(root_dir, f'{ogbn_dataset}-partitions')
- dataset = PygNodePropPredDataset(ogbn_dataset)
- data = dataset[0]
-
- partitioner = Partitioner(data, num_parts, save_dir, recursive)
- partitioner.generate_partition()
- split_idx = dataset.get_idx_split()
-
- print('-- Saving label ...')
- label_dir = osp.join(root_dir, f'{ogbn_dataset}-label')
- os.makedirs(label_dir, exist_ok=True)
- torch.save(data.y.squeeze(), osp.join(label_dir, 'label.pt'))
-
- print('-- Partitioning training indices ...')
- train_idx = split_idx['train']
- train_idx = train_idx.split(train_idx.size(0) // num_parts)
- train_part_dir = osp.join(root_dir, f'{ogbn_dataset}-train-partitions')
- os.makedirs(train_part_dir, exist_ok=True)
- for i in range(num_parts):
- torch.save(train_idx[i], osp.join(train_part_dir, f'partition{i}.pt'))
-
- print('-- Partitioning test indices ...')
- test_idx = split_idx['test']
- test_idx = test_idx.split(test_idx.size(0) // num_parts)
- test_part_dir = osp.join(root_dir, f'{ogbn_dataset}-test-partitions')
- os.makedirs(test_part_dir, exist_ok=True)
- for i in range(num_parts):
- torch.save(test_idx[i], osp.join(test_part_dir, f'partition{i}.pt'))
-
-
-if __name__ == '__main__':
- parser = argparse.ArgumentParser()
- parser.add_argument('--dataset', type=str, default='ogbn-products')
- parser.add_argument('--root_dir', type=str, default='./data/products')
- parser.add_argument('--num_partitions', type=int, default=2)
- parser.add_argument('--recursive', action='store_true')
- args = parser.parse_args()
-
- partition_dataset(args.dataset, args.root_dir, args.num_partitions,
- args.recursive)
diff --git a/pytorch_geometric-2.4.0/examples/distributed/pyg/partition_hetero_graph.py b/pytorch_geometric-2.4.0/examples/distributed/pyg/partition_hetero_graph.py
deleted file mode 100644
index c64bab4..0000000
--- a/pytorch_geometric-2.4.0/examples/distributed/pyg/partition_hetero_graph.py
+++ /dev/null
@@ -1,55 +0,0 @@
-import argparse
-import os
-import os.path as osp
-
-import torch
-
-from torch_geometric.datasets import OGB_MAG
-from torch_geometric.distributed import Partitioner
-
-
-def partition_dataset(
- ogbn_dataset: str,
- root_dir: str,
- num_parts: int,
- recursive: bool = False,
-):
- save_dir = osp.join(root_dir, f'{ogbn_dataset}-partitions')
- dataset = OGB_MAG(root=ogbn_dataset, preprocess='metapath2vec')
- data = dataset[0]
-
- partitioner = Partitioner(data, num_parts, save_dir, recursive)
- partitioner.generate_partition()
-
- print('-- Saving label ...')
- label_dir = osp.join(root_dir, f'{ogbn_dataset}-label')
- os.makedirs(label_dir, exist_ok=True)
- torch.save(data['paper'].y.squeeze(), osp.join(label_dir, 'label.pt'))
-
- print('-- Partitioning training indices ...')
- train_idx = data['paper'].train_mask.nonzero().view(-1)
- train_idx = train_idx.split(train_idx.size(0) // num_parts)
- train_part_dir = osp.join(root_dir, f'{ogbn_dataset}-train-partitions')
- os.makedirs(train_part_dir, exist_ok=True)
- for i in range(num_parts):
- torch.save(train_idx[i], osp.join(train_part_dir, f'partition{i}.pt'))
-
- print('-- Partitioning test indices ...')
- test_idx = data['paper'].test_mask.nonzero().view(-1)
- test_idx = test_idx.split(test_idx.size(0) // num_parts)
- test_part_dir = osp.join(root_dir, f'{ogbn_dataset}-test-partitions')
- os.makedirs(test_part_dir, exist_ok=True)
- for i in range(num_parts):
- torch.save(test_idx[i], osp.join(test_part_dir, f'partition{i}.pt'))
-
-
-if __name__ == '__main__':
- parser = argparse.ArgumentParser()
- parser.add_argument('--dataset', type=str, default='ogbn-mag')
- parser.add_argument('--root_dir', type=str, default='./data/mag')
- parser.add_argument('--num_partitions', type=int, default=2)
- parser.add_argument('--recursive', type=bool, default=False)
- args = parser.parse_args()
-
- partition_dataset(args.dataset, args.root_dir, args.num_partitions,
- args.recursive)
diff --git a/pytorch_geometric-2.4.0/examples/multi_gpu/papers100m_multigpu.py b/pytorch_geometric-2.4.0/examples/multi_gpu/papers100m_multigpu.py
deleted file mode 100644
index 7a36835..0000000
--- a/pytorch_geometric-2.4.0/examples/multi_gpu/papers100m_multigpu.py
+++ /dev/null
@@ -1,137 +0,0 @@
-import argparse
-import os
-import time
-
-import torch
-import torch.distributed as dist
-import torch.multiprocessing as mp
-import torch.nn.functional as F
-from ogb.nodeproppred import PygNodePropPredDataset
-from torch.nn.parallel import DistributedDataParallel
-from torchmetrics import Accuracy
-
-from torch_geometric.loader import NeighborLoader
-from torch_geometric.nn import GCNConv
-
-
-def pyg_num_work():
- num_work = None
- if hasattr(os, "sched_getaffinity"):
- try:
- num_work = len(os.sched_getaffinity(0)) / 2
- except Exception:
- pass
- if num_work is None:
- num_work = os.cpu_count() / 2
- return int(num_work)
-
-
-class GCN(torch.nn.Module):
- def __init__(self, in_channels, hidden_channels, out_channels):
- super().__init__()
- self.conv1 = GCNConv(in_channels, hidden_channels)
- self.conv2 = GCNConv(hidden_channels, out_channels)
-
- def forward(self, x, edge_index, edge_weight=None):
- x = F.dropout(x, p=0.5, training=self.training)
- x = self.conv1(x, edge_index, edge_weight).relu()
- x = F.dropout(x, p=0.5, training=self.training)
- x = self.conv2(x, edge_index, edge_weight)
- return x
-
-
-def run_train(rank, data, world_size, model, epochs, batch_size, fan_out,
- split_idx, num_classes):
- os.environ['MASTER_ADDR'] = 'localhost'
- os.environ['MASTER_PORT'] = '12355'
- dist.init_process_group('nccl', rank=rank, world_size=world_size)
- split_idx['train'] = split_idx['train'].split(
- split_idx['train'].size(0) // world_size, dim=0)[rank].clone()
- model = model.to(rank)
- model = DistributedDataParallel(model, device_ids=[rank])
- optimizer = torch.optim.Adam(model.parameters(), lr=0.01,
- weight_decay=0.0005)
- train_loader = NeighborLoader(data, num_neighbors=[fan_out, fan_out],
- input_nodes=split_idx['train'],
- batch_size=batch_size,
- num_workers=pyg_num_work())
- if rank == 0:
- eval_loader = NeighborLoader(data, num_neighbors=[fan_out, fan_out],
- input_nodes=split_idx['valid'],
- batch_size=batch_size,
- num_workers=pyg_num_work())
- test_loader = NeighborLoader(data, num_neighbors=[fan_out, fan_out],
- input_nodes=split_idx['test'],
- batch_size=batch_size,
- num_workers=pyg_num_work())
- eval_steps = 100
- acc = Accuracy(task="multiclass", num_classes=num_classes).to(rank)
- if rank == 0:
- print("Beginning training...")
- for epoch in range(epochs):
- for i, batch in enumerate(train_loader):
- if i >= 10:
- start = time.time()
- batch = batch.to(rank)
- batch.y = batch.y.to(torch.long)
- optimizer.zero_grad()
- out = model(batch.x, batch.edge_index)
- loss = F.cross_entropy(out[:batch_size], batch.y[:batch_size])
- loss.backward()
- optimizer.step()
- if rank == 0 and i % 10 == 0:
- print("Epoch: " + str(epoch) + ", Iteration: " + str(i) +
- ", Loss: " + str(loss))
- if rank == 0:
- print("Average Training Iteration Time:",
- (time.time() - start) / (i - 10), "s/iter")
- acc_sum = 0.0
- with torch.no_grad():
- for i, batch in enumerate(eval_loader):
- if i >= eval_steps:
- break
- if i >= 10:
- start = time.time()
- batch = batch.to(rank)
- batch.y = batch.y.to(torch.long)
- out = model(batch.x, batch.edge_index)
- acc_sum += acc(out[:batch_size].softmax(dim=-1),
- batch.y[:batch_size])
- print(f"Validation Accuracy: {acc_sum/(i) * 100.0:.4f}%", )
- print("Average Inference Iteration Time:",
- (time.time() - start) / (i - 10), "s/iter")
- if rank == 0:
- acc_sum = 0.0
- with torch.no_grad():
- for i, batch in enumerate(test_loader):
- batch = batch.to(rank)
- batch.y = batch.y.to(torch.long)
- out = model(batch.x, batch.edge_index)
- acc_sum += acc(out[:batch_size].softmax(dim=-1),
- batch.y[:batch_size])
- print(f"Test Accuracy: {acc_sum/(i) * 100.0:.4f}%", )
-
-
-if __name__ == '__main__':
- parser = argparse.ArgumentParser()
- parser.add_argument('--hidden_channels', type=int, default=64)
- parser.add_argument('--lr', type=float, default=0.01)
- parser.add_argument('--epochs', type=int, default=3)
- parser.add_argument('--batch_size', type=int, default=128)
- parser.add_argument('--fan_out', type=int, default=50)
-
- args = parser.parse_args()
-
- dataset = PygNodePropPredDataset(name='ogbn-papers100M')
- split_idx = dataset.get_idx_split()
- data = dataset[0]
- data.y = data.y.reshape(-1)
- model = GCN(dataset.num_features, args.hidden_channels,
- dataset.num_classes)
- print("Data =", data)
- world_size = torch.cuda.device_count()
- print('Let\'s use', world_size, 'GPUs!')
- mp.spawn(
- run_train, args=(data, world_size, model, args.epochs, args.batch_size,
- args.fan_out, split_idx, dataset.num_classes),
- nprocs=world_size, join=True)
diff --git a/pytorch_geometric-2.4.0/test/distributed/test_local_graph_store.py b/pytorch_geometric-2.4.0/test/distributed/test_local_graph_store.py
deleted file mode 100644
index ce83082..0000000
--- a/pytorch_geometric-2.4.0/test/distributed/test_local_graph_store.py
+++ /dev/null
@@ -1,74 +0,0 @@
-import torch
-
-from torch_geometric.distributed import LocalGraphStore
-from torch_geometric.testing import get_random_edge_index
-
-
-def test_local_graph_store():
- graph_store = LocalGraphStore()
-
- edge_index = get_random_edge_index(100, 100, 300)
- edge_id = torch.tensor([1, 2, 3, 5, 8, 4])
-
- graph_store.put_edge_index(edge_index, edge_type=None, layout='coo',
- size=(100, 100))
-
- graph_store.put_edge_id(edge_id, edge_type=None, layout='coo',
- size=(100, 100))
-
- assert len(graph_store.get_all_edge_attrs()) == 1
- edge_attr = graph_store.get_all_edge_attrs()[0]
- assert torch.equal(graph_store.get_edge_index(edge_attr), edge_index)
- assert torch.equal(graph_store.get_edge_id(edge_attr), edge_id)
-
- graph_store.remove_edge_index(edge_attr)
- graph_store.remove_edge_id(edge_attr)
- assert len(graph_store.get_all_edge_attrs()) == 0
-
-
-def test_homogeneous_graph_store():
- edge_id = torch.randperm(300)
- edge_index = get_random_edge_index(100, 100, 300)
-
- graph_store = LocalGraphStore.from_data(edge_id, edge_index, num_nodes=100)
-
- assert len(graph_store.get_all_edge_attrs()) == 1
- edge_attr = graph_store.get_all_edge_attrs()[0]
- assert edge_attr.edge_type is None
- assert edge_attr.layout.value == 'coo'
- assert not edge_attr.is_sorted
- assert edge_attr.size == (100, 100)
-
- assert torch.equal(
- graph_store.get_edge_id(edge_type=None, layout='coo'),
- edge_id,
- )
- assert torch.equal(
- graph_store.get_edge_index(edge_type=None, layout='coo'),
- edge_index,
- )
-
-
-def test_heterogeneous_graph_store():
- edge_type = ('paper', 'to', 'paper')
- edge_id_dict = {edge_type: torch.randperm(300)}
- edge_index_dict = {edge_type: get_random_edge_index(100, 100, 300)}
-
- graph_store = LocalGraphStore.from_hetero_data(
- edge_id_dict, edge_index_dict, num_nodes_dict={'paper': 100})
-
- assert len(graph_store.get_all_edge_attrs()) == 1
- edge_attr = graph_store.get_all_edge_attrs()[0]
- assert edge_attr.edge_type == edge_type
- assert edge_attr.layout.value == 'coo'
- assert not edge_attr.is_sorted
- assert edge_attr.size == (100, 100)
-
- assert torch.equal(
- graph_store.get_edge_id(edge_type, layout='coo'),
- edge_id_dict[edge_type],
- )
- assert torch.equal(
- graph_store.get_edge_index(edge_type, layout='coo'),
- edge_index_dict[edge_type],
- )
diff --git a/pytorch_geometric-2.4.0/test/distributed/test_partition.py b/pytorch_geometric-2.4.0/test/distributed/test_partition.py
deleted file mode 100644
index 2190653..0000000
--- a/pytorch_geometric-2.4.0/test/distributed/test_partition.py
+++ /dev/null
@@ -1,166 +0,0 @@
-import os.path as osp
-
-import pytest
-import torch
-
-from torch_geometric.datasets import FakeDataset, FakeHeteroDataset
-from torch_geometric.distributed import (
- LocalFeatureStore,
- LocalGraphStore,
- Partitioner,
-)
-from torch_geometric.typing import EdgeTypeStr
-
-try:
- # TODO Using `pyg-lib` metis partitioning leads to some weird bugs in the
- # CI. As such, we require `torch-sparse` for these tests for now.
- rowptr = torch.tensor([0, 1])
- col = torch.tensor([0])
- torch.ops.torch_sparse.partition(rowptr, col, None, 1, True)
- WITH_METIS = True
-except (AttributeError, RuntimeError):
- WITH_METIS = False
-
-
-@pytest.mark.skipif(not WITH_METIS, reason='Not compiled with METIS support')
-def test_partition_data(tmp_path):
- data = FakeDataset()[0]
- num_parts = 2
-
- partitioner = Partitioner(data, num_parts, tmp_path)
- partitioner.generate_partition()
-
- node_map_path = osp.join(tmp_path, 'node_map.pt')
- assert osp.exists(node_map_path)
- node_map = torch.load(node_map_path)
- assert node_map.numel() == data.num_nodes
-
- edge_map_path = osp.join(tmp_path, 'edge_map.pt')
- assert osp.exists(edge_map_path)
- edge_map = torch.load(edge_map_path)
- assert edge_map.numel() == data.num_edges
-
- meta_path = osp.join(tmp_path, 'META.json')
- assert osp.exists(meta_path)
-
- graph0_path = osp.join(tmp_path, 'part_0', 'graph.pt')
- assert osp.exists(graph0_path)
- graph0 = torch.load(graph0_path)
- assert len({'edge_id', 'row', 'col', 'size'} & set(graph0.keys())) == 4
-
- graph1_path = osp.join(tmp_path, 'part_1', 'graph.pt')
- assert osp.exists(graph1_path)
- graph1 = torch.load(graph1_path)
- assert len({'edge_id', 'row', 'col', 'size'} & set(graph1.keys())) == 4
-
- node_feats0_path = osp.join(tmp_path, 'part_0', 'node_feats.pt')
- assert osp.exists(node_feats0_path)
- node_feats0 = torch.load(node_feats0_path)
-
- node_feats1_path = osp.join(tmp_path, 'part_1', 'node_feats.pt')
- assert osp.exists(node_feats1_path)
- node_feats1 = torch.load(node_feats1_path)
-
- assert (node_feats0['feats']['x'].size(0) +
- node_feats1['feats']['x'].size(0) == data.num_nodes)
- assert torch.equal(data.x[node_feats0['global_id']],
- node_feats0['feats']['x'])
- assert torch.equal(data.x[node_feats1['global_id']],
- node_feats1['feats']['x'])
-
-
-@pytest.mark.skipif(not WITH_METIS, reason='Not compiled with METIS support')
-def test_partition_hetero_data(tmp_path):
- data = FakeHeteroDataset()[0]
- num_parts = 2
-
- partitioner = Partitioner(data, num_parts, tmp_path)
- partitioner.generate_partition()
-
- meta_path = osp.join(tmp_path, 'META.json')
- assert osp.exists(meta_path)
-
- for edge_type, num_edges in data.num_edges_dict.items():
- assert len(edge_type) == 3
- edge_name = EdgeTypeStr(edge_type)
- edge_map_path = osp.join(tmp_path, 'edge_map', f'{edge_name}.pt')
- assert osp.exists(edge_map_path)
- edge_map = torch.load(edge_map_path)
- assert edge_map.numel() == num_edges
-
- for node_type, num_nodes in data.num_nodes_dict.items():
- node_map_path = osp.join(tmp_path, 'node_map', f'{node_type}.pt')
- assert osp.exists(node_map_path)
- node_map = torch.load(node_map_path)
- assert node_map.numel() == num_nodes
-
- for pid in range(num_parts):
- graph_path = osp.join(tmp_path, f'part_{pid}', 'graph.pt')
- assert osp.exists(graph_path)
- node_feats_path = osp.join(tmp_path, f'part_{pid}', 'node_feats.pt')
- assert osp.exists(node_feats_path)
- edge_feats_path = osp.join(tmp_path, f'part_{pid}', 'edge_feats.pt')
- assert osp.exists(edge_feats_path)
-
-
-@pytest.mark.skipif(not WITH_METIS, reason='Not compiled with METIS support')
-def test_from_partition_data(tmp_path):
- data = FakeDataset()[0]
- num_parts = 2
-
- partitioner = Partitioner(data, num_parts, tmp_path)
- partitioner.generate_partition()
-
- graph_store1 = LocalGraphStore.from_partition(tmp_path, pid=0)
- graph_store2 = LocalGraphStore.from_partition(tmp_path, pid=1)
-
- attr1 = graph_store1.get_all_edge_attrs()[0]
- (row1, col1) = graph_store1.get_edge_index(attr1)
- attr2 = graph_store2.get_all_edge_attrs()[0]
- (row2, col2) = graph_store2.get_edge_index(attr2)
- assert row1.size(0) + row2.size(0) == data.num_edges
-
- feat_store1 = LocalFeatureStore.from_partition(tmp_path, pid=0)
- feat_store2 = LocalFeatureStore.from_partition(tmp_path, pid=1)
-
- node_attr1 = feat_store1.get_all_tensor_attrs()[0]
- assert node_attr1.attr_name == 'x'
- x1 = feat_store1.get_tensor(node_attr1)
- id1 = feat_store1.get_global_id(node_attr1.group_name)
-
- node_attr2 = feat_store2.get_all_tensor_attrs()[0]
- assert node_attr2.attr_name == 'x'
- x2 = feat_store2.get_tensor(node_attr2)
- id2 = feat_store2.get_global_id(node_attr2.group_name)
-
- assert x1.size(0) + x2.size(0) == data.num_nodes
- assert torch.allclose(data.x[id1], x1)
- assert torch.allclose(data.x[id2], x2)
-
-
-@pytest.mark.skipif(not WITH_METIS, reason='Not compiled with METIS support')
-def test_from_partition_hetero_data(tmp_path):
- data = FakeHeteroDataset()[0]
- num_parts = 2
-
- partitioner = Partitioner(data, num_parts, tmp_path)
- partitioner.generate_partition()
-
- graph_store1 = LocalGraphStore.from_partition(tmp_path, pid=0)
- graph_store2 = LocalGraphStore.from_partition(tmp_path, pid=1)
-
- attrs1 = graph_store1.get_all_edge_attrs()
- attrs2 = graph_store2.get_all_edge_attrs()
- assert len(data.edge_types) == len(attrs1) == len(attrs2)
-
- node_types = set()
- for attr in attrs1:
- node_types.add(attr.edge_type[0])
- node_types.add(attr.edge_type[2])
- assert node_types == set(data.node_types)
-
- node_types = set()
- for attr in attrs2:
- node_types.add(attr.edge_type[0])
- node_types.add(attr.edge_type[2])
- assert node_types == set(data.node_types)
diff --git a/pytorch_geometric-2.4.0/test/nn/conv/test_fa_conv.py b/pytorch_geometric-2.4.0/test/nn/conv/test_fa_conv.py
deleted file mode 100644
index d70137f..0000000
--- a/pytorch_geometric-2.4.0/test/nn/conv/test_fa_conv.py
+++ /dev/null
@@ -1,87 +0,0 @@
-import torch
-
-import torch_geometric.typing
-from torch_geometric.nn import FAConv
-from torch_geometric.testing import is_full_test
-from torch_geometric.typing import SparseTensor
-from torch_geometric.utils import to_torch_csc_tensor
-
-
-def test_fa_conv():
- x = torch.randn(4, 16)
- x_0 = torch.randn(4, 16)
- edge_index = torch.tensor([[0, 0, 0, 1, 2, 3], [1, 2, 3, 0, 0, 0]])
- adj1 = to_torch_csc_tensor(edge_index, size=(4, 4))
-
- # adj1 = SparseTensor(row=row, col=col, sparse_sizes=(4, 4))
-
- conv = FAConv(16, eps=1.0, cached=True)
- assert str(conv) == 'FAConv(16, eps=1.0)'
- out = conv(x, x_0, edge_index)
- assert conv._cached_edge_index is not None
- assert out.size() == (4, 16)
-
- if torch_geometric.typing.WITH_TORCH_SPARSE:
- adj2 = SparseTensor.from_edge_index(edge_index, sparse_sizes=(4, 4))
- assert torch.allclose(conv(x, x_0, adj2.t()), out)
- assert conv._cached_adj_t is not None
- assert torch.allclose(conv(x, x_0, adj2.t()), out)
-
- if is_full_test():
- t = '(Tensor, Tensor, Tensor, OptTensor, NoneType) -> Tensor'
- jit = torch.jit.script(conv.jittable(t))
- assert torch.allclose(jit(x, x_0, edge_index), out)
-
- if is_full_test() and torch_geometric.typing.WITH_TORCH_SPARSE:
- t = '(Tensor, Tensor, SparseTensor, OptTensor, NoneType) -> Tensor'
- jit = torch.jit.script(conv.jittable(t))
- assert torch.allclose(jit(x, x_0, adj2.t()), out)
-
- conv.reset_parameters()
- assert conv._cached_edge_index is None
- assert conv._cached_adj_t is None
-
- # Test without caching:
- conv.cached = False
- out = conv(x, x_0, edge_index)
- assert torch.allclose(conv(x, x_0, adj1.t()), out)
- if torch_geometric.typing.WITH_TORCH_SPARSE:
- assert torch.allclose(conv(x, x_0, adj2.t()), out)
-
- # Test `return_attention_weights`:
- result = conv(x, x_0, edge_index, return_attention_weights=True)
- assert torch.allclose(result[0], out)
- assert result[1][0].size() == (2, 10)
- assert result[1][1].size() == (10, )
- assert conv._alpha is None
-
- result = conv(x, x_0, adj1.t(), return_attention_weights=True)
- assert torch.allclose(result[0], out)
- assert result[1][0].size() == torch.Size([4, 4])
- assert result[1][0]._nnz() == 10
- assert conv._alpha is None
-
- if torch_geometric.typing.WITH_TORCH_SPARSE:
- result = conv(x, x_0, adj2.t(), return_attention_weights=True)
- assert torch.allclose(result[0], out)
- assert result[1].sizes() == [4, 4] and result[1].nnz() == 10
- assert conv._alpha is None
-
- if is_full_test():
- t = ('(Tensor, Tensor, Tensor, OptTensor, bool) '
- '-> Tuple[Tensor, Tuple[Tensor, Tensor]]')
- jit = torch.jit.script(conv.jittable(t))
- result = jit(x, x_0, edge_index, return_attention_weights=True)
- assert torch.allclose(result[0], out)
- assert result[1][0].size() == (2, 10)
- assert result[1][1].size() == (10, )
- assert conv._alpha is None
-
- if is_full_test() and torch_geometric.typing.WITH_TORCH_SPARSE:
- t = ('(Tensor, Tensor, SparseTensor, OptTensor, bool) '
- '-> Tuple[Tensor, SparseTensor]')
- jit = torch.jit.script(conv.jittable(t))
- result = jit(x, x_0, adj2.t(), return_attention_weights=True)
- assert torch.allclose(result[0], out)
- assert result[1].sizes() == [4, 4] and result[1].nnz() == 10
- assert conv._alpha is None
diff --git a/pytorch_geometric-2.4.0/test/nn/conv/test_fused_gat_conv.py b/pytorch_geometric-2.4.0/test/nn/conv/test_fused_gat_conv.py
deleted file mode 100644
index 9270975..0000000
--- a/pytorch_geometric-2.4.0/test/nn/conv/test_fused_gat_conv.py
+++ /dev/null
@@ -1,21 +0,0 @@
-import torch
-
-from torch_geometric.nn import FusedGATConv
-from torch_geometric.testing import onlyCUDA, withPackage
-
-
-@onlyCUDA
-@withPackage('dgNN')
-def test_fused_gat_conv():
- device = torch.device('cuda')
-
- x = torch.randn(4, 8, device=device)
- edge_index = torch.tensor([[0, 1, 2, 3], [0, 0, 1, 1]], device=device)
-
- csr, csc, perm = FusedGATConv.to_graph_format(edge_index, size=(4, 4))
-
- conv = FusedGATConv(8, 32, heads=2, add_self_loops=False).to(device)
- assert str(conv) == 'FusedGATConv(8, 32, heads=2)'
-
- out = conv(x, csr, csc, perm)
- assert out.size() == (4, 64)
diff --git a/pytorch_geometric-2.4.0/test/nn/test_data_parallel.py b/pytorch_geometric-2.4.0/test/nn/test_data_parallel.py
deleted file mode 100644
index fd973e8..0000000
--- a/pytorch_geometric-2.4.0/test/nn/test_data_parallel.py
+++ /dev/null
@@ -1,15 +0,0 @@
-import pytest
-import torch
-
-from torch_geometric.data import Data
-from torch_geometric.nn import DataParallel
-from torch_geometric.testing import onlyCUDA
-
-
-@onlyCUDA
-@pytest.mark.skipif(torch.cuda.device_count() < 2, reason='No multiple GPUs')
-def test_data_parallel():
- module = DataParallel(None)
- data_list = [Data(x=torch.randn(x, 1)) for x in [2, 3, 10, 4]]
- batches = module.scatter(data_list, device_ids=[0, 1, 0, 1])
- assert len(batches) == 3
diff --git a/pytorch_geometric-2.4.0/test/transforms/test_gdc.py b/pytorch_geometric-2.4.0/test/transforms/test_gdc.py
deleted file mode 100644
index 4c9e904..0000000
--- a/pytorch_geometric-2.4.0/test/transforms/test_gdc.py
+++ /dev/null
@@ -1,92 +0,0 @@
-import torch
-
-from torch_geometric.data import Data
-from torch_geometric.testing import withPackage
-from torch_geometric.transforms import GDC
-from torch_geometric.utils import to_dense_adj
-
-
-@withPackage('numba')
-def test_gdc():
- edge_index = torch.tensor([[0, 0, 1, 1, 2, 2, 2, 3, 3, 4],
- [1, 2, 0, 2, 0, 1, 3, 2, 4, 3]])
-
- data = Data(edge_index=edge_index, num_nodes=5)
- gdc = GDC(self_loop_weight=1, normalization_in='sym',
- normalization_out='sym',
- diffusion_kwargs=dict(method='ppr', alpha=0.15),
- sparsification_kwargs=dict(method='threshold',
- avg_degree=2), exact=True)
- data = gdc(data)
- mat = to_dense_adj(data.edge_index, edge_attr=data.edge_attr).squeeze()
- assert torch.all(mat >= -1e-8)
- assert torch.allclose(mat, mat.t(), atol=1e-4)
-
- data = Data(edge_index=edge_index, num_nodes=5)
- gdc = GDC(self_loop_weight=1, normalization_in='sym',
- normalization_out='sym',
- diffusion_kwargs=dict(method='heat', t=10),
- sparsification_kwargs=dict(method='threshold',
- avg_degree=2), exact=True)
- data = gdc(data)
- mat = to_dense_adj(data.edge_index, edge_attr=data.edge_attr).squeeze()
- assert torch.all(mat >= -1e-8)
- assert torch.allclose(mat, mat.t(), atol=1e-4)
-
- data = Data(edge_index=edge_index, num_nodes=5)
- gdc = GDC(self_loop_weight=1, normalization_in='col',
- normalization_out='col',
- diffusion_kwargs=dict(method='heat', t=10),
- sparsification_kwargs=dict(method='topk', k=2,
- dim=0), exact=True)
- data = gdc(data)
- mat = to_dense_adj(data.edge_index, edge_attr=data.edge_attr).squeeze()
- col_sum = mat.sum(0)
- assert torch.all(mat >= -1e-8)
- assert torch.all(
- torch.isclose(col_sum, torch.tensor(1.0))
- | torch.isclose(col_sum, torch.tensor(0.0)))
- assert torch.all((~torch.isclose(mat, torch.tensor(0.0))).sum(0) == 2)
-
- data = Data(edge_index=edge_index, num_nodes=5)
- gdc = GDC(self_loop_weight=1, normalization_in='row',
- normalization_out='row',
- diffusion_kwargs=dict(method='heat', t=5),
- sparsification_kwargs=dict(method='topk', k=2,
- dim=1), exact=True)
- data = gdc(data)
- mat = to_dense_adj(data.edge_index, edge_attr=data.edge_attr).squeeze()
- row_sum = mat.sum(1)
- assert torch.all(mat >= -1e-8)
- assert torch.all(
- torch.isclose(row_sum, torch.tensor(1.0))
- | torch.isclose(row_sum, torch.tensor(0.0)))
- assert torch.all((~torch.isclose(mat, torch.tensor(0.0))).sum(1) == 2)
-
- data = Data(edge_index=edge_index, num_nodes=5)
- gdc = GDC(self_loop_weight=1, normalization_in='row',
- normalization_out='row',
- diffusion_kwargs=dict(method='coeff', coeffs=[0.8, 0.3, 0.1]),
- sparsification_kwargs=dict(method='threshold',
- eps=0.1), exact=True)
- data = gdc(data)
- mat = to_dense_adj(data.edge_index, edge_attr=data.edge_attr).squeeze()
- row_sum = mat.sum(1)
- assert torch.all(mat >= -1e-8)
- assert torch.all(
- torch.isclose(row_sum, torch.tensor(1.0))
- | torch.isclose(row_sum, torch.tensor(0.0)))
-
- data = Data(edge_index=edge_index, num_nodes=5)
- gdc = GDC(self_loop_weight=1, normalization_in='sym',
- normalization_out='col',
- diffusion_kwargs=dict(method='ppr', alpha=0.15, eps=1e-4),
- sparsification_kwargs=dict(method='threshold',
- avg_degree=2), exact=False)
- data = gdc(data)
- mat = to_dense_adj(data.edge_index, edge_attr=data.edge_attr).squeeze()
- col_sum = mat.sum(0)
- assert torch.all(mat >= -1e-8)
- assert torch.all(
- torch.isclose(col_sum, torch.tensor(1.0))
- | torch.isclose(col_sum, torch.tensor(0.0)))
diff --git a/pytorch_geometric-2.4.0/test/utils/test_segment.py b/pytorch_geometric-2.4.0/test/utils/test_segment.py
deleted file mode 100644
index 754bbec..0000000
--- a/pytorch_geometric-2.4.0/test/utils/test_segment.py
+++ /dev/null
@@ -1,20 +0,0 @@
-import pytest
-import torch
-
-from torch_geometric.testing import withCUDA, withPackage
-from torch_geometric.utils import segment
-
-
-@withCUDA
-@withPackage('torch_scatter')
-@pytest.mark.parametrize('reduce', ['sum', 'mean', 'min', 'max'])
-def test_segment(device, reduce):
- src = torch.randn(20, 16, device=device)
- ptr = torch.tensor([0, 5, 10, 15, 20], device=device)
-
- out = segment(src, ptr, reduce=reduce)
-
- expected = getattr(torch, reduce)(src.view(4, 5, -1), dim=1)
- expected = expected[0] if isinstance(expected, tuple) else expected
-
- assert torch.allclose(out, expected)
diff --git a/pytorch_geometric-2.4.0/torch_geometric/compile.py b/pytorch_geometric-2.4.0/torch_geometric/compile.py
deleted file mode 100644
index 6fcfc19..0000000
--- a/pytorch_geometric-2.4.0/torch_geometric/compile.py
+++ /dev/null
@@ -1,95 +0,0 @@
-import logging
-import warnings
-from typing import Callable, Optional
-
-import torch
-
-import torch_geometric.typing
-
-JIT_WARNING = ("Could not convert the 'model' into a jittable version. "
- "As such, 'torch.compile' may currently fail to correctly "
- "optimize your model. 'MessagePassing.jittable()' reported "
- "the following error: {error}")
-
-
-def to_jittable(model: torch.nn.Module) -> torch.nn.Module:
- if isinstance(model, torch_geometric.nn.MessagePassing):
- try:
- model = model.jittable()
- except Exception as e:
- warnings.warn(JIT_WARNING.format(error=e))
-
- elif isinstance(model, torch.nn.Module):
- for name, child in model.named_children():
- if isinstance(child, torch_geometric.nn.MessagePassing):
- try:
- setattr(model, name, child.jittable())
- except Exception as e:
- warnings.warn(JIT_WARNING.format(error=e))
- else:
- to_jittable(child)
-
- return model
-
-
-def compile(model: Optional[Callable] = None, *args, **kwargs) -> Callable:
- r"""Optimizes the given :pyg:`PyG` model/function via
- :meth:`torch.compile`.
-
- This function has the same signature as :meth:`torch.compile` (see
- `here `__),
- but it applies further optimization to make :pyg:`PyG` models/functions
- more compiler-friendly.
-
- Specifically, it
-
- 1. temporarily disables the usage of the extension packages
- :obj:`torch_scatter`, :obj:`torch_sparse` and :obj:`pyg_lib`
-
- 2. converts all instances of
- :class:`~torch_geometric.nn.conv.MessagePassing` modules into their
- jittable instances
- (see :meth:`torch_geometric.nn.conv.MessagePassing.jittable`)
-
- .. note::
- Without these adjustments, :meth:`torch.compile` may currently fail to
- correctly optimize your :pyg:`PyG` model.
- We are working on fully relying on :meth:`torch.compile` for future
- releases.
- """
- if model is None:
-
- def fn(model: Callable) -> Callable:
- if model is None:
- raise RuntimeError("'model' cannot be 'None'")
- return compile(model, *args, **kwargs)
-
- return fn
-
- # Disable the usage of external extension packages:
- # TODO (matthias) Disable only temporarily
- prev_state = {
- 'WITH_INDEX_SORT': torch_geometric.typing.WITH_INDEX_SORT,
- 'WITH_TORCH_SCATTER': torch_geometric.typing.WITH_TORCH_SCATTER,
- }
- warnings.filterwarnings('ignore', ".*the 'torch-scatter' package.*")
- for key in prev_state.keys():
- setattr(torch_geometric.typing, key, False)
-
- # Adjust the logging level of `torch.compile`:
- # TODO (matthias) Disable only temporarily
- prev_log_level = {
- 'torch._dynamo': logging.getLogger('torch._dynamo').level,
- 'torch._inductor': logging.getLogger('torch._inductor').level,
- }
- log_level = kwargs.pop('log_level', logging.WARNING)
- for key in prev_log_level.keys():
- logging.getLogger(key).setLevel(log_level)
-
- # Replace instances of `MessagePassing` by their jittable version:
- model = to_jittable(model)
-
- # Finally, run `torch.compile` to create an optimized version:
- out = torch.compile(model, *args, **kwargs)
-
- return out
diff --git a/pytorch_geometric-2.4.0/torch_geometric/data/__init__.py b/pytorch_geometric-2.4.0/torch_geometric/data/__init__.py
deleted file mode 100644
index add215b..0000000
--- a/pytorch_geometric-2.4.0/torch_geometric/data/__init__.py
+++ /dev/null
@@ -1,96 +0,0 @@
-# flake8: noqa
-
-from .feature_store import FeatureStore, TensorAttr
-from .graph_store import GraphStore, EdgeAttr
-from .data import Data
-from .hetero_data import HeteroData
-from .batch import Batch
-from .temporal import TemporalData
-from .database import Database, SQLiteDatabase, RocksDatabase
-from .dataset import Dataset
-from .in_memory_dataset import InMemoryDataset
-from .on_disk_dataset import OnDiskDataset
-from .makedirs import makedirs
-from .download import download_url
-from .extract import extract_tar, extract_zip, extract_bz2, extract_gz
-
-from torch_geometric.lazy_loader import LazyLoader
-
-data_classes = [
- 'Data',
- 'HeteroData',
- 'Batch',
- 'TemporalData',
- 'Dataset',
- 'InMemoryDataset',
- 'OnDiskDataset',
-]
-
-remote_backend_classes = [
- 'FeatureStore',
- 'GraphStore',
- 'TensorAttr',
- 'EdgeAttr',
-]
-
-database_classes = [
- 'Database',
- 'SQLiteDatabase',
- 'RocksDatabase',
-]
-
-helper_functions = [
- 'makedirs',
- 'download_url',
- 'extract_tar',
- 'extract_zip',
- 'extract_bz2',
- 'extract_gz',
-]
-
-__all__ = data_classes + remote_backend_classes + helper_functions
-
-lightning = LazyLoader('lightning', globals(),
- 'torch_geometric.data.lightning')
-
-from torch_geometric.deprecation import deprecated
-from torch_geometric.loader import NeighborSampler
-from torch_geometric.loader import ClusterData
-from torch_geometric.loader import ClusterLoader
-from torch_geometric.loader import GraphSAINTSampler
-from torch_geometric.loader import GraphSAINTNodeSampler
-from torch_geometric.loader import GraphSAINTEdgeSampler
-from torch_geometric.loader import GraphSAINTRandomWalkSampler
-from torch_geometric.loader import ShaDowKHopSampler
-from torch_geometric.loader import RandomNodeLoader
-from torch_geometric.loader import DataLoader
-from torch_geometric.loader import DataListLoader
-from torch_geometric.loader import DenseDataLoader
-
-NeighborSampler = deprecated("use 'loader.NeighborSampler' instead",
- 'data.NeighborSampler')(NeighborSampler)
-ClusterData = deprecated("use 'loader.ClusterData' instead",
- 'data.ClusterData')(ClusterData)
-ClusterLoader = deprecated("use 'loader.ClusterLoader' instead",
- 'data.ClusterLoader')(ClusterLoader)
-GraphSAINTSampler = deprecated("use 'loader.GraphSAINTSampler' instead",
- 'data.GraphSAINTSampler')(GraphSAINTSampler)
-GraphSAINTNodeSampler = deprecated(
- "use 'loader.GraphSAINTNodeSampler' instead",
- 'data.GraphSAINTNodeSampler')(GraphSAINTNodeSampler)
-GraphSAINTEdgeSampler = deprecated(
- "use 'loader.GraphSAINTEdgeSampler' instead",
- 'data.GraphSAINTEdgeSampler')(GraphSAINTEdgeSampler)
-GraphSAINTRandomWalkSampler = deprecated(
- "use 'loader.GraphSAINTRandomWalkSampler' instead",
- 'data.GraphSAINTRandomWalkSampler')(GraphSAINTRandomWalkSampler)
-ShaDowKHopSampler = deprecated("use 'loader.ShaDowKHopSampler' instead",
- 'data.ShaDowKHopSampler')(ShaDowKHopSampler)
-RandomNodeSampler = deprecated("use 'loader.RandomNodeLoader' instead",
- 'data.RandomNodeSampler')(RandomNodeLoader)
-DataLoader = deprecated("use 'loader.DataLoader' instead",
- 'data.DataLoader')(DataLoader)
-DataListLoader = deprecated("use 'loader.DataListLoader' instead",
- 'data.DataListLoader')(DataListLoader)
-DenseDataLoader = deprecated("use 'loader.DenseDataLoader' instead",
- 'data.DenseDataLoader')(DenseDataLoader)
diff --git a/pytorch_geometric-2.4.0/torch_geometric/data/makedirs.py b/pytorch_geometric-2.4.0/torch_geometric/data/makedirs.py
deleted file mode 100644
index 34898ec..0000000
--- a/pytorch_geometric-2.4.0/torch_geometric/data/makedirs.py
+++ /dev/null
@@ -1,16 +0,0 @@
-import errno
-import os
-import os.path as osp
-
-
-def makedirs(path: str):
- r"""Recursively creates a directory.
-
- Args:
- path (str): The path to create.
- """
- try:
- os.makedirs(osp.expanduser(osp.normpath(path)))
- except OSError as e:
- if e.errno != errno.EEXIST and osp.isdir(path):
- raise e
diff --git a/pytorch_geometric-2.4.0/torch_geometric/distributed/__init__.py b/pytorch_geometric-2.4.0/torch_geometric/distributed/__init__.py
deleted file mode 100644
index 8f7ada6..0000000
--- a/pytorch_geometric-2.4.0/torch_geometric/distributed/__init__.py
+++ /dev/null
@@ -1,9 +0,0 @@
-from .local_feature_store import LocalFeatureStore
-from .local_graph_store import LocalGraphStore
-from .partition import Partitioner
-
-__all__ = classes = [
- 'LocalFeatureStore',
- 'LocalGraphStore',
- 'Partitioner',
-]
diff --git a/pytorch_geometric-2.4.0/torch_geometric/distributed/dist_neighbor_sampler.py b/pytorch_geometric-2.4.0/torch_geometric/distributed/dist_neighbor_sampler.py
deleted file mode 100644
index a6d7691..0000000
--- a/pytorch_geometric-2.4.0/torch_geometric/distributed/dist_neighbor_sampler.py
+++ /dev/null
@@ -1,678 +0,0 @@
-import itertools
-import logging
-
-import numpy as np
-import torch
-import torch.multiprocessing as mp
-from torch import Tensor
-
-from torch_geometric.distributed import LocalFeatureStore, LocalGraphStore
-from torch_geometric.distributed.dist_context import DistContext, DistRole
-from torch_geometric.distributed.event_loop import (
- ConcurrentEventLoop,
- wrap_torch_future,
-)
-from torch_geometric.distributed.rpc import (
- RPCCallBase,
- RPCRouter,
- rpc_async,
- rpc_partition_to_workers,
- rpc_register,
- shutdown_rpc,
-)
-from torch_geometric.distributed.utils import (
- BatchDict,
- NodeDict,
- remove_duplicates,
-)
-from torch_geometric.sampler import (
- EdgeSamplerInput,
- HeteroSamplerOutput,
- NeighborSampler,
- NodeSamplerInput,
- SamplerOutput,
-)
-from torch_geometric.sampler.base import NumNeighbors, SubgraphType
-from torch_geometric.sampler.utils import remap_keys
-from torch_geometric.typing import (
- Any,
- Dict,
- EdgeType,
- List,
- NodeType,
- Optional,
- Tuple,
- Union,
-)
-
-NumNeighborsType = Union[NumNeighbors, List[int], Dict[EdgeType, List[int]]]
-
-
-class RPCSamplingCallee(RPCCallBase):
- r"""A wrapper for RPC callee that will perform RPC sampling from remote
- processes."""
- def __init__(self, sampler: NeighborSampler):
- super().__init__()
- self.sampler = sampler
-
- def rpc_async(self, *args, **kwargs) -> Any:
- return self.sampler._sample_one_hop(*args, **kwargs)
-
- def rpc_sync(self, *args, **kwargs) -> Any:
- pass
-
-
-class DistNeighborSampler:
- r"""An implementation of a distributed and asynchronised neighbor sampler
- used by :class:`~torch_geometric.distributed.DistNeighborLoader`."""
- def __init__(
- self,
- current_ctx: DistContext,
- rpc_worker_names: Dict[DistRole, List[str]],
- data: Tuple[LocalGraphStore, LocalFeatureStore],
- num_neighbors: NumNeighborsType,
- channel: Optional[mp.Queue] = None,
- replace: bool = False,
- subgraph_type: Union[SubgraphType, str] = 'directional',
- disjoint: bool = False,
- temporal_strategy: str = 'uniform',
- time_attr: Optional[str] = None,
- concurrency: int = 1,
- **kwargs,
- ):
- self.current_ctx = current_ctx
- self.rpc_worker_names = rpc_worker_names
-
- self.feature_store, self.graph_store = data
- assert isinstance(self.dist_graph, LocalGraphStore)
- assert isinstance(self.dist_feature_store, LocalFeatureStore)
- self.is_hetero = self.dist_graph.meta['is_hetero']
-
- self.num_neighbors = num_neighbors
- self.channel = channel or mp.Queue()
- self.concurrency = concurrency
- self.event_loop = None
- self.replace = replace
- self.subgraph_type = SubgraphType(subgraph_type)
- self.disjoint = disjoint
- self.temporal_strategy = temporal_strategy
- self.time_attr = time_attr
- self.with_edge_attr = self.dist_feature.has_edge_attr()
- _, _, self.edge_permutation = self.dist_graph.csc()
- self.csc = True
-
- def register_sampler_rpc(self) -> None:
- partition2workers = rpc_partition_to_workers(
- current_ctx=self.current_ctx,
- num_partitions=self.dist_graph.num_partitions,
- current_partition_idx=self.dist_graph.partition_idx,
- )
- self.rpc_router = RPCRouter(partition2workers)
- self.dist_feature.set_rpc_router(self.rpc_router)
-
- self._sampler = NeighborSampler(
- data=(self.dist_feature_store, self.dist_graph_store),
- num_neighbors=self.num_neighbors,
- subgraph_type=self.subgraph_type,
- replace=self.replace,
- disjoint=self.disjoint,
- temporal_strategy=self.temporal_strategy,
- time_attr=self.time_attr,
- )
- rpc_sample_callee = RPCSamplingCallee(self._sampler)
- self.rpc_sample_callee_id = rpc_register(rpc_sample_callee)
-
- def init_event_loop(self) -> None:
- self.event_loop = ConcurrentEventLoop(self.concurrency)
- self.event_loop.start_loop()
-
- # Node-based distributed sampling #########################################
-
- def sample_from_nodes(
- self, inputs: NodeSamplerInput,
- **kwargs) -> Optional[Union[SamplerOutput, HeteroSamplerOutput]]:
- inputs = NodeSamplerInput.cast(inputs)
- if self.channel is None:
- # synchronous sampling
- return self.event_loop.run_task(
- coro=self._sample_from(self.node_sample, inputs))
-
- # asynchronous sampling
- cb = kwargs.get("callback", None)
- self.event_loop.add_task(
- coro=self._sample_from(self.node_sample, inputs), callback=cb)
- return None
-
- async def _sample_from(
- self,
- async_func,
- *args,
- **kwargs,
- ) -> Optional[Union[SamplerOutput, HeteroSamplerOutput]]:
-
- sampler_output = await async_func(*args, **kwargs)
- res = await self._collate_fn(sampler_output)
-
- if self.channel is None:
- return res
- self.channel.put(res)
- return None
-
- async def node_sample(
- self,
- inputs: Union[NodeSamplerInput, EdgeSamplerInput],
- dst_time: Tensor = None,
- ) -> Union[SamplerOutput, HeteroSamplerOutput]:
- r"""Performs layer by layer distributed sampling from a
- :class:`NodeSamplerInput` and returns the output of the sampling
- procedure.
-
- Note:
- In case of distributed training it is required to synchronize the
- results between machines after each layer.
- """
-
- input_type = inputs.input_type
- self.input_type = input_type
- batch_size = inputs.input_id.size()[0]
-
- seed_dict = None
- seed_time_dict = None
- src_batch_dict = None
-
- if isinstance(inputs, NodeSamplerInput):
- seed = inputs.node.to(self.device)
- seed_time = (inputs.time.to(self.device)
- if inputs.time is not None else None)
- src_batch = torch.arange(batch_size) if self.disjoint else None
- seed_dict = {input_type: seed}
- seed_time_dict: Dict[NodeType, Tensor] = {input_type: seed_time}
- metadata = (seed, seed_time)
-
- elif isinstance(inputs, EdgeSamplerInput) and self.is_hetero:
- seed_dict = {input_type[0]: inputs.row, input_type[-1]: inputs.col}
- if dst_time is not None:
- seed_time_dict = {
- input_type[0]: inputs.time,
- input_type[-1]: dst_time,
- }
-
- if self.disjoint:
- src_batch_dict = {
- input_type[0]: torch.arange(batch_size),
- input_type[-1]: torch.arange(batch_size, batch_size * 2),
- }
- metadata = (seed_dict, seed_time_dict)
-
- else:
- raise NotImplementedError
-
- if self.is_hetero:
- if input_type is None:
- raise ValueError("Input type should be defined")
-
- node_dict = NodeDict()
- batch_dict = BatchDict(self.disjoint)
- edge_dict: Dict[EdgeType, Tensor] = {}
- num_sampled_nodes_dict: Dict[NodeType, List[int]] = {}
- sampled_nbrs_per_node_dict: Dict[EdgeType, List[int]] = {}
- num_sampled_edges_dict: Dict[EdgeType, List[int]] = {}
-
- for ntype in self._sampler.node_types:
- num_sampled_nodes_dict.update({ntype: [0]})
-
- for etype in self._sampler.edge_types:
- edge_dict.update({etype: torch.empty(0, dtype=torch.int64)})
- num_sampled_edges_dict.update({etype: []})
- sampled_nbrs_per_node_dict.update({etype: []})
-
- if isinstance(inputs, EdgeSamplerInput):
- node_dict.src = seed_dict
- node_dict.out = {
- input_type[0]: inputs.row.numpy(),
- input_type[-1]: inputs.col.numpy(),
- }
-
- num_sampled_nodes_dict = {
- input_type[0]: [inputs.row.numel()],
- input_type[-1]: [inputs.col.numel()],
- }
-
- if self.disjoint:
- batch_dict = src_batch_dict
- batch_dict.out = {
- input_type[0]: src_batch_dict[input_type[0]].numpy(),
- input_type[-1]: src_batch_dict[input_type[-1]].numpy(),
- }
-
- else:
- node_dict.src[input_type] = seed
- node_dict.out[input_type] = seed.numpy()
-
- num_sampled_nodes_dict[input_type].append(seed.numel())
-
- if self.disjoint:
- batch_dict.src[input_type] = src_batch
- batch_dict.out[input_type] = src_batch.numpy()
-
- # loop over the layers
- for i in range(self._sampler.num_hops):
- # create tasks
- task_dict = {}
- for etype in self._sampler.edge_types:
- src = etype[0] if not self.csc else etype[2]
-
- if node_dict.src[src].numel():
- seed_time = (seed_time_dict.get(src, None)
- if seed_time_dict is not None else None)
- if isinstance(self.num_neighbors, list):
- one_hop_num = self.num_neighbors[i]
- else:
- one_hop_num = self.num_neighbors[etype][i]
-
- task_dict[etype] = self.event_loop._loop.create_task(
- self.sample_one_hop(
- node_dict.src[src],
- one_hop_num,
- seed_time,
- batch_dict.src[src],
- etype,
- ))
-
- for etype, task in task_dict.items():
- out: HeteroSamplerOutput = await task
-
- if out.node.numel() == 0:
- # no neighbors were sampled
- break
-
- dst = etype[2] if not self.csc else etype[0]
-
- # remove duplicates
- (
- node_dict.src[dst],
- node_dict.out[dst],
- batch_dict.src[dst],
- batch_dict.out[dst],
- ) = remove_duplicates(
- out,
- node_dict.out[dst],
- batch_dict.out[dst],
- self.disjoint,
- )
-
- node_dict.with_dupl[dst] = torch.cat(
- [node_dict.with_dupl[dst], out.node])
- edge_dict[etype] = torch.cat([edge_dict[etype], out.edge])
-
- if self.disjoint:
- batch_dict.with_dupl[dst] = torch.cat(
- [batch_dict.with_dupl[dst], out.batch])
-
- num_sampled_nodes_dict[dst].append(len(node_dict.src[dst]))
- num_sampled_edges_dict[etype].append(len(out.node))
- sampled_nbrs_per_node_dict[etype] += out.metadata
-
- sampled_nbrs_per_node_dict = remap_keys(sampled_nbrs_per_node_dict,
- self._sampler.to_rel_type)
-
- row_dict, col_dict = torch.ops.pyg.hetero_relabel_neighborhood(
- self._sampler.node_types,
- self._sampler.edge_types,
- seed_dict,
- node_dict.with_dupl,
- sampled_nbrs_per_node_dict,
- self._sampler.num_nodes,
- batch_dict.with_dupl,
- self.csc,
- self.disjoint,
- )
-
- node_dict.out = {
- ntype: torch.from_numpy(node_dict.out[ntype])
- for ntype in self._sampler.node_types
- }
- if self.disjoint:
- batch_dict.out = {
- ntype: torch.from_numpy(batch_dict.out[ntype])
- for ntype in self._sampler.node_types
- }
-
- sampler_output = HeteroSamplerOutput(
- node=node_dict.out,
- row=remap_keys(row_dict, self._sampler.to_edge_type),
- col=remap_keys(col_dict, self._sampler.to_edge_type),
- edge=edge_dict,
- batch=batch_dict.out if self.disjoint else None,
- num_sampled_nodes=num_sampled_nodes_dict,
- num_sampled_edges=num_sampled_edges_dict,
- metadata=metadata,
- )
- else:
- src = seed
- node = src.numpy()
- batch = src_batch.numpy() if self.disjoint else None
-
- node_with_dupl = [torch.empty(0, dtype=torch.int64)]
- batch_with_dupl = [torch.empty(0, dtype=torch.int64)]
- edge = [torch.empty(0, dtype=torch.int64)]
-
- sampled_nbrs_per_node = []
- num_sampled_nodes = [seed.numel()]
- num_sampled_edges = [0]
-
- # loop over the layers
- for one_hop_num in self.num_neighbors:
- out = await self.sample_one_hop(src, one_hop_num, seed_time,
- src_batch)
- if out.node.numel() == 0:
- # no neighbors were sampled
- break
-
- # remove duplicates
- src, node, src_batch, batch = remove_duplicates(
- out, node, batch, self.disjoint)
-
- node_with_dupl.append(out.node)
- edge.append(out.edge)
-
- if self.disjoint:
- batch_with_dupl.append(out.batch)
-
- num_sampled_nodes.append(len(src))
- num_sampled_edges.append(len(out.node))
- sampled_nbrs_per_node += out.metadata
-
- row, col = torch.ops.pyg.relabel_neighborhood(
- seed,
- torch.cat(node_with_dupl),
- sampled_nbrs_per_node,
- self._sampler.num_nodes,
- torch.cat(batch_with_dupl) if self.disjoint else None,
- self.csc,
- self.disjoint,
- )
-
- sampler_output = SamplerOutput(
- node=torch.from_numpy(node),
- row=row,
- col=col,
- edge=torch.cat(edge),
- batch=torch.from_numpy(batch) if self.disjoint else None,
- num_sampled_nodes=num_sampled_nodes,
- num_sampled_edges=num_sampled_edges,
- metadata=metadata,
- )
-
- if self.subgraph_type == SubgraphType.bidirectional:
- sampler_output = sampler_output.to_bidirectional()
-
- return sampler_output
-
- def get_sampler_output(
- self,
- outputs: List[SamplerOutput],
- seed_size: int,
- p_id: int,
- src_batch: Optional[Tensor] = None,
- ) -> SamplerOutput:
- r"""Used when seed nodes belongs to one partition. It's purpose is to
- remove seed nodes from sampled nodes and calculates how many neighbors
- were sampled by each src node based on the
- :obj:`cumsum_neighbors_per_node`. Returns updated sampler output.
- """
- cumsum_neighbors_per_node = outputs[p_id].metadata
-
- # do not include seed
- outputs[p_id].node = outputs[p_id].node[seed_size:]
-
- begin = np.array(cumsum_neighbors_per_node[1:])
- end = np.array(cumsum_neighbors_per_node[:-1])
-
- sampled_nbrs_per_node = list(np.subtract(begin, end))
-
- outputs[p_id].metadata = sampled_nbrs_per_node
-
- if self.disjoint:
- batch = [[src_batch[i]] * nbrs_per_node
- for i, nbrs_per_node in enumerate(sampled_nbrs_per_node)]
- outputs[p_id].batch = Tensor(
- list(itertools.chain.from_iterable(batch))).type(torch.int64)
-
- return outputs[p_id]
-
- def merge_sampler_outputs(
- self,
- partition_ids: Tensor,
- partition_orders: Tensor,
- outputs: List[SamplerOutput],
- one_hop_num: int,
- src_batch: Optional[Tensor] = None,
- ) -> SamplerOutput:
- r"""Merges samplers outputs from different partitions, so that they
- are sorted according to the sampling order. Removes seed nodes from
- sampled nodes and calculates how many neighbors were sampled by each
- src node based on the :obj:`cumsum_neighbors_per_node`. Leverages the
- :obj:`pyg-lib` :obj:`merge_sampler_outputs` function.
-
- Args:
- partition_ids (torch.Tensor): Contains information on which
- partition seeds nodes are located on.
- partition_orders (torch.Tensor): Contains information about the
- order of seed nodes in each partition.
- outputs (List[SamplerOutput]): List of all samplers outputs.
- one_hop_num (int): Max number of neighbors sampled in the current
- layer.
-
- Returns :obj:`SamplerOutput` containing all merged outputs.
- """
- sampled_nodes_with_dupl = [
- o.node if o is not None else torch.empty(0, dtype=torch.int64)
- for o in outputs
- ]
- edge_ids = [
- o.edge if o is not None else torch.empty(0, dtype=torch.int64)
- for o in outputs
- ]
- cumm_sampled_nbrs_per_node = [
- o.metadata if o is not None else [] for o in outputs
- ]
-
- partition_ids = partition_ids.tolist()
- partition_orders = partition_orders.tolist()
-
- partitions_num = self.dist_graph.meta["num_parts"]
-
- out = torch.ops.pyg.merge_sampler_outputs(
- sampled_nodes_with_dupl,
- edge_ids,
- cumm_sampled_nbrs_per_node,
- partition_ids,
- partition_orders,
- partitions_num,
- one_hop_num,
- src_batch,
- self.disjoint,
- )
- (
- out_node_with_dupl,
- out_edge,
- out_batch,
- out_sampled_nbrs_per_node,
- ) = out
-
- return SamplerOutput(
- out_node_with_dupl,
- None,
- None,
- out_edge,
- out_batch if self.disjoint else None,
- metadata=(out_sampled_nbrs_per_node),
- )
-
- async def sample_one_hop(
- self,
- srcs: Tensor,
- one_hop_num: int,
- seed_time: Optional[Tensor] = None,
- src_batch: Optional[Tensor] = None,
- etype: Optional[EdgeType] = None,
- ) -> SamplerOutput:
- r"""Sample one-hop neighbors for a :obj:`srcs`. If src node is located
- on a local partition, evaluates the :obj:`_sample_one_hop` function on
- a current machine. If src node is from a remote partition, send a
- request to a remote machine that contains this partition.
-
- Returns merged samplers outputs from local / remote machines.
- """
- partition_ids = self.dist_graph.get_partition_ids_from_nids(srcs)
- partition_orders = torch.zeros(len(partition_ids), dtype=torch.long)
-
- p_outputs: List[SamplerOutput] = [None
- ] * self.dist_graph.meta["num_parts"]
- futs: List[torch.futures.Future] = []
-
- local_only = True
- single_partition = len(set(partition_ids.tolist())) == 1
-
- for i in range(self.dist_graph.num_partitions):
- p_id = (self.dist_graph.partition_idx +
- i) % self.dist_graph.num_partitions
- p_mask = partition_ids == p_id
- p_srcs = torch.masked_select(srcs, p_mask)
- p_seed_time = (torch.masked_select(seed_time, p_mask)
- if seed_time is not None else None)
-
- p_indices = torch.arange(len(p_srcs), dtype=torch.long)
- partition_orders[p_mask] = p_indices
-
- if p_srcs.shape[0] > 0:
- if p_id == self.dist_graph.partition_idx:
- # sample on local machine
- p_nbr_out = self._sampler._sample_one_hop(
- p_srcs, one_hop_num, p_seed_time, self.csc, etype)
- p_outputs.pop(p_id)
- p_outputs.insert(p_id, p_nbr_out)
- else:
- # sample on remote machine
- local_only = False
- to_worker = self.rpc_router.get_to_worker(p_id)
- futs.append(
- rpc_async(
- to_worker,
- self.rpc_sample_callee_id,
- args=(
- p_srcs,
- one_hop_num,
- p_seed_time,
- self.csc,
- etype,
- ),
- ))
-
- if not local_only:
- # Src nodes are remote
- res_fut_list = await wrap_torch_future(
- torch.futures.collect_all(futs))
- for i, res_fut in enumerate(res_fut_list):
- p_id = (self.dist_graph.partition_idx + i +
- 1) % self.dist_graph.num_partitions
- p_outputs.pop(p_id)
- p_outputs.insert(p_id, res_fut.wait())
-
- # All src nodes are in the same partition
- if single_partition:
- return self.get_sampler_output(p_outputs, len(srcs),
- partition_ids[0], src_batch)
-
- return self.merge_sampler_outputs(partition_ids, partition_orders,
- p_outputs, one_hop_num, src_batch)
-
- async def _collate_fn(
- self, output: Union[SamplerOutput, HeteroSamplerOutput]
- ) -> Union[SamplerOutput, HeteroSamplerOutput]:
- r"""Collect labels and features for the sampled subgrarph if necessary,
- and put them into a sample message.
- """
- if self.is_hetero:
- nlabels = {}
- nfeats = {}
- efeats = {}
- # Collect node labels of input node type.
- node_labels = self.dist_feature.labels
- if node_labels is not None:
- nlabels = node_labels[output.node[self.input_type]]
- else:
- nlabels = None
- # Collect node features.
- if output.node is not None:
- for ntype in output.node.keys():
- if output.node[ntype].numel() > 0:
- fut = self.dist_feature.lookup_features(
- is_node_feat=True,
- index=output.node[ntype],
- input_type=ntype,
- )
- nfeat = await wrap_torch_future(fut)
- nfeat = nfeat.to(torch.device("cpu"))
- nfeats[ntype] = nfeat
- else:
- nfeats[ntype] = None
- # Collect edge features
- if output.edge is not None and self.with_edge_attr:
- for etype in output.edge.keys():
- if output.edge[etype].numel() > 0:
- fut = self.dist_feature.lookup_features(
- is_node_feat=False,
- index=output.edge[etype],
- input_type=etype,
- )
- efeat = await wrap_torch_future(fut)
- efeat = efeat.to(torch.device("cpu"))
- efeats[etype] = efeat
- else:
- efeats[etype] = None
-
- else: # Homo
- # Collect node labels.
- nlabels = (self.dist_feature.labels[output.node] if
- (self.dist_feature.labels is not None) else None)
- # Collect node features.
- if output.node is not None:
- fut = self.dist_feature.lookup_features(
- is_node_feat=True, index=output.node)
- nfeats = await wrap_torch_future(fut)
- nfeats = nfeats.to(torch.device("cpu"))
- # else:
- efeats = None
- # Collect edge features.
- if output.edge is not None and self.with_edge_attr:
- fut = self.dist_feature.lookup_features(
- is_node_feat=False, index=output.edge)
- efeats = await wrap_torch_future(fut)
- efeats = efeats.to(torch.device("cpu"))
- else:
- efeats = None
-
- output.metadata = (*output.metadata, nfeats, nlabels, efeats)
- if self.is_hetero:
- output.row = remap_keys(output.row, self._sampler.to_edge_type)
- output.col = remap_keys(output.col, self._sampler.to_edge_type)
- return output
-
- def __repr__(self) -> str:
- return f"{self.__class__.__name__}()-PID{mp.current_process().pid}"
-
-
-# Sampling Utilities ##########################################################
-
-
-def close_sampler(worker_id: int, sampler: DistNeighborSampler):
- # Make sure that mp.Queue is empty at exit and RAM is cleared:
- try:
- logging.info(f"Closing event loop for worker ID {worker_id}")
- sampler.event_loop.shutdown_loop()
- except AttributeError:
- pass
- logging.info(f"Closing RPC for worker ID {worker_id}")
- shutdown_rpc(graceful=True)
diff --git a/pytorch_geometric-2.4.0/torch_geometric/distributed/partition.py b/pytorch_geometric-2.4.0/torch_geometric/distributed/partition.py
deleted file mode 100644
index 569686a..0000000
--- a/pytorch_geometric-2.4.0/torch_geometric/distributed/partition.py
+++ /dev/null
@@ -1,253 +0,0 @@
-import json
-import logging
-import os
-import os.path as osp
-from typing import List, Optional, Union
-
-import torch
-
-from torch_geometric.data import Data, HeteroData
-from torch_geometric.loader import ClusterData
-from torch_geometric.typing import EdgeType, EdgeTypeStr, NodeType
-
-
-class Partitioner:
- r"""Partition the graph structure and its features of a
- :class:`~torch_geometric.data.Data` or
- :class:`~torch_geometric.data.HeteroData` object.
- Partitioned data output will be structured like this:
-
- **Homogeneous graphs:**
-
- .. code-block::
-
- root/
- |-- META.json
- |-- node_map.pt
- |-- edge_map.pt
- |-- part0/
- |-- graph.pt
- |-- node_feats.pt
- |-- edge_feats.pt
- |-- part1/
- |-- graph.pt
- |-- node_feats.pt
- |-- edge_feats.pt
-
- **Heterogeneous graphs:**
-
- .. code-block::
-
- root/
- |-- META.json
- |-- node_map/
- |-- ntype1.pt
- |-- ntype2.pt
- |-- edge_map/
- |-- etype1.pt
- |-- etype2.pt
- |-- part0/
- |-- graph.pt
- |-- node_feats.pt
- |-- edge_feats.pt
- |-- part1/
- |-- graph.pt
- |-- node_feats.pt
- |-- edge_feats.pt
-
- Args:
- data (Data or HeteroData): The data object.
- num_parts (int): The number of partitions.
- recursive (bool, optional): If set to :obj:`True`, will use multilevel
- recursive bisection instead of multilevel k-way partitioning.
- (default: :obj:`False`)
- root (str): Root directory where the partitioned dataset should be
- saved.
- """
- def __init__(
- self,
- data: Union[Data, HeteroData],
- num_parts: int,
- root: str,
- recursive: bool = False,
- ):
- assert num_parts > 1
-
- self.data = data
- self.num_parts = num_parts
- self.root = root
- self.recursive = recursive
-
- @property
- def is_hetero(self) -> bool:
- return isinstance(self.data, HeteroData)
-
- @property
- def node_types(self) -> Optional[List[NodeType]]:
- return self.data.node_types if self.is_hetero else None
-
- @property
- def edge_types(self) -> Optional[List[EdgeType]]:
- return self.data.edge_types if self.is_hetero else None
-
- def generate_partition(self):
- r"""Generates the partition."""
- os.makedirs(self.root, exist_ok=True)
-
- logging.info('Saving metadata')
- meta = {
- 'num_parts': self.num_parts,
- 'is_hetero': self.is_hetero,
- 'node_types': self.node_types,
- 'edge_types': self.edge_types,
- }
- with open(osp.join(self.root, 'META.json'), 'w') as f:
- json.dump(meta, f)
-
- data = self.data.to_homogeneous() if self.is_hetero else self.data
- cluster_data = ClusterData(
- data,
- num_parts=self.num_parts,
- recursive=self.recursive,
- log=True,
- keep_inter_cluster_edges=True,
- )
-
- node_perm = cluster_data.partition.node_perm
- partptr = cluster_data.partition.partptr
- edge_perm = cluster_data.partition.edge_perm
-
- node_map = torch.empty(data.num_nodes, dtype=torch.int64)
- edge_map = torch.empty(data.num_edges, dtype=torch.int64)
-
- if self.is_hetero:
- node_offset, edge_offset = {}, {}
-
- offset = 0
- for node_type in self.node_types:
- node_offset[node_type] = offset
- offset += self.data[node_type].num_nodes
-
- offset = 0
- for edge_name in self.edge_types:
- edge_offset[edge_name] = offset
- offset += offset + self.data.num_edges_dict[edge_name]
-
- edge_start = 0
- for pid in range(self.num_parts):
- logging.info(f'Saving graph partition {pid}')
- path = osp.join(self.root, f'part_{pid}')
- os.makedirs(path, exist_ok=True)
-
- part_data = cluster_data[pid]
- start, end = int(partptr[pid]), int(partptr[pid + 1])
-
- num_edges = part_data.num_edges
- edge_id = edge_perm[edge_start:edge_start + num_edges]
- edge_map[edge_id] = pid
- edge_start += +num_edges
-
- node_id = node_perm[start:end]
- node_map[node_id] = pid
-
- out = {}
- for i, edge_type in enumerate(self.edge_types):
- src, _, dst = edge_type
- size = (self.data[src].num_nodes, self.data[dst].num_nodes)
-
- mask = part_data.edge_type == i
- rows = part_data.edge_index[0, mask]
- cols = part_data.edge_index[1, mask]
- global_rows = node_id[rows]
- global_cols = node_perm[cols]
- out[edge_type] = {
- 'edge_id': edge_id[mask],
- 'row': global_rows,
- 'col': global_cols,
- 'size': size,
- }
- torch.save(out, osp.join(path, 'graph.pt'))
-
- out = {}
- for i, node_type in enumerate(self.node_types):
- mask = part_data.node_type == i
- x = part_data.x[mask] if 'x' in part_data else None
- out[node_type] = {
- 'global_id': node_id[mask],
- 'feats': dict(x=x),
- }
- torch.save(out, osp.join(path, 'node_feats.pt'))
-
- out = {}
- for i, edge_type in enumerate(self.edge_types):
- mask = part_data.edge_type == i
- edge_attr = None
- if 'edge_attr' in part_data:
- edge_attr = part_data.edge_attr[mask]
- out[edge_type] = {
- 'global_id': edge_id[mask],
- 'feats': dict(edge_attr=edge_attr),
- }
- torch.save(out, osp.join(path, 'edge_feats.pt'))
-
- logging.info('Saving partition mapping info')
-
- path = osp.join(self.root, 'node_map')
- os.makedirs(path, exist_ok=True)
- for i, node_type in enumerate(self.node_types):
- mask = data.node_type == i
- torch.save(node_map[mask], osp.join(path, f'{node_type}.pt'))
-
- path = osp.join(self.root, 'edge_map')
- os.makedirs(path, exist_ok=True)
- for i, edge_type in enumerate(self.edge_types):
- mask = data.edge_type == i
- torch.save(edge_map[mask],
- osp.join(path, f'{EdgeTypeStr(edge_type)}.pt'))
-
- else: # `if not self.is_hetero:`
-
- edge_start = 0
- for pid in range(self.num_parts):
- logging.info(f'Saving graph partition {pid}')
- path = osp.join(self.root, f'part_{pid}')
- os.makedirs(path, exist_ok=True)
-
- part_data = cluster_data[pid]
- start, end = int(partptr[pid]), int(partptr[pid + 1])
-
- num_edges = part_data.num_edges
- edge_id = edge_perm[edge_start:edge_start + num_edges]
- edge_map[edge_id] = pid
- edge_start += num_edges
-
- node_id = node_perm[start:end]
- node_map[node_id] = pid
- rows = part_data.edge_index[0]
- cols = part_data.edge_index[1]
- global_rows = node_id[rows]
- global_cols = node_perm[cols]
-
- torch.save(
- {
- 'edge_id': edge_id,
- 'row': global_rows,
- 'col': global_cols,
- 'size': (data.num_nodes, data.num_nodes),
- }, osp.join(path, 'graph.pt'))
-
- torch.save(
- {
- 'global_id': node_id,
- 'feats': dict(x=part_data.x),
- }, osp.join(path, 'node_feats.pt'))
-
- torch.save(
- {
- 'global_id': edge_id,
- 'feats': dict(edge_attr=part_data.edge_attr),
- }, osp.join(path, 'edge_feats.pt'))
-
- logging.info('Saving partition mapping info')
- torch.save(node_map, osp.join(self.root, 'node_map.pt'))
- torch.save(edge_map, osp.join(self.root, 'edge_map.pt'))
diff --git a/pytorch_geometric-2.4.0/torch_geometric/distributed/utils.py b/pytorch_geometric-2.4.0/torch_geometric/distributed/utils.py
deleted file mode 100644
index ea39175..0000000
--- a/pytorch_geometric-2.4.0/torch_geometric/distributed/utils.py
+++ /dev/null
@@ -1,122 +0,0 @@
-from dataclasses import dataclass, field
-from typing import Tuple
-
-import numpy as np
-import torch
-from torch import Tensor
-
-from torch_geometric.data import HeteroData
-from torch_geometric.distributed import LocalFeatureStore, LocalGraphStore
-from torch_geometric.sampler import SamplerOutput
-from torch_geometric.typing import Dict, NodeType, Optional
-
-
-@dataclass
-class NodeDict:
- r"""Class used during heterogeneous sampling:
- 1) The nodes to serve as source nodes in the next layer
- 2) The nodes with duplicates that are further needed to create COO output
- 3) The output nodes without duplicates
- """
- src: Dict[NodeType, Tensor] = field(default_factory=dict)
- with_dupl: Dict[NodeType, Tensor] = field(default_factory=dict)
- out: Dict[NodeType, Tensor] = field(default_factory=dict)
-
-
-@dataclass
-class BatchDict:
- r"""Class used during disjoint heterogeneous sampling:
- 1) The batch to serve as initial subgraph IDs for source nodes in the next
- layer
- 2) The subgraph IDs with duplicates that are further needed to create COO
- output
- 3) The output subgraph IDs without duplicates
- """
- src: Dict[NodeType, Tensor] = field(default_factory=dict)
- with_duple: Dict[NodeType, Tensor] = field(default_factory=dict)
- out: Dict[NodeType, Tensor] = field(default_factory=dict)
-
-
-def remove_duplicates(
- out: SamplerOutput,
- node: Tensor,
- batch: Optional[Tensor] = None,
- disjoint: bool = False,
-) -> Tuple[Tensor, Tensor, Optional[Tensor], Optional[Tensor]]:
-
- num_nodes = node.numel()
- node_combined = torch.cat([node, out.node])
-
- if not disjoint:
- _, idx = np.unique(node_combined.cpu().numpy(), return_index=True)
- idx = torch.from_numpy(idx).to(node.device).sort().values
-
- node = node_combined[idx]
- src = node[num_nodes:]
-
- return (src, node, None, None)
-
- else:
- batch_combined = torch.cat([batch, out.batch])
- node_batch = torch.stack([batch_combined, node_combined], dim=0)
-
- _, idx = np.unique(node_batch.cpu().numpy(), axis=1, return_index=True)
- idx = torch.from_numpy(idx).to(node.device).sort().values
-
- batch = batch_combined[idx]
- node = node_combined[idx]
- src_batch = batch[num_nodes:]
- src = node[num_nodes:]
-
- return (src, node, src_batch, batch)
-
-
-def filter_dist_store(
- feature_store: LocalFeatureStore,
- graph_store: LocalGraphStore,
- node_dict: Dict[str, Tensor],
- row_dict: Dict[str, Tensor],
- col_dict: Dict[str, Tensor],
- edge_dict: Dict[str, Optional[Tensor]],
- custom_cls: Optional[HeteroData] = None,
- meta: Optional[Dict[str, Tensor]] = None,
-) -> HeteroData:
- r"""Constructs a :class:`HeteroData` object from a feature store that only
- holds nodes in `node` end edges in `edge` for each node and edge type,
- respectively. Sorted attribute values are provided as metadata from
- :class:`DistNeighborSampler`."""
- # Construct a new `HeteroData` object:
- data = custom_cls() if custom_cls is not None else HeteroData()
- nfeats, nlabels, efeats = meta[-3:]
-
- # Filter edge storage:
- required_edge_attrs = []
- for attr in graph_store.get_all_edge_attrs():
- key = attr.edge_type
- if key in row_dict and key in col_dict:
- required_edge_attrs.append(attr)
- edge_index = torch.stack([row_dict[key], col_dict[key]], dim=0)
- data[attr.edge_type].edge_index = edge_index
-
- # Filter node storage:
- required_node_attrs = []
- for attr in feature_store.get_all_tensor_attrs():
- if attr.group_name in node_dict:
- attr.index = node_dict[attr.group_name]
- required_node_attrs.append(attr)
- data[attr.group_name].num_nodes = attr.index.size(0)
-
- if nfeats is not None:
- for attr in required_node_attrs:
- if nfeats[attr.group_name] is not None:
- data[attr.group_name][attr.attr_name] = nfeats[attr.group_name]
-
- if efeats is not None:
- for attr in required_edge_attrs:
- if efeats[attr.edge_type] is not None:
- data[attr.edge_type].edge_attr = efeats[attr.edge_type]
-
- for label in nlabels:
- data[label].y = nlabels[label]
-
- return data
diff --git a/pytorch_geometric-2.4.0/torch_geometric/io/tu.py b/pytorch_geometric-2.4.0/torch_geometric/io/tu.py
deleted file mode 100644
index 6094092..0000000
--- a/pytorch_geometric-2.4.0/torch_geometric/io/tu.py
+++ /dev/null
@@ -1,126 +0,0 @@
-import glob
-import os
-import os.path as osp
-
-import numpy as np
-import torch
-
-from torch_geometric.data import Data
-from torch_geometric.io import read_txt_array
-from torch_geometric.utils import coalesce, cumsum, one_hot, remove_self_loops
-
-names = [
- 'A', 'graph_indicator', 'node_labels', 'node_attributes'
- 'edge_labels', 'edge_attributes', 'graph_labels', 'graph_attributes'
-]
-
-
-def read_tu_data(folder, prefix):
- files = glob.glob(osp.join(folder, f'{prefix}_*.txt'))
- names = [f.split(os.sep)[-1][len(prefix) + 1:-4] for f in files]
-
- edge_index = read_file(folder, prefix, 'A', torch.long).t() - 1
- batch = read_file(folder, prefix, 'graph_indicator', torch.long) - 1
-
- node_attributes = torch.empty((batch.size(0), 0))
- if 'node_attributes' in names:
- node_attributes = read_file(folder, prefix, 'node_attributes')
- if node_attributes.dim() == 1:
- node_attributes = node_attributes.unsqueeze(-1)
-
- node_labels = torch.empty((batch.size(0), 0))
- if 'node_labels' in names:
- node_labels = read_file(folder, prefix, 'node_labels', torch.long)
- if node_labels.dim() == 1:
- node_labels = node_labels.unsqueeze(-1)
- node_labels = node_labels - node_labels.min(dim=0)[0]
- node_labels = node_labels.unbind(dim=-1)
- node_labels = [one_hot(x) for x in node_labels]
- if len(node_labels) == 1:
- node_labels = node_labels[0]
- else:
- node_labels = torch.cat(node_labels, dim=-1)
-
- edge_attributes = torch.empty((edge_index.size(1), 0))
- if 'edge_attributes' in names:
- edge_attributes = read_file(folder, prefix, 'edge_attributes')
- if edge_attributes.dim() == 1:
- edge_attributes = edge_attributes.unsqueeze(-1)
-
- edge_labels = torch.empty((edge_index.size(1), 0))
- if 'edge_labels' in names:
- edge_labels = read_file(folder, prefix, 'edge_labels', torch.long)
- if edge_labels.dim() == 1:
- edge_labels = edge_labels.unsqueeze(-1)
- edge_labels = edge_labels - edge_labels.min(dim=0)[0]
- edge_labels = edge_labels.unbind(dim=-1)
- edge_labels = [one_hot(e) for e in edge_labels]
- if len(edge_labels) == 1:
- edge_labels = edge_labels[0]
- else:
- edge_labels = torch.cat(edge_labels, dim=-1)
-
- x = cat([node_attributes, node_labels])
- edge_attr = cat([edge_attributes, edge_labels])
-
- y = None
- if 'graph_attributes' in names: # Regression problem.
- y = read_file(folder, prefix, 'graph_attributes')
- elif 'graph_labels' in names: # Classification problem.
- y = read_file(folder, prefix, 'graph_labels', torch.long)
- _, y = y.unique(sorted=True, return_inverse=True)
-
- num_nodes = edge_index.max().item() + 1 if x is None else x.size(0)
- edge_index, edge_attr = remove_self_loops(edge_index, edge_attr)
- edge_index, edge_attr = coalesce(edge_index, edge_attr, num_nodes)
-
- data = Data(x=x, edge_index=edge_index, edge_attr=edge_attr, y=y)
- data, slices = split(data, batch)
-
- sizes = {
- 'num_node_attributes': node_attributes.size(-1),
- 'num_node_labels': node_labels.size(-1),
- 'num_edge_attributes': edge_attributes.size(-1),
- 'num_edge_labels': edge_labels.size(-1),
- }
-
- return data, slices, sizes
-
-
-def read_file(folder, prefix, name, dtype=None):
- path = osp.join(folder, f'{prefix}_{name}.txt')
- return read_txt_array(path, sep=',', dtype=dtype)
-
-
-def cat(seq):
- seq = [item for item in seq if item is not None]
- seq = [item for item in seq if item.numel() > 0]
- seq = [item.unsqueeze(-1) if item.dim() == 1 else item for item in seq]
- return torch.cat(seq, dim=-1) if len(seq) > 0 else None
-
-
-def split(data, batch):
- node_slice = cumsum(torch.from_numpy(np.bincount(batch)))
-
- row, _ = data.edge_index
- edge_slice = cumsum(torch.from_numpy(np.bincount(batch[row])))
-
- # Edge indices should start at zero for every graph.
- data.edge_index -= node_slice[batch[row]].unsqueeze(0)
-
- slices = {'edge_index': edge_slice}
- if data.x is not None:
- slices['x'] = node_slice
- else:
- # Imitate `collate` functionality:
- data._num_nodes = torch.bincount(batch).tolist()
- data.num_nodes = batch.numel()
- if data.edge_attr is not None:
- slices['edge_attr'] = edge_slice
- if data.y is not None:
- if data.y.size(0) == batch.size(0):
- slices['y'] = node_slice
- else:
- slices['y'] = torch.arange(0, batch[-1] + 2, dtype=torch.long)
-
- return data, slices
diff --git a/pytorch_geometric-2.4.0/torch_geometric/io/txt_array.py b/pytorch_geometric-2.4.0/torch_geometric/io/txt_array.py
deleted file mode 100644
index e09ae0c..0000000
--- a/pytorch_geometric-2.4.0/torch_geometric/io/txt_array.py
+++ /dev/null
@@ -1,17 +0,0 @@
-import torch
-
-
-def parse_txt_array(src, sep=None, start=0, end=None, dtype=None, device=None):
- to_number = int
- if torch.is_floating_point(torch.empty(0, dtype=dtype)):
- to_number = float
-
- src = [[to_number(x) for x in line.split(sep)[start:end]] for line in src]
- src = torch.tensor(src).to(dtype).squeeze()
- return src
-
-
-def read_txt_array(path, sep=None, start=0, end=None, dtype=None, device=None):
- with open(path, 'r') as f:
- src = f.read().split('\n')[:-1]
- return parse_txt_array(src, sep, start, end, dtype, device)
diff --git a/pytorch_geometric-2.4.0/torch_geometric/loader/mixin.py b/pytorch_geometric-2.4.0/torch_geometric/loader/mixin.py
deleted file mode 100644
index d31e147..0000000
--- a/pytorch_geometric-2.4.0/torch_geometric/loader/mixin.py
+++ /dev/null
@@ -1,167 +0,0 @@
-import glob
-import logging
-import os
-from contextlib import contextmanager
-from typing import Any, Dict, List, Optional
-
-import psutil
-import torch
-
-
-def get_numa_nodes_cores() -> Dict[str, Any]:
- """ Returns numa nodes info in format:
-
- ..code-block::
-
- {: [(, [,
- ...]), ...], ...}
-
- # For example:
- {0: [(0, [0, 4]), (1, [1, 5])], 1: [(2, [2, 6]), (3, [3, 7])]}
-
- If not available, returns an empty dictionary.
- """
- numa_node_paths = glob.glob('/sys/devices/system/node/node[0-9]*')
-
- if not numa_node_paths:
- return {}
-
- nodes = {}
- try:
- for node_path in numa_node_paths:
- numa_node_id = int(os.path.basename(node_path)[4:])
-
- thread_siblings = {}
- for cpu_dir in glob.glob(os.path.join(node_path, 'cpu[0-9]*')):
- cpu_id = int(os.path.basename(cpu_dir)[3:])
- if cpu_id > 0:
- with open(os.path.join(cpu_dir,
- 'online')) as core_online_file:
- core_online = int(
- core_online_file.read().splitlines()[0])
- else:
- core_online = 1 # cpu0 is always online (special case)
- if core_online == 1:
- with open(os.path.join(cpu_dir, 'topology',
- 'core_id')) as core_id_file:
- core_id = int(core_id_file.read().strip())
- if core_id in thread_siblings:
- thread_siblings[core_id].append(cpu_id)
- else:
- thread_siblings[core_id] = [cpu_id]
-
- nodes[numa_node_id] = sorted([(k, sorted(v))
- for k, v in thread_siblings.items()])
-
- except (OSError, ValueError, IndexError, IOError):
- Warning('Failed to read NUMA info')
- return {}
-
- return nodes
-
-
-class WorkerInitWrapper:
- r"""Wraps the :attr:`worker_init_fn` argument for
- :class:`torch.utils.data.DataLoader` workers."""
- def __init__(self, func):
- self.func = func
-
- def __call__(self, worker_id):
- if self.func is not None:
- self.func(worker_id)
-
-
-class AffinityMixin:
- r"""A context manager to enable CPU affinity for data loader workers
- (only used when running on CPU devices).
-
- Affinitization places data loader workers threads on specific CPU cores.
- In effect, it allows for more efficient local memory allocation and reduces
- remote memory calls.
- Every time a process or thread moves from one core to another, registers
- and caches need to be flushed and reloaded.
- This can become very costly if it happens often, and our threads may also
- no longer be close to their data, or be able to share data in a cache.
-
- See `here `__ for the accompanying tutorial.
-
- .. warning::
-
- To correctly affinitize compute threads (*i.e.* with OMP), please make
- sure that you exclude :obj:`loader_cores` from the list of cores
- available for the main process.
- This will cause core oversubsription and exacerbate performance.
-
- .. code-block:: python
-
- loader = NeigborLoader(data, num_workers=3)
- with loader.enable_cpu_affinity(loader_cores=[0, 1, 2]):
- for batch in loader:
- pass
- """
- @contextmanager
- def enable_cpu_affinity(self, loader_cores: Optional[List[int]] = None):
- r"""Enables CPU affinity.
-
- Args:
- loader_cores ([int], optional): List of CPU cores to which data
- loader workers should affinitize to.
- By default, will affinitize to cores starting at :obj:`cpu0`.
- (default: :obj:`node0_cores[:num_workers]`)
- """
- if not self.num_workers > 0:
- raise ValueError(
- f"'enable_cpu_affinity' should be used with at least one "
- f"worker (got {self.num_workers})")
-
- if loader_cores and len(loader_cores) != self.num_workers:
- raise ValueError(
- f"The number of loader cores (got {len(loader_cores)}) "
- f"in 'enable_cpu_affinity' should match with the number "
- f"of workers (got {self.num_workers})")
- worker_init_fn_old = WorkerInitWrapper(self.worker_init_fn)
- affinity_old = psutil.Process().cpu_affinity()
- nthreads_old = torch.get_num_threads()
- loader_cores = loader_cores[:] if loader_cores else None
-
- def init_fn(worker_id):
- try:
- psutil.Process().cpu_affinity([loader_cores[worker_id]])
- except IndexError:
- raise ValueError(f"Cannot use CPU affinity for worker ID "
- f"{worker_id} on CPU {loader_cores}")
-
- worker_init_fn_old(worker_id)
-
- if loader_cores is None:
-
- numa_info = get_numa_nodes_cores()
-
- if numa_info and len(numa_info[0]) > self.num_workers:
- # Take one thread per each node 0 core:
- node0_cores = [cpus[0] for core_id, cpus in numa_info[0]]
- node0_cores.sort()
- else:
- node0_cores = list(range(psutil.cpu_count(logical=False)))
-
- if len(node0_cores) < self.num_workers:
- raise ValueError(
- f"More workers (got {self.num_workers}) than available "
- f"cores (got {len(node0_cores)})")
-
- # Set default loader core IDs:
- loader_cores = node0_cores[:self.num_workers]
-
- try:
- # Set CPU affinity for dataloader:
- self.worker_init_fn = init_fn
- logging.debug(f"{self.num_workers} data loader workers are "
- f"assigned to CPUs {loader_cores}")
- yield
- finally:
- # Restore omp_num_threads and cpu affinity:
- psutil.Process().cpu_affinity(affinity_old)
- torch.set_num_threads(nthreads_old)
- self.worker_init_fn = worker_init_fn_old
- self.cpu_affinity_enabled = False
diff --git a/pytorch_geometric-2.4.0/torch_geometric/nn/conv/message_passing.jinja b/pytorch_geometric-2.4.0/torch_geometric/nn/conv/message_passing.jinja
deleted file mode 100644
index 24a551e..0000000
--- a/pytorch_geometric-2.4.0/torch_geometric/nn/conv/message_passing.jinja
+++ /dev/null
@@ -1,300 +0,0 @@
-import typing
-from typing import *
-from torch_geometric.typing import *
-
-import torch
-from torch import Tensor
-from torch_geometric.nn.conv.message_passing import *
-from {{module}} import *
-
-
-class Propagate_{{uid}}(NamedTuple):
-{%- for k, v in prop_types.items() %}
- {{k}}: {{v}}
-{%- endfor %}
-
-{% if edge_updater_types|length > 0 %}
-class EdgeUpdater_{{uid}}(NamedTuple):
-{%- for k, v in edge_updater_types.items() %}
- {{k}}: {{v}}
-{%- endfor %}
-{% endif %}
-
-class Collect_{{uid}}(NamedTuple):
-{%- for k, v in collect_types.items() %}
- {{k}}: {{v}}
-{%- endfor %}
-
-{% if edge_updater_types|length > 0 %}
-class EdgeUpdater_Collect_{{uid}}(NamedTuple):
-{%- for k, v in edge_collect_types.items() %}
- {{k}}: {{v}}
-{%- endfor %}
-{% endif %}
-
-class {{cls_name}}({{parent_cls_name}}):
-
- @torch.jit._overload_method
- def _check_input(self, edge_index, size):
- # type: (Tensor, Size) -> List[Optional[int]]
- pass
-
- @torch.jit._overload_method
- def _check_input(self, edge_index, size):
- # type: (SparseTensor, Size) -> List[Optional[int]]
- pass
-
-{{check_input}}
-
- @torch.jit._overload_method
- def _lift(self, src, edge_index, dim):
- # type: (Tensor, Tensor, int) -> Tensor
- pass
-
- @torch.jit._overload_method
- def _lift(self, src, edge_index, dim):
- # type: (Tensor, SparseTensor, int) -> Tensor
- pass
-
- def _lift(self, src, edge_index, dim):
- if isinstance(edge_index, Tensor):
- index = edge_index[dim]
- return src.index_select(self.node_dim, index)
-
- elif isinstance(edge_index, SparseTensor):
- row, col, _ = edge_index.coo()
- if dim == 0:
- return src.index_select(self.node_dim, col)
- elif dim == 1:
- return src.index_select(self.node_dim, row)
-
- raise ValueError(
- ('`MessagePassing.propagate` only supports integer tensors of '
- 'shape `[2, num_messages]` or `torch_sparse.SparseTensor` for '
- 'argument `edge_index`.'))
-
- @torch.jit._overload_method
- def _collect(self, edge_def, size, kwargs):
- # type: (Tensor, List[Optional[int]], Propagate_{{uid}}) -> Collect_{{uid}}
- pass
-
- @torch.jit._overload_method
- def _collect(self, edge_def, size, kwargs):
- # type: (SparseTensor, List[Optional[int]], Propagate_{{uid}}) -> Collect_{{uid}}
- pass
-
- def _collect(self, edge_def, size, kwargs):
- init = torch.zeros(1)
- i, j = (1, 0) if self.flow == 'source_to_target' else (0, 1)
-{% for arg in user_args %}
-{%- if arg[-2:] not in ['_i', '_j'] %}
- {{arg}} = kwargs.{{arg}}
-{%- else %}
- {{arg}}: {{collect_types[arg]}} = {% if collect_types[arg][:8] == 'Optional' %}None{% else %}init{% endif %}
- data = kwargs.{{arg[:-2]}}
- if isinstance(data, (tuple, list)):
- assert len(data) == 2
-{%- if arg[-2:] == '_j' %}
- tmp = data[1]
- if isinstance(tmp, Tensor):
- self._set_size(size, 1, tmp)
- {{arg}} = data[0]
-{%- else %}
- tmp = data[0]
- if isinstance(tmp, Tensor):
- self._set_size(size, 0, tmp)
- {{arg}} = data[1]
-{%- endif %}
- else:
- {{arg}} = data
- if isinstance({{arg}}, Tensor):
- self._set_size(size, {% if arg[-2:] == '_j'%}0{% else %}1{% endif %}, {{arg}})
- {{arg}} = self._lift({{arg}}, edge_def, {% if arg[-2:] == "_j" %}j{% else %}i{% endif %})
-{%- endif %}
-{%- endfor %}
-
- edge_index: Optional[Tensor] = None
- adj_t: Optional[SparseTensor] = None
- edge_index_i: torch.Tensor = init
- edge_index_j: torch.Tensor = init
- ptr: Optional[Tensor] = None
- if isinstance(edge_def, Tensor):
- edge_index = edge_def
- edge_index_i = edge_def[i]
- edge_index_j = edge_def[j]
- elif isinstance(edge_def, SparseTensor):
- adj_t = edge_def
- edge_index_i, edge_index_j, value = edge_def.coo()
- ptr, _, _ = edge_def.csr()
-
- {% if 'edge_weight' in collect_types.keys() %}
- if edge_weight is None:
- edge_weight = value
- {% endif %}
- {% if 'edge_attr' in collect_types.keys() %}
- if edge_attr is None:
- edge_attr = value
- {% endif %}
- {% if 'edge_type' in collect_types.keys() %}
- if edge_type is None:
- edge_type = value
- {% endif %}
-
- {% if collect_types.get('edge_weight', 'Optional')[:8] != 'Optional' %}assert edge_weight is not None{% endif %}
- {% if collect_types.get('edge_attr', 'Optional')[:8] != 'Optional' %}assert edge_attr is not None{% endif %}
- {% if collect_types.get('edge_type', 'Optional')[:8] != 'Optional' %}assert edge_type is not None{% endif %}
-
- index = edge_index_i
- size_i = size[1] if size[1] is not None else size[0]
- size_j = size[0] if size[0] is not None else size[1]
- dim_size = size_i
-
- return Collect_{{uid}}({% for k in collect_types.keys() %}{{k}}={{k}}{{ ", " if not loop.last }}{% endfor %})
-
-{% if edge_updater_types|length > 0 %}
- @torch.jit._overload_method
- def _collect_edge(self, edge_def, size, kwargs):
- # type: (Tensor, List[Optional[int]], EdgeUpdater_{{uid}}) -> EdgeUpdater_Collect_{{uid}}
- pass
-
- @torch.jit._overload_method
- def _collect_edge(self, edge_def, size, kwargs):
- # type: (SparseTensor, List[Optional[int]], EdgeUpdater_{{uid}}) -> EdgeUpdater_Collect_{{uid}}
- pass
-
- def _collect_edge(self, edge_def, size, kwargs):
- init = torch.tensor(0.)
- i, j = (1, 0) if self.flow == 'source_to_target' else (0, 1)
-{% for arg in edge_user_args %}
-{%- if arg[-2:] not in ['_i', '_j'] %}
- {{arg}} = kwargs.{{arg}}
-{%- else %}
- {{arg}}: {{edge_collect_types[arg]}} = {% if edge_collect_types[arg][:8] == 'Optional' %}None{% else %}init{% endif %}
- data = kwargs.{{arg[:-2]}}
- if isinstance(data, (tuple, list)):
- assert len(data) == 2
-{%- if arg[-2:] == '_j' %}
- tmp = data[1]
- if isinstance(tmp, Tensor):
- self._set_size(size, 1, tmp)
- {{arg}} = data[0]
-{%- else %}
- tmp = data[0]
- if isinstance(tmp, Tensor):
- self._set_size(size, 0, tmp)
- {{arg}} = data[1]
-{%- endif %}
- else:
- {{arg}} = data
- if isinstance({{arg}}, Tensor):
- self._set_size(size, {% if arg[-2:] == '_j'%}0{% else %}1{% endif %}, {{arg}})
- {{arg}} = self._lift({{arg}}, edge_def, {% if arg[-2:] == "_j" %}j{% else %}i{% endif %})
-{%- endif %}
-{%- endfor %}
-
- edge_index: Optional[Tensor] = None
- adj_t: Optional[SparseTensor] = None
- edge_index_i: torch.Tensor = init
- edge_index_j: torch.Tensor = init
- ptr: Optional[Tensor] = None
- if isinstance(edge_def, Tensor):
- edge_index = edge_def
- edge_index_i = edge_def[i]
- edge_index_j = edge_def[j]
- elif isinstance(edge_def, SparseTensor):
- adj_t = edge_def
- edge_index_i, edge_index_j, value = edge_def.coo()
- ptr, _, _ = edge_def.csr()
-
- {% if 'edge_weight' in edge_collect_types.keys() %}
- if edge_weight is None:
- edge_weight = value
- {% endif %}
- {% if 'edge_attr' in edge_collect_types.keys() %}
- if edge_attr is None:
- edge_attr = value
- {% endif %}
- {% if 'edge_type' in edge_collect_types.keys() %}
- if edge_type is None:
- edge_type = value
- {% endif %}
-
- {% if edge_collect_types.get('edge_weight', 'Optional')[:8] != 'Optional' %}assert edge_weight is not None{% endif %}
- {% if edge_collect_types.get('edge_attr', 'Optional')[:8] != 'Optional' %}assert edge_attr is not None{% endif %}
- {% if edge_collect_types.get('edge_type', 'Optional')[:8] != 'Optional' %}assert edge_type is not None{% endif %}
-
- index = edge_index_i
- size_i = size[1] if size[1] is not None else size[0]
- size_j = size[0] if size[0] is not None else size[1]
- dim_size = size_i
-
- return EdgeUpdater_Collect_{{uid}}({% for k in edge_collect_types.keys() %}{{k}}={{k}}{{ ", " if not loop.last }}{% endfor %})
-
-
-{% endif %}
-
- @torch.jit._overload_method
- def propagate(self, edge_index, {{ prop_types.keys()|join(', ') }}, size=None):
- # type: (Tensor, {{ prop_types.values()|join(', ') }}, Size) -> {{ prop_return_type }}
- pass
-
- @torch.jit._overload_method
- def propagate(self, edge_index, {{ prop_types.keys()|join(', ') }}, size=None):
- # type: (SparseTensor, {{ prop_types.values()|join(', ') }}, Size) -> {{ prop_return_type }}
- pass
-
- def propagate(self, edge_index, {{ prop_types.keys()|join(', ') }}, size=None):
- the_size = self._check_input(edge_index, size)
- in_kwargs = Propagate_{{uid}}({% for k in prop_types.keys() %}{{k}}={{k}}{{ ", " if not loop.last }}{% endfor %})
-
- {% if fuse %}
- if isinstance(edge_index, SparseTensor):
- out = self.message_and_aggregate(edge_index{% for k in msg_and_aggr_args %}, {{k}}=in_kwargs.{{k}}{% endfor %})
- return self.update(out{% for k in update_args %}, {{k}}=in_kwargs.{{k}}{% endfor %})
- {% endif %}
-
- kwargs = self._collect(edge_index, the_size, in_kwargs)
- out = self.message({% for k in msg_args %}{{k}}=kwargs.{{k}}{{ ", " if not loop.last }}{% endfor %})
- out = self.aggregate(out{% for k in aggr_args %}, {{k}}=kwargs.{{k}}{% endfor %})
- return self.update(out{% for k in update_args %}, {{k}}=kwargs.{{k}}{% endfor %})
-
-{% if edge_updater_types|length > 0 %}
- @torch.jit._overload_method
- def edge_updater(self, edge_index{% for k in edge_updater_types.keys() %}, {{k}} {% endfor %}):
- # type: (Tensor{% for v in edge_updater_types.values() %}, {{v}} {% endfor %}) -> {{ edge_updater_return_type }}
- pass
-
- @torch.jit._overload_method
- def edge_updater(self, edge_index{% for k in edge_updater_types.keys() %}, {{k}} {% endfor %}):
- # type: (SparseTensor{% for v in edge_updater_types.values() %}, {{v}} {% endfor %}) -> {{ edge_updater_return_type }}
- pass
-
- def edge_updater(self, edge_index{% for k in edge_updater_types.keys() %}, {{k}} {% endfor %}):
- the_size = self._check_input(edge_index, size=None)
- in_kwargs = EdgeUpdater_{{uid}}({% for k in edge_updater_types.keys() %}{{k}}={{k}}{{ ", " if not loop.last }}{% endfor %})
- kwargs = self._collect_edge(edge_index, the_size, in_kwargs)
- return self.edge_update({% for k in edge_update_args %}{{k}}=kwargs.{{k}}{{ ", " if not loop.last }}{% endfor %})
-{% else %}
- def edge_updater(self):
- pass
-{% endif %}
-
- @property
- def explain(self) -> bool:
- return self._explain
-
- @explain.setter
- def explain(self, explain: bool):
- raise ValueError("Explainability of message passing modules "
- "is only supported on the Python module")
-
-{%- for (arg_types, return_type_repr) in forward_types %}
-
- @torch.jit._overload_method
- {{forward_header}}
- # type: ({{arg_types|join(', ')}}) -> {{return_type_repr}}
- pass
-{%- endfor %}
-
- {{forward_header}}
-{{forward_body}}
diff --git a/pytorch_geometric-2.4.0/torch_geometric/nn/conv/utils/helpers.py b/pytorch_geometric-2.4.0/torch_geometric/nn/conv/utils/helpers.py
deleted file mode 100644
index 5961a44..0000000
--- a/pytorch_geometric-2.4.0/torch_geometric/nn/conv/utils/helpers.py
+++ /dev/null
@@ -1,7 +0,0 @@
-import torch
-
-
-def expand_left(src: torch.Tensor, dim: int, dims: int) -> torch.Tensor:
- for _ in range(dims + dim if dim < 0 else dim):
- src = src.unsqueeze(0)
- return src
diff --git a/pytorch_geometric-2.4.0/torch_geometric/nn/conv/utils/inspector.py b/pytorch_geometric-2.4.0/torch_geometric/nn/conv/utils/inspector.py
deleted file mode 100644
index e5d42b7..0000000
--- a/pytorch_geometric-2.4.0/torch_geometric/nn/conv/utils/inspector.py
+++ /dev/null
@@ -1,86 +0,0 @@
-import inspect
-import re
-from collections import OrderedDict
-from typing import Any, Callable, Dict, List, Optional, Set
-
-from torch_geometric.nn.conv.utils.typing import parse_types
-
-
-class Inspector:
- def __init__(self, base_class: Any):
- self.base_class: Any = base_class
- self.params: Dict[str, Dict[str, Any]] = {}
-
- def inspect(self, func: Callable,
- pop_first: bool = False) -> Dict[str, Any]:
- params = inspect.signature(func).parameters
- params = OrderedDict(params)
- if pop_first:
- params.popitem(last=False)
- self.params[func.__name__] = params
-
- def keys(self, func_names: Optional[List[str]] = None) -> Set[str]:
- keys = []
- for func in func_names or list(self.params.keys()):
- keys += self.params[func].keys()
- return set(keys)
-
- def _implements(self, cls, func_name: str) -> bool:
- if cls.__name__ == 'MessagePassing':
- return False
- if func_name in cls.__dict__.keys():
- return True
- return any(self._implements(c, func_name) for c in cls.__bases__)
-
- def implements(self, func_name: str) -> bool:
- return self._implements(self.base_class.__class__, func_name)
-
- def types(self, func_names: Optional[List[str]] = None) -> Dict[str, str]:
- out: Dict[str, str] = {}
- for func_name in func_names or list(self.params.keys()):
- func = getattr(self.base_class, func_name)
- arg_types = parse_types(func)[0][0]
- for key in self.params[func_name].keys():
- if key in out and out[key] != arg_types[key]:
- raise ValueError(
- (f'Found inconsistent types for argument {key}. '
- f'Expected type {out[key]} but found type '
- f'{arg_types[key]}.'))
- out[key] = arg_types[key]
- return out
-
- def distribute(self, func_name, kwargs: Dict[str, Any]):
- out = {}
- for key, param in self.params[func_name].items():
- data = kwargs.get(key, inspect.Parameter.empty)
- if data is inspect.Parameter.empty:
- if param.default is inspect.Parameter.empty:
- raise TypeError(f'Required parameter {key} is empty.')
- data = param.default
- out[key] = data
- return out
-
-
-def func_header_repr(func: Callable, keep_annotation: bool = True) -> str:
- source = inspect.getsource(func)
- signature = inspect.signature(func)
-
- if keep_annotation:
- return ''.join(re.split(r'(\).*?:.*?\n)', source,
- maxsplit=1)[:2]).strip()
-
- params_repr = ['self']
- for param in signature.parameters.values():
- params_repr.append(param.name)
- if param.default is not inspect.Parameter.empty:
- params_repr[-1] += f'={param.default}'
-
- return f'def {func.__name__}({", ".join(params_repr)}):'
-
-
-def func_body_repr(func: Callable, keep_annotation: bool = True) -> str:
- source = inspect.getsource(func)
- body_repr = re.split(r'\).*?:.*?\n', source, maxsplit=1)[1]
- if not keep_annotation:
- body_repr = re.sub(r'\s*# type:.*\n', '', body_repr)
- return body_repr
diff --git a/pytorch_geometric-2.4.0/torch_geometric/nn/conv/utils/jit.py b/pytorch_geometric-2.4.0/torch_geometric/nn/conv/utils/jit.py
deleted file mode 100644
index 61c756d..0000000
--- a/pytorch_geometric-2.4.0/torch_geometric/nn/conv/utils/jit.py
+++ /dev/null
@@ -1,20 +0,0 @@
-import os.path as osp
-import sys
-from getpass import getuser
-from importlib.util import module_from_spec, spec_from_file_location
-from tempfile import NamedTemporaryFile as TempFile
-from tempfile import gettempdir
-
-from torch_geometric.data.makedirs import makedirs
-
-
-def class_from_module_repr(cls_name, module_repr):
- path = osp.join(gettempdir(), f'{getuser()}_pyg')
- makedirs(path)
- with TempFile(mode='w+', suffix='.py', delete=False, dir=path) as f:
- f.write(module_repr)
- spec = spec_from_file_location(cls_name, f.name)
- mod = module_from_spec(spec)
- sys.modules[cls_name] = mod
- spec.loader.exec_module(mod)
- return getattr(mod, cls_name)
diff --git a/pytorch_geometric-2.4.0/torch_geometric/nn/conv/utils/typing.py b/pytorch_geometric-2.4.0/torch_geometric/nn/conv/utils/typing.py
deleted file mode 100644
index f4bcb40..0000000
--- a/pytorch_geometric-2.4.0/torch_geometric/nn/conv/utils/typing.py
+++ /dev/null
@@ -1,110 +0,0 @@
-import inspect
-import re
-from collections import OrderedDict
-from itertools import product
-from typing import Callable, Dict, List, Tuple
-
-import pyparsing as pp
-
-
-def split_types_repr(types_repr: str) -> List[str]:
- out = []
- i = depth = 0
- for j, char in enumerate(types_repr):
- if char == '[':
- depth += 1
- elif char == ']':
- depth -= 1
- elif char == ',' and depth == 0:
- out.append(types_repr[i:j].strip())
- i = j + 1
- out.append(types_repr[i:].strip())
- return out
-
-
-def sanitize(type_repr: str):
- type_repr = re.sub(r'', r'\1', type_repr)
- type_repr = type_repr.replace('typing.', '')
- type_repr = type_repr.replace('torch_sparse.tensor.', '')
- type_repr = type_repr.replace('Adj', 'Union[Tensor, SparseTensor]')
- type_repr = type_repr.replace('torch_geometric.SparseTensor',
- 'SparseTensor')
-
- # Replace `Union[..., NoneType]` by `Optional[...]`.
- sexp = pp.nestedExpr(opener='[', closer=']')
- tree = sexp.parseString(f'[{type_repr.replace(",", " ")}]').asList()[0]
-
- def union_to_optional_(tree):
- for i in range(len(tree)):
- e, n = tree[i], tree[i + 1] if i + 1 < len(tree) else []
- if e == 'Union' and n[-1] == 'NoneType':
- tree[i] = 'Optional'
- tree[i + 1] = tree[i + 1][:-1]
- elif e == 'Union' and 'NoneType' in n:
- idx = n.index('NoneType')
- n[idx] = [n[idx - 1]]
- n[idx - 1] = 'Optional'
- elif isinstance(e, list):
- tree[i] = union_to_optional_(e)
- return tree
-
- tree = union_to_optional_(tree)
- type_repr = re.sub(r'\'|\"', '', str(tree)[1:-1]).replace(', [', '[')
-
- return type_repr
-
-
-def param_type_repr(param) -> str:
- if param.annotation is inspect.Parameter.empty:
- return 'torch.Tensor'
- return sanitize(re.split(r':|='.strip(), str(param))[1])
-
-
-def return_type_repr(signature) -> str:
- return_type = signature.return_annotation
- if return_type is inspect.Parameter.empty:
- return 'torch.Tensor'
- elif str(return_type)[:6] != ' List[Tuple[Dict[str, str], str]]:
- source = inspect.getsource(func)
- signature = inspect.signature(func)
-
- # Parse `# type: (...) -> ...` annotation. Note that it is allowed to pass
- # multiple `# type:` annotations in `forward()`.
- iterator = re.finditer(r'#\s*type:\s*\((.*)\)\s*->\s*(.*)\s*\n', source)
- matches = list(iterator)
-
- if len(matches) > 0:
- out = []
- args = list(signature.parameters.keys())
- for match in matches:
- arg_types_repr, return_type = match.groups()
- arg_types = split_types_repr(arg_types_repr)
- arg_types = OrderedDict((k, v) for k, v in zip(args, arg_types))
- return_type = return_type.split('#')[0].strip()
- out.append((arg_types, return_type))
- return out
-
- # Alternatively, parse annotations using the inspected signature.
- else:
- ps = signature.parameters
- arg_types = OrderedDict((k, param_type_repr(v)) for k, v in ps.items())
- return [(arg_types, return_type_repr(signature))]
-
-
-def resolve_types(arg_types: Dict[str, str],
- return_type_repr: str) -> List[Tuple[List[str], str]]:
- out = []
- for type_repr in arg_types.values():
- if type_repr[:5] == 'Union':
- out.append(split_types_repr(type_repr[6:-1]))
- else:
- out.append([type_repr])
- return [(x, return_type_repr) for x in product(*out)]
diff --git a/pytorch_geometric-2.4.0/torch_geometric/nn/models/rect.py b/pytorch_geometric-2.4.0/torch_geometric/nn/models/rect.py
deleted file mode 100644
index d17569b..0000000
--- a/pytorch_geometric-2.4.0/torch_geometric/nn/models/rect.py
+++ /dev/null
@@ -1,188 +0,0 @@
-import copy
-
-import torch
-import torch.nn.functional as F
-from torch import Tensor
-from torch.nn import Linear
-
-from torch_geometric.nn import GCNConv
-from torch_geometric.typing import Adj, OptTensor, SparseTensor
-from torch_geometric.utils import scatter
-
-
-class RECT_L(torch.nn.Module):
- r"""The RECT model, *i.e.* its supervised RECT-L part, from the
- `"Network Embedding with Completely-imbalanced Labels"
- `_ paper.
- In particular, a GCN model is trained that reconstructs semantic class
- knowledge.
-
- .. note::
-
- For an example of using RECT, see `examples/rect.py
- `_.
-
- Args:
- in_channels (int): Size of each input sample.
- hidden_channels (int): Intermediate size of each sample.
- normalize (bool, optional): Whether to add self-loops and compute
- symmetric normalization coefficients on-the-fly.
- (default: :obj:`True`)
- dropout (float, optional): The dropout probability.
- (default: :obj:`0.0`)
- """
- def __init__(self, in_channels: int, hidden_channels: int,
- normalize: bool = True, dropout: float = 0.0):
- super().__init__()
- self.in_channels = in_channels
- self.hidden_channels = hidden_channels
- self.dropout = dropout
-
- self.conv = GCNConv(in_channels, hidden_channels, normalize=normalize)
- self.lin = Linear(hidden_channels, in_channels)
-
- self.reset_parameters()
-
- def reset_parameters(self):
- r"""Resets all learnable parameters of the module."""
- self.conv.reset_parameters()
- self.lin.reset_parameters()
- torch.nn.init.xavier_uniform_(self.lin.weight.data)
-
- @torch.jit._overload_method
- def forward(self, x, edge_index, edge_weight=None): # noqa
- # type: (Tensor, Tensor, OptTensor) -> Tensor
- pass
-
- @torch.jit._overload_method
- def forward(self, x, edge_index, edge_weight=None): # noqa
- # type: (Tensor, SparseTensor, OptTensor) -> Tensor
- pass
-
- def forward( # noqa
- self,
- x: Tensor,
- edge_index: Adj,
- edge_weight: OptTensor = None,
- ) -> Tensor:
- """"""
- x = self.conv(x, edge_index, edge_weight)
- x = F.dropout(x, p=self.dropout, training=self.training)
- return self.lin(x)
-
- @torch.jit._overload_method
- def embed(self, x, edge_index, edge_weight=None): # noqa
- # type: (Tensor, Tensor, OptTensor) -> Tensor
- pass
-
- @torch.jit._overload_method
- def embed(self, x, edge_index, edge_weight=None): # noqa
- # type: (Tensor, SparseTensor, OptTensor) -> Tensor
- pass
-
- def embed( # noqa
- self,
- x: Tensor,
- edge_index: Adj,
- edge_weight: OptTensor = None,
- ) -> Tensor:
- with torch.no_grad():
- return self.conv(x, edge_index, edge_weight)
-
- def get_semantic_labels(
- self,
- x: Tensor,
- y: Tensor,
- mask: Tensor,
- ) -> Tensor:
- r"""Replaces the original labels by their class-centers."""
- with torch.no_grad():
- y = y[mask]
- mean = scatter(x[mask], y, dim=0, reduce='mean')
- return mean[y]
-
- def jittable(self, use_sparse_tensor: bool = False) -> torch.nn.Module:
- class EdgeIndexJittable(torch.nn.Module):
- def __init__(self, child: RECT_L):
- super().__init__()
- self.child = copy.deepcopy(child)
- self.child.conv = self.child.conv.jittable()
-
- def reset_parameters(self):
- self.child.reset_parameters()
-
- def forward(
- self,
- x: Tensor,
- edge_index: Tensor,
- edge_weight: OptTensor = None,
- ) -> Tensor:
- return self.child(x, edge_index, edge_weight)
-
- @torch.jit.export
- def embed(
- self,
- x: Tensor,
- edge_index: Tensor,
- edge_weight: OptTensor = None,
- ) -> Tensor:
- return self.child.embed(x, edge_index, edge_weight)
-
- @torch.jit.export
- def get_semantic_labels(
- self,
- x: Tensor,
- y: Tensor,
- mask: Tensor,
- ) -> Tensor:
- return self.child.get_semantic_labels(x, y, mask)
-
- def __repr__(self) -> str:
- return str(self.child)
-
- class SparseTensorJittable(torch.nn.Module):
- def __init__(self, child: RECT_L):
- super().__init__()
- self.child = copy.deepcopy(child)
- self.child.conv = self.child.conv.jittable()
-
- def reset_parameters(self):
- self.child.reset_parameters()
-
- def forward(
- self,
- x: Tensor,
- edge_index: SparseTensor,
- edge_weight: OptTensor = None,
- ):
- return self.child(x, edge_index, edge_weight)
-
- @torch.jit.export
- def embed(
- self,
- x: Tensor,
- edge_index: SparseTensor,
- edge_weight: OptTensor = None,
- ) -> Tensor:
- return self.child.embed(x, edge_index, edge_weight)
-
- @torch.jit.export
- def get_semantic_labels(
- self,
- x: Tensor,
- y: Tensor,
- mask: Tensor,
- ) -> Tensor:
- return self.child.get_semantic_labels(x, y, mask)
-
- def __repr__(self) -> str:
- return str(self.child)
-
- if use_sparse_tensor:
- return SparseTensorJittable(self)
- return EdgeIndexJittable(self)
-
- def __repr__(self) -> str:
- return (f'{self.__class__.__name__}({self.in_channels}, '
- f'{self.hidden_channels})')
diff --git a/pytorch_geometric-2.4.0/torch_geometric/nn/sequential.jinja b/pytorch_geometric-2.4.0/torch_geometric/nn/sequential.jinja
deleted file mode 100644
index 16bbfae..0000000
--- a/pytorch_geometric-2.4.0/torch_geometric/nn/sequential.jinja
+++ /dev/null
@@ -1,33 +0,0 @@
-from typing import *
-from torch_geometric.typing import *
-
-import torch
-from torch import Tensor
-
-
-class {{cls_name}}(torch.nn.Module):
- def reset_parameters(self):
- for name in self._names:
- module = getattr(self, name)
- if hasattr(module, 'reset_parameters'):
- module.reset_parameters()
-
- def forward(self, {{ input_args|join(', ') }}):
- """"""{% for name, module, in_desc, out_desc in calls %}
- {% for output in out_desc %}{{output}}{{ ", " if not loop.last }}{% endfor %} = self.{{name}}({% for input in in_desc %}{{input}}{{ ", " if not loop.last }}{% endfor %}){% endfor %}
- return {% for output in calls[-1][-1] %}{{output}}{{ ", " if not loop.last }}{% endfor %}
-
- def __getitem__(self, idx: int) -> torch.nn.Module:
- return getattr(self, self._names[idx])
-
- def __len__(self) -> int:
- return {{calls|length}}
-
- def __repr__(self) -> str:
- module_reprs = [
- (f" ({i}) - {self[i]}: {', '.join(self.module_headers[i].args)} "
- f"-> {', '.join(self.module_headers[i].output)}")
- for i in range(len(self))
- ]
-
- return 'Sequential(\n{}\n)'.format('\n'.join(module_reprs))
diff --git a/pytorch_geometric-2.4.0/torch_geometric/nn/sequential.py b/pytorch_geometric-2.4.0/torch_geometric/nn/sequential.py
deleted file mode 100644
index 3a2ea7e..0000000
--- a/pytorch_geometric-2.4.0/torch_geometric/nn/sequential.py
+++ /dev/null
@@ -1,131 +0,0 @@
-import os
-import os.path as osp
-from typing import Callable, List, NamedTuple, Tuple, Union
-from uuid import uuid1
-
-import torch
-
-from torch_geometric.nn.conv.utils.jit import class_from_module_repr
-
-
-class HeaderDesc(NamedTuple):
- args: List[str]
- output: List[str]
-
-
-def Sequential(
- input_args: str,
- modules: List[Union[Tuple[Callable, str], Callable]],
-) -> torch.nn.Module:
- r"""An extension of the :class:`torch.nn.Sequential` container in order to
- define a sequential GNN model.
- Since GNN operators take in multiple input arguments,
- :class:`torch_geometric.nn.Sequential` expects both global input
- arguments, and function header definitions of individual operators.
- If omitted, an intermediate module will operate on the *output* of its
- preceding module:
-
- .. code-block:: python
-
- from torch.nn import Linear, ReLU
- from torch_geometric.nn import Sequential, GCNConv
-
- model = Sequential('x, edge_index', [
- (GCNConv(in_channels, 64), 'x, edge_index -> x'),
- ReLU(inplace=True),
- (GCNConv(64, 64), 'x, edge_index -> x'),
- ReLU(inplace=True),
- Linear(64, out_channels),
- ])
-
- where :obj:`'x, edge_index'` defines the input arguments of :obj:`model`,
- and :obj:`'x, edge_index -> x'` defines the function header, *i.e.* input
- arguments *and* return types, of :class:`~torch_geometric.nn.conv.GCNConv`.
-
- In particular, this also allows to create more sophisticated models,
- such as utilizing :class:`~torch_geometric.nn.models.JumpingKnowledge`:
-
- .. code-block:: python
-
- from torch.nn import Linear, ReLU, Dropout
- from torch_geometric.nn import Sequential, GCNConv, JumpingKnowledge
- from torch_geometric.nn import global_mean_pool
-
- model = Sequential('x, edge_index, batch', [
- (Dropout(p=0.5), 'x -> x'),
- (GCNConv(dataset.num_features, 64), 'x, edge_index -> x1'),
- ReLU(inplace=True),
- (GCNConv(64, 64), 'x1, edge_index -> x2'),
- ReLU(inplace=True),
- (lambda x1, x2: [x1, x2], 'x1, x2 -> xs'),
- (JumpingKnowledge("cat", 64, num_layers=2), 'xs -> x'),
- (global_mean_pool, 'x, batch -> x'),
- Linear(2 * 64, dataset.num_classes),
- ])
-
- Args:
- input_args (str): The input arguments of the model.
- modules ([(str, Callable) or Callable]): A list of modules (with
- optional function header definitions). Alternatively, an
- :obj:`OrderedDict` of modules (and function header definitions) can
- be passed.
- """
- try:
- from jinja2 import Template
- except ImportError:
- raise ModuleNotFoundError(
- "No module named 'jinja2' found on this machine. "
- "Run 'pip install jinja2' to install the library.")
-
- input_args = [x.strip() for x in input_args.split(',')]
-
- if not isinstance(modules, dict):
- modules = {f'module_{i}': module for i, module in enumerate(modules)}
-
- # We require the first entry of the input list to define arguments:
- assert len(modules) > 0
- first_module = list(modules.values())[0]
- assert isinstance(first_module, (tuple, list))
-
- # A list holding the callable function and the input and output names:
- calls: List[Tuple[str, Callable, List[str], List[str]]] = []
-
- for name, module in modules.items():
- if isinstance(module, (tuple, list)) and len(module) >= 2:
- module, desc = module[:2]
- in_desc, out_desc = parse_desc(desc)
- elif isinstance(module, (tuple, list)):
- module = module[0]
- in_desc = out_desc = calls[-1][-1]
- else:
- in_desc = out_desc = calls[-1][-1]
-
- calls.append((name, module, in_desc, out_desc))
-
- root = os.path.dirname(osp.realpath(__file__))
- with open(osp.join(root, 'sequential.jinja'), 'r') as f:
- template = Template(f.read())
-
- cls_name = f'Sequential_{uuid1().hex[:6]}'
- module_repr = template.render(
- cls_name=cls_name,
- input_args=input_args,
- calls=calls,
- )
-
- # Instantiate a class from the rendered module representation.
- module = class_from_module_repr(cls_name, module_repr)()
- module.module_headers = [
- HeaderDesc(in_desc, out_desc) for _, _, in_desc, out_desc in calls
- ]
- module._names = list(modules.keys())
- for name, submodule, _, _ in calls:
- setattr(module, name, submodule)
- return module
-
-
-def parse_desc(desc: str) -> Tuple[List[str], List[str]]:
- in_desc, out_desc = desc.split('->')
- in_desc = [x.strip() for x in in_desc.split(',')]
- out_desc = [x.strip() for x in out_desc.split(',')]
- return in_desc, out_desc
diff --git a/pytorch_geometric-2.4.0/torch_geometric/transforms/remove_isolated_nodes.py b/pytorch_geometric-2.4.0/torch_geometric/transforms/remove_isolated_nodes.py
deleted file mode 100644
index 4a4e013..0000000
--- a/pytorch_geometric-2.4.0/torch_geometric/transforms/remove_isolated_nodes.py
+++ /dev/null
@@ -1,67 +0,0 @@
-import copy
-from collections import defaultdict
-from typing import Union
-
-import torch
-
-from torch_geometric.data import Data, HeteroData
-from torch_geometric.data.datapipes import functional_transform
-from torch_geometric.transforms import BaseTransform
-
-
-@functional_transform('remove_isolated_nodes')
-class RemoveIsolatedNodes(BaseTransform):
- r"""Removes isolated nodes from the graph
- (functional name: :obj:`remove_isolated_nodes`)."""
- def forward(
- self,
- data: Union[Data, HeteroData],
- ) -> Union[Data, HeteroData]:
- # Gather all nodes that occur in at least one edge (across all types):
- n_id_dict = defaultdict(list)
- for store in data.edge_stores:
- if 'edge_index' not in store:
- continue
-
- if store._key is None:
- src = dst = None
- else:
- src, _, dst = store._key
-
- n_id_dict[src].append(store.edge_index[0])
- n_id_dict[dst].append(store.edge_index[1])
-
- n_id_dict = {k: torch.cat(v).unique() for k, v in n_id_dict.items()}
-
- n_map_dict = {}
- for store in data.node_stores:
- if store._key not in n_id_dict:
- n_id_dict[store._key] = torch.empty((0, ), dtype=torch.long)
-
- idx = n_id_dict[store._key]
- mapping = idx.new_zeros(data.num_nodes)
- mapping[idx] = torch.arange(idx.numel(), device=mapping.device)
- n_map_dict[store._key] = mapping
-
- for store in data.edge_stores:
- if 'edge_index' not in store:
- continue
-
- if store._key is None:
- src = dst = None
- else:
- src, _, dst = store._key
-
- row = n_map_dict[src][store.edge_index[0]]
- col = n_map_dict[dst][store.edge_index[1]]
- store.edge_index = torch.stack([row, col], dim=0)
-
- old_data = copy.copy(data)
- for out, store in zip(data.node_stores, old_data.node_stores):
- for key, value in store.items():
- if key == 'num_nodes':
- out.num_nodes = n_id_dict[store._key].numel()
- elif store.is_node_attr(key):
- out[key] = value[n_id_dict[store._key]]
-
- return data
diff --git a/pytorch_geometric-2.4.0/torch_geometric/utils/cross_entropy.py b/pytorch_geometric-2.4.0/torch_geometric/utils/cross_entropy.py
deleted file mode 100644
index e3ddd59..0000000
--- a/pytorch_geometric-2.4.0/torch_geometric/utils/cross_entropy.py
+++ /dev/null
@@ -1,66 +0,0 @@
-from typing import Tuple
-
-import torch
-from torch import Tensor
-
-from torch_geometric.utils import scatter
-
-
-class SparseCrossEntropy(torch.autograd.Function):
- # We implement our own custom autograd function for this to avoid the
- # double gradient computation to `inputs`.
- @staticmethod
- def forward(ctx, inputs: Tensor, edge_label_index: Tensor) -> Tensor:
- assert inputs.dim() == 2
-
- logsumexp = inputs.logsumexp(dim=-1)
- ctx.save_for_backward(inputs, edge_label_index, logsumexp)
-
- out = inputs[edge_label_index[0], edge_label_index[1]]
- out.neg_().add_(logsumexp[edge_label_index[0]])
-
- return out.sum() / inputs.size(0)
-
- @staticmethod
- @torch.autograd.function.once_differentiable
- def backward(ctx, grad_out: Tensor) -> Tuple[Tensor, None]:
- inputs, edge_label_index, logsumexp = ctx.saved_tensors
-
- grad_out = grad_out / inputs.size(0)
-
- grad_logsumexp = scatter(grad_out.expand(edge_label_index.size(1)),
- edge_label_index[0], dim=0,
- dim_size=inputs.size(0), reduce='sum')
-
- # Gradient computation of `logsumexp`: `grad * (self - result).exp()`
- grad_input = (inputs - logsumexp.view(-1, 1))
- grad_input.exp_()
- grad_input.mul_(grad_logsumexp.view(-1, 1))
-
- grad_input[edge_label_index[0], edge_label_index[1]] -= grad_out
-
- return grad_input, None
-
-
-def sparse_cross_entropy(inputs: Tensor, edge_label_index: Tensor) -> Tensor:
- r"""A sparse-label variant of :func:`torch.nn.functional.cross_entropy`.
- In particular, the binary target matrix is solely given by sparse indices
- :obj:`edge_label_index`.
-
- Args:
- inputs (torch.Tensor): The predicted unnormalized logits of shape
- :obj:`[batch_size, num_classes]`.
- edge_index (torch.Tensor): The sparse ground-truth indices of
- shape :obj:`[2, num_labels]`.
-
- :rtype: :class:`torch.Tensor`
-
- Example:
-
- >>> inputs = torch.randn(2, 3)
- >>> edge_label_index = torch.tensor([[0, 0, 1],
- ... [0, 1, 2]])
- >>> sparse_cross_entropy(inputs, edge_label_index)
- tensor(1.2919)
- """
- return SparseCrossEntropy.apply(inputs, edge_label_index)
diff --git a/pytorch_geometric-2.4.0/torch_geometric/utils/loop.py b/pytorch_geometric-2.4.0/torch_geometric/utils/loop.py
deleted file mode 100644
index 59265cd..0000000
--- a/pytorch_geometric-2.4.0/torch_geometric/utils/loop.py
+++ /dev/null
@@ -1,418 +0,0 @@
-from typing import Optional, Tuple, Union
-
-import torch
-from torch import Tensor
-
-from torch_geometric.typing import OptTensor
-from torch_geometric.utils import scatter
-from torch_geometric.utils.num_nodes import maybe_num_nodes
-from torch_geometric.utils.sparse import (
- is_torch_sparse_tensor,
- to_edge_index,
- to_torch_coo_tensor,
- to_torch_csr_tensor,
-)
-
-
-def contains_self_loops(edge_index: Tensor) -> bool:
- r"""Returns :obj:`True` if the graph given by :attr:`edge_index` contains
- self-loops.
-
- Args:
- edge_index (LongTensor): The edge indices.
-
- :rtype: bool
-
- Examples:
-
- >>> edge_index = torch.tensor([[0, 1, 0],
- ... [1, 0, 0]])
- >>> contains_self_loops(edge_index)
- True
-
- >>> edge_index = torch.tensor([[0, 1, 1],
- ... [1, 0, 2]])
- >>> contains_self_loops(edge_index)
- False
- """
- mask = edge_index[0] == edge_index[1]
- return mask.sum().item() > 0
-
-
-def remove_self_loops(
- edge_index: Tensor,
- edge_attr: OptTensor = None,
-) -> Tuple[Tensor, OptTensor]:
- r"""Removes every self-loop in the graph given by :attr:`edge_index`, so
- that :math:`(i,i) \not\in \mathcal{E}` for every :math:`i \in \mathcal{V}`.
-
- Args:
- edge_index (LongTensor): The edge indices.
- edge_attr (Tensor, optional): Edge weights or multi-dimensional
- edge features. (default: :obj:`None`)
-
- :rtype: (:class:`LongTensor`, :class:`Tensor`)
-
- Example:
-
- >>> edge_index = torch.tensor([[0, 1, 0],
- ... [1, 0, 0]])
- >>> edge_attr = [[1, 2], [3, 4], [5, 6]]
- >>> edge_attr = torch.tensor(edge_attr)
- >>> remove_self_loops(edge_index, edge_attr)
- (tensor([[0, 1],
- [1, 0]]),
- tensor([[1, 2],
- [3, 4]]))
- """
- size: Optional[Tuple[int, int]] = None
- layout: Optional[int] = None
-
- if is_torch_sparse_tensor(edge_index):
- assert edge_attr is None
- layout = edge_index.layout
- size = (edge_index.size(0), edge_index.size(1))
- edge_index, edge_attr = to_edge_index(edge_index)
-
- mask = edge_index[0] != edge_index[1]
- edge_index = edge_index[:, mask]
-
- if layout is not None:
- assert edge_attr is not None
- edge_attr = edge_attr[mask]
- if str(layout) == 'torch.sparse_coo': # str(...) for TorchScript :(
- return to_torch_coo_tensor(edge_index, edge_attr, size, True), None
- elif str(layout) == 'torch.sparse_csr':
- return to_torch_csr_tensor(edge_index, edge_attr, size, True), None
- raise ValueError(f"Unexpected sparse tensor layout (got '{layout}')")
-
- if edge_attr is None:
- return edge_index, None
- else:
- return edge_index, edge_attr[mask]
-
-
-def segregate_self_loops(
- edge_index: Tensor, edge_attr: OptTensor = None
-) -> Tuple[Tensor, OptTensor, Tensor, OptTensor]:
- r"""Segregates self-loops from the graph.
-
- Args:
- edge_index (LongTensor): The edge indices.
- edge_attr (Tensor, optional): Edge weights or multi-dimensional
- edge features. (default: :obj:`None`)
-
- :rtype: (:class:`LongTensor`, :class:`Tensor`, :class:`LongTensor`,
- :class:`Tensor`)
-
- Example:
-
- >>> edge_index = torch.tensor([[0, 0, 1],
- ... [0, 1, 0]])
- >>> (edge_index, edge_attr,
- ... loop_edge_index,
- ... loop_edge_attr) = segregate_self_loops(edge_index)
- >>> loop_edge_index
- tensor([[0],
- [0]])
- """
-
- mask = edge_index[0] != edge_index[1]
- inv_mask = ~mask
-
- loop_edge_index = edge_index[:, inv_mask]
- loop_edge_attr = None if edge_attr is None else edge_attr[inv_mask]
- edge_index = edge_index[:, mask]
- edge_attr = None if edge_attr is None else edge_attr[mask]
-
- return edge_index, edge_attr, loop_edge_index, loop_edge_attr
-
-
-@torch.jit._overload
-def add_self_loops(edge_index, edge_attr, fill_value, num_nodes):
- # type: (Tensor, OptTensor, Optional[float], Optional[int]) -> Tuple[Tensor, OptTensor] # noqa
- pass
-
-
-@torch.jit._overload
-def add_self_loops(edge_index, edge_attr, fill_value, num_nodes):
- # type: (Tensor, OptTensor, Optional[float], Optional[Tuple[int, int]]) -> Tuple[Tensor, OptTensor] # noqa
- pass
-
-
-@torch.jit._overload
-def add_self_loops(edge_index, edge_attr, fill_value, num_nodes):
- # type: (Tensor, OptTensor, OptTensor, Optional[int]) -> Tuple[Tensor, OptTensor] # noqa
- pass
-
-
-@torch.jit._overload
-def add_self_loops(edge_index, edge_attr, fill_value, num_nodes):
- # type: (Tensor, OptTensor, OptTensor, Optional[Tuple[int, int]]) -> Tuple[Tensor, OptTensor] # noqa
- pass
-
-
-@torch.jit._overload
-def add_self_loops(edge_index, edge_attr, fill_value, num_nodes):
- # type: (Tensor, OptTensor, Optional[str], Optional[int]) -> Tuple[Tensor, OptTensor] # noqa
- pass
-
-
-@torch.jit._overload
-def add_self_loops(edge_index, edge_attr, fill_value, num_nodes):
- # type: (Tensor, OptTensor, Optional[str], Optional[Tuple[int, int]]) -> Tuple[Tensor, OptTensor] # noqa
- pass
-
-
-def add_self_loops(
- edge_index: Tensor,
- edge_attr: OptTensor = None,
- fill_value: Optional[Union[float, Tensor, str]] = None,
- num_nodes: Optional[Union[int, Tuple[int, int]]] = None,
-) -> Tuple[Tensor, OptTensor]:
- r"""Adds a self-loop :math:`(i,i) \in \mathcal{E}` to every node
- :math:`i \in \mathcal{V}` in the graph given by :attr:`edge_index`.
- In case the graph is weighted or has multi-dimensional edge features
- (:obj:`edge_attr != None`), edge features of self-loops will be added
- according to :obj:`fill_value`.
-
- Args:
- edge_index (LongTensor): The edge indices.
- edge_attr (Tensor, optional): Edge weights or multi-dimensional edge
- features. (default: :obj:`None`)
- fill_value (float or Tensor or str, optional): The way to generate
- edge features of self-loops (in case :obj:`edge_attr != None`).
- If given as :obj:`float` or :class:`torch.Tensor`, edge features of
- self-loops will be directly given by :obj:`fill_value`.
- If given as :obj:`str`, edge features of self-loops are computed by
- aggregating all features of edges that point to the specific node,
- according to a reduce operation. (:obj:`"add"`, :obj:`"mean"`,
- :obj:`"min"`, :obj:`"max"`, :obj:`"mul"`). (default: :obj:`1.`)
- num_nodes (int or Tuple[int, int], optional): The number of nodes,
- *i.e.* :obj:`max_val + 1` of :attr:`edge_index`.
- If given as a tuple, then :obj:`edge_index` is interpreted as a
- bipartite graph with shape :obj:`(num_src_nodes, num_dst_nodes)`.
- (default: :obj:`None`)
-
- :rtype: (:class:`LongTensor`, :class:`Tensor`)
-
- Examples:
-
- >>> edge_index = torch.tensor([[0, 1, 0],
- ... [1, 0, 0]])
- >>> edge_weight = torch.tensor([0.5, 0.5, 0.5])
- >>> add_self_loops(edge_index)
- (tensor([[0, 1, 0, 0, 1],
- [1, 0, 0, 0, 1]]),
- None)
-
- >>> add_self_loops(edge_index, edge_weight)
- (tensor([[0, 1, 0, 0, 1],
- [1, 0, 0, 0, 1]]),
- tensor([0.5000, 0.5000, 0.5000, 1.0000, 1.0000]))
-
- >>> # edge features of self-loops are filled by constant `2.0`
- >>> add_self_loops(edge_index, edge_weight,
- ... fill_value=2.)
- (tensor([[0, 1, 0, 0, 1],
- [1, 0, 0, 0, 1]]),
- tensor([0.5000, 0.5000, 0.5000, 2.0000, 2.0000]))
-
- >>> # Use 'add' operation to merge edge features for self-loops
- >>> add_self_loops(edge_index, edge_weight,
- ... fill_value='add')
- (tensor([[0, 1, 0, 0, 1],
- [1, 0, 0, 0, 1]]),
- tensor([0.5000, 0.5000, 0.5000, 1.0000, 0.5000]))
- """
- layout: Optional[int] = None
- is_sparse = is_torch_sparse_tensor(edge_index)
-
- if is_sparse:
- assert edge_attr is None
- layout = edge_index.layout
- size = (edge_index.size(0), edge_index.size(1))
- N = min(size)
- edge_index, edge_attr = to_edge_index(edge_index)
- elif isinstance(num_nodes, (tuple, list)):
- size = (num_nodes[0], num_nodes[1])
- N = min(size)
- else:
- N = maybe_num_nodes(edge_index, num_nodes)
- size = (N, N)
-
- loop_index = torch.arange(0, N, dtype=torch.long, device=edge_index.device)
- loop_index = loop_index.unsqueeze(0).repeat(2, 1)
-
- if edge_attr is not None:
- if fill_value is None:
- loop_attr = edge_attr.new_full((N, ) + edge_attr.size()[1:], 1.)
-
- elif isinstance(fill_value, (int, float)):
- loop_attr = edge_attr.new_full((N, ) + edge_attr.size()[1:],
- fill_value)
- elif isinstance(fill_value, Tensor):
- loop_attr = fill_value.to(edge_attr.device, edge_attr.dtype)
- if edge_attr.dim() != loop_attr.dim():
- loop_attr = loop_attr.unsqueeze(0)
- sizes = [N] + [1] * (loop_attr.dim() - 1)
- loop_attr = loop_attr.repeat(sizes)
-
- elif isinstance(fill_value, str):
- col = edge_index[0] if is_sparse else edge_index[1]
- loop_attr = scatter(edge_attr, col, 0, N, fill_value)
- else:
- raise AttributeError("No valid 'fill_value' provided")
-
- edge_attr = torch.cat([edge_attr, loop_attr], dim=0)
-
- edge_index = torch.cat([edge_index, loop_index], dim=1)
- if is_sparse:
- if str(layout) == 'torch.sparse_coo': # str(...) for TorchScript :(
- return to_torch_coo_tensor(edge_index, edge_attr, size), None
- elif str(layout) == 'torch.sparse_csr':
- return to_torch_csr_tensor(edge_index, edge_attr, size), None
- raise ValueError(f"Unexpected sparse tensor layout (got '{layout}')")
- return edge_index, edge_attr
-
-
-@torch.jit._overload
-def add_remaining_self_loops(edge_index, edge_attr=None, fill_value=None,
- num_nodes=None):
- # type: (Tensor, OptTensor, Optional[float], Optional[int]) -> Tuple[Tensor, OptTensor] # noqa
- pass
-
-
-# @torch.jit._overload
-def add_remaining_self_loops(edge_index, edge_attr=None, fill_value=None,
- num_nodes=None):
- # type: (Tensor, OptTensor, OptTensor, Optional[int]) -> Tuple[Tensor, OptTensor] # noqa
- pass
-
-
-@torch.jit._overload
-def add_remaining_self_loops(edge_index, edge_attr=None, fill_value=None,
- num_nodes=None):
- # type: (Tensor, OptTensor, Optional[str], Optional[int]) -> Tuple[Tensor, OptTensor] # noqa
- pass
-
-
-def add_remaining_self_loops(
- edge_index: Tensor,
- edge_attr: OptTensor = None,
- fill_value: Optional[Union[float, Tensor, str]] = None,
- num_nodes: Optional[int] = None,
-) -> Tuple[Tensor, OptTensor]:
- r"""Adds remaining self-loop :math:`(i,i) \in \mathcal{E}` to every node
- :math:`i \in \mathcal{V}` in the graph given by :attr:`edge_index`.
- In case the graph is weighted or has multi-dimensional edge features
- (:obj:`edge_attr != None`), edge features of non-existing self-loops will
- be added according to :obj:`fill_value`.
-
- Args:
- edge_index (LongTensor): The edge indices.
- edge_attr (Tensor, optional): Edge weights or multi-dimensional edge
- features. (default: :obj:`None`)
- fill_value (float or Tensor or str, optional): The way to generate
- edge features of self-loops (in case :obj:`edge_attr != None`).
- If given as :obj:`float` or :class:`torch.Tensor`, edge features of
- self-loops will be directly given by :obj:`fill_value`.
- If given as :obj:`str`, edge features of self-loops are computed by
- aggregating all features of edges that point to the specific node,
- according to a reduce operation. (:obj:`"add"`, :obj:`"mean"`,
- :obj:`"min"`, :obj:`"max"`, :obj:`"mul"`). (default: :obj:`1.`)
- num_nodes (int, optional): The number of nodes, *i.e.*
- :obj:`max_val + 1` of :attr:`edge_index`. (default: :obj:`None`)
-
- :rtype: (:class:`LongTensor`, :class:`Tensor`)
-
- Example:
-
- >>> edge_index = torch.tensor([[0, 1],
- ... [1, 0]])
- >>> edge_weight = torch.tensor([0.5, 0.5])
- >>> add_remaining_self_loops(edge_index, edge_weight)
- (tensor([[0, 1, 0, 1],
- [1, 0, 0, 1]]),
- tensor([0.5000, 0.5000, 1.0000, 1.0000]))
- """
- N = maybe_num_nodes(edge_index, num_nodes)
- mask = edge_index[0] != edge_index[1]
-
- loop_index = torch.arange(0, N, dtype=torch.long, device=edge_index.device)
- loop_index = loop_index.unsqueeze(0).repeat(2, 1)
-
- if edge_attr is not None:
- if fill_value is None:
- loop_attr = edge_attr.new_full((N, ) + edge_attr.size()[1:], 1.)
-
- elif isinstance(fill_value, (int, float)):
- loop_attr = edge_attr.new_full((N, ) + edge_attr.size()[1:],
- fill_value)
- elif isinstance(fill_value, Tensor):
- loop_attr = fill_value.to(edge_attr.device, edge_attr.dtype)
- if edge_attr.dim() != loop_attr.dim():
- loop_attr = loop_attr.unsqueeze(0)
- sizes = [N] + [1] * (loop_attr.dim() - 1)
- loop_attr = loop_attr.repeat(*sizes)
-
- elif isinstance(fill_value, str):
- loop_attr = scatter(edge_attr, edge_index[1], dim=0, dim_size=N,
- reduce=fill_value)
- else:
- raise AttributeError("No valid 'fill_value' provided")
-
- inv_mask = ~mask
- loop_attr[edge_index[0][inv_mask]] = edge_attr[inv_mask]
-
- edge_attr = torch.cat([edge_attr[mask], loop_attr], dim=0)
-
- edge_index = torch.cat([edge_index[:, mask], loop_index], dim=1)
- return edge_index, edge_attr
-
-
-def get_self_loop_attr(edge_index: Tensor, edge_attr: OptTensor = None,
- num_nodes: Optional[int] = None) -> Tensor:
- r"""Returns the edge features or weights of self-loops
- :math:`(i, i)` of every node :math:`i \in \mathcal{V}` in the
- graph given by :attr:`edge_index`. Edge features of missing self-loops not
- present in :attr:`edge_index` will be filled with zeros. If
- :attr:`edge_attr` is not given, it will be the vector of ones.
-
- .. note::
- This operation is analogous to getting the diagonal elements of the
- dense adjacency matrix.
-
- Args:
- edge_index (LongTensor): The edge indices.
- edge_attr (Tensor, optional): Edge weights or multi-dimensional edge
- features. (default: :obj:`None`)
- num_nodes (int, optional): The number of nodes, *i.e.*
- :obj:`max_val + 1` of :attr:`edge_index`. (default: :obj:`None`)
-
- :rtype: :class:`Tensor`
-
- Examples:
-
- >>> edge_index = torch.tensor([[0, 1, 0],
- ... [1, 0, 0]])
- >>> edge_weight = torch.tensor([0.2, 0.3, 0.5])
- >>> get_self_loop_attr(edge_index, edge_weight)
- tensor([0.5000, 0.0000])
-
- >>> get_self_loop_attr(edge_index, edge_weight, num_nodes=4)
- tensor([0.5000, 0.0000, 0.0000, 0.0000])
- """
- loop_mask = edge_index[0] == edge_index[1]
- loop_index = edge_index[0][loop_mask]
-
- if edge_attr is not None:
- loop_attr = edge_attr[loop_mask]
- else: # A vector of ones:
- loop_attr = torch.ones_like(loop_index, dtype=torch.float)
-
- num_nodes = maybe_num_nodes(edge_index, num_nodes)
- full_loop_attr = loop_attr.new_zeros((num_nodes, ) + loop_attr.size()[1:])
- full_loop_attr[loop_index] = loop_attr
-
- return full_loop_attr
diff --git a/pytorch_geometric-2.4.0/torch_geometric/utils/mixin.py b/pytorch_geometric-2.4.0/torch_geometric/utils/mixin.py
deleted file mode 100644
index ef96157..0000000
--- a/pytorch_geometric-2.4.0/torch_geometric/utils/mixin.py
+++ /dev/null
@@ -1,20 +0,0 @@
-from typing import Iterator
-
-
-class CastMixin:
- @classmethod
- def cast(cls, *args, **kwargs): # TODO Can we apply this recursively?
- if len(args) == 1 and len(kwargs) == 0:
- elem = args[0]
- if elem is None:
- return None
- if isinstance(elem, CastMixin):
- return elem
- if isinstance(elem, tuple):
- return cls(*elem)
- if isinstance(elem, dict):
- return cls(**elem)
- return cls(*args, **kwargs)
-
- def __iter__(self) -> Iterator:
- return iter(self.__dict__.values())
diff --git a/pytorch_geometric-2.4.0/torch_geometric/warnings.py b/pytorch_geometric-2.4.0/torch_geometric/warnings.py
deleted file mode 100644
index ead428d..0000000
--- a/pytorch_geometric-2.4.0/torch_geometric/warnings.py
+++ /dev/null
@@ -1,24 +0,0 @@
-import warnings
-
-import torch_geometric
-
-if torch_geometric.typing.WITH_PT20: # pragma: no cover
- from torch._dynamo import is_compiling as _is_compiling
-else:
-
- def _is_compiling() -> bool: # pragma: no cover
- return False
-
-
-def warn(message: str):
- if _is_compiling():
- return
-
- warnings.warn(message)
-
-
-def filterwarnings(action: str, message: str):
- if _is_compiling():
- return
-
- warnings.filterwarnings(action, message)
diff --git a/pytorch_geometric-2.4.0/.github/CODEOWNERS b/pytorch_geometric-2.5.2/.github/CODEOWNERS
similarity index 100%
rename from pytorch_geometric-2.4.0/.github/CODEOWNERS
rename to pytorch_geometric-2.5.2/.github/CODEOWNERS
diff --git a/pytorch_geometric-2.4.0/.github/CONTRIBUTING.md b/pytorch_geometric-2.5.2/.github/CONTRIBUTING.md
similarity index 84%
rename from pytorch_geometric-2.4.0/.github/CONTRIBUTING.md
rename to pytorch_geometric-2.5.2/.github/CONTRIBUTING.md
index d108e0e..a840103 100644
--- a/pytorch_geometric-2.4.0/.github/CONTRIBUTING.md
+++ b/pytorch_geometric-2.5.2/.github/CONTRIBUTING.md
@@ -4,7 +4,7 @@ If you are interested in contributing to PyG, your contributions will likely fal
1. You want to implement a new feature:
- In general, we accept any features as long as they fit the scope of this package. If you are unsure about this or need help on the design/implementation of your feature, post about it in an issue.
-2. You want to fix a bug:
+1. You want to fix a bug:
- Feel free to send a Pull Request (PR) any time you encounter a bug. Please provide a clear and concise description of what the bug was. If you are unsure about if this is a bug at all or how to fix, post about it in an issue.
Once you finish implementing a feature or bug-fix, please send a PR to https://github.com/pyg-team/pytorch_geometric.
@@ -16,23 +16,23 @@ If your PR isn't merged anytime soon (*e.g.,* due to its large size, complexity
To develop PyG on your machine, here are some tips:
-1. Ensure that you are running on one of the two latest PyTorch releases (*e.g.*, `2.0.0`):
+1. Ensure that you are running on one of the two latest PyTorch releases (*e.g.*, `2.2.0`):
```python
import torch
print(torch.__version__)
```
-2. *(Optional)* Follow the [installation instructions](https://github.com/pyg-team/pytorch_geometric#installation) to install `pyg-lib`, `torch-scatter`, `torch-sparse`, `torch-cluster` and `torch-spline-conv` (if you haven't already).
+1. *(Optional)* Follow the [installation instructions](https://github.com/pyg-team/pytorch_geometric#installation) to install `pyg-lib`, `torch-scatter`, `torch-sparse`, `torch-cluster` and `torch-spline-conv` (if you haven't already).
Note that this step is optional and only necessary if you develop a feature that uses one of these libraries.
```bash
pip install pyg-lib torch-scatter torch-sparse torch-cluster torch-spline-conv -f https://data.pyg.org/whl/torch-${TORCH}+${CUDA}.html
```
- where `${TORCH}` should be replaced by your PyTorch version (*e.g.*, `2.0.0`), and `${CUDA}` should be replaced by your CUDA version (*e.g.*, `cpu` or `cu118`).
+ where `${TORCH}` should be replaced by your PyTorch version (*e.g.*, `2.2.0`), and `${CUDA}` should be replaced by your CUDA version (*e.g.*, `cpu`, `cu118` or `cu121`).
-3. Uninstall all existing PyG installations.
+1. Uninstall all existing PyG installations.
It is advised to run this command repeatedly to confirm that installations across all locations are properly removed.
```bash
@@ -40,20 +40,20 @@ To develop PyG on your machine, here are some tips:
pip uninstall torch-geometric # run this command twice
```
-4. Clone a copy of PyG from source:
+1. Fork and clone the PyG repository:
```bash
- git clone https://github.com/pyg-team/pytorch_geometric
+ git clone https://github.com//pytorch_geometric
cd pytorch_geometric
```
-5. If you already cloned PyG from source, update it:
+1. If you already cloned PyG from source, update it:
```bash
git pull
```
-6. Install PyG in editable mode:
+1. Install PyG in editable mode:
```bash
pip install -e ".[dev,full]"
@@ -62,7 +62,7 @@ To develop PyG on your machine, here are some tips:
This mode will symlink the Python files from the current local source tree into the Python install.
Hence, if you modify a Python file, you do not need to re-install PyG again.
-7. Ensure that you have a working PyG installation by running the entire test suite with
+1. Ensure that you have a working PyG installation by running the entire test suite with
```bash
pytest
@@ -70,7 +70,7 @@ To develop PyG on your machine, here are some tips:
In case an error occurs, please first check if all sub-packages ([`pyg-lib`](https://github.com/pyg-team/pyg-lib), [`torch-scatter`](https://github.com/rusty1s/pytorch_scatter), [`torch-sparse`](https://github.com/rusty1s/pytorch_sparse), [`torch-cluster`](https://github.com/rusty1s/pytorch_cluster) and [`torch-spline-conv`](https://github.com/rusty1s/pytorch_spline_conv)) are on its latest reported version.
-8. Install pre-commit hooks:
+1. Install pre-commit hooks:
```bash
pre-commit install
@@ -85,7 +85,7 @@ Run the entire test suite with
pytest
```
-or test individual files via, _e.g._, `pytest test/utils/test_convert.py`.
+or test individual files via, *e.g.*, `pytest test/utils/test_convert.py`.
## Continuous Integration
@@ -102,7 +102,7 @@ Everytime you send a Pull Request, your commit will be built and checked against
If you do not want to format your code manually, we recommend to use [`yapf`](https://github.com/google/yapf).
-2. Ensure that the entire test suite passes and that code coverage roughly stays the same.
+1. Ensure that the entire test suite passes and that code coverage roughly stays the same.
Please feel encouraged to provide a test with your submitted code.
To test, either run
@@ -118,7 +118,7 @@ Everytime you send a Pull Request, your commit will be built and checked against
(which runs a set of additional but time-consuming tests) dependening on your needs.
-3. Add your feature/bugfix to the [`CHANGELOG.md`](https://github.com/pyg-team/pytorch_geometric/blob/master/CHANGELOG.md?plain=1).
+1. Add your feature/bugfix to the [`CHANGELOG.md`](https://github.com/pyg-team/pytorch_geometric/blob/master/CHANGELOG.md?plain=1).
If multiple PRs move towards integrating a single feature, it is advised to group them together into one bullet point.
## Building Documentation
@@ -126,11 +126,11 @@ Everytime you send a Pull Request, your commit will be built and checked against
To build the documentation:
1. [Build and install](#developing-pyg) PyG from source.
-2. Install [Sphinx](https://www.sphinx-doc.org/en/master/) theme via
+1. Install [Sphinx](https://www.sphinx-doc.org/en/master/) theme via
```bash
pip install git+https://github.com/pyg-team/pyg_sphinx_theme.git
```
-3. Generate the documentation via:
+1. Generate the documentation via:
```bash
cd docs
make html
diff --git a/pytorch_geometric-2.4.0/.github/ISSUE_TEMPLATE/bug-report.yml b/pytorch_geometric-2.5.2/.github/ISSUE_TEMPLATE/bug-report.yml
similarity index 78%
rename from pytorch_geometric-2.4.0/.github/ISSUE_TEMPLATE/bug-report.yml
rename to pytorch_geometric-2.5.2/.github/ISSUE_TEMPLATE/bug-report.yml
index f1e00ad..f250c60 100644
--- a/pytorch_geometric-2.4.0/.github/ISSUE_TEMPLATE/bug-report.yml
+++ b/pytorch_geometric-2.5.2/.github/ISSUE_TEMPLATE/bug-report.yml
@@ -44,14 +44,13 @@ body:
required: true
- type: textarea
attributes:
- label: Environment
+ label: Versions
description: |
- Please provide as much information as possible about your environment, such as your PyG (`print(torch_geometric.__version__)`) and PyTorch version (`print(torch.__version__)`), your OS (*e.g.*, Linux), and your Python version (*e.g.*, `3.9`):
- value: |
- * PyG version:
- * PyTorch version:
- * OS:
- * Python version:
- * CUDA/cuDNN version:
- * How you installed PyTorch and PyG (`conda`, `pip`, source):
- * Any other relevant information (*e.g.*, version of `torch-scatter`):
+ Please run the following and paste the output below.
+ ```sh
+ curl -OL https://raw.githubusercontent.com/pytorch/pytorch/main/torch/utils/collect_env.py
+ # For security purposes, please check the contents of collect_env.py before running it.
+ python3 collect_env.py
+ ```
+ validations:
+ required: true
diff --git a/pytorch_geometric-2.4.0/.github/ISSUE_TEMPLATE/config.yml b/pytorch_geometric-2.5.2/.github/ISSUE_TEMPLATE/config.yml
similarity index 100%
rename from pytorch_geometric-2.4.0/.github/ISSUE_TEMPLATE/config.yml
rename to pytorch_geometric-2.5.2/.github/ISSUE_TEMPLATE/config.yml
diff --git a/pytorch_geometric-2.4.0/.github/ISSUE_TEMPLATE/documentation.yml b/pytorch_geometric-2.5.2/.github/ISSUE_TEMPLATE/documentation.yml
similarity index 100%
rename from pytorch_geometric-2.4.0/.github/ISSUE_TEMPLATE/documentation.yml
rename to pytorch_geometric-2.5.2/.github/ISSUE_TEMPLATE/documentation.yml
diff --git a/pytorch_geometric-2.4.0/.github/ISSUE_TEMPLATE/feature-request.yml b/pytorch_geometric-2.5.2/.github/ISSUE_TEMPLATE/feature-request.yml
similarity index 100%
rename from pytorch_geometric-2.4.0/.github/ISSUE_TEMPLATE/feature-request.yml
rename to pytorch_geometric-2.5.2/.github/ISSUE_TEMPLATE/feature-request.yml
diff --git a/pytorch_geometric-2.4.0/.github/ISSUE_TEMPLATE/installation.yml b/pytorch_geometric-2.5.2/.github/ISSUE_TEMPLATE/installation.yml
similarity index 100%
rename from pytorch_geometric-2.4.0/.github/ISSUE_TEMPLATE/installation.yml
rename to pytorch_geometric-2.5.2/.github/ISSUE_TEMPLATE/installation.yml
diff --git a/pytorch_geometric-2.4.0/.github/ISSUE_TEMPLATE/refactor.yml b/pytorch_geometric-2.5.2/.github/ISSUE_TEMPLATE/refactor.yml
similarity index 100%
rename from pytorch_geometric-2.4.0/.github/ISSUE_TEMPLATE/refactor.yml
rename to pytorch_geometric-2.5.2/.github/ISSUE_TEMPLATE/refactor.yml
diff --git a/pytorch_geometric-2.4.0/.github/actions/setup/action.yml b/pytorch_geometric-2.5.2/.github/actions/setup/action.yml
similarity index 92%
rename from pytorch_geometric-2.4.0/.github/actions/setup/action.yml
rename to pytorch_geometric-2.5.2/.github/actions/setup/action.yml
index bed4899..b73c757 100644
--- a/pytorch_geometric-2.4.0/.github/actions/setup/action.yml
+++ b/pytorch_geometric-2.5.2/.github/actions/setup/action.yml
@@ -6,13 +6,13 @@ inputs:
default: '3.8'
torch-version:
required: false
- default: '2.1.0'
+ default: '2.2.0'
cuda-version:
required: false
default: cpu
torchvision-version:
required: false
- default: '0.16.0'
+ default: '0.17.0'
full_install:
required: false
default: true
@@ -56,13 +56,13 @@ runs:
shell: bash
- name: Install faiss-cpu
- if: ${{ inputs.cuda-version == 'cpu' }}
+ if: ${{ inputs.full_install == 'true' && inputs.cuda-version == 'cpu' }}
run: |
pip install faiss-cpu
shell: bash
- name: Install faiss-gpu
- if: ${{ inputs.cuda-version != 'cpu' }}
+ if: ${{ inputs.full_install == 'true' && inputs.cuda-version != 'cpu' }}
run: |
pip install faiss-gpu
shell: bash
diff --git a/pytorch_geometric-2.5.2/.github/labeler.yml b/pytorch_geometric-2.5.2/.github/labeler.yml
new file mode 100644
index 0000000..8e91499
--- /dev/null
+++ b/pytorch_geometric-2.5.2/.github/labeler.yml
@@ -0,0 +1,58 @@
+documentation:
+ - changed-files:
+ - any-glob-to-any-file: "docs/**/*"
+
+example:
+ - changed-files:
+ - any-glob-to-any-file: "examples/**/*"
+
+data:
+ - changed-files:
+ - any-glob-to-any-file: "torch_geometric/data/**/*"
+
+dataset:
+ - changed-files:
+ - any-glob-to-any-file: ["torch_geometric/io/**/*", "torch_geometric/datasets/**/*"]
+
+sampler:
+ - changed-files:
+ - any-glob-to-any-file: "torch_geometric/sampler/**/*"
+
+loader:
+ - changed-files:
+ - any-glob-to-any-file: "torch_geometric/loader/**/*"
+
+nn:
+ - changed-files:
+ - any-glob-to-any-file: "torch_geometric/nn/**/*"
+
+explain:
+ - changed-files:
+ - any-glob-to-any-file: "torch_geometric/explain/**/*"
+
+transform:
+ - changed-files:
+ - any-glob-to-any-file: "torch_geometric/transforms/**/*"
+
+utils:
+ - changed-files:
+ - any-glob-to-any-file: "torch_geometric/utils/**/*"
+
+distributed:
+ - changed-files:
+ - any-glob-to-any-file: "torch_geometric/distributed/**/*"
+
+contrib:
+ - changed-files:
+ - any-glob-to-any-file: "torch_geometric/contrib/**/*"
+
+graphgym:
+ - changed-files:
+ - any-glob-to-any-file: ["graphgym/**/*", "torch_geometric/graphgym/**/*"]
+
+benchmark:
+ - changed-files:
+ - any-glob-to-any-file: ["benchmark/**/*", "torch_geometric/profile/**/*"]
+
+skip-changelog:
+ - head-branch: ['^skip']
diff --git a/pytorch_geometric-2.4.0/.github/workflows/building_pyg_conda.yml b/pytorch_geometric-2.5.2/.github/workflows/building_pyg_conda.yml
similarity index 80%
rename from pytorch_geometric-2.4.0/.github/workflows/building_pyg_conda.yml
rename to pytorch_geometric-2.5.2/.github/workflows/building_pyg_conda.yml
index f121aca..97a7495 100644
--- a/pytorch_geometric-2.4.0/.github/workflows/building_pyg_conda.yml
+++ b/pytorch_geometric-2.5.2/.github/workflows/building_pyg_conda.yml
@@ -11,10 +11,18 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
- python-version: ['3.8', '3.9', '3.10', '3.11']
- torch-version: [1.12.0, 1.13.0, 2.0.0, 2.1.0]
+ python-version: ['3.8', '3.9', '3.10', '3.11', '3.12']
+ torch-version: [1.12.0, 1.13.0, 2.0.0, 2.1.0, 2.2.0]
cuda-version: ['cpu', 'cu113', 'cu116', 'cu117', 'cu118', 'cu121']
exclude:
+ - torch-version: 1.12.0
+ python-version: '3.12'
+ - torch-version: 1.13.0
+ python-version: '3.12'
+ - torch-version: 2.0.0
+ python-version: '3.12'
+ - torch-version: 2.1.0
+ python-version: '3.12'
- torch-version: 1.12.0
python-version: '3.11'
- torch-version: 1.12.0
@@ -43,16 +51,22 @@ jobs:
cuda-version: 'cu116'
- torch-version: 2.1.0
cuda-version: 'cu117'
- - os: macos-latest
+ - torch-version: 2.2.0
cuda-version: 'cu113'
+ - torch-version: 2.2.0
+ cuda-version: 'cu116'
+ - torch-version: 2.2.0
+ cuda-version: 'cu117'
- os: macos-latest
- cuda-version: 'cu115'
+ cuda-version: 'cu113'
- os: macos-latest
cuda-version: 'cu116'
- os: macos-latest
cuda-version: 'cu117'
- os: macos-latest
cuda-version: 'cu118'
+ - os: macos-latest
+ cuda-version: 'cu121'
steps:
- name: Checkout repository
diff --git a/pytorch_geometric-2.4.0/.github/workflows/building_rusty1s_conda.yml b/pytorch_geometric-2.5.2/.github/workflows/building_rusty1s_conda.yml
similarity index 80%
rename from pytorch_geometric-2.4.0/.github/workflows/building_rusty1s_conda.yml
rename to pytorch_geometric-2.5.2/.github/workflows/building_rusty1s_conda.yml
index 2627422..12d89a6 100644
--- a/pytorch_geometric-2.4.0/.github/workflows/building_rusty1s_conda.yml
+++ b/pytorch_geometric-2.5.2/.github/workflows/building_rusty1s_conda.yml
@@ -11,10 +11,18 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
- python-version: ['3.8', '3.9', '3.10', '3.11']
- torch-version: [1.12.0, 1.13.0, 2.0.0, 2.1.0]
+ python-version: ['3.8', '3.9', '3.10', '3.11', '3.12']
+ torch-version: [1.12.0, 1.13.0, 2.0.0, 2.1.0, 2.2.0]
cuda-version: ['cpu', 'cu113', 'cu116', 'cu117', 'cu118', 'cu121']
exclude:
+ - torch-version: 1.12.0
+ python-version: '3.12'
+ - torch-version: 1.13.0
+ python-version: '3.12'
+ - torch-version: 2.0.0
+ python-version: '3.12'
+ - torch-version: 2.1.0
+ python-version: '3.12'
- torch-version: 1.12.0
python-version: '3.11'
- torch-version: 1.12.0
@@ -43,16 +51,22 @@ jobs:
cuda-version: 'cu116'
- torch-version: 2.1.0
cuda-version: 'cu117'
- - os: macos-latest
+ - torch-version: 2.2.0
cuda-version: 'cu113'
+ - torch-version: 2.2.0
+ cuda-version: 'cu116'
+ - torch-version: 2.2.0
+ cuda-version: 'cu117'
- os: macos-latest
- cuda-version: 'cu115'
+ cuda-version: 'cu113'
- os: macos-latest
cuda-version: 'cu116'
- os: macos-latest
cuda-version: 'cu117'
- os: macos-latest
cuda-version: 'cu118'
+ - os: macos-latest
+ cuda-version: 'cu121'
steps:
- name: Checkout repository
diff --git a/pytorch_geometric-2.4.0/.github/workflows/changelog.yml b/pytorch_geometric-2.5.2/.github/workflows/changelog.yml
similarity index 100%
rename from pytorch_geometric-2.4.0/.github/workflows/changelog.yml
rename to pytorch_geometric-2.5.2/.github/workflows/changelog.yml
diff --git a/pytorch_geometric-2.5.2/.github/workflows/dist_testing.yml b/pytorch_geometric-2.5.2/.github/workflows/dist_testing.yml
new file mode 100644
index 0000000..14efa4a
--- /dev/null
+++ b/pytorch_geometric-2.5.2/.github/workflows/dist_testing.yml
@@ -0,0 +1,43 @@
+name: Testing distributed PyG
+
+on: # yamllint disable-line rule:truthy
+ push:
+ branches:
+ - master
+ pull_request:
+
+jobs:
+
+ dist_pytest:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 40
+
+ # Skip workflow if only certain files have been changed.
+ - name: Get changed files
+ id: changed-files-specific
+ uses: tj-actions/changed-files@v41
+ with:
+ files: |
+ torch_geometric/distributed/**
+ test/distributed/**
+
+ - name: Setup packages
+ if: steps.changed-files-specific.outputs.any_changed == 'true'
+ uses: ./.github/actions/setup
+
+ - name: Install main package
+ if: steps.changed-files-specific.outputs.any_changed == 'true'
+ run: |
+ pip install -e .[test]
+
+ - name: Run tests
+ if: steps.changed-files-specific.outputs.any_changed == 'true'
+ timeout-minutes: 10
+ run: |
+ DIST_TEST=1 pytest test/distributed
+ shell: bash
diff --git a/pytorch_geometric-2.4.0/.github/workflows/documentation.yml b/pytorch_geometric-2.5.2/.github/workflows/documentation.yml
similarity index 96%
rename from pytorch_geometric-2.4.0/.github/workflows/documentation.yml
rename to pytorch_geometric-2.5.2/.github/workflows/documentation.yml
index b61f33a..f0f874b 100644
--- a/pytorch_geometric-2.4.0/.github/workflows/documentation.yml
+++ b/pytorch_geometric-2.5.2/.github/workflows/documentation.yml
@@ -20,7 +20,7 @@ jobs:
# Skip workflow if only certain files have been changed.
- name: Get changed files
id: changed-files-specific
- uses: tj-actions/changed-files@v34
+ uses: tj-actions/changed-files@v41
with:
files: |
benchmark/**
diff --git a/pytorch_geometric-2.4.0/.github/workflows/examples.yml b/pytorch_geometric-2.5.2/.github/workflows/examples.yml
similarity index 100%
rename from pytorch_geometric-2.4.0/.github/workflows/examples.yml
rename to pytorch_geometric-2.5.2/.github/workflows/examples.yml
diff --git a/pytorch_geometric-2.4.0/.github/workflows/full_gpu_testing.yml b/pytorch_geometric-2.5.2/.github/workflows/full_gpu_testing.yml
similarity index 85%
rename from pytorch_geometric-2.4.0/.github/workflows/full_gpu_testing.yml
rename to pytorch_geometric-2.5.2/.github/workflows/full_gpu_testing.yml
index 83996c8..3e96244 100644
--- a/pytorch_geometric-2.4.0/.github/workflows/full_gpu_testing.yml
+++ b/pytorch_geometric-2.5.2/.github/workflows/full_gpu_testing.yml
@@ -2,8 +2,8 @@ name: Full GPU Testing
on: # yamllint disable-line rule:truthy
workflow_dispatch:
- schedule:
- - cron: "0 6 * * *" # Everyday at 6:00am UTC/10:00pm PST
+ # schedule:
+ # - cron: "0 6 * * *" # Everyday at 6:00am UTC/10:00pm PST
jobs:
@@ -29,6 +29,7 @@ jobs:
pip install -e .[full,test]
- name: Run tests
+ timeout-minutes: 20
run: |
FULL_TEST=1 pytest
shell: bash
diff --git a/pytorch_geometric-2.4.0/.github/workflows/full_testing.yml b/pytorch_geometric-2.5.2/.github/workflows/full_testing.yml
similarity index 90%
rename from pytorch_geometric-2.4.0/.github/workflows/full_testing.yml
rename to pytorch_geometric-2.5.2/.github/workflows/full_testing.yml
index a9dde19..0c3a894 100644
--- a/pytorch_geometric-2.4.0/.github/workflows/full_testing.yml
+++ b/pytorch_geometric-2.5.2/.github/workflows/full_testing.yml
@@ -16,16 +16,16 @@ jobs:
matrix:
os: [ubuntu-latest, windows-latest]
python-version: ['3.8', '3.10']
- torch-version: [1.12.0, 1.13.0, 2.0.0, 2.1.0, nightly]
+ torch-version: [1.13.0, 2.0.0, 2.1.0, 2.2.0, nightly]
include:
- - torch-version: 1.12.0
- torchvision-version: 0.13.0
- torch-version: 1.13.0
torchvision-version: 0.14.0
- torch-version: 2.0.0
torchvision-version: 0.15.0
- torch-version: 2.1.0
torchvision-version: 0.16.0
+ - torch-version: 2.2.0
+ torchvision-version: 0.17.0
- torch-version: nightly
torchvision-version: nightly
@@ -50,6 +50,7 @@ jobs:
pip install -e .[full,test]
- name: Run tests
+ timeout-minutes: 20
run: |
FULL_TEST=1 pytest --cov --cov-report=xml
shell: bash
diff --git a/pytorch_geometric-2.4.0/.github/workflows/labeler.yml b/pytorch_geometric-2.5.2/.github/workflows/labeler.yml
similarity index 91%
rename from pytorch_geometric-2.4.0/.github/workflows/labeler.yml
rename to pytorch_geometric-2.5.2/.github/workflows/labeler.yml
index 6f3fea5..bb736dc 100644
--- a/pytorch_geometric-2.4.0/.github/workflows/labeler.yml
+++ b/pytorch_geometric-2.5.2/.github/workflows/labeler.yml
@@ -1,7 +1,7 @@
name: PR Labeler
on: # yamllint disable-line rule:truthy
- pull_request:
+ pull_request_target:
jobs:
@@ -15,7 +15,7 @@ jobs:
steps:
- name: Add PR labels
- uses: actions/labeler@v4
+ uses: actions/labeler@v5
continue-on-error: true
with:
repo-token: "${{ secrets.GITHUB_TOKEN }}"
diff --git a/pytorch_geometric-2.4.0/.github/workflows/latest_testing.yml b/pytorch_geometric-2.5.2/.github/workflows/latest_testing.yml
similarity index 91%
rename from pytorch_geometric-2.4.0/.github/workflows/latest_testing.yml
rename to pytorch_geometric-2.5.2/.github/workflows/latest_testing.yml
index 4a5783f..47f7331 100644
--- a/pytorch_geometric-2.4.0/.github/workflows/latest_testing.yml
+++ b/pytorch_geometric-2.5.2/.github/workflows/latest_testing.yml
@@ -20,7 +20,7 @@ jobs:
# Skip workflow if only certain files have been changed.
- name: Get changed files
id: changed-files-specific
- uses: tj-actions/changed-files@v34
+ uses: tj-actions/changed-files@v41
with:
files: |
benchmark/**
@@ -41,9 +41,10 @@ jobs:
- name: Install main package
if: steps.changed-files-specific.outputs.only_changed != 'true'
run: |
- pip install -e .[full,test]
+ pip install -e .[test]
- name: Run tests
if: steps.changed-files-specific.outputs.only_changed != 'true'
+ timeout-minutes: 10
run: |
pytest
diff --git a/pytorch_geometric-2.5.2/.github/workflows/linting.yml b/pytorch_geometric-2.5.2/.github/workflows/linting.yml
new file mode 100644
index 0000000..440ed79
--- /dev/null
+++ b/pytorch_geometric-2.5.2/.github/workflows/linting.yml
@@ -0,0 +1,48 @@
+name: Linting
+
+on: # yamllint disable-line rule:truthy
+ push:
+ branches:
+ - master
+ pull_request:
+
+jobs:
+
+ mypy:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 40
+
+ # Skip workflow if only certain files have been changed.
+ - name: Get changed files
+ id: changed-files-specific
+ uses: tj-actions/changed-files@v41
+ with:
+ files: |
+ benchmark/**
+ conda/**
+ docker/**
+ docs/**
+ examples/**
+ graphgym/**
+ README.md
+ CHANGELOG.md
+
+ - name: Setup packages
+ if: steps.changed-files-specific.outputs.only_changed != 'true'
+ uses: ./.github/actions/setup
+
+ - name: Install main package
+ if: steps.changed-files-specific.outputs.only_changed != 'true'
+ run: |
+ pip install mypy
+ pip install -e .[full,test]
+
+ - name: Check type hints
+ if: steps.changed-files-specific.outputs.only_changed != 'true'
+ run: |
+ mypy
diff --git a/pytorch_geometric-2.4.0/.github/workflows/minimal_testing.yml b/pytorch_geometric-2.5.2/.github/workflows/minimal_testing.yml
similarity index 91%
rename from pytorch_geometric-2.4.0/.github/workflows/minimal_testing.yml
rename to pytorch_geometric-2.5.2/.github/workflows/minimal_testing.yml
index ee6c57d..3b03910 100644
--- a/pytorch_geometric-2.4.0/.github/workflows/minimal_testing.yml
+++ b/pytorch_geometric-2.5.2/.github/workflows/minimal_testing.yml
@@ -1,4 +1,4 @@
-name: Testing minimal PyTorch 2.1
+name: Testing minimal PyTorch 2.2
on: # yamllint disable-line rule:truthy
push:
@@ -20,7 +20,7 @@ jobs:
# Skip workflow if only certain files have been changed.
- name: Get changed files
id: changed-files-specific
- uses: tj-actions/changed-files@v34
+ uses: tj-actions/changed-files@v41
with:
files: |
benchmark/**
@@ -45,5 +45,6 @@ jobs:
- name: Run tests
if: steps.changed-files-specific.outputs.only_changed != 'true'
+ timeout-minutes: 10
run: |
pytest
diff --git a/pytorch_geometric-2.4.0/.github/workflows/nightly.yml b/pytorch_geometric-2.5.2/.github/workflows/nightly.yml
similarity index 100%
rename from pytorch_geometric-2.4.0/.github/workflows/nightly.yml
rename to pytorch_geometric-2.5.2/.github/workflows/nightly.yml
diff --git a/pytorch_geometric-2.4.0/.github/workflows/prev_testing.yml b/pytorch_geometric-2.5.2/.github/workflows/prev_testing.yml
similarity index 85%
rename from pytorch_geometric-2.4.0/.github/workflows/prev_testing.yml
rename to pytorch_geometric-2.5.2/.github/workflows/prev_testing.yml
index d4c2472..9d64df0 100644
--- a/pytorch_geometric-2.4.0/.github/workflows/prev_testing.yml
+++ b/pytorch_geometric-2.5.2/.github/workflows/prev_testing.yml
@@ -14,16 +14,14 @@ jobs:
strategy:
fail-fast: false
matrix:
- torch-version: [1.11.0, 1.12.0, 1.13.0, 2.0.0]
+ torch-version: [1.13.0, 2.0.0, 2.1.0]
include:
- - torch-version: 1.11.0
- torchvision-version: 0.12.0
- - torch-version: 1.12.0
- torchvision-version: 0.13.0
- torch-version: 1.13.0
torchvision-version: 0.14.0
- torch-version: 2.0.0
torchvision-version: 0.15.0
+ - torch-version: 2.1.0
+ torchvision-version: 0.16.0
steps:
- name: Checkout repository
@@ -34,7 +32,7 @@ jobs:
# Skip workflow if only certain files have been changed.
- name: Get changed files
id: changed-files-specific
- uses: tj-actions/changed-files@v34
+ uses: tj-actions/changed-files@v41
with:
files: |
benchmark/**
@@ -60,5 +58,6 @@ jobs:
- name: Run tests
if: steps.changed-files-specific.outputs.only_changed != 'true'
+ timeout-minutes: 10
run: |
pytest
diff --git a/pytorch_geometric-2.4.0/.github/workflows/testing.yml b/pytorch_geometric-2.5.2/.github/workflows/testing.yml
similarity index 88%
rename from pytorch_geometric-2.4.0/.github/workflows/testing.yml
rename to pytorch_geometric-2.5.2/.github/workflows/testing.yml
index 0710eb1..b782b42 100644
--- a/pytorch_geometric-2.4.0/.github/workflows/testing.yml
+++ b/pytorch_geometric-2.5.2/.github/workflows/testing.yml
@@ -1,4 +1,4 @@
-name: Testing PyTorch 2.1
+name: Testing PyTorch 2.2
on: # yamllint disable-line rule:truthy
push:
@@ -20,7 +20,7 @@ jobs:
# Skip workflow if only certain files have been changed.
- name: Get changed files
id: changed-files-specific
- uses: tj-actions/changed-files@v34
+ uses: tj-actions/changed-files@v41
with:
files: |
benchmark/**
@@ -43,8 +43,9 @@ jobs:
- name: Run tests
if: steps.changed-files-specific.outputs.only_changed != 'true'
+ timeout-minutes: 10
run: |
- pytest --cov --cov-report=xml
+ pytest --cov --cov-report=xml --durations 10
- name: Upload coverage
if: steps.changed-files-specific.outputs.only_changed != 'true'
diff --git a/pytorch_geometric-2.4.0/.pre-commit-config.yaml b/pytorch_geometric-2.5.2/.pre-commit-config.yaml
similarity index 70%
rename from pytorch_geometric-2.4.0/.pre-commit-config.yaml
rename to pytorch_geometric-2.5.2/.pre-commit-config.yaml
index 3283a3f..569ba7b 100644
--- a/pytorch_geometric-2.4.0/.pre-commit-config.yaml
+++ b/pytorch_geometric-2.5.2/.pre-commit-config.yaml
@@ -5,16 +5,15 @@ ci:
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v4.4.0
+ rev: v4.5.0
hooks:
- id: no-commit-to-branch
name: No commits to master
-
- - repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v4.4.0
- hooks:
- id: end-of-file-fixer
name: End-of-file fixer
+ - name: mixed-line-ending
+ id: mixed-line-ending
+ args: [--fix, lf]
- id: trailing-whitespace
name: Remove trailing whitespaces
- id: check-toml
@@ -28,19 +27,12 @@ repos:
)$
- repo: https://github.com/adrienverge/yamllint.git
- rev: v1.32.0
+ rev: v1.33.0
hooks:
- id: yamllint
name: Lint yaml
args: [-d, '{extends: default, rules: {line-length: disable, document-start: disable, truthy: {level: error}, braces: {max-spaces-inside: 1}}}']
- # - repo: https://github.com/regebro/pyroma
- # rev: "4.2"
- # hooks:
- # - id: pyroma
- # name: Check packaging
- # args: [--min=10, .]
-
- repo: https://github.com/google/yapf
rev: v0.40.2
hooks:
@@ -49,7 +41,7 @@ repos:
additional_dependencies: [toml]
- repo: https://github.com/pycqa/isort
- rev: 5.12.0
+ rev: 5.13.2
hooks:
- id: isort
name: Sort imports
@@ -60,3 +52,20 @@ repos:
- id: flake8
name: Check PEP8
additional_dependencies: [Flake8-pyproject]
+
+ - repo: https://github.com/astral-sh/ruff-pre-commit
+ rev: v0.1.9
+ hooks:
+ - id: ruff
+ name: Ruff formatting
+ args: [--fix, --exit-non-zero-on-fix]
+
+ - repo: https://github.com/executablebooks/mdformat
+ rev: 0.7.17
+ hooks:
+ - id: mdformat
+ name: Format Markdown
+ additional_dependencies:
+ - mdformat-gfm
+ - mdformat_frontmatter
+ - mdformat_footnote
diff --git a/pytorch_geometric-2.4.0/CHANGELOG.md b/pytorch_geometric-2.5.2/CHANGELOG.md
similarity index 88%
rename from pytorch_geometric-2.4.0/CHANGELOG.md
rename to pytorch_geometric-2.5.2/CHANGELOG.md
index 81b7608..48b58f3 100644
--- a/pytorch_geometric-2.4.0/CHANGELOG.md
+++ b/pytorch_geometric-2.5.2/CHANGELOG.md
@@ -3,19 +3,123 @@
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
-## [2.5.0] - 2023-MM-DD
+## \[2.6.0\] - 2024-MM-DD
### Added
### Changed
+### Deprecated
+
+### Fixed
+
+### Removed
+
+## \[2.5.0\] - 2024-02-16
+
+### Added
+
+- Added an example for recommender systems, including k-NN search and retrieval metrics ([#8546](https://github.com/pyg-team/pytorch_geometric/pull/8546))
+- Added multi-GPU evaluation in distributed sampling example ([#8880](https://github.com/pyg-team/pytorch_geometric/pull/8880))
+- Added end-to-end example for distributed CPU training ([#8713](https://github.com/pyg-team/pytorch_geometric/pull/8713))
+- Added PyTorch 2.2 support ([#8857](https://github.com/pyg-team/pyg-lib/pull/8857))
+- Added fallback code path for `segment` in case `torch-scatter` is not installed ([#8852](https://github.com/pyg-team/pytorch_geometric/pull/8852))
+- Added support for custom node labels in `visualize_graph()` ([#8816](https://github.com/pyg-team/pytorch_geometric/pull/8816))
+- Added support for graph partitioning for temporal data in `torch_geometric.distributed` ([#8718](https://github.com/pyg-team/pytorch_geometric/pull/8718), [#8815](https://github.com/pyg-team/pytorch_geometric/pull/8815), [#8874](https://github.com/pyg-team/pytorch_geometric/pull/8874))
+- Added `TreeGraph` and `GridMotif` generators ([#8736](https://github.com/pyg-team/pytorch_geometric/pull/8736))
+- Added two examples for edge-level temporal sampling on a heterogenous graph, with and without distributed training ([#8383](https://github.com/pyg-team/pytorch_geometric/pull/8383), [#8820](https://github.com/pyg-team/pytorch_geometric/pull/8820))
+- Added the `num_graphs` option to the `StochasticBlockModelDataset` ([#8648](https://github.com/pyg-team/pytorch_geometric/pull/8648))
+- Added noise scheduler utility for diffusion based graph generative models ([#8347](https://github.com/pyg-team/pytorch_geometric/pull/8347))
+- Added the equivariant `ViSNet` model ([#8287](https://github.com/pyg-team/pytorch_geometric/pull/8287))
+- Added temporal-related capabilities to `Data` ([#8454](https://github.com/pyg-team/pytorch_geometric/pull/8454))
+- Added support for returning multi graphs in `to_networkx` ([#8575](https://github.com/pyg-team/pytorch_geometric/pull/8575))
+- Added support for XPU device in `profileit` decorator ([#8532](https://github.com/pyg-team/pytorch_geometric/pull/8532))
+- Added `KNNIndex` exclusion logic ([#8573](https://github.com/pyg-team/pytorch_geometric/pull/8573))
+- Added warning when calling `dataset.num_classes` on regression problems ([#8550](https://github.com/pyg-team/pytorch_geometric/pull/8550))
+- Added relabel node functionality to `dropout_node` ([#8524](https://github.com/pyg-team/pytorch_geometric/pull/8524))
+- Added support for type checking via `mypy` ([#8254](https://github.com/pyg-team/pytorch_geometric/pull/8254))
+- Added support for link-prediction retrieval metrics ([#8499](https://github.com/pyg-team/pytorch_geometric/pull/8499), [#8326](https://github.com/pyg-team/pytorch_geometric/pull/8326), [#8566](https://github.com/pyg-team/pytorch_geometric/pull/8566), [#8647](https://github.com/pyg-team/pytorch_geometric/pull/8647))
+- Added METIS partitioning with CSC/CSR format selection in `ClusterData` ([#8438](https://github.com/pyg-team/pytorch_geometric/pull/8438))
+- Added `is_torch_instance` to check against the original class of compiled models ([#8461](https://github.com/pyg-team/pytorch_geometric/pull/8461))
+- Added dense computation for `AddRandomWalkPE` ([#8431](https://github.com/pyg-team/pytorch_geometric/pull/8431))
+- Added a tutorial for point cloud processing ([#8015](https://github.com/pyg-team/pytorch_geometric/pull/8015))
+- Added `fsspec` as file system backend ([#8379](https://github.com/pyg-team/pytorch_geometric/pull/8379), [#8426](https://github.com/pyg-team/pytorch_geometric/pull/8426), [#8434](https://github.com/pyg-team/pytorch_geometric/pull/8434), [#8474](https://github.com/pyg-team/pytorch_geometric/pull/8474))
+- Added support for floating-point average degree numbers in `FakeDataset` and `FakeHeteroDataset` ([#8404](https://github.com/pyg-team/pytorch_geometric/pull/8404))
+- Added support for device conversions of `InMemoryDataset` ([#8402](https://github.com/pyg-team/pytorch_geometric/pull/8402))
+- Added support for edge-level temporal sampling in `NeighborLoader` and `LinkNeighborLoader` ([#8372](https://github.com/pyg-team/pytorch_geometric/pull/8372), [#8428](https://github.com/pyg-team/pytorch_geometric/pull/8428))
+- Added support for `torch.compile` in `ModuleDict` and `ParameterDict` ([#8363](https://github.com/pyg-team/pytorch_geometric/pull/8363))
+- Added `force_reload` option to `Dataset` and `InMemoryDataset` to reload datasets ([#8352](https://github.com/pyg-team/pytorch_geometric/pull/8352), [#8357](https://github.com/pyg-team/pytorch_geometric/pull/8357), [#8436](https://github.com/pyg-team/pytorch_geometric/pull/8436))
+- Added support for `torch.compile` in `MultiAggregation` ([#8345](https://github.com/pyg-team/pytorch_geometric/pull/8345))
+- Added support for `torch.compile` in `HeteroConv` ([#8344](https://github.com/pyg-team/pytorch_geometric/pull/8344))
+- Added support for weighted `sparse_cross_entropy` ([#8340](https://github.com/pyg-team/pytorch_geometric/pull/8340))
+- Added a multi GPU training benchmarks for CUDA and XPU devices ([#8288](https://github.com/pyg-team/pytorch_geometric/pull/8288), [#8382](https://github.com/pyg-team/pytorch_geometric/pull/8382), [#8386](https://github.com/pyg-team/pytorch_geometric/pull/8386))
+- Support MRR computation in `KGEModel.test()` ([#8298](https://github.com/pyg-team/pytorch_geometric/pull/8298))
+- Added an example for model parallelism (`examples/multi_gpu/model_parallel.py`) ([#8309](https://github.com/pyg-team/pytorch_geometric/pull/8309))
+- Added a tutorial for multi-node multi-GPU training with pure PyTorch ([#8071](https://github.com/pyg-team/pytorch_geometric/pull/8071))
+- Added a multinode-multigpu example on `ogbn-papers100M` ([#8070](https://github.com/pyg-team/pytorch_geometric/pull/8070))
+- Added support for `to_hetero_with_bases` on static graphs ([#8247](https://github.com/pyg-team/pytorch_geometric/pull/8247))
+- Added the `RCDD` dataset ([#8196](https://github.com/pyg-team/pytorch_geometric/pull/8196))
+- Added distributed `GAT + ogbn-products` example targeting XPU device ([#8032](https://github.com/pyg-team/pytorch_geometric/pull/8032))
+- Added the option to skip explanations of certain message passing layers via `conv.explain = False` ([#8216](https://github.com/pyg-team/pytorch_geometric/pull/8216))
+
+### Changed
+
+- Changed the default inference mode for `use_segment_matmul` based on benchmarking (from a heuristic-based version) ([#8615](https://github.com/pyg-team/pytorch_geometric/pull/8615))
+- Return an empty tensor from `utils.group_argsort` if its input tensor is empty ([#8752](https://github.com/pyg-team/pytorch_geometric/pull/8752))
+- GNN layers are now jittable by default ([#8745](https://github.com/pyg-team/pytorch_geometric/pull/8745))
+- Sparse node features in `NELL` and `AttributedGraphDataset` are now represented as `torch.sparse_csr_tensor` instead of `torch_sparse.SparseTensor` ([#8679](https://github.com/pyg-team/pytorch_geometric/pull/8679))
+- Accelerated mini-batching of `torch.sparse` tensors ([#8670](https://github.com/pyg-team/pytorch_geometric/pull/8670))
+- Fixed RPC timeout due to worker closing in `DistLoader` with `atexit` not executed correctly in `worker_init_fn` ([#8605](https://github.com/pyg-team/pytorch_geometric/pull/8605))
+- `ExplainerDataset` will now contain node labels for any motif generator ([#8519](https://github.com/pyg-team/pytorch_geometric/pull/8519))
+- Made `utils.softmax` faster via `softmax_csr` ([#8399](https://github.com/pyg-team/pytorch_geometric/pull/8399))
+- Made `utils.mask.mask_select` faster ([#8369](https://github.com/pyg-team/pytorch_geometric/pull/8369))
+- Update `DistNeighborSampler` ([#8209](https://github.com/pyg-team/pytorch_geometric/pull/8209), [#8367](https://github.com/pyg-team/pytorch_geometric/pull/8367), [#8375](https://github.com/pyg-team/pytorch_geometric/pull/8375), ([#8624](https://github.com/pyg-team/pytorch_geometric/pull/8624), [#8722](https://github.com/pyg-team/pytorch_geometric/pull/8722))
+- Update `GraphStore` and `FeatureStore` to support distributed training ([#8083](https://github.com/pyg-team/pytorch_geometric/pull/8083))
+- Disallow the usage of `add_self_loops=True` in `GCNConv(normalize=False)` ([#8210](https://github.com/pyg-team/pytorch_geometric/pull/8210))
+- Disable device asserts during `torch_geometric.compile` ([#8220](https://github.com/pyg-team/pytorch_geometric/pull/8220))
+
+### Deprecated
+
+- Deprecated `MessagePassing.jittable` ([#8781](https://github.com/pyg-team/pytorch_geometric/pull/8781))
+- Deprecated the usage of `torch_geometric.compile`; Use `torch.compile` instead ([#8780](https://github.com/pyg-team/pytorch_geometric/pull/8780))
+- Deprecated the `typing` argument in `MessagePassing.jittable()` ([#8731](https://github.com/pyg-team/pytorch_geometric/pull/8731))
+- Deprecated `torch_geometric.data.makedirs` in favor of `os.makedirs` ([#8421](https://github.com/pyg-team/pytorch_geometric/pull/8421))
+- Deprecated `DataParallel` in favor of `DistributedDataParallel` ([#8250](https://github.com/pyg-team/pytorch_geometric/pull/8250))
+
+### Fixed
+
+- Fixed dummy value creation of boolean tensors in `to_homogeneous()` ([#8858](https://github.com/pyg-team/pytorch_geometric/pull/8858))
+- Fixed Google Drive download issues ([#8804](https://github.com/pyg-team/pytorch_geometric/pull/8804))
+- Fixed a bug in which `InMemoryDataset` did not reconstruct the correct data class when a `pre_transform` has modified it ([#8692](https://github.com/pyg-team/pytorch_geometric/pull/8692))
+- Fixed a bug in which transforms were not applied for `OnDiskDataset` ([#8663](https://github.com/pyg-team/pytorch_geometric/pull/8663))
+- Fixed mini-batch computation in `DMoNPooing` loss function ([#8285](https://github.com/pyg-team/pytorch_geometric/pull/8285))
+- Fixed `NaN` handling in `SQLDatabase` ([#8479](https://github.com/pyg-team/pytorch_geometric/pull/8479))
+- Fixed `CaptumExplainer` in case no `index` is passed ([#8440](https://github.com/pyg-team/pytorch_geometric/pull/8440))
+- Fixed `edge_index` construction in the `UPFD` dataset ([#8413](https://github.com/pyg-team/pytorch_geometric/pull/8413))
+- Fixed TorchScript support in `AttentionalAggregation` and `DeepSetsAggregation` ([#8406](https://github.com/pyg-team/pytorch_geometric/pull/8406))
+- Fixed `GraphMaskExplainer` for GNNs with more than two layers ([#8401](https://github.com/pyg-team/pytorch_geometric/pull/8401))
+- Breaking Change: Properly initialize modules in `GATConv` depending on whether the input is bipartite or non-bipartite ([#8397](https://github.com/pyg-team/pytorch_geometric/pull/8397))
+- Fixed `input_id` computation in `NeighborLoader` in case a `mask` is given ([#8312](https://github.com/pyg-team/pytorch_geometric/pull/8312))
+- Respect current device when deep-copying `Linear` layers ([#8311](https://github.com/pyg-team/pytorch_geometric/pull/8311))
+- Fixed `Data.subgraph()`/`HeteroData.subgraph()` in case `edge_index` is not defined ([#8277](https://github.com/pyg-team/pytorch_geometric/pull/8277))
+- Fixed empty edge handling in `MetaPath2Vec` ([#8248](https://github.com/pyg-team/pytorch_geometric/pull/8248))
+- Fixed `AttentionExplainer` usage within `AttentiveFP` ([#8244](https://github.com/pyg-team/pytorch_geometric/pull/8244))
+- Fixed `load_from_state_dict` in lazy `Linear` modules ([#8242](https://github.com/pyg-team/pytorch_geometric/pull/8242))
+- Fixed pre-trained `DimeNet++` performance on `QM9` ([#8239](https://github.com/pyg-team/pytorch_geometric/pull/8239))
+- Fixed `GNNExplainer` usage within `AttentiveFP` ([#8216](https://github.com/pyg-team/pytorch_geometric/pull/8216))
+- Fixed `to_networkx(to_undirected=True)` in case the input graph is not undirected ([#8204](https://github.com/pyg-team/pytorch_geometric/pull/8204))
+- Fixed sparse-sparse matrix multiplication support on Windows in `TwoHop` and `AddRandomWalkPE` transformations ([#8197](https://github.com/pyg-team/pytorch_geometric/pull/8197), [#8225](https://github.com/pyg-team/pytorch_geometric/pull/8225))
+- Fixed batching of `HeteroData` converted using `ToSparseTensor()` when `torch_sparse` is not installed ([#8356](https://github.com/pyg-team/pytorch_geometric/pull/8356))
+
### Removed
-## [2.4.0] - 2023-10-12
+- Removed disabling of extension packages during `torch_geometric.compile` ([#8698](https://github.com/pyg-team/pytorch_geometric/pull/8698))
+
+## \[2.4.0\] - 2023-10-12
### Added
-- Add the ``ogc`` method as example ([#8168](https://github.com/pyg-team/pytorch_geometric/pull/8168))
+- Add the `ogc` method as example ([#8168](https://github.com/pyg-team/pytorch_geometric/pull/8168))
- Added a tutorial on `NeighborLoader` ([#7931](https://github.com/pyg-team/pytorch_geometric/pull/7931))
- Added the option to override usage of `segment_matmul`/`grouped_matmul` via the `torch_geometric.backend.use_segment_matmul` flag ([#8148](https://github.com/pyg-team/pytorch_geometric/pull/8148))
- Added support for PyTorch 2.1.0 ([#8134](https://github.com/pyg-team/pytorch_geometric/pull/8134))
@@ -203,7 +307,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
- Removed `layer_type` argument in `contrib.explain.GraphMaskExplainer` ([#7445](https://github.com/pyg-team/pytorch_geometric/pull/7445))
- Replaced `FastHGTConv` with `HGTConv` ([#7117](https://github.com/pyg-team/pytorch_geometric/pull/7117))
-## [2.3.0] - 2023-03-23
+## \[2.3.0\] - 2023-03-23
### Added
@@ -361,7 +465,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
- Removed `target_index` argument in the `Explainer` interface ([#6270](https://github.com/pyg-team/pytorch_geometric/pull/6270))
- Removed `Aggregation.set_validate_args` option ([#6175](https://github.com/pyg-team/pytorch_geometric/pull/6175))
-## [2.2.0] - 2022-12-01
+## \[2.2.0\] - 2022-12-01
### Added
@@ -427,7 +531,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
- Added `Aggregation.set_validate_args` option to skip validation of `dim_size` ([#5290](https://github.com/pyg-team/pytorch_geometric/pull/5290))
- Added `SparseTensor` support to inference and training benchmark suite ([#5242](https://github.com/pyg-team/pytorch_geometric/pull/5242), [#5258](https://github.com/pyg-team/pytorch_geometric/pull/5258), [#5881](https://github.com/pyg-team/pytorch_geometric/pull/5881))
- Added experimental mode in inference benchmarks ([#5254](https://github.com/pyg-team/pytorch_geometric/pull/5254))
-- Added node classification example instrumented with [Weights and Biases (W&B) logging](https://wandb.com) and [W&B Sweeps](https://wandb.com/sweeps) ([#5192](https://github.com/pyg-team/pytorch_geometric/pull/5192))
+- Added node classification example instrumented with [Weights and Biases (W&B) logging](https://wandb.com) and [W&B Sweeps](https://wandb.com/sweeps) ([#5192](https://github.com/pyg-team/pytorch_geometric/pull/5192))
- Added experimental mode for `utils.scatter` ([#5232](https://github.com/pyg-team/pytorch_geometric/pull/5232), [#5241](https://github.com/pyg-team/pytorch_geometric/pull/5241), [#5386](https://github.com/pyg-team/pytorch_geometric/pull/5386))
- Added missing test labels in `HGBDataset` ([#5233](https://github.com/pyg-team/pytorch_geometric/pull/5233))
- Added `BaseStorage.get()` functionality ([#5240](https://github.com/pyg-team/pytorch_geometric/pull/5240))
@@ -479,7 +583,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
- Removed `scatter_reduce` option from experimental mode ([#5399](https://github.com/pyg-team/pytorch_geometric/pull/5399))
-## [2.1.0] - 2022-08-17
+## \[2.1.0\] - 2022-08-17
### Added
@@ -527,7 +631,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
- Added the `bias` vector to the `GCN` model definition in the "Create Message Passing Networks" tutorial ([#4755](https://github.com/pyg-team/pytorch_geometric/pull/4755))
- Added `transforms.RootedSubgraph` interface with two implementations: `RootedEgoNets` and `RootedRWSubgraph` ([#3926](https://github.com/pyg-team/pytorch_geometric/pull/3926))
- Added `ptr` vectors for `follow_batch` attributes within `Batch.from_data_list` ([#4723](https://github.com/pyg-team/pytorch_geometric/pull/4723))
-- Added `torch_geometric.nn.aggr` package ([#4687](https://github.com/pyg-team/pytorch_geometric/pull/4687), [#4721](https://github.com/pyg-team/pytorch_geometric/pull/4721), [#4731](https://github.com/pyg-team/pytorch_geometric/pull/4731), [#4762](https://github.com/pyg-team/pytorch_geometric/pull/4762), [#4749](https://github.com/pyg-team/pytorch_geometric/pull/4749), [#4779](https://github.com/pyg-team/pytorch_geometric/pull/4779), [#4863](https://github.com/pyg-team/pytorch_geometric/pull/4863), [#4864](https://github.com/pyg-team/pytorch_geometric/pull/4864), [#4865](https://github.com/pyg-team/pytorch_geometric/pull/4865), [#4866](https://github.com/pyg-team/pytorch_geometric/pull/4866), [#4872](https://github.com/pyg-team/pytorch_geometric/pull/4872), [#4934](https://github.com/pyg-team/pytorch_geometric/pull/4934), [#4935](https://github.com/pyg-team/pytorch_geometric/pull/4935), [#4957](https://github.com/pyg-team/pytorch_geometric/pull/4957), [#4973](https://github.com/pyg-team/pytorch_geometric/pull/4973), [#4973](https://github.com/pyg-team/pytorch_geometric/pull/4973), [#4986](https://github.com/pyg-team/pytorch_geometric/pull/4986), [#4995](https://github.com/pyg-team/pytorch_geometric/pull/4995), [#5000](https://github.com/pyg-team/pytorch_geometric/pull/5000), [#5034](https://github.com/pyg-team/pytorch_geometric/pull/5034), [#5036](https://github.com/pyg-team/pytorch_geometric/pull/5036), [#5039](https://github.com/pyg-team/pytorch_geometric/issues/5039), [#4522](https://github.com/pyg-team/pytorch_geometric/pull/4522), [#5033](https://github.com/pyg-team/pytorch_geometric/pull/5033]), [#5085](https://github.com/pyg-team/pytorch_geometric/pull/5085), [#5097](https://github.com/pyg-team/pytorch_geometric/pull/5097), [#5099](https://github.com/pyg-team/pytorch_geometric/pull/5099), [#5104](https://github.com/pyg-team/pytorch_geometric/pull/5104), [#5113](https://github.com/pyg-team/pytorch_geometric/pull/5113), [#5130](https://github.com/pyg-team/pytorch_geometric/pull/5130), [#5098](https://github.com/pyg-team/pytorch_geometric/pull/5098), [#5191](https://github.com/pyg-team/pytorch_geometric/pull/5191))
+- Added `torch_geometric.nn.aggr` package ([#4687](https://github.com/pyg-team/pytorch_geometric/pull/4687), [#4721](https://github.com/pyg-team/pytorch_geometric/pull/4721), [#4731](https://github.com/pyg-team/pytorch_geometric/pull/4731), [#4762](https://github.com/pyg-team/pytorch_geometric/pull/4762), [#4749](https://github.com/pyg-team/pytorch_geometric/pull/4749), [#4779](https://github.com/pyg-team/pytorch_geometric/pull/4779), [#4863](https://github.com/pyg-team/pytorch_geometric/pull/4863), [#4864](https://github.com/pyg-team/pytorch_geometric/pull/4864), [#4865](https://github.com/pyg-team/pytorch_geometric/pull/4865), [#4866](https://github.com/pyg-team/pytorch_geometric/pull/4866), [#4872](https://github.com/pyg-team/pytorch_geometric/pull/4872), [#4934](https://github.com/pyg-team/pytorch_geometric/pull/4934), [#4935](https://github.com/pyg-team/pytorch_geometric/pull/4935), [#4957](https://github.com/pyg-team/pytorch_geometric/pull/4957), [#4973](https://github.com/pyg-team/pytorch_geometric/pull/4973), [#4973](https://github.com/pyg-team/pytorch_geometric/pull/4973), [#4986](https://github.com/pyg-team/pytorch_geometric/pull/4986), [#4995](https://github.com/pyg-team/pytorch_geometric/pull/4995), [#5000](https://github.com/pyg-team/pytorch_geometric/pull/5000), [#5034](https://github.com/pyg-team/pytorch_geometric/pull/5034), [#5036](https://github.com/pyg-team/pytorch_geometric/pull/5036), [#5039](https://github.com/pyg-team/pytorch_geometric/issues/5039), [#4522](https://github.com/pyg-team/pytorch_geometric/pull/4522), [#5033](https://github.com/pyg-team/pytorch_geometric/pull/5033), [#5085](https://github.com/pyg-team/pytorch_geometric/pull/5085), [#5097](https://github.com/pyg-team/pytorch_geometric/pull/5097), [#5099](https://github.com/pyg-team/pytorch_geometric/pull/5099), [#5104](https://github.com/pyg-team/pytorch_geometric/pull/5104), [#5113](https://github.com/pyg-team/pytorch_geometric/pull/5113), [#5130](https://github.com/pyg-team/pytorch_geometric/pull/5130), [#5098](https://github.com/pyg-team/pytorch_geometric/pull/5098), [#5191](https://github.com/pyg-team/pytorch_geometric/pull/5191))
- Added the `DimeNet++` model ([#4432](https://github.com/pyg-team/pytorch_geometric/pull/4432), [#4699](https://github.com/pyg-team/pytorch_geometric/pull/4699), [#4700](https://github.com/pyg-team/pytorch_geometric/pull/4700), [#4800](https://github.com/pyg-team/pytorch_geometric/pull/4800))
- Added an example of using PyG with PyTorch Ignite ([#4487](https://github.com/pyg-team/pytorch_geometric/pull/4487))
- Added `GroupAddRev` module with support for reducing training GPU memory ([#4671](https://github.com/pyg-team/pytorch_geometric/pull/4671), [#4701](https://github.com/pyg-team/pytorch_geometric/pull/4701), [#4715](https://github.com/pyg-team/pytorch_geometric/pull/4715), [#4730](https://github.com/pyg-team/pytorch_geometric/pull/4730))
@@ -572,9 +676,9 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
- Changed docstring for `RandomLinkSplit` ([#5190](https://github.com/pyg-team/pytorch_geometric/issues/5190))
- Switched to PyTorch `scatter_reduce` implementation - experimental feature ([#5120](https://github.com/pyg-team/pytorch_geometric/pull/5120))
-- Fixed `RGATConv` device mismatches for `f-scaled` mode ([#5187](https://github.com/pyg-team/pytorch_geometric/pull/5187)]
-- Allow for multi-dimensional `edge_labels` in `LinkNeighborLoader` ([#5186](https://github.com/pyg-team/pytorch_geometric/pull/5186)]
-- Fixed `GINEConv` bug with non-sequential input ([#5154](https://github.com/pyg-team/pytorch_geometric/pull/5154)]
+- Fixed `RGATConv` device mismatches for `f-scaled` mode ([#5187](https://github.com/pyg-team/pytorch_geometric/pull/5187))
+- Allow for multi-dimensional `edge_labels` in `LinkNeighborLoader` ([#5186](https://github.com/pyg-team/pytorch_geometric/pull/5186))
+- Fixed `GINEConv` bug with non-sequential input ([#5154](https://github.com/pyg-team/pytorch_geometric/pull/5154))
- Improved error message ([#5095](https://github.com/pyg-team/pytorch_geometric/pull/5095))
- Fixed `HGTLoader` bug which produced outputs with missing edge types ([#5067](https://github.com/pyg-team/pytorch_geometric/pull/5067))
- Fixed dynamic inheritance issue in data batching ([#5051](https://github.com/pyg-team/pytorch_geometric/pull/5051))
diff --git a/pytorch_geometric-2.4.0/CITATION.cff b/pytorch_geometric-2.5.2/CITATION.cff
similarity index 100%
rename from pytorch_geometric-2.4.0/CITATION.cff
rename to pytorch_geometric-2.5.2/CITATION.cff
diff --git a/pytorch_geometric-2.4.0/LICENSE b/pytorch_geometric-2.5.2/LICENSE
similarity index 100%
rename from pytorch_geometric-2.4.0/LICENSE
rename to pytorch_geometric-2.5.2/LICENSE
diff --git a/pytorch_geometric-2.4.0/README.md b/pytorch_geometric-2.5.2/README.md
similarity index 65%
rename from pytorch_geometric-2.4.0/README.md
rename to pytorch_geometric-2.5.2/README.md
index e1190ca..d0210dd 100644
--- a/pytorch_geometric-2.4.0/README.md
+++ b/pytorch_geometric-2.5.2/README.md
@@ -1,23 +1,8 @@
-[pypi-image]: https://badge.fury.io/py/torch-geometric.svg
-[pypi-url]: https://pypi.python.org/pypi/torch-geometric
-[testing-image]: https://github.com/pyg-team/pytorch_geometric/actions/workflows/testing.yml/badge.svg
-[testing-url]: https://github.com/pyg-team/pytorch_geometric/actions/workflows/testing.yml
-[linting-image]: https://github.com/pyg-team/pytorch_geometric/actions/workflows/linting.yml/badge.svg
-[linting-url]: https://github.com/pyg-team/pytorch_geometric/actions/workflows/linting.yml
-[docs-image]: https://readthedocs.org/projects/pytorch-geometric/badge/?version=latest
-[docs-url]: https://pytorch-geometric.readthedocs.io/en/latest
-[coverage-image]: https://codecov.io/gh/pyg-team/pytorch_geometric/branch/master/graph/badge.svg
-[coverage-url]: https://codecov.io/github/pyg-team/pytorch_geometric?branch=master
-[contributing-image]: https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat
-[contributing-url]: https://github.com/pyg-team/pytorch_geometric/blob/master/.github/CONTRIBUTING.md
-[slack-image]: https://img.shields.io/badge/slack-pyg-brightgreen
-[slack-url]: https://data.pyg.org/slack.html
-
---------------------------------------------------------------------------------
+______________________________________________________________________
[![PyPI Version][pypi-image]][pypi-url]
[![Testing Status][testing-image]][testing-url]
@@ -39,30 +24,30 @@ In addition, it consists of easy-to-use mini-batch loaders for operating on many
---------------------------------------------------------------------------------
+______________________________________________________________________
-* [Library Highlights](#library-highlights)
-* [Quick Tour for New Users](#quick-tour-for-new-users)
-* [Architecture Overview](#architecture-overview)
-* [Implemented GNN Models](#implemented-gnn-models)
-* [Installation](#installation)
+- [Library Highlights](#library-highlights)
+- [Quick Tour for New Users](#quick-tour-for-new-users)
+- [Architecture Overview](#architecture-overview)
+- [Implemented GNN Models](#implemented-gnn-models)
+- [Installation](#installation)
## Library Highlights
Whether you are a machine learning researcher or first-time user of machine learning toolkits, here are some reasons to try out PyG for machine learning on graph-structured data.
-* **Easy-to-use and unified API**:
+- **Easy-to-use and unified API**:
All it takes is 10-20 lines of code to get started with training a GNN model (see the next section for a [quick tour](#quick-tour-for-new-users)).
PyG is *PyTorch-on-the-rocks*: It utilizes a tensor-centric API and keeps design principles close to vanilla PyTorch.
If you are already familiar with PyTorch, utilizing PyG is straightforward.
-* **Comprehensive and well-maintained GNN models**:
+- **Comprehensive and well-maintained GNN models**:
Most of the state-of-the-art Graph Neural Network architectures have been implemented by library developers or authors of research papers and are ready to be applied.
-* **Great flexibility**:
+- **Great flexibility**:
Existing PyG models can easily be extended for conducting your own research with GNNs.
Making modifications to existing models or creating new architectures is simple, thanks to its easy-to-use message passing API, and a variety of operators and utility functions.
-* **Large-scale real-world GNN models**:
+- **Large-scale real-world GNN models**:
We focus on the need of GNN applications in challenging real-world scenarios, and support learning on diverse types of graphs, including but not limited to: scalable GNNs for graphs with millions of nodes; dynamic GNNs for node predictions over time; heterogeneous GNNs with multiple node types and edge types.
-* **GraphGym integration**: GraphGym lets users easily reproduce GNN experiments, is able to launch and analyze thousands of different GNN configurations, and is customizable by registering new modules to a GNN learning pipeline.
+- **GraphGym integration**: GraphGym lets users easily reproduce GNN experiments, is able to launch and analyze thousands of different GNN configurations, and is customizable by registering new modules to a GNN learning pipeline.
## Quick Tour for New Users
@@ -115,6 +100,7 @@ for epoch in range(200):
loss.backward()
optimizer.step()
```
+
More information about evaluating final model performance can be found in the corresponding [example](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/gcn.py).
@@ -124,7 +110,7 @@ More information about evaluating final model performance can be found in the co
In addition to the easy application of existing GNNs, PyG makes it simple to implement custom Graph Neural Networks (see [here](https://pytorch-geometric.readthedocs.io/en/latest/tutorial/create_gnn.html) for the accompanying tutorial).
For example, this is all it takes to implement the [edge convolutional layer](https://arxiv.org/abs/1801.07829) from Wang *et al.*:
-$$x_i^{\prime} ~ = ~ \max_{j \in \mathcal{N}(i)} ~ \textrm{MLP}_{\theta} \left( [ ~ x_i, ~ x_j - x_i ~ ] \right)$$
+$$x_i^{\\prime} ~ = ~ \\max\_{j \\in \\mathcal{N}(i)} ~ \\textrm{MLP}\_{\\theta} \\left( \[ ~ x_i, ~ x_j - x_i ~ \] \\right)$$
```python
import torch
@@ -172,10 +158,10 @@ For a quick start, check out our [examples](https://github.com/pyg-team/pytorch_
PyG provides a multi-layer framework that enables users to build Graph Neural Network solutions on both low and high levels.
It comprises of the following components:
-* The PyG **engine** utilizes the powerful PyTorch deep learning framework with full [`torch.compile`](https://pytorch-geometric.readthedocs.io/en/latest/advanced/compile.html) and [TorchScript](https://pytorch-geometric.readthedocs.io/en/latest/advanced/jit.html) support, as well as additions of efficient CPU/CUDA libraries for operating on sparse data, *e.g.*, [`pyg-lib`](https://github.com/pyg-team/pyg-lib).
-* The PyG **storage** handles data processing, transformation and loading pipelines. It is capable of handling and processing large-scale graph datasets, and provides effective solutions for heterogeneous graphs. It further provides a variety of sampling solutions, which enable training of GNNs on large-scale graphs.
-* The PyG **operators** bundle essential functionalities for implementing Graph Neural Networks. PyG supports important GNN building blocks that can be combined and applied to various parts of a GNN model, ensuring rich flexibility of GNN design.
-* Finally, PyG provides an abundant set of GNN **models**, and examples that showcase GNN models on standard graph benchmarks. Thanks to its flexibility, users can easily build and modify custom GNN models to fit their specific needs.
+- The PyG **engine** utilizes the powerful PyTorch deep learning framework with full [`torch.compile`](https://pytorch-geometric.readthedocs.io/en/latest/advanced/compile.html) and [TorchScript](https://pytorch-geometric.readthedocs.io/en/latest/advanced/jit.html) support, as well as additions of efficient CPU/CUDA libraries for operating on sparse data, *e.g.*, [`pyg-lib`](https://github.com/pyg-team/pyg-lib).
+- The PyG **storage** handles data processing, transformation and loading pipelines. It is capable of handling and processing large-scale graph datasets, and provides effective solutions for heterogeneous graphs. It further provides a variety of sampling solutions, which enable training of GNNs on large-scale graphs.
+- The PyG **operators** bundle essential functionalities for implementing Graph Neural Networks. PyG supports important GNN building blocks that can be combined and applied to various parts of a GNN model, ensuring rich flexibility of GNN design.
+- Finally, PyG provides an abundant set of GNN **models**, and examples that showcase GNN models on standard graph benchmarks. Thanks to its flexibility, users can easily build and modify custom GNN models to fit their specific needs.
@@ -190,152 +176,156 @@ All Graph Neural Network layers are implemented via the **[`nn.MessagePassing`](
A GNN layer specifies how to perform message passing, *i.e.* by designing different message, aggregation and update functions as defined [here](https://pytorch-geometric.readthedocs.io/en/latest/tutorial/create_gnn.html).
These GNN layers can be stacked together to create Graph Neural Network models.
-* **[GCNConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.GCNConv.html)** from Kipf and Welling: [Semi-Supervised Classification with Graph Convolutional Networks](https://arxiv.org/abs/1609.02907) (ICLR 2017) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/gcn.py)]
-* **[ChebConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.ChebConv.html)** from Defferrard *et al.*: [Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering](https://arxiv.org/abs/1606.09375) (NIPS 2016) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/gcn.py#L36-L37)]
-* **[GATConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.GATConv.html)** from Veličković *et al.*: [Graph Attention Networks](https://arxiv.org/abs/1710.10903) (ICLR 2018) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/gat.py)]
+- **[GCNConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.GCNConv.html)** from Kipf and Welling: [Semi-Supervised Classification with Graph Convolutional Networks](https://arxiv.org/abs/1609.02907) (ICLR 2017) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/gcn.py)\]
+- **[ChebConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.ChebConv.html)** from Defferrard *et al.*: [Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering](https://arxiv.org/abs/1606.09375) (NIPS 2016) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/gcn.py#L36-L37)\]
+- **[GATConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.GATConv.html)** from Veličković *et al.*: [Graph Attention Networks](https://arxiv.org/abs/1710.10903) (ICLR 2018) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/gat.py)\]
Expand to see all implemented GNN layers...
-* **[GCN2Conv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.GCN2Conv.html)** from Chen *et al.*: [Simple and Deep Graph Convolutional Networks](https://arxiv.org/abs/2007.02133) (ICML 2020) [[**Example1**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/gcn2_cora.py), [**Example2**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/gcn2_ppi.py)]
-* **[SplineConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.SplineConv.html)** from Fey *et al.*: [SplineCNN: Fast Geometric Deep Learning with Continuous B-Spline Kernels](https://arxiv.org/abs/1711.08920) (CVPR 2018) [[**Example1**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/cora.py), [**Example2**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/faust.py)]
-* **[NNConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.NNConv.html)** from Gilmer *et al.*: [Neural Message Passing for Quantum Chemistry](https://arxiv.org/abs/1704.01212) (ICML 2017) [[**Example1**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/qm9_nn_conv.py), [**Example2**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/mnist_nn_conv.py)]
-* **[CGConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.CGConv.html)** from Xie and Grossman: [Crystal Graph Convolutional Neural Networks for an Accurate and Interpretable Prediction of Material Properties](https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.120.145301) (Physical Review Letters 120, 2018)
-* **[ECConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.ECConv.html)** from Simonovsky and Komodakis: [Edge-Conditioned Convolution on Graphs](https://arxiv.org/abs/1704.02901) (CVPR 2017)
-* **[EGConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.EGConv.html)** from Tailor *et al.*: [Adaptive Filters and Aggregator Fusion for Efficient Graph Convolutions](https://arxiv.org/abs/2104.01481) (GNNSys 2021) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/egc.py)]
-* **[GATv2Conv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.GATv2Conv.html)** from Brody *et al.*: [How Attentive are Graph Attention Networks?](https://arxiv.org/abs/2105.14491) (ICLR 2022)
-* **[TransformerConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.TransformerConv.html)** from Shi *et al.*: [Masked Label Prediction: Unified Message Passing Model for Semi-Supervised Classification](https://arxiv.org/abs/2009.03509) (CoRR 2020) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/unimp_arxiv.py)]
-* **[SAGEConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.SAGEConv.html)** from Hamilton *et al.*: [Inductive Representation Learning on Large Graphs](https://arxiv.org/abs/1706.02216) (NIPS 2017) [[**Example1**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/reddit.py), [**Example2**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/ogbn_products_sage.py), [**Example3**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/graph_sage_unsup.py), [**Example4**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/graph_sage_unsup_ppi.py)]
-* **[GraphConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.GraphConv.html)** from, *e.g.*, Morris *et al.*: [Weisfeiler and Leman Go Neural: Higher-order Graph Neural Networks](https://arxiv.org/abs/1810.02244) (AAAI 2019)
-* **[GatedGraphConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.GatedGraphConv.html)** from Li *et al.*: [Gated Graph Sequence Neural Networks](https://arxiv.org/abs/1511.05493) (ICLR 2016)
-* **[ResGatedGraphConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.ResGatedGraphConv.html)** from Bresson and Laurent: [Residual Gated Graph ConvNets](https://arxiv.org/abs/1711.07553) (CoRR 2017)
-* **[GINConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.GINConv.html)** from Xu *et al.*: [How Powerful are Graph Neural Networks?](https://arxiv.org/abs/1810.00826) (ICLR 2019) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/mutag_gin.py)]
-* **[GINEConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.GINEConv.html)** from Hu *et al.*: [Strategies for Pre-training Graph Neural Networks](https://arxiv.org/abs/1905.12265) (ICLR 2020)
-* **[ARMAConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.ARMAConv.html)** from Bianchi *et al.*: [Graph Neural Networks with Convolutional ARMA Filters](https://arxiv.org/abs/1901.01343) (CoRR 2019) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/arma.py)]
-* **[SGConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.SGConv.html)** from Wu *et al.*: [Simplifying Graph Convolutional Networks](https://arxiv.org/abs/1902.07153) (CoRR 2019) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/sgc.py)]
-* **[APPNP](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.APPNP.html)** from Klicpera *et al.*: [Predict then Propagate: Graph Neural Networks meet Personalized PageRank](https://arxiv.org/abs/1810.05997) (ICLR 2019) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/citation/appnp.py)]
-* **[MFConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.MFConv.html)** from Duvenaud *et al.*: [Convolutional Networks on Graphs for Learning Molecular Fingerprints](https://arxiv.org/abs/1509.09292) (NIPS 2015)
-* **[AGNNConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.AGNNConv.html)** from Thekumparampil *et al.*: [Attention-based Graph Neural Network for Semi-Supervised Learning](https://arxiv.org/abs/1803.03735) (CoRR 2017) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/agnn.py)]
-* **[TAGConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.TAGConv.html)** from Du *et al.*: [Topology Adaptive Graph Convolutional Networks](https://arxiv.org/abs/1710.10370) (CoRR 2017) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/tagcn.py)]
-* **[PNAConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.PNAConv.html)** from Corso *et al.*: [Principal Neighbourhood Aggregation for Graph Nets](https://arxiv.org/abs/2004.05718) (CoRR 2020) [**[Example](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/pna.py)**]
-* **[FAConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.FAConv.html)** from Bo *et al.*: [Beyond Low-Frequency Information in Graph Convolutional Networks](https://arxiv.org/abs/2101.00797) (AAAI 2021)
-* **[PDNConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.nn.conv.PDNConv.html)** from Rozemberczki *et al.*: [Pathfinder Discovery Networks for Neural Message Passing](https://arxiv.org/abs/2010.12878) (WWW 2021)
-* **[RGCNConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.RGCNConv.html)** from Schlichtkrull *et al.*: [Modeling Relational Data with Graph Convolutional Networks](https://arxiv.org/abs/1703.06103) (ESWC 2018) [[**Example1**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/rgcn.py), [**Example2**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/rgcn_link_pred.py)]
-* **[RGATConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.RGATConv.html)** from Busbridge *et al.*: [Relational Graph Attention Networks](https://arxiv.org/abs/1904.05811) (CoRR 2019) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/rgat.py)]
-* **[FiLMConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.FiLMConv.html)** from Brockschmidt: [GNN-FiLM: Graph Neural Networks with Feature-wise Linear Modulation](https://arxiv.org/abs/1906.12192) (ICML 2020) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/film.py)]
-* **[SignedConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.SignedConv.html)** from Derr *et al.*: [Signed Graph Convolutional Network](https://arxiv.org/abs/1808.06354) (ICDM 2018) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/signed_gcn.py)]
-* **[DNAConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.DNAConv.html)** from Fey: [Just Jump: Dynamic Neighborhood Aggregation in Graph Neural Networks](https://arxiv.org/abs/1904.04849) (ICLR-W 2019) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/dna.py)]
-* **[PANConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.PANConv.html)** from Ma *et al.*: [Path Integral Based Convolution and Pooling for Graph Neural Networks](https://arxiv.org/abs/2006.16811) (NeurIPS 2020)
-* **[PointNetConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.PointNetConv.html)** (including **[Iterative Farthest Point Sampling](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.pool.fps.html)**, dynamic graph generation based on **[nearest neighbor](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.pool.knn_graph.html)** or **[maximum distance](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.pool.radius_graph.html)**, and **[k-NN interpolation](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.unpool.knn_interpolate.html)** for upsampling) from Qi *et al.*: [PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation](https://arxiv.org/abs/1612.00593) (CVPR 2017) and [PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space](https://arxiv.org/abs/1706.02413) (NIPS 2017) [[**Example1**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/pointnet2_classification.py), [**Example2**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/pointnet2_segmentation.py)]
-* **[EdgeConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.EdgeConv.html)** from Wang *et al.*: [Dynamic Graph CNN for Learning on Point Clouds](https://arxiv.org/abs/1801.07829) (CoRR, 2018) [[**Example1**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/dgcnn_classification.py), [**Example2**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/dgcnn_segmentation.py)]
-* **[XConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.XConv.html)** from Li *et al.*: [PointCNN: Convolution On X-Transformed Points](https://arxiv.org/abs/1801.07791) (NeurIPS 2018) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/points/point_cnn.py)]
-* **[PPFConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.PPFConv.html)** from Deng *et al.*: [PPFNet: Global Context Aware Local Features for Robust 3D Point Matching](https://arxiv.org/abs/1802.02669) (CVPR 2018)
-* **[GMMConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.GMMConv.html)** from Monti *et al.*: [Geometric Deep Learning on Graphs and Manifolds using Mixture Model CNNs](https://arxiv.org/abs/1611.08402) (CVPR 2017)
-* **[FeaStConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.FeaStConv.html)** from Verma *et al.*: [FeaStNet: Feature-Steered Graph Convolutions for 3D Shape Analysis](https://arxiv.org/abs/1706.05206) (CVPR 2018)
-* **[PointTransformerConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.PointTransformerConv.html)** from Zhao *et al.*: [Point Transformer](https://arxiv.org/abs/2012.09164) (2020)
-* **[HypergraphConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.HypergraphConv.html)** from Bai *et al.*: [Hypergraph Convolution and Hypergraph Attention](https://arxiv.org/abs/1901.08150) (CoRR 2019)
-* **[GravNetConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.GravNetConv.html)** from Qasim *et al.*: [Learning Representations of Irregular Particle-detector Geometry with Distance-weighted Graph Networks](https://arxiv.org/abs/1902.07987) (European Physics Journal C, 2019)
-* **[SuperGAT](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.SuperGATConv.html)** from Kim and Oh: [How To Find Your Friendly Neighborhood: Graph Attention Design With Self-Supervision](https://openreview.net/forum?id=Wi5KUNlqWty) (ICLR 2021) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/super_gat.py)]
-* **[HGTConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.HGTConv.html)** from Hu *et al.*: [Heterogeneous Graph Transformer](https://arxiv.org/abs/2003.01332) (WWW 2020) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/hetero/hgt_dblp.py)]
-* **[HEATConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.HEATonv.html)** from Mo *et al.*: [Heterogeneous Edge-Enhanced Graph Attention Network For Multi-Agent Trajectory Prediction](https://arxiv.org/abs/2106.07161) (CoRR 2021)
-* **[SSGConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.SSGConv.html)** from Zhu *et al.*: [Simple Spectral Graph Convolution](https://openreview.net/forum?id=CYO5T-YjWZV) (ICLR 2021)
-* **[FusedGATConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.FusedGATConv.html)** from Zhang *et al.*: [Understanding GNN Computational Graph: A Coordinated Computation, IO, and Memory Perspective](https://proceedings.mlsys.org/paper/2022/file/9a1158154dfa42caddbd0694a4e9bdc8-Paper.pdf) (MLSys 2022)
-* **[GPSConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.GPSConv.html)** from Rampášek *et al.*: [Recipe for a General, Powerful, Scalable Graph Transformer](https://arxiv.org/abs/2205.12454) (NeurIPS 2022) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/graph_gps.py)]
+- **[GCN2Conv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.GCN2Conv.html)** from Chen *et al.*: [Simple and Deep Graph Convolutional Networks](https://arxiv.org/abs/2007.02133) (ICML 2020) \[[**Example1**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/gcn2_cora.py), [**Example2**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/gcn2_ppi.py)\]
+- **[SplineConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.SplineConv.html)** from Fey *et al.*: [SplineCNN: Fast Geometric Deep Learning with Continuous B-Spline Kernels](https://arxiv.org/abs/1711.08920) (CVPR 2018) \[[**Example1**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/cora.py), [**Example2**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/faust.py)\]
+- **[NNConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.NNConv.html)** from Gilmer *et al.*: [Neural Message Passing for Quantum Chemistry](https://arxiv.org/abs/1704.01212) (ICML 2017) \[[**Example1**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/qm9_nn_conv.py), [**Example2**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/mnist_nn_conv.py)\]
+- **[CGConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.CGConv.html)** from Xie and Grossman: [Crystal Graph Convolutional Neural Networks for an Accurate and Interpretable Prediction of Material Properties](https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.120.145301) (Physical Review Letters 120, 2018)
+- **[ECConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.ECConv.html)** from Simonovsky and Komodakis: [Edge-Conditioned Convolution on Graphs](https://arxiv.org/abs/1704.02901) (CVPR 2017)
+- **[EGConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.EGConv.html)** from Tailor *et al.*: [Adaptive Filters and Aggregator Fusion for Efficient Graph Convolutions](https://arxiv.org/abs/2104.01481) (GNNSys 2021) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/egc.py)\]
+- **[GATv2Conv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.GATv2Conv.html)** from Brody *et al.*: [How Attentive are Graph Attention Networks?](https://arxiv.org/abs/2105.14491) (ICLR 2022)
+- **[TransformerConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.TransformerConv.html)** from Shi *et al.*: [Masked Label Prediction: Unified Message Passing Model for Semi-Supervised Classification](https://arxiv.org/abs/2009.03509) (CoRR 2020) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/unimp_arxiv.py)\]
+- **[SAGEConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.SAGEConv.html)** from Hamilton *et al.*: [Inductive Representation Learning on Large Graphs](https://arxiv.org/abs/1706.02216) (NIPS 2017) \[[**Example1**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/reddit.py), [**Example2**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/ogbn_products_sage.py), [**Example3**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/graph_sage_unsup.py), [**Example4**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/graph_sage_unsup_ppi.py)\]
+- **[GraphConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.GraphConv.html)** from, *e.g.*, Morris *et al.*: [Weisfeiler and Leman Go Neural: Higher-order Graph Neural Networks](https://arxiv.org/abs/1810.02244) (AAAI 2019)
+- **[GatedGraphConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.GatedGraphConv.html)** from Li *et al.*: [Gated Graph Sequence Neural Networks](https://arxiv.org/abs/1511.05493) (ICLR 2016)
+- **[ResGatedGraphConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.ResGatedGraphConv.html)** from Bresson and Laurent: [Residual Gated Graph ConvNets](https://arxiv.org/abs/1711.07553) (CoRR 2017)
+- **[GINConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.GINConv.html)** from Xu *et al.*: [How Powerful are Graph Neural Networks?](https://arxiv.org/abs/1810.00826) (ICLR 2019) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/mutag_gin.py)\]
+- **[GINEConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.GINEConv.html)** from Hu *et al.*: [Strategies for Pre-training Graph Neural Networks](https://arxiv.org/abs/1905.12265) (ICLR 2020)
+- **[ARMAConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.ARMAConv.html)** from Bianchi *et al.*: [Graph Neural Networks with Convolutional ARMA Filters](https://arxiv.org/abs/1901.01343) (CoRR 2019) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/arma.py)\]
+- **[SGConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.SGConv.html)** from Wu *et al.*: [Simplifying Graph Convolutional Networks](https://arxiv.org/abs/1902.07153) (CoRR 2019) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/sgc.py)\]
+- **[APPNP](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.APPNP.html)** from Klicpera *et al.*: [Predict then Propagate: Graph Neural Networks meet Personalized PageRank](https://arxiv.org/abs/1810.05997) (ICLR 2019) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/citation/appnp.py)\]
+- **[MFConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.MFConv.html)** from Duvenaud *et al.*: [Convolutional Networks on Graphs for Learning Molecular Fingerprints](https://arxiv.org/abs/1509.09292) (NIPS 2015)
+- **[AGNNConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.AGNNConv.html)** from Thekumparampil *et al.*: [Attention-based Graph Neural Network for Semi-Supervised Learning](https://arxiv.org/abs/1803.03735) (CoRR 2017) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/agnn.py)\]
+- **[TAGConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.TAGConv.html)** from Du *et al.*: [Topology Adaptive Graph Convolutional Networks](https://arxiv.org/abs/1710.10370) (CoRR 2017) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/tagcn.py)\]
+- **[PNAConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.PNAConv.html)** from Corso *et al.*: [Principal Neighbourhood Aggregation for Graph Nets](https://arxiv.org/abs/2004.05718) (CoRR 2020) \[**[Example](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/pna.py)**\]
+- **[FAConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.FAConv.html)** from Bo *et al.*: [Beyond Low-Frequency Information in Graph Convolutional Networks](https://arxiv.org/abs/2101.00797) (AAAI 2021)
+- **[PDNConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.nn.conv.PDNConv.html)** from Rozemberczki *et al.*: [Pathfinder Discovery Networks for Neural Message Passing](https://arxiv.org/abs/2010.12878) (WWW 2021)
+- **[RGCNConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.RGCNConv.html)** from Schlichtkrull *et al.*: [Modeling Relational Data with Graph Convolutional Networks](https://arxiv.org/abs/1703.06103) (ESWC 2018) \[[**Example1**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/rgcn.py), [**Example2**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/rgcn_link_pred.py)\]
+- **[RGATConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.RGATConv.html)** from Busbridge *et al.*: [Relational Graph Attention Networks](https://arxiv.org/abs/1904.05811) (CoRR 2019) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/rgat.py)\]
+- **[FiLMConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.FiLMConv.html)** from Brockschmidt: [GNN-FiLM: Graph Neural Networks with Feature-wise Linear Modulation](https://arxiv.org/abs/1906.12192) (ICML 2020) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/film.py)\]
+- **[SignedConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.SignedConv.html)** from Derr *et al.*: [Signed Graph Convolutional Network](https://arxiv.org/abs/1808.06354) (ICDM 2018) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/signed_gcn.py)\]
+- **[DNAConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.DNAConv.html)** from Fey: [Just Jump: Dynamic Neighborhood Aggregation in Graph Neural Networks](https://arxiv.org/abs/1904.04849) (ICLR-W 2019) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/dna.py)\]
+- **[PANConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.PANConv.html)** from Ma *et al.*: [Path Integral Based Convolution and Pooling for Graph Neural Networks](https://arxiv.org/abs/2006.16811) (NeurIPS 2020)
+- **[PointNetConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.PointNetConv.html)** (including **[Iterative Farthest Point Sampling](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.pool.fps.html)**, dynamic graph generation based on **[nearest neighbor](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.pool.knn_graph.html)** or **[maximum distance](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.pool.radius_graph.html)**, and **[k-NN interpolation](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.unpool.knn_interpolate.html)** for upsampling) from Qi *et al.*: [PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation](https://arxiv.org/abs/1612.00593) (CVPR 2017) and [PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space](https://arxiv.org/abs/1706.02413) (NIPS 2017) \[[**Example1**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/pointnet2_classification.py), [**Example2**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/pointnet2_segmentation.py)\]
+- **[EdgeConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.EdgeConv.html)** from Wang *et al.*: [Dynamic Graph CNN for Learning on Point Clouds](https://arxiv.org/abs/1801.07829) (CoRR, 2018) \[[**Example1**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/dgcnn_classification.py), [**Example2**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/dgcnn_segmentation.py)\]
+- **[XConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.XConv.html)** from Li *et al.*: [PointCNN: Convolution On X-Transformed Points](https://arxiv.org/abs/1801.07791) (NeurIPS 2018) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/points/point_cnn.py)\]
+- **[PPFConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.PPFConv.html)** from Deng *et al.*: [PPFNet: Global Context Aware Local Features for Robust 3D Point Matching](https://arxiv.org/abs/1802.02669) (CVPR 2018)
+- **[GMMConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.GMMConv.html)** from Monti *et al.*: [Geometric Deep Learning on Graphs and Manifolds using Mixture Model CNNs](https://arxiv.org/abs/1611.08402) (CVPR 2017)
+- **[FeaStConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.FeaStConv.html)** from Verma *et al.*: [FeaStNet: Feature-Steered Graph Convolutions for 3D Shape Analysis](https://arxiv.org/abs/1706.05206) (CVPR 2018)
+- **[PointTransformerConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.PointTransformerConv.html)** from Zhao *et al.*: [Point Transformer](https://arxiv.org/abs/2012.09164) (2020)
+- **[HypergraphConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.HypergraphConv.html)** from Bai *et al.*: [Hypergraph Convolution and Hypergraph Attention](https://arxiv.org/abs/1901.08150) (CoRR 2019)
+- **[GravNetConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.GravNetConv.html)** from Qasim *et al.*: [Learning Representations of Irregular Particle-detector Geometry with Distance-weighted Graph Networks](https://arxiv.org/abs/1902.07987) (European Physics Journal C, 2019)
+- **[SuperGAT](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.SuperGATConv.html)** from Kim and Oh: [How To Find Your Friendly Neighborhood: Graph Attention Design With Self-Supervision](https://openreview.net/forum?id=Wi5KUNlqWty) (ICLR 2021) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/super_gat.py)\]
+- **[HGTConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.HGTConv.html)** from Hu *et al.*: [Heterogeneous Graph Transformer](https://arxiv.org/abs/2003.01332) (WWW 2020) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/hetero/hgt_dblp.py)\]
+- **[HEATConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.HEATonv.html)** from Mo *et al.*: [Heterogeneous Edge-Enhanced Graph Attention Network For Multi-Agent Trajectory Prediction](https://arxiv.org/abs/2106.07161) (CoRR 2021)
+- **[SSGConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.SSGConv.html)** from Zhu *et al.*: [Simple Spectral Graph Convolution](https://openreview.net/forum?id=CYO5T-YjWZV) (ICLR 2021)
+- **[FusedGATConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.FusedGATConv.html)** from Zhang *et al.*: [Understanding GNN Computational Graph: A Coordinated Computation, IO, and Memory Perspective](https://proceedings.mlsys.org/paper/2022/file/9a1158154dfa42caddbd0694a4e9bdc8-Paper.pdf) (MLSys 2022)
+- **[GPSConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.GPSConv.html)** from Rampášek *et al.*: [Recipe for a General, Powerful, Scalable Graph Transformer](https://arxiv.org/abs/2205.12454) (NeurIPS 2022) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/graph_gps.py)\]
+
**Pooling layers:**
Graph pooling layers combine the vectorial representations of a set of nodes in a graph (or a subgraph) into a single vector representation that summarizes its properties of nodes.
It is commonly applied to graph-level tasks, which require combining node features into a single graph representation.
-* **[Top-K Pooling](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.pool.TopKPooling.html)** from Gao and Ji: [Graph U-Nets](https://arxiv.org/abs/1905.05178) (ICML 2019), Cangea *et al.*: [Towards Sparse Hierarchical Graph Classifiers](https://arxiv.org/abs/1811.01287) (NeurIPS-W 2018) and Knyazev *et al.*: [Understanding Attention and Generalization in Graph Neural Networks](https://arxiv.org/abs/1905.02850) (ICLR-W 2019) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/proteins_topk_pool.py)]
-* **[DiffPool](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.dense.dense_diff_pool.html)** from Ying *et al.*: [Hierarchical Graph Representation Learning with Differentiable Pooling](https://arxiv.org/abs/1806.08804) (NeurIPS 2018) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/proteins_diff_pool.py)]
+- **[Top-K Pooling](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.pool.TopKPooling.html)** from Gao and Ji: [Graph U-Nets](https://arxiv.org/abs/1905.05178) (ICML 2019), Cangea *et al.*: [Towards Sparse Hierarchical Graph Classifiers](https://arxiv.org/abs/1811.01287) (NeurIPS-W 2018) and Knyazev *et al.*: [Understanding Attention and Generalization in Graph Neural Networks](https://arxiv.org/abs/1905.02850) (ICLR-W 2019) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/proteins_topk_pool.py)\]
+- **[DiffPool](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.dense.dense_diff_pool.html)** from Ying *et al.*: [Hierarchical Graph Representation Learning with Differentiable Pooling](https://arxiv.org/abs/1806.08804) (NeurIPS 2018) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/proteins_diff_pool.py)\]
Expand to see all implemented pooling layers...
-* **[Attentional Aggregation](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.aggr.AttentionalAggregation.html)** from Li *et al.*: [Graph Matching Networks for Learning the Similarity of Graph Structured Objects](https://arxiv.org/abs/1904.12787) (ICML 2019) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/global_attention.py)]
-* **[Set2Set](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.aggr.Set2Set.html)** from Vinyals *et al.*: [Order Matters: Sequence to Sequence for Sets](https://arxiv.org/abs/1511.06391) (ICLR 2016) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/set2set.py)]
-* **[Sort Aggregation](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.aggr.SortAggregation.html)** from Zhang *et al.*: [An End-to-End Deep Learning Architecture for Graph Classification](https://www.cse.wustl.edu/~muhan/papers/AAAI_2018_DGCNN.pdf) (AAAI 2018) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/sort_pool.py)]
-* **[MinCut Pooling](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.dense.dense_mincut_pool.html)** from Bianchi *et al.*: [Spectral Clustering with Graph Neural Networks for Graph Pooling](https://arxiv.org/abs/1907.00481) (ICML 2020) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/proteins_mincut_pool.py)]
-* **[DMoN Pooling](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.dense.DMoNPooling.html)** from Tsitsulin *et al.*: [Graph Clustering with Graph Neural Networks](https://arxiv.org/abs/2006.16904) (CoRR 2020) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/proteins_dmon_pool.py)]
-* **[Graclus Pooling](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.pool.graclus.html)** from Dhillon *et al.*: [Weighted Graph Cuts without Eigenvectors: A Multilevel Approach](http://www.cs.utexas.edu/users/inderjit/public_papers/multilevel_pami.pdf) (PAMI 2007) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/mnist_graclus.py)]
-* **[Voxel Grid Pooling](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.pool.voxel_grid.html)** from, *e.g.*, Simonovsky and Komodakis: [Dynamic Edge-Conditioned Filters in Convolutional Neural Networks on Graphs](https://arxiv.org/abs/1704.02901) (CVPR 2017) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/mnist_voxel_grid.py)]
-* **[SAG Pooling](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.pool.SAGPooling.html)** from Lee *et al.*: [Self-Attention Graph Pooling](https://arxiv.org/abs/1904.08082) (ICML 2019) and Knyazev *et al.*: [Understanding Attention and Generalization in Graph Neural Networks](https://arxiv.org/abs/1905.02850) (ICLR-W 2019) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/sag_pool.py)]
-* **[Edge Pooling](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.pool.EdgePooling.html)** from Diehl *et al.*: [Towards Graph Pooling by Edge Contraction](https://graphreason.github.io/papers/17.pdf) (ICML-W 2019) and Diehl: [Edge Contraction Pooling for Graph Neural Networks](https://arxiv.org/abs/1905.10990) (CoRR 2019) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/edge_pool.py)]
-* **[ASAPooling](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.pool.ASAPooling.html)** from Ranjan *et al.*: [ASAP: Adaptive Structure Aware Pooling for Learning Hierarchical Graph Representations](https://arxiv.org/abs/1911.07979) (AAAI 2020) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/asap.py)]
-* **[PANPooling](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.pool.PANPooling.html)** from Ma *et al.*: [Path Integral Based Convolution and Pooling for Graph Neural Networks](https://arxiv.org/abs/2006.16811) (NeurIPS 2020)
-* **[MemPooling](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.pool.MemPooling.html)** from Khasahmadi *et al.*: [Memory-Based Graph Networks](https://arxiv.org/abs/2002.09518) (ICLR 2020) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/mem_pool.py)]
-* **[Graph Multiset Transformer](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.aggr.GraphMultisetTransformer.html)** from Baek *et al.*: [Accurate Learning of Graph Representations with Graph Multiset Pooling](https://arxiv.org/abs/2102.11533) (ICLR 2021) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/proteins_gmt.py)]
-* **[Equilibrium Aggregation](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.aggr.EquilibriumAggregation.html)** from Bartunov *et al.*: [](https://arxiv.org/abs/2202.12795) (UAI 2022) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/equilibrium_median.py)]
+- **[Attentional Aggregation](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.aggr.AttentionalAggregation.html)** from Li *et al.*: [Graph Matching Networks for Learning the Similarity of Graph Structured Objects](https://arxiv.org/abs/1904.12787) (ICML 2019) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/global_attention.py)\]
+- **[Set2Set](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.aggr.Set2Set.html)** from Vinyals *et al.*: [Order Matters: Sequence to Sequence for Sets](https://arxiv.org/abs/1511.06391) (ICLR 2016) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/set2set.py)\]
+- **[Sort Aggregation](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.aggr.SortAggregation.html)** from Zhang *et al.*: [An End-to-End Deep Learning Architecture for Graph Classification](https://www.cse.wustl.edu/~muhan/papers/AAAI_2018_DGCNN.pdf) (AAAI 2018) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/sort_pool.py)\]
+- **[MinCut Pooling](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.dense.dense_mincut_pool.html)** from Bianchi *et al.*: [Spectral Clustering with Graph Neural Networks for Graph Pooling](https://arxiv.org/abs/1907.00481) (ICML 2020) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/proteins_mincut_pool.py)\]
+- **[DMoN Pooling](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.dense.DMoNPooling.html)** from Tsitsulin *et al.*: [Graph Clustering with Graph Neural Networks](https://arxiv.org/abs/2006.16904) (CoRR 2020) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/proteins_dmon_pool.py)\]
+- **[Graclus Pooling](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.pool.graclus.html)** from Dhillon *et al.*: [Weighted Graph Cuts without Eigenvectors: A Multilevel Approach](http://www.cs.utexas.edu/users/inderjit/public_papers/multilevel_pami.pdf) (PAMI 2007) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/mnist_graclus.py)\]
+- **[Voxel Grid Pooling](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.pool.voxel_grid.html)** from, *e.g.*, Simonovsky and Komodakis: [Dynamic Edge-Conditioned Filters in Convolutional Neural Networks on Graphs](https://arxiv.org/abs/1704.02901) (CVPR 2017) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/mnist_voxel_grid.py)\]
+- **[SAG Pooling](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.pool.SAGPooling.html)** from Lee *et al.*: [Self-Attention Graph Pooling](https://arxiv.org/abs/1904.08082) (ICML 2019) and Knyazev *et al.*: [Understanding Attention and Generalization in Graph Neural Networks](https://arxiv.org/abs/1905.02850) (ICLR-W 2019) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/sag_pool.py)\]
+- **[Edge Pooling](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.pool.EdgePooling.html)** from Diehl *et al.*: [Towards Graph Pooling by Edge Contraction](https://graphreason.github.io/papers/17.pdf) (ICML-W 2019) and Diehl: [Edge Contraction Pooling for Graph Neural Networks](https://arxiv.org/abs/1905.10990) (CoRR 2019) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/edge_pool.py)\]
+- **[ASAPooling](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.pool.ASAPooling.html)** from Ranjan *et al.*: [ASAP: Adaptive Structure Aware Pooling for Learning Hierarchical Graph Representations](https://arxiv.org/abs/1911.07979) (AAAI 2020) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/asap.py)\]
+- **[PANPooling](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.pool.PANPooling.html)** from Ma *et al.*: [Path Integral Based Convolution and Pooling for Graph Neural Networks](https://arxiv.org/abs/2006.16811) (NeurIPS 2020)
+- **[MemPooling](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.pool.MemPooling.html)** from Khasahmadi *et al.*: [Memory-Based Graph Networks](https://arxiv.org/abs/2002.09518) (ICLR 2020) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/mem_pool.py)\]
+- **[Graph Multiset Transformer](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.aggr.GraphMultisetTransformer.html)** from Baek *et al.*: [Accurate Learning of Graph Representations with Graph Multiset Pooling](https://arxiv.org/abs/2102.11533) (ICLR 2021) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/proteins_gmt.py)\]
+- **[Equilibrium Aggregation](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.aggr.EquilibriumAggregation.html)** from Bartunov *et al.*: [](https://arxiv.org/abs/2202.12795) (UAI 2022) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/equilibrium_median.py)\]
+
**GNN models:**
Our supported GNN models incorporate multiple message passing layers, and users can directly use these pre-defined models to make predictions on graphs.
Unlike simple stacking of GNN layers, these models could involve pre-processing, additional learnable parameters, skip connections, graph coarsening, etc.
-* **[SchNet](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.SchNet.html)** from Schütt *et al.*: [SchNet: A Continuous-filter Convolutional Neural Network for Modeling Quantum Interactions](https://arxiv.org/abs/1706.08566) (NIPS 2017) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/qm9_pretrained_schnet.py)]
-* **[DimeNet](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.DimeNet.html)** and **[DimeNetPlusPlus](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.DimeNetPlusPlus.html)** from Klicpera *et al.*: [Directional Message Passing for Molecular Graphs](https://arxiv.org/abs/2003.03123) (ICLR 2020) and [Fast and Uncertainty-Aware Directional Message Passing for Non-Equilibrium Molecules](https://arxiv.org/abs/2011.14115) (NeurIPS-W 2020) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/qm9_pretrained_dimenet.py)]
-* **[Node2Vec](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.Node2Vec.html)** from Grover and Leskovec: [node2vec: Scalable Feature Learning for Networks](https://arxiv.org/abs/1607.00653) (KDD 2016) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/node2vec.py)]
-* **[Deep Graph Infomax](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.DeepGraphInfomax.html)** from Veličković *et al.*: [Deep Graph Infomax](https://arxiv.org/abs/1809.10341) (ICLR 2019) [[**Example1**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/infomax_transductive.py), [**Example2**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/infomax_inductive.py)]
-* **Deep Multiplex Graph Infomax** from Park *et al.*: [Unsupervised Attributed Multiplex Network Embedding](https://arxiv.org/abs/1911.06750) (AAAI 2020) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/hetero/dmgi_unsup.py)]
-* **[Masked Label Prediction](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.MaskLabel.html)** from Shi *et al.*: [Masked Label Prediction: Unified Message Passing Model for Semi-Supervised Classification](https://arxiv.org/abs/2009.03509) (CoRR 2020) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/unimp_arxiv.py)]
-* **[PMLP](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.PMLP.html)** from Yang *et al.*: [Graph Neural Networks are Inherently Good Generalizers: Insights by Bridging GNNs and MLPs](https://arxiv.org/abs/2212.09034) (ICLR 2023)
+- **[SchNet](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.SchNet.html)** from Schütt *et al.*: [SchNet: A Continuous-filter Convolutional Neural Network for Modeling Quantum Interactions](https://arxiv.org/abs/1706.08566) (NIPS 2017) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/qm9_pretrained_schnet.py)\]
+- **[DimeNet](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.DimeNet.html)** and **[DimeNetPlusPlus](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.DimeNetPlusPlus.html)** from Klicpera *et al.*: [Directional Message Passing for Molecular Graphs](https://arxiv.org/abs/2003.03123) (ICLR 2020) and [Fast and Uncertainty-Aware Directional Message Passing for Non-Equilibrium Molecules](https://arxiv.org/abs/2011.14115) (NeurIPS-W 2020) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/qm9_pretrained_dimenet.py)\]
+- **[Node2Vec](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.Node2Vec.html)** from Grover and Leskovec: [node2vec: Scalable Feature Learning for Networks](https://arxiv.org/abs/1607.00653) (KDD 2016) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/node2vec.py)\]
+- **[Deep Graph Infomax](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.DeepGraphInfomax.html)** from Veličković *et al.*: [Deep Graph Infomax](https://arxiv.org/abs/1809.10341) (ICLR 2019) \[[**Example1**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/infomax_transductive.py), [**Example2**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/infomax_inductive.py)\]
+- **Deep Multiplex Graph Infomax** from Park *et al.*: [Unsupervised Attributed Multiplex Network Embedding](https://arxiv.org/abs/1911.06750) (AAAI 2020) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/hetero/dmgi_unsup.py)\]
+- **[Masked Label Prediction](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.MaskLabel.html)** from Shi *et al.*: [Masked Label Prediction: Unified Message Passing Model for Semi-Supervised Classification](https://arxiv.org/abs/2009.03509) (CoRR 2020) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/unimp_arxiv.py)\]
+- **[PMLP](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.PMLP.html)** from Yang *et al.*: [Graph Neural Networks are Inherently Good Generalizers: Insights by Bridging GNNs and MLPs](https://arxiv.org/abs/2212.09034) (ICLR 2023)
Expand to see all implemented GNN models...
-* **[Jumping Knowledge](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.JumpingKnowledge.html)** from Xu *et al.*: [Representation Learning on Graphs with Jumping Knowledge Networks](https://arxiv.org/abs/1806.03536) (ICML 2018) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/gin.py#L54-L106)]
-* A **[MetaLayer](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.MetaLayer.html)** for building any kind of graph network similar to the [TensorFlow Graph Nets library](https://github.com/deepmind/graph_nets) from Battaglia *et al.*: [Relational Inductive Biases, Deep Learning, and Graph Networks](https://arxiv.org/abs/1806.01261) (CoRR 2018)
-* **[MetaPath2Vec](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.MetaPath2Vec.html)** from Dong *et al.*: [metapath2vec: Scalable Representation Learning for Heterogeneous Networks](https://ericdongyx.github.io/papers/KDD17-dong-chawla-swami-metapath2vec.pdf) (KDD 2017) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/hetero/metapath2vec.py)]
-* All variants of **[Graph Autoencoders](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.GAE.html)** and **[Variational Autoencoders](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.VGAE.html)** from:
- * [Variational Graph Auto-Encoders](https://arxiv.org/abs/1611.07308) from Kipf and Welling (NIPS-W 2016) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/autoencoder.py)]
- * [Adversarially Regularized Graph Autoencoder for Graph Embedding](https://arxiv.org/abs/1802.04407) from Pan *et al.* (IJCAI 2018) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/argva_node_clustering.py)]
- * [Simple and Effective Graph Autoencoders with One-Hop Linear Models](https://arxiv.org/abs/2001.07614) from Salha *et al.* (ECML 2020) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/autoencoder.py)]
-* **[SEAL](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/seal_link_pred.py)** from Zhang and Chen: [Link Prediction Based on Graph Neural Networks](https://arxiv.org/pdf/1802.09691.pdf) (NeurIPS 2018) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/seal_link_pred.py)]
-* **[RENet](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.RENet.html)** from Jin *et al.*: [Recurrent Event Network for Reasoning over Temporal Knowledge Graphs](https://arxiv.org/abs/1904.05530) (ICLR-W 2019) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/renet.py)]
-* **[GraphUNet](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.GraphUNet.html)** from Gao and Ji: [Graph U-Nets](https://arxiv.org/abs/1905.05178) (ICML 2019) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/graph_unet.py)]
-* **[AttentiveFP](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.AttentiveFP.html)** from Xiong *et al.*: [Pushing the Boundaries of Molecular Representation for Drug Discovery with the Graph Attention Mechanism](https://pubs.acs.org/doi/10.1021/acs.jmedchem.9b00959) (J. Med. Chem. 2020) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/attentive_fp.py)]
-* **[DeepGCN](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.DeepGCNLayer.html)** and the **[GENConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.GENConv.html)** from Li *et al.*: [DeepGCNs: Can GCNs Go as Deep as CNNs?](https://arxiv.org/abs/1904.03751) (ICCV 2019) and [DeeperGCN: All You Need to Train Deeper GCNs](https://arxiv.org/abs/2006.07739) (CoRR 2020) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/ogbn_proteins_deepgcn.py)]
-* **[RECT](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.RECT_L.html)** from Wang *et al.*: [Network Embedding with Completely-imbalanced Labels](https://ieeexplore.ieee.org/document/8979355) (TKDE 2020) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/rect.py)]
-* **[GNNExplainer](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.explain.algorithm.GNNExplainer.html)** from Ying *et al.*: [GNNExplainer: Generating Explanations for Graph Neural Networks](https://arxiv.org/abs/1903.03894) (NeurIPS 2019) [[**Example1**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/explain/gnn_explainer.py), [**Example2**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/explain/gnn_explainer_ba_shapes.py), [**Example3**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/explain/gnn_explainer_link_pred.py)]
-* **Graph-less Neural Networks** from Zhang *et al.*: [Graph-less Neural Networks: Teaching Old MLPs New Tricks via Distillation](https://arxiv.org/abs/2110.08727) (CoRR 2021) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/glnn.py)]
-* **[LINKX](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.LINKX.html)** from Lim *et al.*: [Large Scale Learning on Non-Homophilous Graphs:
-New Benchmarks and Strong Simple Methods](https://arxiv.org/abs/2110.14446) (NeurIPS 2021) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/linkx.py)]
-* **[RevGNN](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.GroupAddRev.html)** from Li *et al.*: [Training Graph Neural with 1000 Layers](https://arxiv.org/abs/2106.07476) (ICML 2021) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/rev_gnn.py)]
-* **[TransE](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.kge.TransE.html)** from Bordes *et al.*: [Translating Embeddings for Modeling Multi-Relational Data](https://proceedings.neurips.cc/paper/2013/file/1cecc7a77928ca8133fa24680a88d2f9-Paper.pdf) (NIPS 2013) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/kge_fb15k_237.py)]
-* **[ComplEx](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.kge.ComplEx.html)** from Trouillon *et al.*: [Complex Embeddings for Simple Link Prediction](https://arxiv.org/abs/1606.06357) (ICML 2016) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/kge_fb15k_237.py)]
-* **[DistMult](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.kge.DistMult.html)** from Yang *et al.*: [Embedding Entities and Relations for Learning and Inference in Knowledge Bases](https://arxiv.org/abs/1412.6575) (ICLR 2015) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/kge_fb15k_237.py)]
-* **[RotatE](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.kge.RotatE.html)** from Sun *et al.*: [RotatE: Knowledge Graph Embedding by Relational Rotation in Complex Space](https://arxiv.org/abs/1902.10197) (ICLR 2019) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/kge_fb15k_237.py)]
+- **[Jumping Knowledge](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.JumpingKnowledge.html)** from Xu *et al.*: [Representation Learning on Graphs with Jumping Knowledge Networks](https://arxiv.org/abs/1806.03536) (ICML 2018) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/gin.py#L54-L106)\]
+- A **[MetaLayer](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.MetaLayer.html)** for building any kind of graph network similar to the [TensorFlow Graph Nets library](https://github.com/deepmind/graph_nets) from Battaglia *et al.*: [Relational Inductive Biases, Deep Learning, and Graph Networks](https://arxiv.org/abs/1806.01261) (CoRR 2018)
+- **[MetaPath2Vec](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.MetaPath2Vec.html)** from Dong *et al.*: [metapath2vec: Scalable Representation Learning for Heterogeneous Networks](https://ericdongyx.github.io/papers/KDD17-dong-chawla-swami-metapath2vec.pdf) (KDD 2017) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/hetero/metapath2vec.py)\]
+- All variants of **[Graph Autoencoders](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.GAE.html)** and **[Variational Autoencoders](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.VGAE.html)** from:
+ - [Variational Graph Auto-Encoders](https://arxiv.org/abs/1611.07308) from Kipf and Welling (NIPS-W 2016) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/autoencoder.py)\]
+ - [Adversarially Regularized Graph Autoencoder for Graph Embedding](https://arxiv.org/abs/1802.04407) from Pan *et al.* (IJCAI 2018) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/argva_node_clustering.py)\]
+ - [Simple and Effective Graph Autoencoders with One-Hop Linear Models](https://arxiv.org/abs/2001.07614) from Salha *et al.* (ECML 2020) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/autoencoder.py)\]
+- **[SEAL](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/seal_link_pred.py)** from Zhang and Chen: [Link Prediction Based on Graph Neural Networks](https://arxiv.org/pdf/1802.09691.pdf) (NeurIPS 2018) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/seal_link_pred.py)\]
+- **[RENet](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.RENet.html)** from Jin *et al.*: [Recurrent Event Network for Reasoning over Temporal Knowledge Graphs](https://arxiv.org/abs/1904.05530) (ICLR-W 2019) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/renet.py)\]
+- **[GraphUNet](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.GraphUNet.html)** from Gao and Ji: [Graph U-Nets](https://arxiv.org/abs/1905.05178) (ICML 2019) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/graph_unet.py)\]
+- **[AttentiveFP](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.AttentiveFP.html)** from Xiong *et al.*: [Pushing the Boundaries of Molecular Representation for Drug Discovery with the Graph Attention Mechanism](https://pubs.acs.org/doi/10.1021/acs.jmedchem.9b00959) (J. Med. Chem. 2020) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/attentive_fp.py)\]
+- **[DeepGCN](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.DeepGCNLayer.html)** and the **[GENConv](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.GENConv.html)** from Li *et al.*: [DeepGCNs: Can GCNs Go as Deep as CNNs?](https://arxiv.org/abs/1904.03751) (ICCV 2019) and [DeeperGCN: All You Need to Train Deeper GCNs](https://arxiv.org/abs/2006.07739) (CoRR 2020) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/ogbn_proteins_deepgcn.py)\]
+- **[RECT](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.RECT_L.html)** from Wang *et al.*: [Network Embedding with Completely-imbalanced Labels](https://ieeexplore.ieee.org/document/8979355) (TKDE 2020) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/rect.py)\]
+- **[GNNExplainer](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.explain.algorithm.GNNExplainer.html)** from Ying *et al.*: [GNNExplainer: Generating Explanations for Graph Neural Networks](https://arxiv.org/abs/1903.03894) (NeurIPS 2019) \[[**Example1**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/explain/gnn_explainer.py), [**Example2**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/explain/gnn_explainer_ba_shapes.py), [**Example3**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/explain/gnn_explainer_link_pred.py)\]
+- **Graph-less Neural Networks** from Zhang *et al.*: [Graph-less Neural Networks: Teaching Old MLPs New Tricks via Distillation](https://arxiv.org/abs/2110.08727) (CoRR 2021) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/glnn.py)\]
+- **[LINKX](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.LINKX.html)** from Lim *et al.*: [Large Scale Learning on Non-Homophilous Graphs:
+ New Benchmarks and Strong Simple Methods](https://arxiv.org/abs/2110.14446) (NeurIPS 2021) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/linkx.py)\]
+- **[RevGNN](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.GroupAddRev.html)** from Li *et al.*: [Training Graph Neural with 1000 Layers](https://arxiv.org/abs/2106.07476) (ICML 2021) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/rev_gnn.py)\]
+- **[TransE](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.kge.TransE.html)** from Bordes *et al.*: [Translating Embeddings for Modeling Multi-Relational Data](https://proceedings.neurips.cc/paper/2013/file/1cecc7a77928ca8133fa24680a88d2f9-Paper.pdf) (NIPS 2013) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/kge_fb15k_237.py)\]
+- **[ComplEx](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.kge.ComplEx.html)** from Trouillon *et al.*: [Complex Embeddings for Simple Link Prediction](https://arxiv.org/abs/1606.06357) (ICML 2016) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/kge_fb15k_237.py)\]
+- **[DistMult](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.kge.DistMult.html)** from Yang *et al.*: [Embedding Entities and Relations for Learning and Inference in Knowledge Bases](https://arxiv.org/abs/1412.6575) (ICLR 2015) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/kge_fb15k_237.py)\]
+- **[RotatE](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.kge.RotatE.html)** from Sun *et al.*: [RotatE: Knowledge Graph Embedding by Relational Rotation in Complex Space](https://arxiv.org/abs/1902.10197) (ICLR 2019) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/kge_fb15k_237.py)\]
+
**GNN operators and utilities:**
PyG comes with a rich set of neural network operators that are commonly used in many GNN models.
They follow an extensible design: It is easy to apply these operators and graph utilities to existing GNN layers and models to further enhance model performance.
-* **[DropEdge](https://pytorch-geometric.readthedocs.io/en/latest/modules/utils.html#torch_geometric.utils.dropout_edge)** from Rong *et al.*: [DropEdge: Towards Deep Graph Convolutional Networks on Node Classification](https://openreview.net/forum?id=Hkx1qkrKPr) (ICLR 2020)
-* **[DropNode](https://pytorch-geometric.readthedocs.io/en/latest/modules/utils.html#torch_geometric.utils.dropout_node)**, **[MaskFeature](https://pytorch-geometric.readthedocs.io/en/latest/modules/utils.html#torch_geometric.utils.mask_feature)** and **[AddRandomEdge](https://pytorch-geometric.readthedocs.io/en/latest/modules/utils.html#torch_geometric.utils.add_random_edge)** from You *et al.*: [Graph Contrastive Learning with Augmentations](https://arxiv.org/abs/2010.13902) (NeurIPS 2020)
-* **[DropPath](https://pytorch-geometric.readthedocs.io/en/latest/modules/utils.html#torch_geometric.utils.dropout_path)** from Li *et al.*: [MaskGAE: Masked Graph Modeling Meets Graph Autoencoders](https://arxiv.org/abs/2205.10053) (arXiv 2022)
-* **[ShuffleNode](https://pytorch-geometric.readthedocs.io/en/latest/modules/utils.html#torch_geometric.utils.shuffle_node)** from Veličković *et al.*: [Deep Graph Infomax](https://arxiv.org/abs/1809.10341) (ICLR 2019)
-* **[GraphNorm](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.norm.GraphNorm.html)** from Cai *et al.*: [GraphNorm: A Principled Approach to Accelerating Graph Neural Network Training](https://proceedings.mlr.press/v139/cai21e.html) (ICML 2021)
-* **[GDC](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.transforms.GDC.html)** from Klicpera *et al.*: [Diffusion Improves Graph Learning](https://arxiv.org/abs/1911.05485) (NeurIPS 2019) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/gcn.py)]
+- **[DropEdge](https://pytorch-geometric.readthedocs.io/en/latest/modules/utils.html#torch_geometric.utils.dropout_edge)** from Rong *et al.*: [DropEdge: Towards Deep Graph Convolutional Networks on Node Classification](https://openreview.net/forum?id=Hkx1qkrKPr) (ICLR 2020)
+- **[DropNode](https://pytorch-geometric.readthedocs.io/en/latest/modules/utils.html#torch_geometric.utils.dropout_node)**, **[MaskFeature](https://pytorch-geometric.readthedocs.io/en/latest/modules/utils.html#torch_geometric.utils.mask_feature)** and **[AddRandomEdge](https://pytorch-geometric.readthedocs.io/en/latest/modules/utils.html#torch_geometric.utils.add_random_edge)** from You *et al.*: [Graph Contrastive Learning with Augmentations](https://arxiv.org/abs/2010.13902) (NeurIPS 2020)
+- **[DropPath](https://pytorch-geometric.readthedocs.io/en/latest/modules/utils.html#torch_geometric.utils.dropout_path)** from Li *et al.*: [MaskGAE: Masked Graph Modeling Meets Graph Autoencoders](https://arxiv.org/abs/2205.10053) (arXiv 2022)
+- **[ShuffleNode](https://pytorch-geometric.readthedocs.io/en/latest/modules/utils.html#torch_geometric.utils.shuffle_node)** from Veličković *et al.*: [Deep Graph Infomax](https://arxiv.org/abs/1809.10341) (ICLR 2019)
+- **[GraphNorm](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.norm.GraphNorm.html)** from Cai *et al.*: [GraphNorm: A Principled Approach to Accelerating Graph Neural Network Training](https://proceedings.mlr.press/v139/cai21e.html) (ICML 2021)
+- **[GDC](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.transforms.GDC.html)** from Klicpera *et al.*: [Diffusion Improves Graph Learning](https://arxiv.org/abs/1911.05485) (NeurIPS 2019) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/gcn.py)\]
Expand to see all implemented GNN operators and utilities...
-* **[GraphSizeNorm](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.norm.GraphSizeNorm.html)** from Dwivedi *et al.*: [Benchmarking Graph Neural Networks](https://arxiv.org/abs/2003.00982) (CoRR 2020)
-* **[PairNorm](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.norm.PairNorm.html)** from Zhao and Akoglu: [PairNorm: Tackling Oversmoothing in GNNs](https://arxiv.org/abs/1909.12223) (ICLR 2020)
-* **[MeanSubtractionNorm](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.norm.MeanSubtractionNorm.html)** from Yang *et al.*: [Revisiting "Over-smoothing" in Deep GCNs](https://arxiv.org/abs/2003.13663) (CoRR 2020)
-* **[DiffGroupNorm](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.norm.DiffGroupNorm.html)** from Zhou *et al.*: [Towards Deeper Graph Neural Networks with Differentiable Group Normalization](https://arxiv.org/abs/2006.06972) (NeurIPS 2020)
-* **[Tree Decomposition](https://pytorch-geometric.readthedocs.io/en/latest/modules/utils.html#torch_geometric.utils.tree_decomposition)** from Jin *et al.*: [Junction Tree Variational Autoencoder for Molecular Graph Generation](https://arxiv.org/abs/1802.04364) (ICML 2018)
-* **[TGN](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.TGNMemory.html)** from Rossi *et al.*: [Temporal Graph Networks for Deep Learning on Dynamic Graphs](https://arxiv.org/abs/2006.10637) (GRL+ 2020) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/tgn.py)]
-* **[Weisfeiler Lehman Operator](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.WLConv.html)** from Weisfeiler and Lehman: [A Reduction of a Graph to a Canonical Form and an Algebra Arising During this Reduction](https://www.iti.zcu.cz/wl2018/pdf/wl_paper_translation.pdf) (Nauchno-Technicheskaya Informatsia 1968) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/wl_kernel.py)]
-* **[Continuous Weisfeiler Lehman Operator](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.WLConvContinuous.html)** from Togninalli *et al.*: [Wasserstein Weisfeiler-Lehman Graph Kernels](https://arxiv.org/abs/1906.01277) (NeurIPS 2019)
-* **[Label Propagation](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.LabelPropagation.html)** from Zhu and Ghahramani: [Learning from Labeled and Unlabeled Data with Label Propagation](http://mlg.eng.cam.ac.uk/zoubin/papers/CMU-CALD-02-107.pdf) (CMU-CALD 2002) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/label_prop.py)]
-* **[Local Degree Profile](https://pytorch-geometric.readthedocs.io/en/latest/modules/nn.html#torch_geometric.transforms.LocalDegreeProfile)** from Cai and Wang: [A Simple yet Effective Baseline for Non-attribute Graph Classification](https://arxiv.org/abs/1811.03508) (CoRR 2018)
-* **[CorrectAndSmooth](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.CorrectAndSmooth.html)** from Huang *et al.*: [Combining Label Propagation And Simple Models Out-performs Graph Neural Networks](https://arxiv.org/abs/2010.13993) (CoRR 2020) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/correct_and_smooth.py)]
-* **[Gini](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.functional.gini.html)** and **[BRO](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.functional.bro.html)** regularization from Henderson *et al.*: [Improving Molecular Graph Neural Network Explainability with Orthonormalization and Induced Sparsity](https://arxiv.org/abs/2105.04854) (ICML 2021)
-* **[RootedEgoNets](https://pytorch-geometric.readthedocs.io/en/latest/modules/nn.html#torch_geometric.transforms.RootedEgoNets)** and **[RootedRWSubgraph](https://pytorch-geometric.readthedocs.io/en/latest/modules/nn.html#torch_geometric.transforms.RootedRWSubgraph)** from Zhao *et al.*: [From Stars to Subgraphs: Uplifting Any GNN with Local Structure Awareness](https://arxiv.org/abs/2110.03753) (ICLR 2022)
-* **[FeaturePropagation](https://pytorch-geometric.readthedocs.io/en/latest/modules/nn.html#torch_geometric.transforms.FeaturePropagation)** from Rossi *et al.*: [On the Unreasonable Effectiveness of Feature Propagation in Learning on Graphs with Missing Node Features](https://arxiv.org/abs/2111.12128) (CoRR 2021)
+- **[GraphSizeNorm](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.norm.GraphSizeNorm.html)** from Dwivedi *et al.*: [Benchmarking Graph Neural Networks](https://arxiv.org/abs/2003.00982) (CoRR 2020)
+- **[PairNorm](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.norm.PairNorm.html)** from Zhao and Akoglu: [PairNorm: Tackling Oversmoothing in GNNs](https://arxiv.org/abs/1909.12223) (ICLR 2020)
+- **[MeanSubtractionNorm](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.norm.MeanSubtractionNorm.html)** from Yang *et al.*: [Revisiting "Over-smoothing" in Deep GCNs](https://arxiv.org/abs/2003.13663) (CoRR 2020)
+- **[DiffGroupNorm](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.norm.DiffGroupNorm.html)** from Zhou *et al.*: [Towards Deeper Graph Neural Networks with Differentiable Group Normalization](https://arxiv.org/abs/2006.06972) (NeurIPS 2020)
+- **[Tree Decomposition](https://pytorch-geometric.readthedocs.io/en/latest/modules/utils.html#torch_geometric.utils.tree_decomposition)** from Jin *et al.*: [Junction Tree Variational Autoencoder for Molecular Graph Generation](https://arxiv.org/abs/1802.04364) (ICML 2018)
+- **[TGN](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.TGNMemory.html)** from Rossi *et al.*: [Temporal Graph Networks for Deep Learning on Dynamic Graphs](https://arxiv.org/abs/2006.10637) (GRL+ 2020) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/tgn.py)\]
+- **[Weisfeiler Lehman Operator](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.WLConv.html)** from Weisfeiler and Lehman: [A Reduction of a Graph to a Canonical Form and an Algebra Arising During this Reduction](https://www.iti.zcu.cz/wl2018/pdf/wl_paper_translation.pdf) (Nauchno-Technicheskaya Informatsia 1968) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/wl_kernel.py)\]
+- **[Continuous Weisfeiler Lehman Operator](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.WLConvContinuous.html)** from Togninalli *et al.*: [Wasserstein Weisfeiler-Lehman Graph Kernels](https://arxiv.org/abs/1906.01277) (NeurIPS 2019)
+- **[Label Propagation](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.LabelPropagation.html)** from Zhu and Ghahramani: [Learning from Labeled and Unlabeled Data with Label Propagation](http://mlg.eng.cam.ac.uk/zoubin/papers/CMU-CALD-02-107.pdf) (CMU-CALD 2002) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/label_prop.py)\]
+- **[Local Degree Profile](https://pytorch-geometric.readthedocs.io/en/latest/modules/nn.html#torch_geometric.transforms.LocalDegreeProfile)** from Cai and Wang: [A Simple yet Effective Baseline for Non-attribute Graph Classification](https://arxiv.org/abs/1811.03508) (CoRR 2018)
+- **[CorrectAndSmooth](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.models.CorrectAndSmooth.html)** from Huang *et al.*: [Combining Label Propagation And Simple Models Out-performs Graph Neural Networks](https://arxiv.org/abs/2010.13993) (CoRR 2020) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/correct_and_smooth.py)\]
+- **[Gini](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.functional.gini.html)** and **[BRO](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.functional.bro.html)** regularization from Henderson *et al.*: [Improving Molecular Graph Neural Network Explainability with Orthonormalization and Induced Sparsity](https://arxiv.org/abs/2105.04854) (ICML 2021)
+- **[RootedEgoNets](https://pytorch-geometric.readthedocs.io/en/latest/modules/nn.html#torch_geometric.transforms.RootedEgoNets)** and **[RootedRWSubgraph](https://pytorch-geometric.readthedocs.io/en/latest/modules/nn.html#torch_geometric.transforms.RootedRWSubgraph)** from Zhao *et al.*: [From Stars to Subgraphs: Uplifting Any GNN with Local Structure Awareness](https://arxiv.org/abs/2110.03753) (ICLR 2022)
+- **[FeaturePropagation](https://pytorch-geometric.readthedocs.io/en/latest/modules/nn.html#torch_geometric.transforms.FeaturePropagation)** from Rossi *et al.*: [On the Unreasonable Effectiveness of Feature Propagation in Learning on Graphs with Missing Node Features](https://arxiv.org/abs/2111.12128) (CoRR 2021)
+
**Scalable GNNs:**
@@ -344,21 +334,22 @@ Such application is challenging since the entire graph, its associated features
Many state-of-the-art scalability approaches tackle this challenge by sampling neighborhoods for mini-batch training, graph clustering and partitioning, or by using simplified GNN models.
These approaches have been implemented in PyG, and can benefit from the above GNN layers, operators and models.
-* **[NeighborLoader](https://pytorch-geometric.readthedocs.io/en/latest/modules/loader.html#torch_geometric.loader.NeighborLoader)** from Hamilton *et al.*: [Inductive Representation Learning on Large Graphs](https://arxiv.org/abs/1706.02216) (NIPS 2017) [[**Example1**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/reddit.py), [**Example2**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/ogbn_products_sage.py), [**Example3**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/ogbn_products_gat.py), [**Example4**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/hetero/to_hetero_mag.py)]
-* **[ClusterGCN](https://pytorch-geometric.readthedocs.io/en/latest/modules/loader.html#torch_geometric.loader.ClusterLoader)** from Chiang *et al.*: [Cluster-GCN: An Efficient Algorithm for Training Deep and Large Graph Convolutional Networks](https://arxiv.org/abs/1905.07953) (KDD 2019) [[**Example1**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/cluster_gcn_reddit.py), [**Example2**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/cluster_gcn_ppi.py)]
-* **[GraphSAINT](https://pytorch-geometric.readthedocs.io/en/latest/modules/loader.html#torch_geometric.loader.GraphSAINTSampler)** from Zeng *et al.*: [GraphSAINT: Graph Sampling Based Inductive Learning Method](https://arxiv.org/abs/1907.04931) (ICLR 2020) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/graph_saint.py)]
+- **[NeighborLoader](https://pytorch-geometric.readthedocs.io/en/latest/modules/loader.html#torch_geometric.loader.NeighborLoader)** from Hamilton *et al.*: [Inductive Representation Learning on Large Graphs](https://arxiv.org/abs/1706.02216) (NIPS 2017) \[[**Example1**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/reddit.py), [**Example2**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/ogbn_products_sage.py), [**Example3**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/ogbn_products_gat.py), [**Example4**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/hetero/to_hetero_mag.py)\]
+- **[ClusterGCN](https://pytorch-geometric.readthedocs.io/en/latest/modules/loader.html#torch_geometric.loader.ClusterLoader)** from Chiang *et al.*: [Cluster-GCN: An Efficient Algorithm for Training Deep and Large Graph Convolutional Networks](https://arxiv.org/abs/1905.07953) (KDD 2019) \[[**Example1**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/cluster_gcn_reddit.py), [**Example2**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/cluster_gcn_ppi.py)\]
+- **[GraphSAINT](https://pytorch-geometric.readthedocs.io/en/latest/modules/loader.html#torch_geometric.loader.GraphSAINTSampler)** from Zeng *et al.*: [GraphSAINT: Graph Sampling Based Inductive Learning Method](https://arxiv.org/abs/1907.04931) (ICLR 2020) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/graph_saint.py)\]
Expand to see all implemented scalable GNNs...
-* **[ShaDow](https://pytorch-geometric.readthedocs.io/en/latest/modules/loader.html#torch_geometric.loader.ShaDowKHopSampler)** from Zeng *et al.*: [Decoupling the Depth and Scope of Graph Neural Networks](https://arxiv.org/abs/2201.07858) (NeurIPS 2021) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/shadow.py)]
-* **[SIGN](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.transforms.SIGN.html)** from Rossi *et al.*: [SIGN: Scalable Inception Graph Neural Networks](https://arxiv.org/abs/2004.11198) (CoRR 2020) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/sign.py)]
-* **[HGTLoader](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.loader.HGTLoader.html)** from Hu *et al.*: [Heterogeneous Graph Transformer](https://arxiv.org/abs/2003.01332) (WWW 2020) [[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/hetero/to_hetero_mag.py)]
+- **[ShaDow](https://pytorch-geometric.readthedocs.io/en/latest/modules/loader.html#torch_geometric.loader.ShaDowKHopSampler)** from Zeng *et al.*: [Decoupling the Depth and Scope of Graph Neural Networks](https://arxiv.org/abs/2201.07858) (NeurIPS 2021) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/shadow.py)\]
+- **[SIGN](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.transforms.SIGN.html)** from Rossi *et al.*: [SIGN: Scalable Inception Graph Neural Networks](https://arxiv.org/abs/2004.11198) (CoRR 2020) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/sign.py)\]
+- **[HGTLoader](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.loader.HGTLoader.html)** from Hu *et al.*: [Heterogeneous Graph Transformer](https://arxiv.org/abs/2003.01332) (WWW 2020) \[[**Example**](https://github.com/pyg-team/pytorch_geometric/blob/master/examples/hetero/to_hetero_mag.py)\]
+
## Installation
-PyG is available for Python 3.8 to Python 3.11.
+PyG is available for Python 3.8 to Python 3.12.
### Anaconda
@@ -379,17 +370,15 @@ For this, simply run
pip install torch_geometric
```
-PyG 2.3 requires that at least PyTorch 1.11 is installed.
-
### Additional Libraries
If you want to utilize the full set of features from PyG, there exists several additional libraries you may want to install:
-* **[`pyg-lib`](https://github.com/pyg-team/pyg-lib)**: Heterogeneous GNN operators and graph sampling routines
-* **[`torch-scatter`](https://github.com/rusty1s/pytorch_scatter)**: Accelerated and efficient sparse reductions
-* **[`torch-sparse`](https://github.com/rusty1s/pytorch_sparse)**: [`SparseTensor`](https://pytorch-geometric.readthedocs.io/en/latest/advanced/sparse_tensor.html) support
-* **[`torch-cluster`](https://github.com/rusty1s/pytorch_cluster)**: Graph clustering routines
-* **[`torch-spline-conv`](https://github.com/rusty1s/pytorch_spline_conv)**: [`SplineConv`](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.SplineConv.html) support
+- **[`pyg-lib`](https://github.com/pyg-team/pyg-lib)**: Heterogeneous GNN operators and graph sampling routines
+- **[`torch-scatter`](https://github.com/rusty1s/pytorch_scatter)**: Accelerated and efficient sparse reductions
+- **[`torch-sparse`](https://github.com/rusty1s/pytorch_sparse)**: [`SparseTensor`](https://pytorch-geometric.readthedocs.io/en/latest/advanced/sparse_tensor.html) support
+- **[`torch-cluster`](https://github.com/rusty1s/pytorch_cluster)**: Graph clustering routines
+- **[`torch-spline-conv`](https://github.com/rusty1s/pytorch_spline_conv)**: [`SplineConv`](https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.nn.conv.SplineConv.html) support
These packages come with their own CPU and GPU kernel implementations based on the [PyTorch C++/CUDA/hip(ROCm) extension interface](https://github.com/pytorch/extension-cpp).
For a basic usage of PyG, these dependencies are **fully optional**.
@@ -397,42 +386,46 @@ We recommend to start with a minimal installation, and install additional depend
For ease of installation of these extensions, we provide `pip` wheels for all major OS/PyTorch/CUDA combinations, see [here](https://data.pyg.org/whl).
-#### PyTorch 2.1
+#### PyTorch 2.2
-To install the binaries for PyTorch 2.1.0, simply run
+To install the binaries for PyTorch 2.2.0, simply run
```
-pip install pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv -f https://data.pyg.org/whl/torch-2.1.0+${CUDA}.html
+pip install pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv -f https://data.pyg.org/whl/torch-2.2.0+${CUDA}.html
```
where `${CUDA}` should be replaced by either `cpu`, `cu118`, or `cu121` depending on your PyTorch installation.
| | `cpu` | `cu118` | `cu121` |
-|-------------|-------|---------|---------|
-| **Linux** | ✅ | ✅ | ✅ |
-| **Windows** | ✅ | ✅ | ✅ |
-| **macOS** | ✅ | | |
+| ----------- | ----- | ------- | ------- |
+| **Linux** | ✅ | ✅ | ✅ |
+| **Windows** | ✅ | ✅ | ✅ |
+| **macOS** | ✅ | | |
-#### PyTorch 2.0
+#### PyTorch 2.1
-To install the binaries for PyTorch 2.0.0, simply run
+To install the binaries for PyTorch 2.1.0, simply run
```
-pip install pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv -f https://data.pyg.org/whl/torch-2.0.0+${CUDA}.html
+pip install pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv -f https://data.pyg.org/whl/torch-2.1.0+${CUDA}.html
```
-where `${CUDA}` should be replaced by either `cpu`, `cu117`, or `cu118` depending on your PyTorch installation.
+where `${CUDA}` should be replaced by either `cpu`, `cu118`, or `cu121` depending on your PyTorch installation.
-| | `cpu` | `cu117` | `cu118` |
-|-------------|-------|---------|---------|
-| **Linux** | ✅ | ✅ | ✅ |
-| **Windows** | ✅ | ✅ | ✅ |
-| **macOS** | ✅ | | |
+| | `cpu` | `cu118` | `cu121` |
+| ----------- | ----- | ------- | ------- |
+| **Linux** | ✅ | ✅ | ✅ |
+| **Windows** | ✅ | ✅ | ✅ |
+| **macOS** | ✅ | | |
-**Note:** Binaries of older versions are also provided for PyTorch 1.4.0, PyTorch 1.5.0, PyTorch 1.6.0, PyTorch 1.7.0/1.7.1, PyTorch 1.8.0/1.8.1, PyTorch 1.9.0, PyTorch 1.10.0/1.10.1/1.10.2, PyTorch 1.11.0, PyTorch 1.12.0/1.12.1 and PyTorch 1.13.0/1.13.1 (following the same procedure).
+**Note:** Binaries of older versions are also provided for PyTorch 1.4.0, PyTorch 1.5.0, PyTorch 1.6.0, PyTorch 1.7.0/1.7.1, PyTorch 1.8.0/1.8.1, PyTorch 1.9.0, PyTorch 1.10.0/1.10.1/1.10.2, PyTorch 1.11.0, PyTorch 1.12.0/1.12.1, PyTorch 1.13.0/1.13.1, and PyTorch 2.0.0 (following the same procedure).
**For older versions, you might need to explicitly specify the latest supported version number** or install via `pip install --no-index` in order to prevent a manual installation from source.
You can look up the latest supported version number [here](https://data.pyg.org/whl).
+### NVIDIA PyG Container
+
+NVIDIA provides a PyG docker container for effortlessly training and deploying GPU accelerated GNNs with PyG, see [here](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pyg).
+
### Nightly and Master
In case you want to experiment with the latest PyG features which are not fully released yet, either install the **nightly version** of PyG via
@@ -469,3 +462,16 @@ Feel free to [email us](mailto:matthias.fey@tu-dortmund.de) if you wish your wor
If you notice anything unexpected, please open an [issue](https://github.com/pyg-team/pytorch_geometric/issues) and let us know.
If you have any questions or are missing a specific feature, feel free [to discuss them with us](https://github.com/pyg-team/pytorch_geometric/discussions).
We are motivated to constantly make PyG even better.
+
+[contributing-image]: https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat
+[contributing-url]: https://github.com/pyg-team/pytorch_geometric/blob/master/.github/CONTRIBUTING.md
+[docs-image]: https://readthedocs.org/projects/pytorch-geometric/badge/?version=latest
+[docs-url]: https://pytorch-geometric.readthedocs.io/en/latest
+[linting-image]: https://github.com/pyg-team/pytorch_geometric/actions/workflows/linting.yml/badge.svg
+[linting-url]: https://github.com/pyg-team/pytorch_geometric/actions/workflows/linting.yml
+[pypi-image]: https://badge.fury.io/py/torch-geometric.svg
+[pypi-url]: https://pypi.python.org/pypi/torch-geometric
+[slack-image]: https://img.shields.io/badge/slack-pyg-brightgreen
+[slack-url]: https://data.pyg.org/slack.html
+[testing-image]: https://github.com/pyg-team/pytorch_geometric/actions/workflows/testing.yml/badge.svg
+[testing-url]: https://github.com/pyg-team/pytorch_geometric/actions/workflows/testing.yml
diff --git a/pytorch_geometric-2.4.0/benchmark/README.md b/pytorch_geometric-2.5.2/benchmark/README.md
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/README.md
rename to pytorch_geometric-2.5.2/benchmark/README.md
diff --git a/pytorch_geometric-2.4.0/benchmark/citation/README.md b/pytorch_geometric-2.5.2/benchmark/citation/README.md
similarity index 61%
rename from pytorch_geometric-2.4.0/benchmark/citation/README.md
rename to pytorch_geometric-2.5.2/benchmark/citation/README.md
index 660c892..eae9e7d 100644
--- a/pytorch_geometric-2.4.0/benchmark/citation/README.md
+++ b/pytorch_geometric-2.5.2/benchmark/citation/README.md
@@ -3,12 +3,12 @@
Evaluation scripts for various methods on the Cora, CiteSeer and PubMed citation networks.
Each experiment is repeated 100 times on either a fixed train/val/test split or on multiple random splits:
-* **[GCN](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/citation/gcn.py)**: `python gcn.py`
-* **[GAT](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/citation/gat.py)**: `python gat.py`
-* **[Cheby](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/citation/cheb.py)**: `python cheb.py`
-* **[SGC](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/citation/sgc.py)**: `python sgc.py`
-* **[ARMA](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/citation/arma.py)**: `python arma.py`
-* **[APPNP](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/citation/appnp.py)**: `python appnp.py`
+- **[GCN](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/citation/gcn.py)**: `python gcn.py`
+- **[GAT](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/citation/gat.py)**: `python gat.py`
+- **[Cheby](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/citation/cheb.py)**: `python cheb.py`
+- **[SGC](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/citation/sgc.py)**: `python sgc.py`
+- **[ARMA](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/citation/arma.py)**: `python arma.py`
+- **[APPNP](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/citation/appnp.py)**: `python appnp.py`
Run the whole test suite via
diff --git a/pytorch_geometric-2.4.0/benchmark/citation/__init__.py b/pytorch_geometric-2.5.2/benchmark/citation/__init__.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/citation/__init__.py
rename to pytorch_geometric-2.5.2/benchmark/citation/__init__.py
diff --git a/pytorch_geometric-2.4.0/benchmark/citation/appnp.py b/pytorch_geometric-2.5.2/benchmark/citation/appnp.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/citation/appnp.py
rename to pytorch_geometric-2.5.2/benchmark/citation/appnp.py
diff --git a/pytorch_geometric-2.4.0/benchmark/citation/arma.py b/pytorch_geometric-2.5.2/benchmark/citation/arma.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/citation/arma.py
rename to pytorch_geometric-2.5.2/benchmark/citation/arma.py
diff --git a/pytorch_geometric-2.4.0/benchmark/citation/cheb.py b/pytorch_geometric-2.5.2/benchmark/citation/cheb.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/citation/cheb.py
rename to pytorch_geometric-2.5.2/benchmark/citation/cheb.py
diff --git a/pytorch_geometric-2.4.0/benchmark/citation/datasets.py b/pytorch_geometric-2.5.2/benchmark/citation/datasets.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/citation/datasets.py
rename to pytorch_geometric-2.5.2/benchmark/citation/datasets.py
diff --git a/pytorch_geometric-2.4.0/benchmark/citation/gat.py b/pytorch_geometric-2.5.2/benchmark/citation/gat.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/citation/gat.py
rename to pytorch_geometric-2.5.2/benchmark/citation/gat.py
diff --git a/pytorch_geometric-2.4.0/benchmark/citation/gcn.py b/pytorch_geometric-2.5.2/benchmark/citation/gcn.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/citation/gcn.py
rename to pytorch_geometric-2.5.2/benchmark/citation/gcn.py
diff --git a/pytorch_geometric-2.4.0/benchmark/citation/inference.sh b/pytorch_geometric-2.5.2/benchmark/citation/inference.sh
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/citation/inference.sh
rename to pytorch_geometric-2.5.2/benchmark/citation/inference.sh
diff --git a/pytorch_geometric-2.4.0/benchmark/citation/run.sh b/pytorch_geometric-2.5.2/benchmark/citation/run.sh
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/citation/run.sh
rename to pytorch_geometric-2.5.2/benchmark/citation/run.sh
diff --git a/pytorch_geometric-2.4.0/benchmark/citation/sgc.py b/pytorch_geometric-2.5.2/benchmark/citation/sgc.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/citation/sgc.py
rename to pytorch_geometric-2.5.2/benchmark/citation/sgc.py
diff --git a/pytorch_geometric-2.4.0/benchmark/citation/statistics.py b/pytorch_geometric-2.5.2/benchmark/citation/statistics.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/citation/statistics.py
rename to pytorch_geometric-2.5.2/benchmark/citation/statistics.py
diff --git a/pytorch_geometric-2.4.0/benchmark/citation/train_eval.py b/pytorch_geometric-2.5.2/benchmark/citation/train_eval.py
similarity index 98%
rename from pytorch_geometric-2.4.0/benchmark/citation/train_eval.py
rename to pytorch_geometric-2.5.2/benchmark/citation/train_eval.py
index 0e7a789..5fb3630 100644
--- a/pytorch_geometric-2.4.0/benchmark/citation/train_eval.py
+++ b/pytorch_geometric-2.5.2/benchmark/citation/train_eval.py
@@ -5,7 +5,6 @@
from torch import tensor
from torch.optim import Adam
-import torch_geometric
from torch_geometric.profile import timeit, torch_profile
from torch_geometric.utils import index_to_mask
@@ -45,7 +44,7 @@ def run_train(dataset, model, runs, epochs, lr, weight_decay, early_stopping,
profiling, use_compile, permute_masks=None, logger=None):
val_losses, accs, durations = [], [], []
if use_compile:
- model = torch_geometric.compile(model)
+ model = torch.compile(model)
for run in range(runs):
data = dataset[0]
@@ -130,7 +129,7 @@ def run_inference(dataset, model, epochs, profiling, bf16, use_compile,
model.to(device).reset_parameters()
if use_compile:
- model = torch_geometric.compile(model)
+ model = torch.compile(model)
if torch.cuda.is_available():
amp = torch.cuda.amp.autocast(enabled=False)
diff --git a/pytorch_geometric-2.4.0/benchmark/inference/README.md b/pytorch_geometric-2.5.2/benchmark/inference/README.md
similarity index 89%
rename from pytorch_geometric-2.4.0/benchmark/inference/README.md
rename to pytorch_geometric-2.5.2/benchmark/inference/README.md
index 6312d10..ca0baf9 100644
--- a/pytorch_geometric-2.4.0/benchmark/inference/README.md
+++ b/pytorch_geometric-2.5.2/benchmark/inference/README.md
@@ -3,11 +3,11 @@
## Environment setup
1. Confirm that PyG is properly installed.
-2. Install dataset package:
+1. Install dataset package:
```bash
pip install ogb
```
-3. Install `jemalloc` for performance benchmark:
+1. Install `jemalloc` for performance benchmark:
```bash
cd ${workspace}
git clone https://github.com/jemalloc/jemalloc.git
@@ -32,11 +32,11 @@
export LD_PRELOAD="$jemalloc_lib"
export MALLOC_CONF="oversize_threshold:1,background_thread:true,metadata_thp:auto,dirty_decay_ms:9000000000,muzzy_decay_ms:9000000000"
```
-2. Core binding, *e.g.*, single socket / single core / 4 cores per instance:
+1. Core binding, *e.g.*, single socket / single core / 4 cores per instance:
```bash
OMP_NUM_THREADS=${CORES} numactl -C 0-${LAST_CORE} -m 0 CMD......
```
-3. Execute benchmarks, *e.g.*:
+1. Execute benchmarks, *e.g.*:
```bash
python -u inference_benchmark.py --datasets=Reddit --models=gcn --eval-batch-sizes=512 --num-layers=2 --num-hidden-channels=64
python -u inference_benchmark.py --datasets=Reddit --models=gcn --eval-batch-sizes=512 --num-layers=2 --num-hidden-channels=64 --use-sparse-tensor
diff --git a/pytorch_geometric-2.4.0/benchmark/inference/inference_benchmark.py b/pytorch_geometric-2.5.2/benchmark/inference/inference_benchmark.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/inference/inference_benchmark.py
rename to pytorch_geometric-2.5.2/benchmark/inference/inference_benchmark.py
diff --git a/pytorch_geometric-2.4.0/benchmark/kernel/README.md b/pytorch_geometric-2.5.2/benchmark/kernel/README.md
similarity index 57%
rename from pytorch_geometric-2.4.0/benchmark/kernel/README.md
rename to pytorch_geometric-2.5.2/benchmark/kernel/README.md
index 65659dc..a673578 100644
--- a/pytorch_geometric-2.4.0/benchmark/kernel/README.md
+++ b/pytorch_geometric-2.5.2/benchmark/kernel/README.md
@@ -3,18 +3,18 @@
Evaluation script for various methods on [common benchmark datasets](http://graphkernels.cs.tu-dortmund.de) via 10-fold cross validation, where a training fold is randomly sampled to serve as a validation set.
Hyperparameter selection is performed for the number of hidden units and the number of layers with respect to the validation set:
-* **[GCN](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/gcn.py)**
-* **[GraphSAGE](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/graph_sage.py)**
-* **[GIN](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/gin.py)**
-* **[Graclus](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/graclus.py)**
-* **[Top-K Pooling](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/top_k.py)**
-* **[SAG Pooling](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/sag_pool.py)**
-* **[DiffPool](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/diff_pool.py)**
-* **[EdgePool](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/edge_pool.py)**
-* **[GlobalAttention](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/global_attention.py)**
-* **[Set2Set](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/set2set.py)**
-* **[SortPool](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/sort_pool.py)**
-* **[ASAPool](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/asap.py)**
+- **[GCN](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/gcn.py)**
+- **[GraphSAGE](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/graph_sage.py)**
+- **[GIN](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/gin.py)**
+- **[Graclus](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/graclus.py)**
+- **[Top-K Pooling](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/top_k.py)**
+- **[SAG Pooling](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/sag_pool.py)**
+- **[DiffPool](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/diff_pool.py)**
+- **[EdgePool](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/edge_pool.py)**
+- **[GlobalAttention](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/global_attention.py)**
+- **[Set2Set](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/set2set.py)**
+- **[SortPool](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/sort_pool.py)**
+- **[ASAPool](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/kernel/asap.py)**
Run (or modify) the whole test suite via
diff --git a/pytorch_geometric-2.4.0/benchmark/kernel/__init__.py b/pytorch_geometric-2.5.2/benchmark/kernel/__init__.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/kernel/__init__.py
rename to pytorch_geometric-2.5.2/benchmark/kernel/__init__.py
diff --git a/pytorch_geometric-2.4.0/benchmark/kernel/asap.py b/pytorch_geometric-2.5.2/benchmark/kernel/asap.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/kernel/asap.py
rename to pytorch_geometric-2.5.2/benchmark/kernel/asap.py
diff --git a/pytorch_geometric-2.4.0/benchmark/kernel/datasets.py b/pytorch_geometric-2.5.2/benchmark/kernel/datasets.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/kernel/datasets.py
rename to pytorch_geometric-2.5.2/benchmark/kernel/datasets.py
diff --git a/pytorch_geometric-2.4.0/benchmark/kernel/diff_pool.py b/pytorch_geometric-2.5.2/benchmark/kernel/diff_pool.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/kernel/diff_pool.py
rename to pytorch_geometric-2.5.2/benchmark/kernel/diff_pool.py
diff --git a/pytorch_geometric-2.4.0/benchmark/kernel/edge_pool.py b/pytorch_geometric-2.5.2/benchmark/kernel/edge_pool.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/kernel/edge_pool.py
rename to pytorch_geometric-2.5.2/benchmark/kernel/edge_pool.py
diff --git a/pytorch_geometric-2.4.0/benchmark/kernel/gcn.py b/pytorch_geometric-2.5.2/benchmark/kernel/gcn.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/kernel/gcn.py
rename to pytorch_geometric-2.5.2/benchmark/kernel/gcn.py
diff --git a/pytorch_geometric-2.4.0/benchmark/kernel/gin.py b/pytorch_geometric-2.5.2/benchmark/kernel/gin.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/kernel/gin.py
rename to pytorch_geometric-2.5.2/benchmark/kernel/gin.py
diff --git a/pytorch_geometric-2.4.0/benchmark/kernel/global_attention.py b/pytorch_geometric-2.5.2/benchmark/kernel/global_attention.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/kernel/global_attention.py
rename to pytorch_geometric-2.5.2/benchmark/kernel/global_attention.py
diff --git a/pytorch_geometric-2.4.0/benchmark/kernel/graclus.py b/pytorch_geometric-2.5.2/benchmark/kernel/graclus.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/kernel/graclus.py
rename to pytorch_geometric-2.5.2/benchmark/kernel/graclus.py
diff --git a/pytorch_geometric-2.4.0/benchmark/kernel/graph_sage.py b/pytorch_geometric-2.5.2/benchmark/kernel/graph_sage.py
similarity index 96%
rename from pytorch_geometric-2.4.0/benchmark/kernel/graph_sage.py
rename to pytorch_geometric-2.5.2/benchmark/kernel/graph_sage.py
index e7f361f..2901938 100644
--- a/pytorch_geometric-2.4.0/benchmark/kernel/graph_sage.py
+++ b/pytorch_geometric-2.5.2/benchmark/kernel/graph_sage.py
@@ -2,7 +2,7 @@
import torch.nn.functional as F
from torch.nn import Linear
-from torch_geometric.nn import JumpingKnowledge, SAGEConv, global_mean_pool
+from torch_geometric.nn import JumpingKnowledge, SAGEConv, global_add_pool
class GraphSAGE(torch.nn.Module):
@@ -27,7 +27,7 @@ def forward(self, data):
x = F.relu(self.conv1(x, edge_index))
for conv in self.convs:
x = F.relu(conv(x, edge_index))
- x = global_mean_pool(x, batch)
+ x = global_add_pool(x, batch)
x = F.relu(self.lin1(x))
x = F.dropout(x, p=0.5, training=self.training)
x = self.lin2(x)
@@ -67,7 +67,7 @@ def forward(self, data):
x = F.relu(conv(x, edge_index))
xs += [x]
x = self.jump(xs)
- x = global_mean_pool(x, batch)
+ x = global_add_pool(x, batch)
x = F.relu(self.lin1(x))
x = F.dropout(x, p=0.5, training=self.training)
x = self.lin2(x)
diff --git a/pytorch_geometric-2.4.0/benchmark/kernel/main.py b/pytorch_geometric-2.5.2/benchmark/kernel/main.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/kernel/main.py
rename to pytorch_geometric-2.5.2/benchmark/kernel/main.py
diff --git a/pytorch_geometric-2.4.0/benchmark/kernel/main_performance.py b/pytorch_geometric-2.5.2/benchmark/kernel/main_performance.py
similarity index 97%
rename from pytorch_geometric-2.4.0/benchmark/kernel/main_performance.py
rename to pytorch_geometric-2.5.2/benchmark/kernel/main_performance.py
index c35737d..6a9c6c7 100644
--- a/pytorch_geometric-2.4.0/benchmark/kernel/main_performance.py
+++ b/pytorch_geometric-2.5.2/benchmark/kernel/main_performance.py
@@ -8,7 +8,6 @@
from graph_sage import GraphSAGE
from train_eval import eval_acc, inference_run, train
-import torch_geometric
from torch_geometric import seed_everything
from torch_geometric.loader import DataLoader
from torch_geometric.profile import rename_profile_file, timeit, torch_profile
@@ -86,7 +85,7 @@ def run_train():
model = Model(dataset, num_layers, hidden).to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=args.lr)
if args.compile:
- model = torch_geometric.compile(model)
+ model = torch.compile(model)
loss_list = []
acc_list = []
for epoch in range(1, args.epochs + 1):
@@ -126,7 +125,7 @@ def run_inference():
model = Model(dataset, num_layers, hidden).to(device)
if args.compile:
- model = torch_geometric.compile(model)
+ model = torch.compile(model)
with amp:
for epoch in range(1, args.epochs + 1):
if epoch == args.epochs:
diff --git a/pytorch_geometric-2.4.0/benchmark/kernel/sag_pool.py b/pytorch_geometric-2.5.2/benchmark/kernel/sag_pool.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/kernel/sag_pool.py
rename to pytorch_geometric-2.5.2/benchmark/kernel/sag_pool.py
diff --git a/pytorch_geometric-2.4.0/benchmark/kernel/set2set.py b/pytorch_geometric-2.5.2/benchmark/kernel/set2set.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/kernel/set2set.py
rename to pytorch_geometric-2.5.2/benchmark/kernel/set2set.py
diff --git a/pytorch_geometric-2.4.0/benchmark/kernel/sort_pool.py b/pytorch_geometric-2.5.2/benchmark/kernel/sort_pool.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/kernel/sort_pool.py
rename to pytorch_geometric-2.5.2/benchmark/kernel/sort_pool.py
diff --git a/pytorch_geometric-2.4.0/benchmark/kernel/statistics.py b/pytorch_geometric-2.5.2/benchmark/kernel/statistics.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/kernel/statistics.py
rename to pytorch_geometric-2.5.2/benchmark/kernel/statistics.py
diff --git a/pytorch_geometric-2.4.0/benchmark/kernel/top_k.py b/pytorch_geometric-2.5.2/benchmark/kernel/top_k.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/kernel/top_k.py
rename to pytorch_geometric-2.5.2/benchmark/kernel/top_k.py
diff --git a/pytorch_geometric-2.4.0/benchmark/kernel/train_eval.py b/pytorch_geometric-2.5.2/benchmark/kernel/train_eval.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/kernel/train_eval.py
rename to pytorch_geometric-2.5.2/benchmark/kernel/train_eval.py
diff --git a/pytorch_geometric-2.4.0/benchmark/loader/neighbor_loader.py b/pytorch_geometric-2.5.2/benchmark/loader/neighbor_loader.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/loader/neighbor_loader.py
rename to pytorch_geometric-2.5.2/benchmark/loader/neighbor_loader.py
diff --git a/pytorch_geometric-2.5.2/benchmark/multi_gpu/training/README.md b/pytorch_geometric-2.5.2/benchmark/multi_gpu/training/README.md
new file mode 100644
index 0000000..2b440fb
--- /dev/null
+++ b/pytorch_geometric-2.5.2/benchmark/multi_gpu/training/README.md
@@ -0,0 +1,24 @@
+# Training Benchmark
+
+## Running benchmark on CUDA GPU
+
+Run benchmark, e.g. assuming you have `n` NVIDIA GPUs:
+
+```
+python training_benchmark_cuda.py --dataset ogbn-products --model edge_cnn --num-epochs 3 --n_gpus
+```
+
+## Running benchmark on Intel GPU
+
+## Environment setup
+
+```
+install intel_extension_for_pytorch
+install oneccl_bindings_for_pytorch
+```
+
+Run benchmark, e.g. assuming you have `n` XPUs:
+
+```
+mpirun -np python training_benchmark_xpu.py --dataset ogbn-products --model edge_cnn --num-epochs 3
+```
diff --git a/pytorch_geometric-2.5.2/benchmark/multi_gpu/training/common.py b/pytorch_geometric-2.5.2/benchmark/multi_gpu/training/common.py
new file mode 100644
index 0000000..1cf396a
--- /dev/null
+++ b/pytorch_geometric-2.5.2/benchmark/multi_gpu/training/common.py
@@ -0,0 +1,279 @@
+import argparse
+import ast
+from time import perf_counter
+from typing import Any, Callable, Tuple, Union
+
+import torch
+import torch.distributed as dist
+import torch.nn.functional as F
+from torch.nn.parallel import DistributedDataParallel as DDP
+
+from benchmark.utils import get_model, get_split_masks, test
+from torch_geometric.data import Data, HeteroData
+from torch_geometric.loader import NeighborLoader
+from torch_geometric.nn import PNAConv
+
+supported_sets = {
+ 'ogbn-mag': ['rgat', 'rgcn'],
+ 'ogbn-products': ['edge_cnn', 'gat', 'gcn', 'pna', 'sage'],
+ 'Reddit': ['edge_cnn', 'gat', 'gcn', 'pna', 'sage'],
+}
+
+device_conditions = {
+ 'xpu': (lambda: torch.xpu.is_available()),
+ 'cuda': (lambda: torch.cuda.is_available()),
+}
+
+
+def train_homo(model: Any, loader: NeighborLoader, optimizer: torch.optim.Adam,
+ device: torch.device) -> torch.Tensor:
+ for batch in loader:
+ optimizer.zero_grad()
+ batch = batch.to(device)
+ out = model(batch.x, batch.edge_index)
+ batch_size = batch.batch_size
+ out = out[:batch_size]
+ target = batch.y[:batch_size]
+ loss = F.cross_entropy(out, target)
+ loss.backward()
+ optimizer.step()
+
+ return loss
+
+
+def train_hetero(model: Any, loader: NeighborLoader,
+ optimizer: torch.optim.Adam,
+ device: torch.device) -> torch.Tensor:
+ for batch in loader:
+ optimizer.zero_grad()
+ batch = batch.to(device)
+ out = model(batch.x_dict, batch.edge_index_dict)
+ batch_size = batch['paper'].batch_size
+ out = out['paper'][:batch_size]
+ target = batch['paper'].y[:batch_size]
+ loss = F.cross_entropy(out, target)
+ loss.backward()
+ optimizer.step()
+
+ return loss
+
+
+def maybe_synchronize(device: str):
+ if device == 'xpu' and torch.xpu.is_available():
+ torch.xpu.synchronize()
+ if device == 'cuda' and torch.cuda.is_available():
+ torch.cuda.synchronize()
+
+
+def create_mask_per_rank(
+ global_mask: Union[torch.Tensor,
+ Tuple[str,
+ torch.Tensor]], rank: int, world_size: int,
+ hetero: bool = False) -> Union[torch.Tensor, Tuple[str, torch.Tensor]]:
+ mask = global_mask[-1] if hetero else global_mask
+ nonzero = mask.nonzero().reshape(-1)
+ rank_indices = nonzero.split(nonzero.size(0) // world_size,
+ dim=0)[rank].clone()
+ mask_per_rank = torch.full_like(mask, False)
+ mask_per_rank[rank_indices] = True
+
+ if hetero:
+ return tuple((global_mask[0], mask_per_rank))
+ else:
+ return mask_per_rank
+
+
+def run(rank: int, world_size: int, args: argparse.ArgumentParser,
+ num_classes: int, data: Union[Data, HeteroData],
+ custom_optimizer: Callable[[Any, Any], Tuple[Any, Any]] = None):
+ if not device_conditions[args.device]():
+ raise RuntimeError(f'{args.device.upper()} is not available')
+
+ device = torch.device(f'{args.device}:{rank}')
+
+ if rank == 0:
+ print('BENCHMARK STARTS')
+ print(f'Running on {args.device.upper()}')
+ print(f'Dataset: {args.dataset}')
+
+ hetero = True if args.dataset == 'ogbn-mag' else False
+ mask, val_mask, test_mask = get_split_masks(data, args.dataset)
+ mask = create_mask_per_rank(mask, rank, world_size, hetero)
+ degree = None
+
+ inputs_channels = data[
+ 'paper'].num_features if args.dataset == 'ogbn-mag' \
+ else data.num_features
+
+ if args.model not in supported_sets[args.dataset]:
+ err_msg = (f'Configuration of {args.dataset} + {args.model}'
+ 'not supported')
+ raise RuntimeError(err_msg)
+ if rank == 0:
+ print(f'Training bench for {args.model}:')
+
+ num_nodes = int(mask[-1].sum()) if hetero else int(mask.sum())
+ num_neighbors = args.num_neighbors
+
+ if type(num_neighbors) is list:
+ if len(num_neighbors) == 1:
+ num_neighbors = num_neighbors * args.num_layers
+ elif type(num_neighbors) is int:
+ num_neighbors = [num_neighbors] * args.num_layers
+
+ if len(num_neighbors) != args.num_layers:
+ err_msg = (f'num_neighbors={num_neighbors} lenght != num of'
+ 'layers={args.num_layers}')
+
+ kwargs = {
+ 'num_neighbors': num_neighbors,
+ 'batch_size': args.batch_size,
+ 'num_workers': args.num_workers,
+ }
+ subgraph_loader = NeighborLoader(
+ data,
+ input_nodes=mask,
+ sampler=None,
+ **kwargs,
+ )
+ if rank == 0 and args.evaluate:
+ val_loader = NeighborLoader(
+ data,
+ input_nodes=val_mask,
+ sampler=None,
+ **kwargs,
+ )
+ test_loader = NeighborLoader(
+ data,
+ input_nodes=test_mask,
+ sampler=None,
+ **kwargs,
+ )
+
+ if rank == 0:
+ print('----------------------------------------------')
+ print(
+ f'Batch size={args.batch_size}, '
+ f'Layers amount={args.num_layers}, '
+ f'Num_neighbors={num_neighbors}, '
+ f'Hidden features size={args.num_hidden_channels}', flush=True)
+
+ params = {
+ 'inputs_channels': inputs_channels,
+ 'hidden_channels': args.num_hidden_channels,
+ 'output_channels': num_classes,
+ 'num_heads': args.num_heads,
+ 'num_layers': args.num_layers,
+ }
+
+ if args.model == 'pna' and degree is None:
+ degree = PNAConv.get_degree_histogram(subgraph_loader)
+ print(f'Rank: {rank}, calculated degree for {args.dataset}.',
+ flush=True)
+ params['degree'] = degree
+ dist.barrier()
+
+ torch.manual_seed(12345)
+ model = get_model(args.model, params,
+ metadata=data.metadata() if hetero else None)
+ model = model.to(device)
+
+ if hetero:
+ model.eval()
+ x_keys = data.metadata()[0]
+ edge_index_keys = data.metadata()[1]
+ fake_x_dict = {
+ k: torch.rand((32, inputs_channels), device=device)
+ for k in x_keys
+ }
+ fake_edge_index_dict = {
+ k: torch.randint(0, 32, (2, 8), device=device)
+ for k in edge_index_keys
+ }
+ model.forward(fake_x_dict, fake_edge_index_dict)
+
+ model = DDP(model, device_ids=[device], find_unused_parameters=hetero)
+ model.train()
+
+ optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
+
+ if custom_optimizer:
+ model, optimizer = custom_optimizer(model, optimizer)
+
+ train = train_hetero if hetero else train_homo
+
+ maybe_synchronize(args.device)
+ dist.barrier()
+ if rank == 0:
+ beg = perf_counter()
+
+ for epoch in range(args.num_epochs):
+ loss = train(
+ model,
+ subgraph_loader,
+ optimizer,
+ device,
+ )
+
+ dist.barrier()
+
+ if rank == 0:
+ print(f'Epoch: {epoch:02d}, Loss: {loss:.4f}', flush=True)
+
+ if rank == 0 and args.evaluate:
+ # In evaluate, throughput and
+ # latency are not accurate.
+ val_acc = test(model, val_loader, device, hetero,
+ progress_bar=False)
+ print(f'Val Accuracy: {val_acc:.4f}')
+
+ dist.barrier()
+
+ maybe_synchronize(args.device)
+ dist.barrier()
+ if rank == 0:
+ end = perf_counter()
+ duration = end - beg
+
+ if rank == 0 and args.evaluate:
+ test_acc = test(model, test_loader, device, hetero, progress_bar=False)
+ print(f'Test Accuracy: {test_acc:.4f}')
+
+ dist.barrier()
+
+ if rank == 0:
+ num_nodes_total = num_nodes * world_size
+ duration_per_epoch = duration / args.num_epochs
+ throughput = num_nodes_total / duration_per_epoch
+ latency = duration_per_epoch / num_nodes_total * 1000
+ print(f'Time: {duration_per_epoch:.4f}s')
+ print(f'Throughput: {throughput:.3f} samples/s')
+ print(f'Latency: {latency:.3f} ms', flush=True)
+
+ dist.destroy_process_group()
+
+
+def get_predefined_args() -> argparse.ArgumentParser:
+ argparser = argparse.ArgumentParser(
+ 'GNN distributed (DDP) training benchmark')
+ add = argparser.add_argument
+
+ add('--dataset', choices=['ogbn-mag', 'ogbn-products', 'Reddit'],
+ default='Reddit', type=str)
+ add('--model',
+ choices=['edge_cnn', 'gat', 'gcn', 'pna', 'rgat', 'rgcn',
+ 'sage'], default='sage', type=str)
+ add('--root', default='../../data', type=str,
+ help='relative path to look for the datasets')
+ add('--batch-size', default=4096, type=int)
+ add('--num-layers', default=3, type=int)
+ add('--num-hidden-channels', default=128, type=int)
+ add('--num-heads', default=2, type=int,
+ help='number of hidden attention heads, applies only for gat and rgat')
+ add('--num-neighbors', default=[10], type=ast.literal_eval,
+ help='number of neighbors to sample per layer')
+ add('--num-workers', default=0, type=int)
+ add('--num-epochs', default=1, type=int)
+ add('--evaluate', action='store_true')
+
+ return argparser
diff --git a/pytorch_geometric-2.5.2/benchmark/multi_gpu/training/training_benchmark_cuda.py b/pytorch_geometric-2.5.2/benchmark/multi_gpu/training/training_benchmark_cuda.py
new file mode 100644
index 0000000..7c429ec
--- /dev/null
+++ b/pytorch_geometric-2.5.2/benchmark/multi_gpu/training/training_benchmark_cuda.py
@@ -0,0 +1,51 @@
+import argparse
+import os
+from typing import Union
+
+import torch
+import torch.distributed as dist
+import torch.multiprocessing as mp
+
+from benchmark.multi_gpu.training.common import (
+ get_predefined_args,
+ run,
+ supported_sets,
+)
+from benchmark.utils import get_dataset
+from torch_geometric.data import Data, HeteroData
+
+
+def run_cuda(rank: int, world_size: int, args: argparse.ArgumentParser,
+ num_classes: int, data: Union[Data, HeteroData]):
+ os.environ['MASTER_ADDR'] = 'localhost'
+ os.environ['MASTER_PORT'] = '12355'
+ dist.init_process_group('nccl', rank=rank, world_size=world_size)
+ run(rank, world_size, args, num_classes, data)
+
+
+if __name__ == '__main__':
+ argparser = get_predefined_args()
+ argparser.add_argument('--n-gpus', default=1, type=int)
+ args = argparser.parse_args()
+ setattr(args, 'device', 'cuda')
+
+ assert args.dataset in supported_sets.keys(), \
+ f"Dataset {args.dataset} isn't supported."
+ data, num_classes = get_dataset(args.dataset, args.root)
+
+ max_world_size = torch.cuda.device_count()
+ chosen_world_size = args.n_gpus
+ if chosen_world_size <= max_world_size:
+ world_size = chosen_world_size
+ else:
+ print(f'User selected {chosen_world_size} GPUs '
+ f'but only {max_world_size} GPUs are available')
+ world_size = max_world_size
+ print(f'Let\'s use {world_size} GPUs!')
+
+ mp.spawn(
+ run_cuda,
+ args=(world_size, args, num_classes, data),
+ nprocs=world_size,
+ join=True,
+ )
diff --git a/pytorch_geometric-2.5.2/benchmark/multi_gpu/training/training_benchmark_xpu.py b/pytorch_geometric-2.5.2/benchmark/multi_gpu/training/training_benchmark_xpu.py
new file mode 100644
index 0000000..3009144
--- /dev/null
+++ b/pytorch_geometric-2.5.2/benchmark/multi_gpu/training/training_benchmark_xpu.py
@@ -0,0 +1,53 @@
+import os
+from typing import Any, Tuple
+
+import intel_extension_for_pytorch as ipex
+import oneccl_bindings_for_pytorch # noqa
+import torch.distributed as dist
+
+from benchmark.multi_gpu.training.common import (
+ get_predefined_args,
+ run,
+ supported_sets,
+)
+from benchmark.utils import get_dataset
+
+
+def get_dist_params() -> Tuple[int, int, str]:
+ master_addr = "127.0.0.1"
+ master_port = "29500"
+ os.environ["MASTER_ADDR"] = master_addr
+ os.environ["MASTER_PORT"] = master_port
+
+ mpi_rank = int(os.environ.get("PMI_RANK", -1))
+ mpi_world_size = int(os.environ.get("PMI_SIZE", -1))
+ rank = mpi_rank if mpi_world_size > 0 else os.environ.get("RANK", 0)
+ world_size = (mpi_world_size if mpi_world_size > 0 else os.environ.get(
+ "WORLD_SIZE", 1))
+
+ os.environ["RANK"] = str(rank)
+ os.environ["WORLD_SIZE"] = str(world_size)
+
+ init_method = f"tcp://{master_addr}:{master_port}"
+
+ return rank, world_size, init_method
+
+
+def custom_optimizer(model: Any, optimizer: Any) -> Tuple[Any, Any]:
+ return ipex.optimize(model, optimizer=optimizer)
+
+
+if __name__ == '__main__':
+ rank, world_size, init_method = get_dist_params()
+ dist.init_process_group(backend="ccl", init_method=init_method,
+ world_size=world_size, rank=rank)
+
+ argparser = get_predefined_args()
+ args = argparser.parse_args()
+ setattr(args, 'device', 'xpu')
+
+ assert args.dataset in supported_sets.keys(), \
+ f"Dataset {args.dataset} isn't supported."
+ data, num_classes = get_dataset(args.dataset, args.root)
+
+ run(rank, world_size, args, num_classes, data, custom_optimizer)
diff --git a/pytorch_geometric-2.4.0/benchmark/points/README.md b/pytorch_geometric-2.5.2/benchmark/points/README.md
similarity index 56%
rename from pytorch_geometric-2.4.0/benchmark/points/README.md
rename to pytorch_geometric-2.5.2/benchmark/points/README.md
index 2e135dd..b9e5d65 100644
--- a/pytorch_geometric-2.4.0/benchmark/points/README.md
+++ b/pytorch_geometric-2.5.2/benchmark/points/README.md
@@ -2,8 +2,8 @@
Evaluation scripts for various methods on the ModelNet10 dataset:
-* **[MPNN](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/points/mpnn.py)**: `python mpnn.py`
-* **[PointNet++](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/points/point_net.py)**: `python point_net.py`
-* **[EdgeCNN](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/points/edge_cnn.py)**: `python edge_cnn.py`
-* **[SplineCNN](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/points/spline_cnn.py)**: `python spline_cnn.py`
-* **[PointCNN](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/points/point_cnn.py)**: `python point_cnn.py`
+- **[MPNN](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/points/mpnn.py)**: `python mpnn.py`
+- **[PointNet++](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/points/point_net.py)**: `python point_net.py`
+- **[EdgeCNN](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/points/edge_cnn.py)**: `python edge_cnn.py`
+- **[SplineCNN](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/points/spline_cnn.py)**: `python spline_cnn.py`
+- **[PointCNN](https://github.com/pyg-team/pytorch_geometric/blob/master/benchmark/points/point_cnn.py)**: `python point_cnn.py`
diff --git a/pytorch_geometric-2.4.0/benchmark/points/__init__.py b/pytorch_geometric-2.5.2/benchmark/points/__init__.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/points/__init__.py
rename to pytorch_geometric-2.5.2/benchmark/points/__init__.py
diff --git a/pytorch_geometric-2.4.0/benchmark/points/datasets.py b/pytorch_geometric-2.5.2/benchmark/points/datasets.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/points/datasets.py
rename to pytorch_geometric-2.5.2/benchmark/points/datasets.py
diff --git a/pytorch_geometric-2.4.0/benchmark/points/edge_cnn.py b/pytorch_geometric-2.5.2/benchmark/points/edge_cnn.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/points/edge_cnn.py
rename to pytorch_geometric-2.5.2/benchmark/points/edge_cnn.py
diff --git a/pytorch_geometric-2.4.0/benchmark/points/mpnn.py b/pytorch_geometric-2.5.2/benchmark/points/mpnn.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/points/mpnn.py
rename to pytorch_geometric-2.5.2/benchmark/points/mpnn.py
diff --git a/pytorch_geometric-2.4.0/benchmark/points/point_cnn.py b/pytorch_geometric-2.5.2/benchmark/points/point_cnn.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/points/point_cnn.py
rename to pytorch_geometric-2.5.2/benchmark/points/point_cnn.py
diff --git a/pytorch_geometric-2.4.0/benchmark/points/point_net.py b/pytorch_geometric-2.5.2/benchmark/points/point_net.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/points/point_net.py
rename to pytorch_geometric-2.5.2/benchmark/points/point_net.py
diff --git a/pytorch_geometric-2.4.0/benchmark/points/spline_cnn.py b/pytorch_geometric-2.5.2/benchmark/points/spline_cnn.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/points/spline_cnn.py
rename to pytorch_geometric-2.5.2/benchmark/points/spline_cnn.py
diff --git a/pytorch_geometric-2.4.0/benchmark/points/statistics.py b/pytorch_geometric-2.5.2/benchmark/points/statistics.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/points/statistics.py
rename to pytorch_geometric-2.5.2/benchmark/points/statistics.py
diff --git a/pytorch_geometric-2.4.0/benchmark/points/train_eval.py b/pytorch_geometric-2.5.2/benchmark/points/train_eval.py
similarity index 97%
rename from pytorch_geometric-2.4.0/benchmark/points/train_eval.py
rename to pytorch_geometric-2.5.2/benchmark/points/train_eval.py
index 7912ff4..df879a5 100644
--- a/pytorch_geometric-2.4.0/benchmark/points/train_eval.py
+++ b/pytorch_geometric-2.5.2/benchmark/points/train_eval.py
@@ -4,7 +4,6 @@
import torch.nn.functional as F
from torch.optim import Adam
-import torch_geometric
from torch_geometric.loader import DataLoader
from torch_geometric.profile import timeit, torch_profile
@@ -21,7 +20,7 @@ def run_train(train_dataset, test_dataset, model, epochs, batch_size,
weight_decay):
model = model.to(device)
if use_compile:
- model = torch_geometric.compile(model)
+ model = torch.compile(model)
optimizer = Adam(model.parameters(), lr=lr, weight_decay=weight_decay)
train_loader = DataLoader(train_dataset, batch_size, shuffle=True)
@@ -62,7 +61,7 @@ def run_inference(test_dataset, model, epochs, batch_size, profiling, bf16,
use_compile):
model = model.to(device)
if use_compile:
- model = torch_geometric.compile(model)
+ model = torch.compile(model)
test_loader = DataLoader(test_dataset, batch_size, shuffle=False)
if torch.cuda.is_available():
diff --git a/pytorch_geometric-2.4.0/benchmark/runtime/README.md b/pytorch_geometric-2.5.2/benchmark/runtime/README.md
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/runtime/README.md
rename to pytorch_geometric-2.5.2/benchmark/runtime/README.md
diff --git a/pytorch_geometric-2.4.0/benchmark/runtime/__init__.py b/pytorch_geometric-2.5.2/benchmark/runtime/__init__.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/runtime/__init__.py
rename to pytorch_geometric-2.5.2/benchmark/runtime/__init__.py
diff --git a/pytorch_geometric-2.4.0/benchmark/runtime/dgl/gat.py b/pytorch_geometric-2.5.2/benchmark/runtime/dgl/gat.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/runtime/dgl/gat.py
rename to pytorch_geometric-2.5.2/benchmark/runtime/dgl/gat.py
diff --git a/pytorch_geometric-2.4.0/benchmark/runtime/dgl/gcn.py b/pytorch_geometric-2.5.2/benchmark/runtime/dgl/gcn.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/runtime/dgl/gcn.py
rename to pytorch_geometric-2.5.2/benchmark/runtime/dgl/gcn.py
diff --git a/pytorch_geometric-2.4.0/benchmark/runtime/dgl/hidden.py b/pytorch_geometric-2.5.2/benchmark/runtime/dgl/hidden.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/runtime/dgl/hidden.py
rename to pytorch_geometric-2.5.2/benchmark/runtime/dgl/hidden.py
diff --git a/pytorch_geometric-2.4.0/benchmark/runtime/dgl/main.py b/pytorch_geometric-2.5.2/benchmark/runtime/dgl/main.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/runtime/dgl/main.py
rename to pytorch_geometric-2.5.2/benchmark/runtime/dgl/main.py
diff --git a/pytorch_geometric-2.4.0/benchmark/runtime/dgl/rgcn.py b/pytorch_geometric-2.5.2/benchmark/runtime/dgl/rgcn.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/runtime/dgl/rgcn.py
rename to pytorch_geometric-2.5.2/benchmark/runtime/dgl/rgcn.py
diff --git a/pytorch_geometric-2.4.0/benchmark/runtime/dgl/train.py b/pytorch_geometric-2.5.2/benchmark/runtime/dgl/train.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/runtime/dgl/train.py
rename to pytorch_geometric-2.5.2/benchmark/runtime/dgl/train.py
diff --git a/pytorch_geometric-2.4.0/benchmark/runtime/gat.py b/pytorch_geometric-2.5.2/benchmark/runtime/gat.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/runtime/gat.py
rename to pytorch_geometric-2.5.2/benchmark/runtime/gat.py
diff --git a/pytorch_geometric-2.4.0/benchmark/runtime/gcn.py b/pytorch_geometric-2.5.2/benchmark/runtime/gcn.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/runtime/gcn.py
rename to pytorch_geometric-2.5.2/benchmark/runtime/gcn.py
diff --git a/pytorch_geometric-2.4.0/benchmark/runtime/main.py b/pytorch_geometric-2.5.2/benchmark/runtime/main.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/runtime/main.py
rename to pytorch_geometric-2.5.2/benchmark/runtime/main.py
diff --git a/pytorch_geometric-2.4.0/benchmark/runtime/rgcn.py b/pytorch_geometric-2.5.2/benchmark/runtime/rgcn.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/runtime/rgcn.py
rename to pytorch_geometric-2.5.2/benchmark/runtime/rgcn.py
diff --git a/pytorch_geometric-2.4.0/benchmark/runtime/train.py b/pytorch_geometric-2.5.2/benchmark/runtime/train.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/runtime/train.py
rename to pytorch_geometric-2.5.2/benchmark/runtime/train.py
diff --git a/pytorch_geometric-2.4.0/benchmark/setup.py b/pytorch_geometric-2.5.2/benchmark/setup.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/setup.py
rename to pytorch_geometric-2.5.2/benchmark/setup.py
diff --git a/pytorch_geometric-2.4.0/benchmark/training/README.md b/pytorch_geometric-2.5.2/benchmark/training/README.md
similarity index 90%
rename from pytorch_geometric-2.4.0/benchmark/training/README.md
rename to pytorch_geometric-2.5.2/benchmark/training/README.md
index 64cc17a..85bd6d3 100644
--- a/pytorch_geometric-2.4.0/benchmark/training/README.md
+++ b/pytorch_geometric-2.5.2/benchmark/training/README.md
@@ -3,11 +3,11 @@
## Environment setup
1. Confirm that PyG is properly installed.
-2. Install dataset package:
+1. Install dataset package:
```bash
pip install ogb
```
-3. Install `jemalloc` for performance benchmark:
+1. Install `jemalloc` for performance benchmark:
```bash
cd ${workspace}
git clone https://github.com/jemalloc/jemalloc.git
@@ -32,11 +32,11 @@
export LD_PRELOAD="$jemalloc_lib"
export MALLOC_CONF="oversize_threshold:1,background_thread:true,metadata_thp:auto,dirty_decay_ms:9000000000,muzzy_decay_ms:9000000000"
```
-2. Core binding, *e.g.*, single socket / single core / 4 cores per instance:
+1. Core binding, *e.g.*, single socket / single core / 4 cores per instance:
```bash
OMP_NUM_THREADS=${CORES} numactl -C 0-${LAST_CORE} -m 0 CMD......
```
-3. Execute benchmarks, *e.g.*:
+1. Execute benchmarks, *e.g.*:
```bash
python training_benchmark.py --models=gcn --datasets=Reddit --num-workers=0 --batch-sizes=512 --num-layers=2 --num-hidden-channels=64 --num-steps=50
python training_benchmark.py --models=gcn --datasets=Reddit --num-workers=0 --batch-sizes=512 --num-layers=2 --num-hidden-channels=64 --num-steps=50 --use-sparse-tensor
diff --git a/pytorch_geometric-2.4.0/benchmark/training/training_benchmark.py b/pytorch_geometric-2.5.2/benchmark/training/training_benchmark.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/training/training_benchmark.py
rename to pytorch_geometric-2.5.2/benchmark/training/training_benchmark.py
diff --git a/pytorch_geometric-2.4.0/benchmark/utils/__init__.py b/pytorch_geometric-2.5.2/benchmark/utils/__init__.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/utils/__init__.py
rename to pytorch_geometric-2.5.2/benchmark/utils/__init__.py
diff --git a/pytorch_geometric-2.4.0/benchmark/utils/hetero_gat.py b/pytorch_geometric-2.5.2/benchmark/utils/hetero_gat.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/utils/hetero_gat.py
rename to pytorch_geometric-2.5.2/benchmark/utils/hetero_gat.py
diff --git a/pytorch_geometric-2.4.0/benchmark/utils/hetero_sage.py b/pytorch_geometric-2.5.2/benchmark/utils/hetero_sage.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/utils/hetero_sage.py
rename to pytorch_geometric-2.5.2/benchmark/utils/hetero_sage.py
diff --git a/pytorch_geometric-2.4.0/benchmark/utils/utils.py b/pytorch_geometric-2.5.2/benchmark/utils/utils.py
similarity index 100%
rename from pytorch_geometric-2.4.0/benchmark/utils/utils.py
rename to pytorch_geometric-2.5.2/benchmark/utils/utils.py
diff --git a/pytorch_geometric-2.4.0/codecov.yml b/pytorch_geometric-2.5.2/codecov.yml
similarity index 100%
rename from pytorch_geometric-2.4.0/codecov.yml
rename to pytorch_geometric-2.5.2/codecov.yml
diff --git a/pytorch_geometric-2.4.0/conda/pyg/README.md b/pytorch_geometric-2.5.2/conda/pyg/README.md
similarity index 100%
rename from pytorch_geometric-2.4.0/conda/pyg/README.md
rename to pytorch_geometric-2.5.2/conda/pyg/README.md
diff --git a/pytorch_geometric-2.4.0/conda/pyg/build_conda.sh b/pytorch_geometric-2.5.2/conda/pyg/build_conda.sh
similarity index 100%
rename from pytorch_geometric-2.4.0/conda/pyg/build_conda.sh
rename to pytorch_geometric-2.5.2/conda/pyg/build_conda.sh
diff --git a/pytorch_geometric-2.4.0/conda/pyg/meta.yaml b/pytorch_geometric-2.5.2/conda/pyg/meta.yaml
similarity index 80%
rename from pytorch_geometric-2.4.0/conda/pyg/meta.yaml
rename to pytorch_geometric-2.5.2/conda/pyg/meta.yaml
index 959e7e8..f23bfff 100644
--- a/pytorch_geometric-2.4.0/conda/pyg/meta.yaml
+++ b/pytorch_geometric-2.5.2/conda/pyg/meta.yaml
@@ -1,13 +1,14 @@
package:
name: pyg
- version: 2.3.1
+ version: 2.5.0
source:
- url: https://files.pythonhosted.org/packages/06/a5/9f5af849c4185da5ea55f70ef17e23f93355cd4e989d82cfc8ba2d8747af/torch_geometric-2.3.1.tar.gz
+ url: https://files.pythonhosted.org/packages/e6/6e/a596e2ddecc3b13a0d576495369a30309fb54c74fadf0bbca645bfbcaa2f/torch_geometric-2.4.0.tar.gz
requirements:
host:
- pip
+ - flit-core
- python {{ environ.get('PYTHON_VERSION') }}
run:
@@ -15,11 +16,13 @@ requirements:
- {{ environ.get('CONDA_PYTORCH_CONSTRAINT') }}
- {{ environ.get('CONDA_CUDATOOLKIT_CONSTRAINT') }}
- psutil
+ - fsspec
- tqdm
- jinja2
- pyparsing
- numpy
- scipy
+ - aiohttp
- requests
- scikit-learn
diff --git a/pytorch_geometric-2.4.0/conda/pytorch-geometric/README.md b/pytorch_geometric-2.5.2/conda/pytorch-geometric/README.md
similarity index 100%
rename from pytorch_geometric-2.4.0/conda/pytorch-geometric/README.md
rename to pytorch_geometric-2.5.2/conda/pytorch-geometric/README.md
diff --git a/pytorch_geometric-2.4.0/conda/pytorch-geometric/build_conda.sh b/pytorch_geometric-2.5.2/conda/pytorch-geometric/build_conda.sh
similarity index 100%
rename from pytorch_geometric-2.4.0/conda/pytorch-geometric/build_conda.sh
rename to pytorch_geometric-2.5.2/conda/pytorch-geometric/build_conda.sh
diff --git a/pytorch_geometric-2.4.0/conda/pytorch-geometric/meta.yaml b/pytorch_geometric-2.5.2/conda/pytorch-geometric/meta.yaml
similarity index 81%
rename from pytorch_geometric-2.4.0/conda/pytorch-geometric/meta.yaml
rename to pytorch_geometric-2.5.2/conda/pytorch-geometric/meta.yaml
index 21b9862..37fd7f1 100644
--- a/pytorch_geometric-2.4.0/conda/pytorch-geometric/meta.yaml
+++ b/pytorch_geometric-2.5.2/conda/pytorch-geometric/meta.yaml
@@ -1,13 +1,14 @@
package:
name: pytorch-geometric
- version: 2.3.1
+ version: 2.5.0
source:
- url: https://files.pythonhosted.org/packages/06/a5/9f5af849c4185da5ea55f70ef17e23f93355cd4e989d82cfc8ba2d8747af/torch_geometric-2.3.1.tar.gz
+ url: https://files.pythonhosted.org/packages/e6/6e/a596e2ddecc3b13a0d576495369a30309fb54c74fadf0bbca645bfbcaa2f/torch_geometric-2.4.0.tar.gz
requirements:
host:
- pip
+ - flit-core
- python {{ environ.get('PYTHON_VERSION') }}
run:
@@ -15,11 +16,13 @@ requirements:
- {{ environ.get('CONDA_PYTORCH_CONSTRAINT') }}
- {{ environ.get('CONDA_CUDATOOLKIT_CONSTRAINT') }}
- psutil
+ - fsspec
- tqdm
- jinja2
- pyparsing
- numpy
- scipy
+ - aiohttp
- requests
- scikit-learn
diff --git a/pytorch_geometric-2.4.0/docker/Dockerfile b/pytorch_geometric-2.5.2/docker/Dockerfile
similarity index 100%
rename from pytorch_geometric-2.4.0/docker/Dockerfile
rename to pytorch_geometric-2.5.2/docker/Dockerfile
diff --git a/pytorch_geometric-2.4.0/docker/README.md b/pytorch_geometric-2.5.2/docker/README.md
similarity index 95%
rename from pytorch_geometric-2.4.0/docker/README.md
rename to pytorch_geometric-2.5.2/docker/README.md
index b91d390..8cedd98 100644
--- a/pytorch_geometric-2.4.0/docker/README.md
+++ b/pytorch_geometric-2.5.2/docker/README.md
@@ -4,12 +4,11 @@ You can run PyG with CUDA 10.1 inside a docker image.
The creation of [our dockerfile](https://github.com/pyg-team/pytorch_geometric/blob/master/docker/Dockerfile) refers to the dockerfiles provided by [NVIDIA](https://gitlab.com/nvidia/cuda/tree/ubuntu18.04) and [PyTorch](https://github.com/anibali/docker-pytorch).
1. Download the dockerfile to your host server.
-2. `$ docker build -t "custom image name"`
-3. `$ docker run --rm -it --init --runtime=nvidia --ipc=host --network=host --volume=$PWD:/app -e NVIDIA_VISIBLE_DEVICES=0 "custom image name" /bin/bash`
+1. `$ docker build -t "custom image name"`
+1. `$ docker run --rm -it --init --runtime=nvidia --ipc=host --network=host --volume=$PWD:/app -e NVIDIA_VISIBLE_DEVICES=0 "custom image name" /bin/bash`
If you encounter any problems, please feel free to contact .
-
# Singularity
You can run PyG inside a singularity image. An example singularity file can be found in this folder.
@@ -49,4 +48,5 @@ to run on the CPU, or
```
singularity exec --nv geometric.sif python3 gat.py
```
+
to run on the GPU.
diff --git a/pytorch_geometric-2.4.0/docker/singularity b/pytorch_geometric-2.5.2/docker/singularity
similarity index 100%
rename from pytorch_geometric-2.4.0/docker/singularity
rename to pytorch_geometric-2.5.2/docker/singularity
diff --git a/pytorch_geometric-2.4.0/docs/Makefile b/pytorch_geometric-2.5.2/docs/Makefile
similarity index 100%
rename from pytorch_geometric-2.4.0/docs/Makefile
rename to pytorch_geometric-2.5.2/docs/Makefile
diff --git a/pytorch_geometric-2.4.0/docs/README.md b/pytorch_geometric-2.5.2/docs/README.md
similarity index 80%
rename from pytorch_geometric-2.4.0/docs/README.md
rename to pytorch_geometric-2.5.2/docs/README.md
index 3900b49..c2a6288 100644
--- a/pytorch_geometric-2.4.0/docs/README.md
+++ b/pytorch_geometric-2.5.2/docs/README.md
@@ -3,11 +3,11 @@
To build the documentation:
1. [Build and install](https://github.com/pyg-team/pytorch_geometric/blob/master/.github/CONTRIBUTING.md#developing-pytorch-geometric) PyG from source.
-2. Install [Sphinx](https://www.sphinx-doc.org/en/master/) theme via
+1. Install [Sphinx](https://www.sphinx-doc.org/en/master/) theme via
```
pip install git+https://github.com/pyg-team/pyg_sphinx_theme.git
```
-3. Generate the documentation file via:
+1. Generate the documentation file via:
```
cd docs
make html
diff --git a/pytorch_geometric-2.4.0/docs/requirements.txt b/pytorch_geometric-2.5.2/docs/requirements.txt
similarity index 100%
rename from pytorch_geometric-2.4.0/docs/requirements.txt
rename to pytorch_geometric-2.5.2/docs/requirements.txt
diff --git a/pytorch_geometric-2.4.0/docs/source/_figures/architecture.svg b/pytorch_geometric-2.5.2/docs/source/_figures/architecture.svg
similarity index 100%
rename from pytorch_geometric-2.4.0/docs/source/_figures/architecture.svg
rename to pytorch_geometric-2.5.2/docs/source/_figures/architecture.svg
diff --git a/pytorch_geometric-2.4.0/docs/source/_figures/build.sh b/pytorch_geometric-2.5.2/docs/source/_figures/build.sh
similarity index 100%
rename from pytorch_geometric-2.4.0/docs/source/_figures/build.sh
rename to pytorch_geometric-2.5.2/docs/source/_figures/build.sh
diff --git a/pytorch_geometric-2.5.2/docs/source/_figures/dist_part.png b/pytorch_geometric-2.5.2/docs/source/_figures/dist_part.png
new file mode 100644
index 0000000000000000000000000000000000000000..d79cd6a9c8080946a9d87b7e52dea52d8bc23178
GIT binary patch
literal 115493
zcmaI81ymf(wl)l8fFZaCADjetcXuZQf`#DD;O=e-7Th5r!3hMH00Y4#xVyXS*SzPP
zd++-1x<6|T({y)LckSBp)ZR}Ksiq=}{*w4592^|FyquH<92_DA92~q77zsEdk<_08
z{Gn+jDXAteDG5@&^5cYVuR=NvMJN|%6m6o^Hcu~1
z#=YE0b}*)1@NIQfU3FLIte$!e?uIDjqeZuhdg6!1A?`0k&b#OLUW+AH!bgE`T#7Ud
zAz4*r)7y@YekSbO-bul5etO#zu|J5%YEdGO%aW7Zde(N$;=NPd=0Ev(eVMiKT`U#$
z8t)$H-HLYMb~I%C(GH%Lny!GGNyQ=Z@)^geVB2(|_RQr0okl{Z&bhI<1X
zgW=%At>8ew5j^lA20n0bFFuFCAp_qyz(*<<;XhXqDRN)@=NMk;`9^U~NqKqTThr9p
z%*-BY>EJSH0ImVLnzGW;bVI|epMIpw
zpr+1NjxJUX_K@d(O+Gldx(HKIJwNEbe*X2IW*%1m{Um$nzlQ}3koEZrD?1At>wonP
zG!=S2E1+iOVP^YI%E}H95AX~TPEHP?fA0TZSN{8n|D&buf45}kWM}`MP5;NG|8G-m
zsF|~*gB|cp7m@#-ntwO`pBMk#P>A(;=>J0$|B~}RX8}QrycA;nuSpYmS!*wD3kN3#
zCod(g1T+n9)y4>ls+Vx5k
zhm(`Dci@Lng}GPV+h2?a3aHwb)?UQsUW-as6Iz6L{l-+Z(qh;#KK
z6|)4)fDjcxmHU5xL2^4~eX;)k`U0*&n7~PB{puIFKwnsz;2(x{!F3M8kg17WdD_zV
zWlBm0IfgO+*Hc1}1Ha;kbP8^iA0WR2SLf7+TV4%G);bKE%+}w5$%Gt}{9)V2;*Vqk
zDzfpUCDh^Z<5dOp+t*cz_iG1Ei>F8HCujmrt29p>+v|OaNlu@)X)uP`66rZBSGXRj
zDQBwxivDMaVpSh7kh&vquZP=KyR)R67GE0%DSGG!)zd2Am8{Z6tM`5Grp-#w4N{=P
zqqj{|NG|Lu{H*mR&A$lus|(RR&g-8(I7KOp(i?A*@}smBG>b~jJoIIT3bq;lw-mAL
zz4IbhrZ^p6J>{}GBB76?bz_+6RKyV4Au
z?A@A6r?nLAubxf2T6r4I;uzoU@c;L0f&~$(B#o6#!g{7RWDpU1z9p2GdF
zNga(5YYD^us(Iu!aaS8QQS18GvK8;Z8w=bnVQO&;KU;Mm7MB7EpQc*xUBP|FB;G|8
zQYK~$pPvE|4
zntSp|uN5z&gjQX_8i$h|<&-gbKnXpgnwG=#MHoG02RoFpPyaVwvavbX+?g$2l3Zzh
z9X60?JBph+&VlweJ8S&qzo(WxKH%48ySB4Lvx_n671?UtZ>J?Ejd`!iXw0|0FL){B
zB#)sn3jxO7Nr;lN)6%^wlKU(n3t{c9y^p@KmQRb+wW$k{`{umVf;XwHo}ve9&COp`
zf={`Y=Zm?Hn~Oh`X1(=gj>iBQqf}cC5!8X?OSt>p#{>*B7aHZ6#q-w=tyocm0t!yD
z6kLh5jAM_Yew-L2>tzDcKANH&aD%)2?6xwXO=1Sd^UxMzt}xohYbb
zwUH+Cn(WgmZ5j<||Lm!6HCFL`0*8j!KIO7%1iPJAd~4D58=;L4@7fXQ*@;A`f?S+f
zM2?yaxvQMX=Gmo}R^R8nq~O$L{CGdyztewZ9!&uoz{F5u^+LCn6GkdlZz})UMdZIJ
z&{*;OPVwz+6vV0ptp-%|ty^i2T-*1>p-U*j1%TFHQwHQ(Lrd%n`wDbM3)LB=p<@*Y
zM}<}Xy^8iip|_cf5mA&3aT;AzmA-rM#Am`x;whE6o~qdoN@lo!-~81iRm3vH3&NL!
zq(CacffwO+C{zTHd!Mhga@mzIyUYOeMyJAzn;w{wD|#7jT-QVH!G
zEPdaaYuf!YLc8Y?)*V$C8gyVqoOd@!;EFu*`=R?D|IuP6s-_H0x1JmNX?ct|_!Snw
zh0iy;Y^jGGfdzWJSmtwz4LF>?v-LMQr!KUaMF-?%41z@5`wm#&ZtQh)xzEbzhTN&Y
z;Ca`4>0t0pammZ?rcv`8td!H00?A=6wAw!+F1|}c`92q`uWg22QEH2#5xVO*LJ58k
z%n7GPBZUo^^ut@ck!wSkIQ?6eMHNLptc~jTT&;pNPjkRr%9DBjjpb%I_reSOB_l?-
zwR(Fgd*AIX#7nUDtG=267AD`wmwGW7YH$rMHklqzw46L5xgW}YFA%8GRLP$O^<*r4
zSD$H=b_lo&v5%Aip~0_Bb>vIR@4Vmc`dJ6}?&e;~0C7YJ#8WmWDSGcN5_@mWewQe8
zxIsNyB}>+Lv0|w8J-gNYA>j2onPo)mU0)R_5YPvj6i6_MhH4$iYEGJ2oMWxv?j*Wh
z{W4JyX6aL76BJCU`2>yl@U|F`Am$r>+ZQ=cEepgS4yo1=Nbux8x$
z{marhfidZ+9IC*nW&~xtmk9nbP$u!o@?%1QPMktARAOXItD!>+Vl^t{Ax#aysxq+y
zAY+z3l8_y%oL|bjykR}=guAm9enZHkIM0^A@T@2K_Tg@HQCJaS-3^ss3f_t(#o-0P
z^pv5c%>@>|cG11D6qk)MvTyIZKe8I({wL@FAyEXhobZ5a2)@6GmUbDt6_CvhyE7sc
zR-i5V6&~#AVE-b#jWnt*_MtjN_UJ~q4
zUEX^aR0%13AF6@vhd3)N4H3Yet~tZ<{c|=SF-&-i=o}=`_2P;6t6tBjr~c0=_ONIF
zJB|LgKhhFJW#Ys_(+OLHsfEY_%0rmnG4I
z7ODiIK(l>)
z;-3+fCsn0$pPSc36^dVZZtjWiFz3T`y|rHU!OtMT0fr#M8)TwlmV0SQLs&sk&Q9fB
zYf7H3Z1v95iK2dUa<^GzUrDT&%6NpIIvN^FE#XGXsIWG`Oj&Komxm%udIAQwlO+P^
ze`Ig)t*-C`uVr#IesVm=s@hED%6eNzP(nmwv#q$m1#yxLtwJdrN1G}bm`^`nVsvjW
zoQ!ul3BTKM*3+8=#uu25zxI|hCIO?)b;SCr+rWk1n#)h?oLd&k$s0|u4xlZ|PF6;g
zK;~JOa%u2o;lJVy9KjZO>y3pW+`?WKUNls-)d>mNz(%I%Gxu^jats|_AQrXS8~#9n
zt8&?e+o=-#=(_PZJLGk=>9|MxZ`ZQrbCnVi!@H#AV(IZ%LLx5Xs$34YbQRE2{uS{&
z6u{*EL9mc~?A{^gJmr$~^8rB%>)H*UdH&@a|Eu^S6zT_NadJRl+}7%}6tWX^fW2Y8
z0i~RL=;!pmnz}xOdQsoP&PqO8`-HzV6ON-w;6yNYvcJ}Uw4YtR+{oWkrM!TpbGqr}
zgF{}x{}Q=AZJ9ZLja)3$BlIJW(SE1>@QXmWj}yyMr!3oad{xg{Oy8ao#ZHjT>{#rT
zE2bxX3$CTaf5U8vC^!+M#hbR*q`4;9?(=b^WS1zDVk4N&n4g7kWicp9=nt<$%~jqV
z{k2S(IzX
zU&j<%sPsk`4$c~1IyV7JPU(%f?@ZglrmHtfIh|Mps4+mfIuG%khJgy+Sk}mR7cPQ_
ztcc&8-0g3-@t$a?bTVz5{#^K7GJR2$XV45
zhF9ut+8Pp{gO;Ttie|J7j~putCjZCuc(7mHPS7|_$2l2Qm`E$wly=~JI8)iv?&d@&
z6PU=AM2;I><=00<^7>srPY?<>x9B^*U$v;4P=t3t#~n1&D!)cyW^`Fp-Y
z!YP!wvW8tesqm~_zrmI7ie+z^51thiGKtlGM|$Kc`Q!_wTWP6C5=LNq7fu^tXYKp2
zV35YTTTEOqBU#)KB_;)di#;NF8qESCD`AD`E7+^yS5wa&syTux`HR2n69-L$ejnc4@4O_;<%^#Hh33GMndAw>u$at4;BVQTAz@2ooy7PTUlpG8%AF2O?e-TJT~r?_kWky?H6?2rFrmN|0EkE
zFx>lzx@Awd(Zx#5F1qn_;+v*bdjPx(jLaR+^)1!oy;^s9qK=_oktPmxYg_1ocou3z
zz8%YStrf2CaR;)?R+jr1kwvCB?}7_%%lVjMt!GWVILrPP1I|!5rgQVuocs3!SL7q#
z=BMOps^h*9E58o2_8$g5zhA#&?6Hg+@*U;9nu*Up6_-k#pU#G$v4bwpv(_M+SZ1B3U
z?yL|GM)DM4r0~CIFVp+^=lfKlJT9vNUgS@kDGe{L#`_@tr^ko8mOVbN2~VCNE2AXW
zaC8zGQ&?OPItdS+8E^jT{M6ET^0DS0a`@-rTCrTOMzd~L_&+cnEVc;tqx+tZ%IOl*#D|0IZzT6Ta#f*MUz^!oBqMkF`WDvhzRSLfgVPg{S?--3fK{(
zfNIpcUt!yNAS~Fk9IBk13LJc{sUO#G?06i>3Fz#H>;C5@kTw9eJ(GBM$;a?m7g(
z+?cUf%K^pPEyLXvv=Q(UTdloWcLTy4zzETBXb9e4iLGV4Fn)E*8}9&G(0ImI%g=6X
znSGofN{ogopqn40#ud`t&{yE|(uGcRq)gR0NijOs=4zzmcd<8jd2<;qx0S))xv3CL
zcrbp4&z6j4u~Obff7ai>^SjcLGw&?2XlHXq;Os{8rMujS^op?rgw6&yC#p!YnU-pcvU;D>&C5je^QAFtd%(Tp9Ys%(x`cOW&Y=NfL>f`yw
zpwXq=^`P^2IOh1t8tmXlz!)r!tN@o@1*F9brS2?WuC
z(O*g|`Q0%aICbNnAOFT2A4n77YzQLd%${w%su0}?;}lI?%4sW$Em6e0)pKRB>@9Ba
zY}1SSz;eBjY6NDX6LVkkt-toFbvSO=%4QUSd#&Ewb_OTc;YPH|DO7-_<963^>!yJYoXW0
zuKZI5w+)@&Yyt(7c7tR4ff8zq^P_NWKM8eN9$1PRfl@!y6nBMmXFW2Jh&SiXvnO}cq4(&5o_<}I
zmmJk?e;QsN?Z&BV9qqm{=kw>!9UX+#q3emNA}6!=Col>krply;aTUSA3K3Lt&fD{y
zwZGh3RrO2}1IFT+MuPjzPmgy*wi;hd^(Phn7{h-xYI>txD)(@>&}30r$quV?UvNz|
z5+sG4M~Y6ga7;oz`@~UYuz&2us)+k$QwL~ppYfSR1sTq-OF+uPFdoZ0z`@@B>>I|A
zrB8)&+0Al^4z86BHnBctJ3XZR-hc|7yGxW6{|PLQB&e_!T$N5Wt;dHeibJaj@Uk
zfq7FEN@nE$;9BRp$`0Mu#1%GNE{2K>!}(*ypSPondhyLWoxCNYU&TX)9=RSy$2APk
zR}26Sii3J}-}L>GXW!JKZrf8MMRmp3hJO^Y((j@?hI6iYBQ|4rF?%Q3s#6^9G*Bj%
z*sM|_;a<0o&e+lee!(XE@`oCp}(wkocHkc+}&z71?}S8<8I2W`MuvHyPwB6
zGT&cxVuLlF=q9A?m_rSZ3X*?P)P#oogfGIdIg$5N>6D#(c^=n2>qVq0bRvb6ffiMH
zQr*vT_6G@*eBYgXf}LWBREaW}y3yRxI63C&eoK^SD-)`M1WIABQ0|S9jwbN5i#;B#
zl@@)s$MJ$<$+mnSg>!~N56Onl>);eeBz>)_*tEx{q9x^IEnd|8{=mV%zj8SB9hTSA
z!$}emt}3dhaJ9*5>0Nqo(>rul_w*Kb$`7*q$n?FoK-Y|`1C$B-e33%^{D7>)JBtftCYHs{t|>>#rG8$$Z0_J
zj$w*n`MVk!IwGN3V9uM9wrG5~U{+J*21s{;1I|o5CMjo0jBkf3(7t2w`F;5C0SQ_2
znDIA;tkVV3NI|^FZgK_+$j+hVVv=b#LdF!lF|x>&G!FW}MWLQk&}Tjh>Mlk8bKJC%
zqCc?0aaC6nUn7)S%M0BrQnZ1{v`l2@L`DSeiKjtay1)<(=R;JGT)C+zE`xKmYY7_-@qGq
zt7`?FrgV_JG`MC7m^2;E7H;uLYP&mZk{)fL61EU0*m6F<;e(!f>HV}tHdWAi(?FBu
z@2W4qmotz3Yct)Z5W$DCx^lFlIufoAlg+^OueP7rB}P8mRGI!;ADZe-sw%c279fxE
zC)uojcg}F;sO?FG(|jPo*PJ1e+oPEy@p?=2NuFuC@b+TQVuxb4y?z}!EG*lMW18N3
zx%<81@{-qfdb#L@d^3PdSKY_T1uaJ)r8;HlA7^0RXM?xD
zpCm&c|JpG$)N;}Xi^An#v2s0bZPc3Is5H!vnc-~z(HHFLFGBXs61Xx8WzyJc{UQ99
zlq8VRVNdGSQSMJhx3OP2DRbTFIzW*|1``HB~0L-|-!0l5q<;X!WrU=89#ap+omj+y(ryoDqD5Y~*;rL!H
zxKn)>3l%(S)(p}jcxMs4++{WR2D_($GRA-4MW9+==9`D>8H9@MbJPq?>joMJBV2y!
zfQUa>$CRHL=@Mb&-b!!Q)(Gx$179F(45o9_W-U-iMGcZ_AtK0wIXy$g{$TxNEV8ZKTuJCaiw{#2Tz(;EV@*#_NNR00KEsk<
zRERFZ|2DKg5yks?YpweHws!hba=|vhMD^zj@D4s+CK;Zd^`xJMXL9(YSAW8YtEr
zw*PFPJ*Wv-wCQj#ZkuioK~e)buszLw*iSKaPYtr(2{{F(L=DBQw)kd
zgQ~@5bBBOI@U=TSbzXT@h8($Ma@HVx;#bko_}mLO;Ag1ct92awL5vLqPc@WG@qyQ^
z*6l#g$_tn%Tv+9?Aez2M)Ce|e^smJR=$1l&ahn2rYjAf1`x0wWFmjw{G&Hc8qUNtp
zNXqyG3dXWpfZ$ftBs+%DHVfvg&wh*+#x)SVfB!HTOZZ%)iY!l37SKG@=)9p2368a#
ziqJ(jS@7J-qQ|ae2Xo@;V4=-)N+c5YrYNVs_(tGJX6c9|DRceH`^vsS=e@(`5&-=U
z$(-lv>}?A0Y3Wi5YFIF#`AT%4RIYRC;|HFG$7>O1F{v-Wf$4mz6%K@{=h~1O#m|<|`_t
z@xSpMMAv*%3M;qj9lKLA;wM3|X;`3L#EZFvvgITL?_NlG^Ql4uImUa%>lMDr4+Bcu
zFJLJN6tGXnQ52r**nQr+-%6yeBbl4haElm7F{{zzBE^68WP<I9awq0St>MQXa`m^8<>D(fy9ip2$0iy?F9G1YN-y&
z3}n^cLttY9EC^UE&c^uIJn6}3-rWder_EqGf6_0Z$AM^_FAGV@S$_(5A8EaAvieI=gyhnsJOQhX4Jk8?nnrlAKW6?J
zngHSTp+3zZ;#|E0{lITWZTL=~J`qQh?-^fg0I|c}!(9jQYx2I#f%97#%b4Aohaf5V
z-4BfR!ivPsaEWsj8mM!jIhZ+e>32RYV_LajR<&=+%6wc;4p4lo9=9FvFo=^_|}n5M3>oT78|Vn)TIr1v`1U?g9sN+QCKS
zq{yczx~k@N#37lhb#wOpA4JerAbx6JSC<(<_4a8fI%#%ub+q~nF=B>)Bs
zr&?K}cIN?WoPHDAD>%HFc#h5v<$IHD8fXMBH?U}g=)5_QkcSu>~hatsOuktfV+rZ88#4E8DY;w0;GSW0Ne=b@Oh=@pK9Qi#ud!Z9g@ZK
z0Ju{ZV8oHj*wJPqcp>|N!E89l{`iCPzx*Zdk-<2exCEz^9w9u`wJdFqw>Cj{_yu|V
zw$p4*WT_1XDtDwwI-q#9UtR}4r=*NuhB9HqF)BlTvpM5KV_+2i^SDA1YdEb$*o3R0
zgoekn3&5Ik#`;6L>9jsZt)hONEu|0VdToGZQ@f;4tOrdEpG7%YG}Kd_00_@FbCwUg
z3u726DNUG`2~+H~LbwR#v@d2}kse=I(%hMU?wjaxAjI)Sa~{!mXrcX1b^O;7H>m6*
z9h!#Zt6wwNIx1{VE2)V_z5BEHI)-PPag`*ABq8xL*r2K}A;-bP&+9V{Y#<%-C_vfyawsV(1-4d7n@M*RPiR
zS&N4l!W%eiDQXIUktX-V5K)UvgrgBj8COs~b|BDVsQP>)eVrHpt|4NFp0WH~|A5Dgl!C)2;e>2TOhzRu(N_8C-f=UEx
z9E@A^fAYnS%186HoA|2k_IH(vb-KHOsS_4S?d$i#8>sWj7fpbeMOEX{AP|@4hs(JQ
zEMtbe(Nse5mKm&jA#=KG1GX`@HBB7XM)#vb>Exa_FM=9A(t$biywLyb3voji@~6W^
zUycA4u+vAMGf;<$DSVFAa=ZKeRI_H!mhz=%u}ssDXdz%Nm`#oYhyVb-{DSx+fH;iN
zUpQt-XBpKCL+K3e%XPm3E13<-mt+zRMXX>cWBsfBX~TJU9n@?d5yLnG
z*@Qu&pX-1$!;9y7%b+jUk%A?2`O0!NPnz8HNNdw>>GyrAHm;W?GTBYTv_j=CW-M~D8qz>xq2?3=@tjwf$t(J&KvLw4GgwB1ixz#u{FBx0
zv_2S@Gb0z1m`e^6^woj_^B?RUb%8VRofEk+5bgxXGkp3j>DdpqIygg251ZfEDak1&
zvHvBW-ky$Mej3%mMW^!mU$VBso$?&HAYH%vbWLW~w~5>;dpo2zxE)*L)*{DOr!fQ`9ai~CMmH~T
zmIsWBIZ@HkOgpJoZ@;izzvS0{fqaHnw2!^r7o8YZ++^NoE~--pkPV8^ZDMHU^7Vp1o~Evc
zs5or(UVNLa_ZL$7GvM=A)9vHeJ>BS8F1b_J0D#&^5Njo}`K{Ie4!6Swtbh+y9t4ZbpKRSQbY`?{U*Ulw1yBa1%
z?jWv-9yiwiNY01#>w8pE65j57Lk)j(eJI={gV_v>v%`86Lofc<;((}BAy1OgcX>-)
ziNk<)zF)k26imu_R>VhmKp4-_TPr6Ew_JEbZz(S!;bcAamz_PrUF^*JLAOr~?uD8m
zBf%wqE*)AM($3CKerHTzm^@-47(C|s!}e9ODVn{Hmg#BGF}C>}gJkV~W-ZB*#~OO1
zu~`nU#@IH=MDfZRj`ixb86BF3Qhw>p7b2pCcqxzzOYf2a%Efy&-&>aoYBtoqXh`M+
zV%)wug1=hzM<)TldzvzXhG;j=C$&}$=gZ^*uBplGeQv&3oWy(GVuqH|&V#xk-<#ip
z6Huc^ue>r_5Zj{(_T^r^B8@jd>-hRE!`cmBnGwM$7^r-P9_svVzB(UQCG02d;s|Kq
zYQ3OWPN(UV%tSdF69X?js%Zr=!Hs^0Mx({9i3j#2Ff(y^2HIl36G#G~4;lA@De^2`
z7d^K&W+p(1eKq;|@E!gpm*{x~9k>Wnsv@%Y~_23F@gUcf$%lAlSc9Lb6f
z!lY~JJ-%?+YikqPVa7J&&V1v|NJgt2vgz&=k&Gqgrm2jv%SZ2^rpqr@&WK7P`+T|k
z_xs!+4SF7_4@-N8wVU6-atMBqygoiLy7JQ?Pk$h^w{p)SweHNBPb$UsJ#{Tvm4azz
z|7
zLVkhL-%67AsYX`ifU7M5E5HHa`fY#!&por)FH108pvN`kN86Fyz`n~lDn3-wGOATP
zI*5|-s7wZr-Dk_%+CIZY$_sh=0ZAZ1PNVdoF&f52gH9
z(F+4#Ssl)_<1FE3*)ZDPq85>)M4*_QVKucEWa~jWe6lTYwKJc(_FKId@wxVi+ISxx
zM+Rm3)cVCmdBDntkfYG6kwF@+{EJe+Y{{ZPu)q~Y*`R5MCH2O|uu5I)
z$|lH;JUw2CHUc#tT6CyA?rY*d(rl?cBBwRfzmkFxaNgGvomu@VkQ5_furtFbPF!F|
z7z{>j(o_}xi>iT=$`G-cmF4_47Z$VOrCaI0o|3bHv&a2I?C9RZsxEcULbBHFMx{cd
zU{fR(iB%IfG)^o_z!luK4`!Tv<=B7?a!Z(&V@;a<%Czyuj05efBfzBF5qtIPrOC;+q>KwjS1tZo$H!SVOWHgg`;$dQ+
z@Ttr^T?_Q#B|Os*QAfcqD=2jbY(kpgv|CJ)9J`p(om{p?4&&X8`v|D_09dc3Lwyi5}cGGFMSj1)X-ETpN4JeRz@goe*YF%LI
zwz4fK+DKqW5Q1Wk$)>&o2G_JF(+jqP0r_MD4785)gD~cj8p>BOl(4+p|Bo70Z#0&N&
za$&F9>*X#dW9PCU*g%B&0&g_57!(bi`9$v%a&j>VkU#`}?#bqOmQQ&qKeMOgus!Y&
z1!sQ_W9rGN<|AtY1+T9XxhdWBwkD4qTV1rJEYx#Dz@Q^YK(_sr
z+$r6<^KiL@#8=NNED!R)%Y!*hz#Q)}vNb{0Z3@lf)noSAQd)REkUh{%HvG`hnEdBX@&9DOhJ(;2BM)K#lLQ%HxFe099
zpxXBtt~r7%5IhCs({cfDo(Xt#vey+xZGK{bG}ygU&oLeh&j7vaz|Y2UN=R!a+!CtU
z%i2K}qM-X`mdMbc6!hUMP^1O2<^M2-#p=LG^2&vHj|WTcNpWPt;!SlFg#a(sLZ5e*
zW2)kk-=v;fsNg^Va3(=
zLN~wanGt9XM;cI(0{C>&xf7Q653Qpd%8Tay-VHO+w
z_>2D0X(-z50Vt-OPuo!=2FD5Sj&K58QyY)%i~liqU~G@$9&9dX)LPelAMa2ui*JGG
z>V}(POiTU}EJy>$3*PR=?@2^_Ay)wGGoLIFwW(G0?vngd|EtHjzafZv!0L${t9^BT
zrlfi8ouVJ_1Jciwm`alPb`G1#AJ~+1RI-w5!&n2s*x1ApJxJ))m?@#lOu)J$cYXci
zXo6J8o@Ie@22W&;B4{y`;49gM;A}Z<`mML)le$3LnSWtFN+j(zY=*ZAZvN>dpoR;A
zn4Yv7jIgkoBzN)WN%}V-IxvA+El;D`T`42}n4^HL3YuYtqOkz0m0c;aOa)le5HzsX
zif0Fy0y{x9G~NX69VXEy@V=brHVSzaUy1!J)e+C%Z<^u9{c$)rIN(PLC^dNB>*_E|
zKRJT+`@0(RcD({@e|GhWj!}jQ7`kUy9Ioq_eL|P^6D;Wv)X`7
zgLx4~Kzh#=XCRCGYjkpr5n(h~%=$*d(BkTVf4``Jzbeu9Eph4B=qjX_3vU2RiWWoc
zuRkb15ZORSl>4_)OdeGl=1{4z0TciWa5OZn4_D-H?%)e%uEa}4re}tX7&aTY`QaX~
zab;k5o!9qNAhAsU*`q)~xi`kWo775%T=sV8DnCJyJ%V3-bwHibVoU%HijZB{>&G)K
zugaPJLI5xD7?LoxnrY$Yd)%&Gf&BVgYdi`No&ICp&ql5b82HHvDi4K;c4Xsvt8i<#
zF3@S?TnQP_Y1}`ZlGU>17@ys?aQXMp>D589c*+-)cQUTV0T{Tw{b?;ptCXgLv{J83
zt5my!lpA0q>bd`ruM1Q8(nQD^KGogur6JjiGD=JrtJlV92uFncOhBzsDJXR^3pMbY=FO_?iE-4DQPBaqm!n
zeNSz>@GD-%zb(n{&Z^-T;-7EG)wx}V!INe4(&J?cKt5dkiIZeJ0GgqJ=vrk$nF!S&
z+;Z-bQ3QGkV5k7R!nH^5n2(aqN|1;k@K|HYs1BMbT0)7Ottj+o^84C_)${)-Lw94T!<3bc1z
z6qpnO_Jq=Qvy;nOiV0s^VrQMCA-3S@vmjxkkb@8}V{tfmOi?19tkydhkt{yHG0bEQ
zU=ss-h9>WdQ5n+4H|JQqstI|eHy!G4RmUD%!mZ|tA8MU0SoC-tNSJfll=G`rArXIW
z&r+i;(QMQW{~+{6my3qt;3{5|8M%{!Y)zV2hITZcc}i*6&oh_ELC(KFt}CZ-TFptJ
zdi8907}#R9dy?fknj58Ny_0THl6>c%f%EOs?VE(l`iul}%;FzbSa!J?5LP5}lQy#7
z=y0|E4%e}aYxYqW5cVFnoUL_>UxLr5uMqbgwpX%i`db{b4+{J7>fH}r_BTfSY1Sp$
zxtGFwSWb&8k}%85qzkUYrlMNw6F2_NQEK{a)5)Mr4s&kd^P@nm?|zf6O3gzHn
z<`7=bMs2{$U(2*-6ISbIo)yN(G7rMKG#Y1dm*SPz4TN?0+z)x{-{3bf!A0CVCD^<@>
z;r?bi-1za17_5(c(f*HOGa&e-)9Jp7Lex-9(ESx%<%%vihB*>Ml!4NE_)G)$b|<_1
zfxTSP0uXOIQUBWM2I{$g%|op*X?>{rdO~L2d+K}bAd;@=(01H3MV`W&x-=>u64tGo
z|HX+zl8ZzgUZRJ|vzRnUwjLuSA&&I(95jRO9{uE)#A0Onh+zEf(EtJG{%_>?ant(P
zLhtMy*^=yqE~_8@@`PLGl+TfQ{vSV)$T9m}o)$NH%T0+{6Vw^huKwsq_Inev&8Ox|
zO0{T;*f#j?6(>f)N=4B}2`6l^Y*%^I-H9ecNce~VJVY&0xooeHf0MpWz!gsUXB1%2
zU2F&_C?bj|8SxRDiaO8H-Mebs9ZU?1*Hyvwe7+{EeY#Q?
z4Sq7S#~kd{9JY~Beuu?>KDuOim+~V2{I~+S2V11r8_m*~jM*;{KoM(1Vg|L6C4vJE^x1SaTSg$b
zjRi_sl_`e)&iU@`batgCb?8-GF`=kHczS(VoMadG&g%R3OMWdL(hyb9sb1z;NIb0U
zs|nU2;Aukx+k?_FcK*WXM+E#j=0Yqg?a%&bl~|dT&QuB|f7c27Nv!ybF|*lxhskyf
z8zZPXxM0douPSkpX<9~~S$5)k>OrBb!%Z4MO;&UlSqv}LQms%n4>A&O(B>99jH}dkFV;(j`zG}s2fjO?X?=xPbH8t?(OYXOn+GVY!OB~)+#Pl
z=NLBo{{TNa-XjgZ88;X{Cw!~e`6TGytVzhY=|kwD&l2cH{TNkDO;4H9l_NHr`aMC(
zy^Sp(`)RJC*7dg`ktx{iY?GHz6WE7E`q~~al-0}0y--F3cuM0o3Om19uFH^kdX?)}
z$vCthqj+3hzJo(Z;eXKhU0y2Px=f?RH?+%Z%s8meJ)(d0+)7XC9m*A-6ezxStKwW?
zYoxp5EA6I}Ayc)H^B%_>6PhH@J->(0}dmPu={B73wo8
zth_;dHYA(+P!vF=2HiQlZbfdJXwPpo6T#&l(ePOfV~8v3-qxu6{HhZD=fj1`nPj;}
zDvYM%7B46n7p6M0i?~zkGE4U^i5qrzu!Rru+dfjgG)vqMqtmay5qtL9cfbC?D1SzV
z!hz!NE=fOSDljp%o$a)KxLF@}c6lSX1|K9_cziFp46d=BSxZX9q@+PBBkL>Z%$i`2JUY?alLr-q;wp|$!_^FLipQTuP
z3`j9vP?P(mLXz5`?280@$#^&)!B)qmSLs4t$?lF{G~Gp7uz#A1#&(}v2lBR4_r*vd
zK_{wFi#r{s>=8}))WWaSOKdmBCeE6RC!8FKA8yv1u_c0t;Bn8c586i1uiOfv%WYuX
z$wA`Fu@>~>cvpVHx4Xu>>}VQKEtT;Cc?7yy?(GJuh+NMljp_ |