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 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 literal 0 HcmV?d00001 diff --git a/pytorch_geometric-2.5.2/docs/source/_figures/dist_proc.png b/pytorch_geometric-2.5.2/docs/source/_figures/dist_proc.png new file mode 100644 index 0000000000000000000000000000000000000000..4fd442fba8d96d1ea14d29f5f4a7a19176860f81 GIT binary patch literal 75694 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ℑG?eFzb~Ac-=`4$M1WvbBO9P2H%08HiYhs>#MIEu=4y-zwci zC)L2wol1|8QF+lzuz8)O*AM)RB1|?g&rC&Dd#&I#(opNnL6x$tmE@qujlLx&;slnD z8KAM2AA}@;Jc1h%k)QGCUDsAjrg%?KdbJAd&W->wDmp32D@p&hU8BHYv3=@`Ql8ft z%Kq09Ggj6buS4>d5Hjcm&k*bY%A@GJQ^JL29170sR|>t{FB2&32|O_9uh;C zo$~dE5H6-tQw^!s)$NRoJ}+(zeGmGqeyeIuTN(74CM|5s5Sn)-Yz#;sQCicKrQXm4 zDX^uU&sY#rlYLXHotz^e7oGAt&66$9^IElUmr@?4Oy@>Y|9UwArh@XS4A4%2tlHO9#)4-9o zRI41+A=6l7GK+wQIn94|e!J-wG*Xj|YF&aPFGY3`K-oau*GDlf>iNMIn5}GiP}fX8 z`Vl3H6zTJM@PFF-@_4A*_ur|Wo{CnHJqlS0$&!64yOee8(}a>W`x1>&J!Bn`B4T1> z8T%e$O18?97{f>&lCcemAv0#2dsNTU_j|tIb6)55`~J=!=XLyp*JtK)-}iN2+kIc} z>$(>0QKWENly2q8ek*HxGZbOoxc(5js+4JQtGPCj!hX89=n#IetXnZ{Z7c!HEJl_f zKc>TQ859dMMW=dX(G-JtZ8qWQvzb~l^Co9Xwz@Xi zjoi!3XrITNM~&&$zR~gYF0Er{VW~jn*;LH~CgYsd(H`8w*~hP361!sPV#Q^Yywm1A zwxz>s)>b*mblhV`d4-SGCvK^#cU~2n^R{8ep5Am?@-8Pj`5vt~w!2IG6|(yReW-l7 zp(HJ&Wc3aHy4tj-kUIgdh*_UCR@<=0B$O=Al2wH^mTG9Vd|b%3`B4~~-j1KvS^@6I ziSBRL-WFVn&XAHwovEdysy2=0YLaTI>Fy|*-oR4S9x7Z@Cf^I(`&L@7*VITo9P}ZP zNvn+pL$%&HOE84{;t^75Pu-fj1H7m=^jZW5rH@&ggJhIjGVGRo-i|t_%r2F)8`hUi zqCQ%Z1zJnW>130LqjbhVBlol8KTT4fxVaX)9_7{=kEcnA=<5yp*AE*%;+jp>j-Z#L z@8XY6<|Q3p`%2f&McF=e?sxrG~H#eAK$R5^LF#}2Bvs&m7_oUO7Mexg=~ z)QOmu{VgXf^L_2=0=#6kt(}9*?q-quY^;v6g~^oP^@n#mTmnt(pjdr6&68;jAAjgr z<$P{!Rgp+`+Aia{N@-9H+$g85i@otW`O`gRlh+$_86os*(xwMBCEtxw$RVEi1Zc`i zjeb{T`HJDUIkMq7s=Syeyu@+s)3;S&V(2FnSra#v>lfu5L{&Mx=ki=IymV$waw1G9 z)Qc`q=vmU!&Yc`-&n4J^vZAa$=neeK3sZmtp6`M5w|73S9Ur`mV5D!{AU2z(Y`sf6 z?!M47!nPGI>;KK~YiT+lW&~Cf7nMA7pZ++V3%g!~39ubA=Jv_Ptg2WJ0|rXSg2z~U zw$DR#F%47HyWP%eMVsDkMHA?fjpRfhyMhL9{)1pqk%bJi7_)}E0y@DI zH{!p#yne)?Ay^q3D1ds;@y<%}wPu&o`SA2|GdHbg0 z=?QC3uzOMxLscl(g<_J65Z6H~BsYtB1^X_E{L?n>kroITG1j?BWuFnM!e44A#;AN+ z1@6tvse6_$TS#`dTHCd_jukD~KOL{7e2V?bvQP+R+tZ&qXz*4hthPBw#`41X#V&kP&>T~Xipdz4*1Nm->~s57E_KTdm$Ce}VTNW{$K1>GxesOXG-RfuJVO)edG`259)6p?w3Nu# zVsk|5DYFq*#?y73uK~p!&>dLhqBi+6ypvYKq(5bfxgDH#a;|DDj+vgN#ngmtinm#^^@&FW3kL@TFcuLn-(q@qAqGV=?<5WClL)jab~FAmKgEx%hpHEGn@5t*v`fH zgyHS!tEL;dFrKPUW(s`s=3cZlMubRw16 z^bp2_Qz(0ca@ilmIX{`)>e`%s1h0Kig#7y+dp=*yL}t){yS68dL1W@!_s5CQhxRjW*v1`pC;BZd=%rA<86o~G zv%&uuI3`bOZt8JSMq}h@*g7xR5h@>ZAc!%KY|49P6w3%GV(jlkMLZGMfX zD@3xh>0R*H2H|;`m;qhoMqj#FgUh5{hiR-+b;$lzxOpRPbY|!O!O_pLOZluwO7Qi}T6&M9H_ni2nEyd4uuIegw^`d)_1IMqAvv#O9wJO6hM*ggS#9xk*5fG9lh0%v4bxH z-w#{vO5)-nwQEE*CnlYuucaQh10v)*93iq1=5JGb27^g*uJ+=Nq8&c(_UGpfD3RO; zgI?yZcsD!9kQ5Mn{3GHu`8gN#Zdtk7AnQI$EO!+O>H~hY&W%0GgakU0Hu%@Vk=9Z!qLGwf=JYB^z7UVYHYJOe6NU#!5qN|(uYzT*uRYGao77E%e#7Al80bYSG zbYwXZry8Q8ajdZ2c@zJl5ZK3q25}9KsKyAaklonSXI#j19WG?D7Z)Xul2XhdKI`q{hLdXRrA&{v4JNxR3>OQ{d;rIFTUZ{U<5hMF=s7q5xC-s?y$NgZ1rOmi+ovE#cL|htUO9+#LiDtrP}rX>!4og)^|WZ1b5JA-+$M+MWd63PvhHtM&up_%-y=AdaG zDy*RSo^gql;9HCn-C9Lcs4=BpwaD)xr4&PdY2VFgm|0Eu>A-_C>-i1FjQlf-ZMeyX z8^!Dnl6ufmbd{#G!&LeG4QrI7Rq+L^Q@$~*Vdc{pJ=53_l}X{z=x-wD4mwe&ygJCn zu*n2|uE_p2ZY{I+B+@8pZB(tDjOEE$dRMc87bztTxfe8UtfexD1=-0NwH7zyNe(FE zrhvNj_5ytHs|s%msObd&ZW)}NOn?z6Rz#o zaovwgaOSd>ge7Ab;gdLSrlk=^t+oqP6PNDJ4fPzkPsj{glI<51WWVBNiCLByiy~>S zNS^ujvMEWfOQ2WN%qn-C1ksFMY1aUmdL_AQ6FR%@B`K&O3XVrL#fR-c#T_9ZREcO# z6pO7%&=e7Tbx4UgN?E!um7jC{?Yo6fqqQsL%L~o>Ci`oUPs8TOSied;ww$ojsJ&(e z<;L$BPrT-s$Q*Bf@6A{|xU)z}ml1F+TcGQZ zxq=w4A7F5qn*b|wXx&$hh6oWm9{R%sS)o=u&wYYZWh+l{v>soB>uzG2rzk*so!JWz z7c&9qZ1FLCvGYh$)pQoI zn-t@1ojS5t<#g+lfVx-ilNA)!cKXlqi z)+F+}an3GQ65cM*?}VJ-D)G9)?lelR``kRpmoDArazWj8Q6dZo_PskJ?TfLw-Z=s2 z^{qqu0K#j2kn;FCb7~%7Rw~gKQD3s_EBh#J&^lULnO4i<3|k_++|+D;b+pC3`36jh zwdBi+7QJ0j&Q4R-4<)8?rvCO~S67w-Z=am7FJj=P-_@t(EqRJFRZ(Ii1=>CxYudEY z8&gFOYMi<+VB*=1F=Mhn@(a2X`qw&O3&q`XiVsHBmY3v!rb80e=!F?1MD6aPP*mGI z{-Rn<+)o+*r$c%GGJ@FN=@M#3y~?Lu*hq!Z8k}{dj@cr}bZ0z1A)3}OIih9HA)|G~W$Nv2gfK;yNkaRiDl}$tG9mMwrB2DW=3;9ePe2TI|8T0F{B% zp7#E0rLlafk)xx&6#=7n%jvb$x^9!<(LMIGPP*r;sx#!QiQ8n2)0T6*{AN&#SI&yUUEd71MsC`1l@{=r$%6Nq~x6Ircp3rHz z^?4=5cyK&Oes*CGM3_68SFd=Oa8c6~mVgSa^?M(~tPS(6GfB6k5t}`gX7v*$H;5Zu z6>iK8hV$TA0N37I{df4|&hj#1qdlZk)EKeS@HRWK&4SO4U~Fy|2O#obyg=h$Z6nJu z=f8p))9-J^W^BUfjFCYAAxMt=ywx+>Mi2V!?Wn8jS&bvYGZL(5(ywc|F^Nrq89yJJ z``o$$4H=og-@nqSM6%(ub1L<^S%+&1ef~GmIO8FgUjdjgfCyeH!7V@$Fma(#%HyV$ z*2YS-N3n>NddQ-2Sn>SM>W_)IY16yWQBi}$A0aakyV-Y+D;}5-D6ZYmb`mSew^khw z#70RE zO-*8({k{+L&iopU0zVYc*}pJbjNdAOOiT~2S`dg{#kht;f`58iSr7m$@M4~Y9#Q6S z0r?lSly# z?)=rx{H_4&i{%3KKEee69kUf@^QRwIrES#C7vW07vT*a?I(_-B!qsj4{p-bRVd|<> zZm;~zZ(UXc856AI*i1jBNpa2y>>=^T0Y>*hY41M zl+prRsMm)ZNhAgsoYJZEo@IcJZ`yoogtG7EN~0Gn2wDicj}^IlDQIKaSUntCJVq}M z8f>Z|*r(bF($esS+}%uI+t}2sL7c4Puju15Pt+G?kR@<k#n!J6GyUh zx0fft5wP|IO9Bh6nt-v^H0bL3hvDJM97?lOde9G)$C*fvH3|KIE2}8i8wuVEkd`1WjqVA*^>~XS2LNY;pv$do^x@jAH$fP8Hx?NVZ7ya zp&cn3BXV?nY{1d9s;f#{g`_k9Zfm2W?rM$b9AMbbTxZvCt+#pG0a&4|M9!?iB_|+$ znNv}E$JegX6WlFfU&nAE%mQ40Sr!?T!db`#0P_Ob1HeIE+`rLy7S#Wp0=@o@81pvuEEuFHhw?f$V zaLZ_R;N;y4z53SbwyboejO^!QMePZe1n2Y!`)Y zdtHU*I&i=zVp9+w(z=C#>^~sbqD9k@JP3v;bWgh$MHj-Kfan{*XLgw333e5 zbn7*`xZ|tTqcn87MzWn1K#ua|SN^gB(k`lbv;&N$;EC&YeYb~j$%T$#w$Aw*ObGZ^N0!s7Te{U590`YLu82Z$Db9$XV4I0QtS(i2GTX4r5a(bL=UByEm z+$|Cxt)NuTzi^MP2Nuk2S{l;lrPj^ zov81`AMc|uP!OvVTb{rofvZtYbzIf+cH;E{oY#l)=U+98j|N03fHF%`pQx2Q(lM>Q}d8W^n!bkUELSs+O?v+1u~MZDmvu+S=;Nn-Sx-V~2kq zex4qJ1Tpj00c9O0?sx}OJQ|A-aS(i@su*y6X2RkKl-m4tpqhLr#Dgp zZb(0^#D@F6X2aZ-r@21B%&Y#-TNZEkONwrZ?6xyk`Arxrh_zINuFKKFcn z@?FFlmwbHOF_5P0k?Ip6(kpYA(QzFf>N>OwCvU+8?~}#cbg{8PP4K^!YM3VzIJ>+? zs-Hil+!{`aeIgRD1uH$^bGhimwHji;i(Y|G#MF4*b+=E+6|1wiOPv($x z+d01P$)B=3uDh>p$L?iu$qz$1aa>^6?9_~59S}~^(|ICHr%~ppM(y(itBkw>t@jES z0`hS$h})muJ=-F7M<(M1jvnfPn@`I+!4 zo`ZzioVweIBM%44FJDnubYUgB3h%hXrU%wBT$4G80To2=csj**ZwG47uH-h$oB*2w zq|sHQ3+ixRV#jbBUj{pHQETkKE7j8GUI`D{)yBO^xlZ#gwN;NolEV9s4ukh?^8gd$ zKYG;BG99G<_9@gpp~N9WN)XB55)mAd?i?4mQPig}ys3N+u*e6zA0MZhSnbJ&o2Gq= zs?3bsIZys)F%acu|hm{f&Q`J=S3Jei9#SJgh9to z@H2N8OdaxK>)#L0`rKUqBvkrwee$$b>5VRTTxE|YKR|A(koy-FKBpj>meAV-_JT4} zd@ZlK4Anv1LhEy5J7dNQ@-lJV(2ez0C`lyvOeSd5LU2mZs9D+t>Es_jlDu{C%b#Lk z%oh%k%?CJNf~GDw#0C{Hn$j^gi5!`|WTgR0b*W)~dvOyKdfK&rUoFU?fI#*h=R`l* zDbu+8{+JJ|gG4K4^B;ZlSV~40^V`?zRj+#ltZSX0^5D)tx)RJN?1| zv#PMrKQD6D9w62p9CLLlzIA7eHe2fTaf#TpQmqEvF0qZ{YU*+D1yJWt3^WZ07Xa0~ zj((fQFsD@==mi*B!A$2Pc{OOng-@eF;Yq@#k#**{ylb66e%Rr$(vCGI)izh*SQ3xcQhfUAq zw}(ZE66Cwuyq9+^?l*h^7U2*E<_Ceuv9|SujfiRYzUWggIKcA5sjpjJt%I6@5QyW? zJD~Ru13A5N=mE#Y(rHX8FOTwqSzYOp%*Z7|yAmlttWPYq3h;kHYx$)Q3w>$(T(ti87bO>a> z7U0gG^ZqYzir*D|50PKkY;q^iQ~!0MJ=*>kr$(y$6dD%4oz&ZuiBs%h{!!JqVl>^J1u{5!_ALuR*fvm9X z^NXZv2~$mBJW4X6T(O)+B4MD)$@t^f2h!+W3I5p+@p=Ed13tHU2d|E0Z!KsxtwTm=S%rABXU zwziquwELi+{OKsqO$ZknOoT@fOK5{7Yei`9Os6>nvR*NW*`+A69a1vCQZ z2D`oXoCIxT$_%3J&Tbkeql2us>n9U|Ej+pBe|~Z?Q+-I(;95q2C1b~*>EZ&bCt zy({>Mr1Q;0$sxZUjoLLvYT7>Y$l#sn+Ken}#LVh2^6E6lKH_=cWrdr8weXWccf0Ex zPwTR@--XqdOF0~_mua!+r8{Bp1O5g;2U>19eo$FCd@MLlPPsCCZ2t1W>3Fj zg2M2pT`wt&V#c^49%#G8Fh4x|HXfVa!vqXCx+eKz5||>%bL#f8i~EITf4D7!%9H@X z$NofAa~R%Kpq%JG&%CqUu4(hIemoF#-u<() zs<4Y$Iq<+T{0`8!xonGHzJS`al4pK+TH9V3_qDys;&6t$61c3se`YuMjDh+eo}fq7 zrZ={&bpRTbB=tDK@E%pA$0vhr(`Qp{dG!iZAgtN*!)L0A90+-bWGc%l@{GqwdGK>w zmDn{trVe}@&P{(QSO5w*2YsYGp2Z1%cUZn5%Xj_<*7#rY&HvfMN+*_u1J3S;%{>61 z;9Y=0`9Y0qU}AxP2HN3(|JD9;{{w#y0{N#=|2KXxuzPn{_SFHn2GXCJ19gv zyL3`fY_!|JO!@YE)+-m0r3Hge!a{a(q9e2HCK;i5k45W|7b!CJQ`sR6)i4LwIq6kM z-CvW6V$*wgbC1D8Nr8B+h@)!a24g!7S!%m=weeE%#_8YK^j?|Bb##AzP#h#6gd%?P6`A}P8 zN00DKeRpz?MwJZ5i|;}Os37_!LPV@a^F}g~d&g66g}uNwsItyAO$)G_F5C&rm6~9g z2?I(MOYc0eCAArAHhQ-FyDqbBjtx>Fj-3VBkjzIV>r@+oPa^V=M{>Q!I)tohsngH6F9kaUOg~L=4&8k+ zLPR+Z=rcC3dSs)?=)6~k8GiHufMHWtW6WdZLIewVayP6V3slTMIqaWhjdPNynMn;) z7eY|w)rc|?A{m9P*VRhKi^6*3jFmz^@sAEZzKbSuK|kqZxWO^op2Y=cUT2EgX_ixU zxC#Q{Q|8KM@2A-<64QJ?k`0SVx(Q#Xwx>vW-u<8LAE@t>^uGa?=KxL}<}X$oEtNUK z4#o9vzaz6ODd5^5Yoap~jFd5(GPqKRF7T}Xa)ic-9uTye;n8A)OQ}vbrXa@)pePNT z5Cn2r2Dk_Y_oM`(11p}F>=&))L{~ZA!sDh0eIK$hv$$EDsKqcTHnjBXW54d9r71cH zI=55t_fM-5n<7e-fNDPp4u6t=(l3F#YKrm`UYXe`Gi5U$ZEnH!@-7SY{?-JT`-aQI zL`VB7FA&2Q?At*7(M=%l&K=L(fM0-n^y;Ksz^*nU2B(t>fig|r8X=PUTOpg?x$XSJ zGQ+R^(`6#Cfm=(6E(jgMY!xDuP?Q&Vs!-cLx{>QrvVNh-#C=y(s{%~fO~}eBZMaoH ztc@ay9HA$Js}})X;Nx$0JrFs^Y}dhUAknzm7CpcN?)~F@9)H}Y!_^`*`T@QeQPjS&Riq%t1W>oyKKm! zTUm*BPR={=TlKhFDM>pkWw%nTviSl}ijA>S@ki{^O1qKRRAdqyWyH&cCbh$ZV#7B^ z0@TGwNMN(?f+L^NmeEz+RutD6PWGbs7|lZ34Iwq`vk9j}Hq%09x#<9sd;m6e;@aNn z)I#U=9Or)B2$5F5;gV5zn8*7%+6PC14yIf}yo{LGsRX(W)}0;OdF*9SqvzQKE<2Zjo?xn@xA-myU3!PUC% z?(*;yVC4@iR(^7ROy3_a;12_`q^0x7VzJ;tgD|$RDiWHT`*oj&Gx&N!Vc{G2;_NZW zf(3SPU68S9gIUa6c>VPCo^^xPZdil}Dins{RiWID!(*M ztBPGuE1|GpqXsjV-oa9^z+(Xlb^!+xe5flSH+oey0qw#zO62eC7Q%4y$IG=ZyR+47 zerxsJ3cv3Wv51f7)k-XS^BV_#)p{(Ut(fC(k2|yj&Kf#&#?3*=_3D z;T4~DWu;8Xyf5v2BqNm=Q%L&lpEm0W(52sgGpC9A5#mHpgo?N0X@|KYJP?BIJbp&i zwa8(4^tw;`vzch613(}>viEqu`))pJ0dIVxqH^#7Ct%8aq30_R=X(b9-ft6Jm!o$# zFUsGzY2<~OZpC(+VoV6oqb$im$NYOYxV-oqR`~XjFC8^QM8aeGPC(Wa`(MK-AyI@Q4@p#(315J+<@ej68ps4zU|P_ zhgNnVzL*>-oRu49zgWwz$83&|F-P+7?SmBkxFspYY4)2}u-nd>b|ioFv8 zrYd$%^MHlp$aYk#DV?reg*2*$-{mkv1;BtPsFoPhhNJ!2&IjJ@HUnY$pW19iT3{Dq zx7#qfG=?keVN#6ztTlIv!qRI*=QPJ%(!S?Yz8?ZTjI+KyU802Y*R3qc*^-0q)y4tW z(P$T&-pO5UhtPi{nX5&fHk1hn=oc@LT9&wlHmR72)g{T=*1nYWl@8FcpzFGv{PTW5 zB?ule_aqsA8>Ej%B1FcVaHnHR!xG&Kc(s_#QF($0&i3r!9O7bo z|A{{>K9~(po!#FX!2xBrDi4O=G|y^pCzUMZIX;&~Pp{KTh~OY_Qk>;RbeJleWrHg3 z1%*kJ!U{tfs(jZaGv5Lzb%V0C2Uop^)NWBxzCAbNU+>JF$Yo>-*fXPBU-Z{9CPdRb1b0!rxo%E$W|shA!o1*O&rl zvo8d4_LFzek^<2yxBF(t-RYK9`dkh)`{Z|Widf0|C)ufapKNYY%#=@Yl1bb#q?rIJ z4H=DAv;gXTElqlXg(dHI-zf}ul@WpDd?gRL~AHz0J&48kNKk9z-ij%r|eFT&EAO|Qh{7oXPYA4osyHhbYfH8nSi6k@LJ*(jM^^O4ik z&g;MJv8FaX{l9&Xf3pHmAIdw2Y5cCP=hd_Yf1b5fq?(V_e3GPmCcXxMp`Ip?}-ml)HYHQD) zGks>dr@ea!l9LgIgTaCU0Re#%7Zdsn0s@u+0s<-y^&WUfC_Nn+_(Q>1P*6@>P!M0v z#?rvpOdkXUGtNG8m`X?owa25&NN-A|Pa>HZ&ySfYm?TDMkF~E?#Iej;bU3t*OS!V5 zwz9i(K~=sAWt$gY&+wOwe9X7T5thV{HV0QvE-U%B+^1fYcDbK5@lz{G=k~0u+;tfC zzQ_82xU23>g_U4UR6_@ymBz)j^=uyKM|@9kSc-CWNn9{>TPfmpW)Xeap(?WAh++|1 z&E7G>CH)&c_iKe%9=~Um9~?%_d`R4U{`G2_J3cst(!d zY}XFGJHs}cw?E}uK}|ba#lM1Bs($Mn;%fB&6Ro9sqbX`-%J*^f6xLVNcZ-Hj)9h*?%#I=@fIpvI<^v%8s z8Jh#i1Du10iID^Fd;I_RG3#2m-41n(6J>!8XUZ@fV0pSA?7vfiR0zJ}z&_)wQ!3`9E zA`tU#YT}|f$<;i_6-aG-ilsC!T-35Oer=?JfT`xQ4sL2PMW*)Ri}q-3Sp0sAywNGS zB6V?cbE9<98uM)7U|6dH^P!L&EZCDU1M1%|2w%Q)up-f7d2m!vVLl|ezhB^>BpEJ5 z{|@^Ngh~!3!S?~xqEza?aX={ipFjCMk%}20WyjXvk&)lXf&KbLJXS$Owy&~85zHIa z*ESj3eyBheLw-K>Q8PVrGDzHR$F8!5Cq_zKyg$~JRCq>QoFXO={Dh;zEc&Ou+f!U+P!JTquYwN~P|5cup$w9XvdS3$K= zm47g4$3rCF859w-4nQ#)u5_!mzUE)3W$#cfkX{k^U}%wlEXDo>NT_xn zzUzgksh8%1sZtLdlR3abm7w6??cgI2XeWc(%X}u=J6)Zf)M_iu)>sVJgVADlR8}fb z2_~e9%@I4PgpGiT(keVdJXwH^)-r-VIe>-E(LOm5Vl$G9tbt#%ke~cw()p{N3(fl1 zSgMI*;Q*GX_lwe~L}%j}9k?F*dzqwnjEwJ0aVtR)4DNI=MPU#Y+d2DjH*`AlWyyki zaJ%@BomKiMaM5iT*O^ndG6^whZJy>RINh&MakdGFtpheF{5>FVar1RQB_t`9e)WG) zpYn9kn)4j6t!oMX%UN>P+$na%SB(v%eJ<~fBh8{|VLBTRLUKa~$JWl1I;}reu5Xr2H zk#Lg$0&PKq(HE)RoLVGv>xaN9c#UhA6#m*2F0ao;yT(+B2+O8Eb~|AH@9in3;4rbC zBR^`xUT$~Vs@)VqXPvVXnn+@X-4mFzXx&WY=^ayxflJ|gfbt9-dHzl%{oq_0`56~_ zjfCYeE*JaskPqkk)K%~-++XQx$3P@U1Zy-k{nYZfM6JqbnJ~+dK>kta9j&F1V3~zT zTv6Q3LOwQ-FCtmMZ%zObZ5}Prq|epy$Q!cX^-U&ov6eZCieWX*7c$=l{g&l+4k3Ik zX!0I=_uFyghn;6(P2JhCVfX!?@pj|a!-b0V;k$rDP0jT!G{aHGtF}id*jCW+V zCYX|L#~Q~urkYO)$vBNlf5m?U3G7~k@AimYfR5*it<hd1#{GQH}Zo)=wm}U32jrW1=JN5y4rTGS94{>P`?esVJ=WCbTP9^rot|ebX{#_HJ z2)-;dIV?e|(|1s}%Z_jPN_MXrj*eW7PdiF8SAHY7aButIPUNXWf5v`3-SnZwzeC+t z6x*G45u2^<-VIZ=^)G*}`SGP8$qm)KTzKS7gz~a+peb$@f~Pwb<4v2ZcLYtokrfpH zc1G~<^sHdCdZH_{y^ByF8PPl^xl`mw$nviOMFjzK7T}Xj1qhCYCJKe@9@)V+*zXoG zAB4G^=xyO=feNoJ5n4T|5ORC0>d{%E{*3lGIDR>>yj{}7D%JR{eA)!@XTedoY^O>$ zjkmK};GMW3XR{%DuX5VkH)K-Y1NFw*5|NdEK8&0F7IX4Q3_qsvOf53^>$o;a=6ghq zKT2nd3#@@KW6#0kVkAg2d34aiOuP;-CEgpq{g^umg9_XQ&x!?Itt3fax7sBNkmRxP zQ@E)UCrG3>qP?NJMFz$}nqkzf>9j{z&XCT=J0|Z6x3ddsI{(IrY*4PR=g1FNVIHZS z^rWa3$@EM~|4MsgI@DHu#M7W7x>MBXpnuI7)rIp$H*}G5Iqr0!f~b3fmb-I&`Q%6{ zSE_5D$D}lyK8K|{vDs`{>Zef@SwK|j#_Q9i>@HxYTr0h_d6)CN?e#^n<@;?O5|K#C zp&*ChH3H5`@|dm;_tpEZzmSNVE>H#L*Tpoj<^9 ze}HPfuvKxl+GtO;u3W5CDiv`VLf4u>qgKnle=u8q>N_f|{djY1ceciVub=<2*&D&N z8bKB0rtnm?gAg~ zJ{#HpCgB|#*!+y=w-sadB({l0g)c69erfKj<_Vp;$b8gQgy|kH&PvhuuE`s}xa(vq z1g0z>N4QSMX0<$yFYnO1K{qNpv=KF_Lf7tlqzowkiZ-7+!I}=@*8)(PQihYuZfnU! z2;TJUm81Nb6IKWOc>Ju7{V5!_Mw=oL5H=#lZf>h<9X`SzV5O}#d&1mqtTN4Cc79my z-S4L7*P1U%)P1+HsT{?%4kWH6G3At#WP^X zx)#y8zU)`dm58IXF&~5AwcQzlEuVaSx#gYL%9Hv?`L$Bd-*}lzHVq(dIFe#5s!!qi zaAhnZAu;fIVJZk28QJM3WwJ0k^*AyT(Ga#k4f}vt46Xfq6HrNoc@l|ze?6i_wy%t66V+38Up^?eE zWa@p>U8#rbb|caaB9@uSZp*6Tb*~c+%YO)*&uGBWUkLql^U=~`k9h7zMJR<;KdCePNp3cnO9p`xRUWM*b6HaVC#p7&rI zFE`rn?{vW%F_pL6sB+*T>OIMg1mL+RlH!GD8jhx2yt`)w(_t;z(BmMNB~L}?pszkrIOS%M$1 z6yi_rB+pr{XbCmd_9RLFm2h$}=Kv7LkA~tRD;J^?t0JfUmfdK)xx^$Sh7?-z(sp-e zI#;p-5j2GgXI&13pL0LYvG11TKW`^!aXRk||48V}`BM9MdwLp|)^9ifrz?DIMgaxN-qMnCMp9-4O~Y_Q~Pzr!BWG+kzZBiAp6Z z>qkvzogYZt*V?@(64Y&iVtR5|4&iY)bF7r>V-P@79+w?gQ!Q|}+_vMCn=iKXd|J@O zaNw|*`^0Yue?X32a|?Pnq+P!*F_-nF6{jWsF<}jY_>x#-_mg!TBRe4&bRxGrwmdqe z8~oaHKXocW2hY;oANs4h&={9b$9DLulF|V8TQTAOD5_0{Y0mzn(#gaNZN+7c5|x>z zPe8ifP=34E>fe}v*4PCF1*cjKjbNB1vLo zoY~@gbG@7H5npDSUFf%c2NaiyElIj>8{I)ygLG|yO+`SSZ@U7r>6qK?vZ$03$p>|U z+@6E|{B%-GX#Nc6=e_I*sFO5Jmwghl)h+~HSEaBLy$Rtm#K_%8|`J4QFP?qg#vw23pUfw*4kfy5Kl)yl!ayK(=qVtZ94vNj5+-dbNEEb8IOXQePa82;O_54q7C`0KL zfu{0U6PYh!cBOb0=&2xTd^c2sJ|v_86ZsHa5mm_I*CT+N+<#csL~Cxq^&V^BV7hoP zQ9RUHPavMu{QhE_1b#t@XiSq1+Pws*&n3sl$C0;bPoHmB$?j0#U|~_=$e3#_f`Wsy z*j8N?vet(1lI7!`_(61=&zl8nErT^F?UB{829Hh<#H?+|;XK>NbKOg2{ih zu7`^6mYb@m`fPP9VEbMc=BFW(- z6+#y4_x!Of#9Gv9ySlo9dQH;o@dy{IjfwmP3Q^jP`k)Lv2a3*|R7_S|-IBNP*Aqd5 zS(3MCEw2xzqtWljxII`q&cKMQhZ+3pF-ID;g!&k&EY z(EYW_fP?A%M;c=T!%F8%gK@CVQk0SfCR?qow77n0Os3-Amh`5&*oS6a*Pms;llz-vkK%W4ZlM#Tlf;!=BMg-MPh{~x z0jF;+bepS%@o?|uBOkQUgVR3lA1AbgDDnhzOz=^5%sXi@mlzhh`7GJsE8TR2Lf#GZ zL2Yo`#Q@c>e0`C#j324XIMDaqDzYjSz1`i2*n4BX&?tJL1~H`46R4oP=^{&;l+r0* z%eC4x8|x}=SiBrTpqdP`h(yEn9tIDl@>?C!{Pvyv)t85o3@}dLHDf6L4XnME2qS4h zpC50pk18SG_X^Q)DP~GcGtP=_-)IL5xMRX;xLr@%P+9?XRYs2rITcXRC4U69* zB_!1wqIze_n0Qr0F$j2D#~?Wno~r!l(jtR({rmxnrbk&|PTciidDj)23BVtY%Po;D z8o_gT{*#Kr<*>AFD_`Tx(2snS=uu|8Fck{djh{TN^8ZqKR*PaxPHP|V(Tad*|7-N z=2DmH5a<3hDQGfNLa}M8FNkp;%$LAZ^C>~fiEiyV<3E@3y;l|TSW*ltm%hWH@(*u8 z#_BIN6DI9Gp5xwxq)e;nY3gQ2(`{``o1?29uQVsY+P>f)?C&7-A@4SbrndNJAL~}# zsea&RB--MDQMnj#%ztee!t=NsX5(5Iyq*o2cOOj zM93q}>y5q9Rai10Y|qc091jo2dq$I+bG0dFRR3^LFg2JVNyY~QGe?-79mCPNDO3BVJhCcA47*$?riE52W z@^j*X&BN6`BU=9Vd=B?2htomwBN>m{pIo%rHcO9I;bSiFcsxr48z;|Jqu}|E0LfS` z&c*d9nUg9F&vbpOHc0e^o*?)4UTJ0j*ls>tLOECk%7(!Z?i4;{hexR_Z|~qqx(^mg za0S>IV6a_tQ1E;FdJH~DP%Az=Dh)?* zJL{E)CVUwx3gIeY7VlAKHo5IDU^N!jQ8?We7$YCuXXq&v%7k>dakwr1NVjb$Uvld; zi{vdwfMT0*Y_u$7m^Z?i>#pzWJUA906mnRMZvp6PH-|>wJ@E`-#f=Zi^LT&>Z-EF3 z%wy2BAq+k00JA<*4YTvSuEBj2hsJ+nA|f#3#x=IGn<3iCpMES_jyyBv!oYxwkAOcz z=aPI^jIE4k&-cG*P!Ge48Qks%_cbX@(PV+E!{Fo<(9+8ZAr&kZc-tB*vZ^XvaUx;; zn`Eo>;==-Kv@JH2=sl<*s*;Z-{Q{2al@-cYvyjHn&BgkC1x5Hi<$CGQ{$D_X(t#y+ zGNm4^x(yW;nn=s~YzmpYCGDP&L2n{DpGk zn-{z4pAu&Zfnir`fahb2)!cRKSqsrL(dR!htq4o8JI%5+6x2IKUK{D8Ph2dWj`mI^RBKk*8Os{rJOAD@4G75jY&% zQ*w==EHi^aV{akq9XHszz5otvI1b0(Y2I$@y^+ObNtmyT2mmMT05etnMszzQPwT8G zUF$RiC6xTPbj5F~<5NL7A&uRk1j(e)*E)Uqo%L)F<14g60JU$UTQX)Y`5Rp7`SVeN zxh#lleb%7oP%(Ogrv_g-^}9n!yY<`1{&(2#Jz1OZjE7QyGji~Jo17OP@!)};`(ruy z6kb_FTJ~?G?!7!QK)LN1`wNM3gfdWO-d0Wy#)n_+YiJW318shZ_aKl8z z0+Gi)5fmk%dJ%>K=^p7M0d0iTI^|;W+kM=k0@I{s8qWoVgNN&z4X&{g1|rwaGFSBL zyV2l7SM~QtB+lwr@XW*8t9|0}9zQ=wg>94ELWyCStSWM zIkVhGOd?1sAWh5~a&v#IEW6rJff^^|T8ga6aaZ2u`<2wgbqJbWudYUc`Ru{HGnTu2 z?PJT@i}rO$%xuh`sr#7Txcy_q3Ht2F-k{Pcx8?c)4&NZYLJ*oAz^#mCR;q*|F>o!Lgj2bsOFE zFkp1Rildp{HiN0`R(M2WQvFY)@Dl8)ESVC!MVL|I{8=9S0>z8hL$wQQ;4APJW88tz z=Usy9!f&Nw1hEv_@%SmM^VQ+K;cITc6740hWIXNf2XYHLg>ws+JsYcCMr2gkjZsJz zPP|E9>iuV^7ezxMU;|4|*s4Dd#>sLOU+zLl=>u@vt!;)UE{Oyv%Nv`kVnn+B< z%_7I_-SN+cA4B$r$qd=In0%ilZyL%tG;CzQ7j?SW`R+&&T>k{C(+6$Q_L zxdwhKQ|2WN^Alz)C2*UN_FFTftNX!;16}Kz#^o8dfppse~2& zWYO-pzzU%X@}nFbYwo$kTwa_5+NZ3s_a2xx1WL;sj@B3DPK3UG z56so;gxAT5?u?n~x4U@?<5J4)sH@A={{CcmlnIW-;R?VB{r$r0~by&9H=$c z+_m)56cqkgG;%Oppy(I{2Y6hVF-}zMix(0I<6}Uzk3r3x7~G^(nt?N)?I@x4t)Tnr z4s;svbTF3=Q0wQnz20vF2KOz~PMx#y4FBV>QHMZWeNJ}#?TQ0C-y)K&=s=fP2 zwB}A%zl!m3ccSGF;|6=Oy_u5v>GrNh6=9@4DscBl6Os-PDC9n@QTJIkjNP-Wj%q5T zmA((Vtl$ygQQZ-iq7A&}-zdK7wUH4P-*O`(4vyb<7-P^oV^O;^%_(0qJce2qY2%JtU!#881sV=yg8NrTgmTogNUi-_X9pULgp`>f>1d6&Js49}=K zL>f0SJ+deuhtz94#8doZ#jazQ+9SUMu0YC}Yv(Q$8!uHax+A zbASCK59&l~(tN_pdU0QeOl8Xs$HAU3y{uPD2&JN+gF<1l^E8UT`cCu+*(IuY8WD~x z1vC?A05h|VHKP(lzRVc+nQNyuI&MwiS^aG#L__@L(F|ZGx87>sQ>|&2i~n+l6Vcjs z;7awQSQeI?WriJf`e ziKVFSd+Un#9*~Yxb*K4M-z3piV%M8+Qlsck6Do!&v%5FATsFZtPcD(5DlLi`Z-1(5~KQBO99EU1`Iak=L_&KrU=q&4w*A8b`kOd11p)`4$7--ez~ePxZ<|ZKd@qP?|cZc%NvOBLEI*r zd1AVrHB;x`N$#~vwUTOc-v%`qqlW4KGUD%f*s^xr%C4pwrtr5WGr`~f!*d~wd!lh6 z$*wYOaZiXeZExZEzG@rQmVQ_Fb`2Lw54El02y5@+hw4NI6;?>@O#^pVmi%L-b5kmc z*L4Htr+Kyna-!q!GS%syBG?H6QU;g81K>|G=b6aFIP4Eua}BkgL>d>7tle)v?1#UYGT3?lyzOg5kURuScfe4fl-6E4vBy5kRlwp*%!H}g64MU@ox>M*oX=W77_sG5) z|5oz@)?Uq@b$0jQPq<}Hxp~!kz*dHB1M9ZtZ53_8+tYAF$$MCjpw~_1%ChwBEsDwY zNnqp!1@xct$K@7GWmvAu)05a#WlT=p*3e*}drHLPU*J?H*6X;1Uq>E8WYT4F+DP4G z>sDE?n#_@dE!+!*FZ$-i+#KA)3)GuJ1^F0!b@ymWZQLh>0r|trG?>E}0!X}u+}wZU zzF9Ow4oS|4o7cs-3{i*;H407Q^Jxh7=iZeXib_BPD06AfPejQ>zbmg?LH%aKX<)H8 zzV{{b88CF|J(^mXl=obl7QUd1=4cVL+0gl#F{py=ve|O{1^eJV7q-rjt6q-4^hCJC zWR^QRLv=lVjAW}pMo|3Cq%h_^)<_D2OmLx63+}ggBv!zc4MeAc`-?dvKwfM6THpPkX(3d}fo~Pbr8I z?%Vx(fDi!-@hTh#PQ%V)=Y71-Ns>+bSEhlj2eL@ys4G0Tr#vFJT9?Hb_hydna9Ef3 zep4}Sz|{u_hj{6{Cs6MaWQ3pz@dymT9g zf5gV&aUzuUq8sqT;dKd~DV?L+q!@Pg7xsnPnYmv30LCV1VO?uZYIMrwLM%ePR`Ipf zRi6r7Dr(Ylp*|Ydd5>|S(m5=3LG@S9C#zbxdm-@3pt<{F8cJNb6p4j2#Gj@xkKoH2 zSjjpQ`>OwhBX3c~#e2~7SqE>~vzN9518Hj8Pn&Rc=?`aFhD zj?h$Wd}(jt`5~_&N55*40`1YWjZ7QnMpE+G`Q7ZuKI!i99A-q1T6MDe`-{;u?x+>F zM}`@tv>arT&OL7ewh4sQHlporTpqsZ;@Ox^`S?PJ!>a=X*c;anx2FLBXaA<(Axk0O zs7LqAjjL?IzfMLl-wMInBseNR=_f!J-mW2aGFW5wMgnRIvwsRefX} zTx}JVCItxLwb5h$nz(@Y?j&<5Y}dtotlvaV6MlxNb|>mbiX!vmNHEm)+!TS8Sn1l> zk?E!Am-?K(^EFZq9$fE>7>Qtd=g}C9j}^@G6?-5gbljnzZ+G~%BDfdWN-g`;d%>$~SjN=0>yMiYEi(}{bUw-0?SvoLIgRA*lw`KV$V zrdqI%4u6!2%5A7nzqHpAbT3U8Q#a4UXSy;nKd`&(-oBjl841L)wxvz4O?Wan3fxsJ z%spOJYoDO9KbdM^jht{T1|0P=pzZOAdN)PYp-iHM)`VQBOAr?}3Z!E#2Opzk{$j?7 z5n-K|_-CV@G%l)nXVNa7lReWyd-5C$;1`+LP}As0-s_81VW_CEcq{3-R9@(N6f9}G z1l_Pg@zFCY?;|LGY$0W6!|1R6MLtFgdQ~o|eNx=-6w6MmE$z0fnj?9q%-yI}M7;)g zNRT^b{l$qUghiCB9I!8(f1x=dxg#o|hsK2p#Z#PaiKZ;!IyB6&Iuj3t=mJLOhBCgy z2Wa@lLv_-MS`8P^glcycA#!%i-RLK1iL5wVpqHxG2e@1&ZUIXIGTZaT-v3r^fH{;< zPg!7^{_7&RR!StY4!_;98xFO5zhb8mAHNVm78jEVQzYyQhlMM95JAbDz8_L$r-~s7 zZ&Blm7yK3Y<9lJ{;~o}Bg!v}H_dZN63cHKDyzlMrz<$^nqImI;E4i7B*x^m!k% zNeKoDDg%i~Gp9`By|`+FgTqUWDTbsA;w+;SpR~K|S8`bksC?X*SA0{yFi(|ybaJ^< zrxL2=Cv7s-7CSm&W%vZ*#7*~=YI9$Ny!4m4p_9rwDDvvz7iJ}P7K8tqee`@iN0H>1 zmw4S9hd6dRW|^}m^r@-zjLJd{r1qdu-bJDlAde*`scRb|9>p+!`pII#F|0+~h?f3SA|EGg?6l3Co`JDuFCbEuq4K^ZmeSgAPWD7AK0PpK7po= z_TZj9LU+tHo?y(Wiu_Q-vY>$eR2kiAK>!zZK8B4rnJ5Uk|9rcWL1b;cRHN#h=61r; zpFI5(ukc-Fc>A^?2kH6xl9ThJNAg;-@%+>B)W9~=l!Dcbpy;LyOd<1@4dfE`xh0bj#HV(D0(fjYku~mL7y`^&=#fOso8-DQL zI==Z?Z=Vf=1dB~I&FTyAt?RjWcGK-ehxijwgv1$7#GX3A8kKZkowzlqQ#rbaObu9= z>gdNj-4)E&j_4Y%W(lGxcZT}lr)o*J#G?<-Q@HC%A9#>jY*A=!LMK1jQz48&wrT1( z{I99T1WhN(n5;Kl?7R0lkViC4ZD-1C@quEAGKY6A^>Y-%qB4hhemRV|8k&swEEOtD z-`Uw|bY)u(V@W}}DJ)+`L1ylLhAru1G99rFqVX`DS=d$<Nxybf>rWdS>3Vbr_ zht1a`^G6pZ%{$YD>UUp4%S0Y;PIFG@XAS$2a|>k4srD4Vfers)OX7Jvg5cQte3VzH z5YU?T_-lktXr^q4@G|Y;)+{{RX%XbZWId~KD)%Pi+LFvjzt4gVE{aJGuPI;HP)c)> z!BayJ;%q$Jf$KI_(&m3IrJNkp9V)2bXurqn{7DKI^%y@G0saqMP~+-qUDB134u#vJ zdBJRv717B&=^MTENK_p<#sSMXKVS7^jdF@M!BJIsP>6~~OS^>%cjyuVdu-686I;97 zrsZcR9Cc3Yw^W`T2`1?I+z@A4MG~f#u|H`}%rsdR*L8__Cds?6rmp_q5K=Nyu@Mw% z8ucMm)v0>%`xbsClKGgIq4g1MWkRmxjE}Agh(`2G%*m!@kMei~U6Ni>i^o3_*PFWB zdDW4VldB9|4Oo^DpnOK?s_~}UIf=cf*yG92ObcCn8Xaue7r^CYOfpnF&}Y6=e-TPs z(%yg4VE#UU-gq4~Vz>VjU1s^ewEhz`XgXnrsq>1x;25Pfh7GgnMWVDyPIm*PHcGr- zbvC;F4HB@_mk(gOi?MsEpAOTiGB7WaBS=Q4O)<kQb0 zcAx>j1&o<}lgiuY>4oK=k3%N$fqKsyFEY8gP(az6DcSN9hI#-}eJ0WUxznbw#;ymR zbVA>cIN27g7j-zNrM9-TML_sIYpP`2GtK$J*5!E^(rC9#I-H9%Cpf%F;x^nV>0sKF zb~}Zp?M#IhQW>odHSn~9yVnTg5#ZN8dgM3D8e^qNO@A`UeRD}4bE^NrL2~@AfZc;n zBR`pLRYUBHX>2C29}=Y}spwxfP#EWp5XC@35MBSMq7zj^dH>FMS~K7yU!SK9BS? z9h?L+{Z?`ew4H4x1?C@1=9-z`3Wu05CQ!$&p3jddYtd!%p3UIeqIQGIXO}Q{a;6R5 znRH-dsCLd6OjFkEg(-VvvpY0YTP!0d5w-IB#4DDW2?waa2<>k<4#Wxx*^*jR3JPIT zf{6Gl%;jO7h&ude~^89eM&pRo-IK-?`|C=Vs$Ur=! z01GZNA!0e;mwazQCMD+-C=BecV%I2CQZ7XlL6q0iHl8Y=Xt^5Tnkq4ttDEJoIxVtWw=ph1y>JzT z%{SBfA@`7^IW|Fq(SxRWq^5FZgOi6n7Z9jP)Gj@n7KQ^N)y4azWmDN<9LjO$Y4x}|{!_eG6%q6`{{r6SOw zt}Wx0T0eSjw_E4pV*an&ln~t21ne;8sC`jP%qWAo50~@XDd?qDkQ$XqXS^Fg42IdX zkQm`2AolFcL8ZA^56;WLoN5y8w$>5ZQm;;mY5o{Jv|h-GB%!y}!iM|!a2uW|DpK|+ z2Jm$df$9lbs~j1Q`XD3_HaDvLCKCiNu@@&o1zuO76zL{a#^s|@uJ;z?hNnfb; z!RVojhq&w#Pn1Iikt^E25dK-m@JL4#e5y0_8MV?&g#f>HMv6U9T1+p! zB#vQ%6&4XN>g)xSD8}E!Hxz3o=qa0=dVh7i5tyzy{FL8Nu zF~oOw#{26)9rL>&$^pic3kr;M#uF`mbwSFixbs7>KH0gdF`=r!lZv9pCMP_aNl;|7cJI% zqbRF@*<;1$WAHZc8B9t@Rew6$oXh`7!X0?Cp#P{>G~J597OUWGO2*<(MXjtHq3~P7 zyb84ELm9vo3m!c3*LZcWsrjf}UM7YFZp(ULv-fK?L`{RdU^=tAf z7%oKR{*Pd6%d7I$k(PjS1RP$Ij~V9Lc$q(dwKz^GMC_k*a|5ojf%G>5^yU-B8&bnF zEM%NXR>`#`Ttdb7Jl+w~b=4<|ak$Qf35Z&bt~wu@TIkp2beb_RQQO^>Vw$PLe!#S)_H`3rS^qk`MbRtd){KRY&%vzezsesD0btRNkrd7}ut=IUuI|2I|_UJ+SBo zNFjO=%8~*Nna^GGBM1&)QY`z(zfI|jR#7!G`5VWKvp1cOsx%?O`qR%2OQ4@C6T-Gz zn3!Z?2OVC=j)cYebHaXXK=sG%xZ8@= zD`26}=-!)KhX1@5#dy<%H2Z0=OxyJ&BQtD%)X7&L3y_TT|B~)|fwFaXj#;|T%85R18wf~u(BAdU?n#N?Anmxgh zg>G5s#Xb*E51ny?hhLo0U>aKJVAwZ(g$C6Z0`qW9W2_}c4P_|m(uRj)efszx&hYD0$7G^F^AH5)kJuQTB9U>$}8!hgd)8j zhs0g&%9?JuMWt>=aL3};gJ4VLF4kD$G(P3UE9T4JAE9O&19KN^p9m0b>C;}4>g8SB zSW7O*eJgF)_r4rX{VvNV9K#iHot#!iD^G6GfB_NJp&t*!_6g!Gi>mSk6{mSoWx$fw z^^8RaqZbZgr&Xa(XfmKt=0ffbwci~%u6(`PpJX;1frW0u0QO8rCB^UoYVab zHDWaNK82hWjv~{>xYXj??lz{{No-ju!%arZQm2MJdXv>`QkGMdI1_6+3Avw+g5P+w zhoO&GuzE#IzVB(B)UNg{J6Q0q9G+N+DlaWniiKl1q!;_6d3Ab&@BrG}Js6$`(mqGm zn=aG*gbXag<&SexktdG0q#f>w=g$NM_ZSd=@=CHgLd98k?CH=DH9E~>=iIpn{x(pk zR1CX(uA&S)mXsVcVGoMGrhp}vVmZkgR{%T=q&lk0m)Vf`G|Aa`6d#X{3eO=F^DRnt zUWc5yJOty`!nGvyBV7na)#cnaQ4MN;54{CZe$Z-}O`joEZGqB75<{7D1IBWn$W-zo ze$+FI%g2oUu2Coh&E$(g&MI-51!afM4~bVgta<3i#b;G(LKsFMInGDLmwO4L%1+ZC zWTD@cn+VV}jJMwwa`0TrQw9w)h3WPR4x5HTbd{fOhZ*MX=hqyNIZ*R=BxqNC~Pd3EmN|In5FGTlsyLv;0+mB!O1v&_LM8lTyHT61q z@Hwxw{>JzEBbD%%kWC(*Z{OQ7UH^0Ms8HycN@V&*nOXuOB)Wetx;hr9>&PuljJ}-DF^>>F4LIt#%Yq&EEj;#i0>lJqnnV^0AbY7({6~to zL?niY1hD%gazHeJ@($&u3d_xel-S2@SF@%-zn8KS`ncE7atH%2z@V*U7z2J)8*x&Y z4!g{6*){^TOy$;K=YAZ@eWX`A$F@9Kf(H&0;%B(+M?x>xf-P>a;l(d`qMAp->Cz27 z1nI@`M`#y83);r2NlgtfpV!P@&lgF7$Cc1a&YcX7ASSkHd%xkDR_%xx*)_OTbcaLE zGna#uJNmV>k)j+%S>EP%9EpR3p@5&Hoa_Rv=7hK~&~<@9_j(I`Ei0lj2-3%FZq{`K zF(Qma(UM#Ra)S&t(oC7JoZ|J(Jpv^*NAc20;ZAE;-YEgkoNP>a8^$*I8}1Yj&YX*A zOGkX&Uh9+rw(FjWg9R(JnkupxQe!aF^J@2eT4JkDQprK8u%zb_P%`ceq~Etme8tAa zHcT1qO1@)N0;;P|zy=G&)WTh=v&7s1vHJpg>tj@0Buez`F`oSR(G}H5PD{MTy$slunGuKuon#zgU3VuOw$p<`RhI z`>XqrCdkcJQJdM6M_lIK?B6H<@W5N2ttv3FlP4H@E(b&#<=hsJ3DUmqO8-Kj>-5LQ zk3gxt_s-e=`IxGGkpQKO*Z;KSh_~Pic9fRxbJTM(j@`>~+{yv3u?sXwl6=LpLByfI z=o!CX7(84COi##Z6R>@9$l9g{SExnOSyc_}B^8>O`|&AZ`l;=_zRC{(KhhVNKQc+n z@lFJ^bUCao{FNGitO3ieNmu)&j;SnP=hmLx^w&-oEY~_Xj~Chdz7O}oHF&l!D+j3d zA0KU6eBpeKdQ~>K!=No29qU~ z!yiSwJFK(cdihy8axzZ)t<=y-FR+;VwtD-{m3g%C6ZnFw@!D}uy0TIqw3u(Vcx+r7 z^lcezYbgsv#V#xq4-W$^D${V`7Q!38){Th`dBDzs6sFfr>@?N0CYH1x!wt@n-Hi<; z?|a}SWn{B`ekk_1B`J}|Jhi#jdWSL1a9(dZxoF6(&d>05;3GQD>3S-P09%FMH5Q|* z_~-BT;aU6$eQH0EFFU&7Xkj(s>{vCD(Z2^vi(K>hC3E9$Mm?2IhH8cN5m5K!+Zioc{SXDM<$6i?h)X z$jvx*ce1!MYXyBvhDbI=M2&eD!6-xBeRNN7%&q^QRwPXhU@H6^s{Bkhl^u~*uG6h;n9A!l>4~~sJ!KZHIYp`C4;t_ z+KutGoP<}sr;iU?aSc~&9zh>F>Zh8VN&+Q1h}IlL%60iZ;J${Mn2pSwBN{<6IJfuv zPBL%L+E+W~8!izW5ce0g!#od@y;fjhk4)9ulQhQGq{rVxrKeF2H4r0sM z8mgWWZRX$q1)w@KV=Y3jb>BDpz`lTpQhw;o-(LJdb9n<5cJFJ+FU+HM(c$l7gY2rs7c1?z6N}SuTPxm$pRb7PTn1{|xqqdd@^rMy8(A$hD^kg=j z1+gB@u{8>DLiHDV1g{yzKRz#$qUAtg3O4h;w-tLU5b|jff#9VtvVFyK+OyyPE@+GU z9%awDtU=&#+@Ws%hA7i}3RMqnl%v|Q%e%%=K+tHz?soSm_i%cfFcC;L zYRfaDWaY>i3dN9iN#d@_G~wU5JR_S<`+qc@gI}fJ*M_sECQsHh*>;_5+cni>+qP}H z$((FYoow4S-!tFe=lu_!v(MgZuXXQxUCYs;+fGB8@DXziNFlzRo+7{#MbB0w!rS+T zzHN#_;yEr!dhAAW-4Vw-V$gTIH+;IC0WwA1_J$s3n7kHI>;7Ab4Pr0>pdG7i5vhDJ zK8|Wc<}aUL*Hb$_Z(O_bz(tcd&19(vx?zy{ayz>wZE9-Peq{J(Eq1gMi1K?L)!CL5x`BdRk& zsLP2l=B)lzYV@bbaC2L_WWA3?THF66oBetS%yC~YTz))o4?NL=LIqae(^0LWv9D@G z<|X$zPFy6qTolE}t_cUi=7>k*sT7DI(I|HFXCDnR$xr9#wpZ3Ok1#Nx{N^mLL2w;) z-qAxL6}Zt*|0e>C@IVcDcaAX`(2h6YupJn>K1r~~w(!PiTmccrmDnrAmsgq}G|e3{ ziOzjezwogW`F=F2bsFxilcgr`%FxGtnXK7)(OZklxRs$Jj&^jfc7q!V1-Z1OebRct zVvK(;Mi(7PZS&HpmzgQpFaGqxZ8V2{z^6cT*=QyalPJU3(K3j6)FwJEiZRno%NoyX zK}EA1P(eU~SX`SQNKf(j`hbnmcg)9+eXTt)d%4kH9ZP=wWkVu&95+Jy$8z&3 zE(6*aPacpq+l z2IEt+73extG~tv#t^ht<@Xs^8EN(#Z$cw8kj_sfv>Z$m5IM)lsA>Iwz&9kZ;;bP8a7@>} zSVX0-H47%cONa+@30@so6e^%8I1Z(CLU$8n8kw&IMYG-lWtlz0mvfWZ-lB6ByT4kR zo}ia(C|`plg&~hd%@ycN&qa!M@gQ@40bCB1%7baq%_3*f7oW;f?RG9;z_-6$Pl%|E zW1%IGBsOR=kwzQK)hIp^n)&|6-N&_ptss5otBugY*yzfh42;UM;>+lIgY9_S6fT+e8nak@e?l}j{F0bRjyhB&_e z!knSIA69NkDhKF6Azv6=ez$O|(ZIL5`xHVm6w}mST=!e45OIEsS9VpUK*BSwj!Js5 zD;O**6R#gLYMjjo&ij<|-mE?njCMcttF5STd9txH&~2_r*5q<1R2gniL^}{Btfh(_ zR-Wx~;F{vm$>=aux$ejOZovYQ#4h_BU#-?xw^@P z%}2=tfz4+37)P_yn8;Emfr>b93b7E2*C`+F2^V7gWBnXo$@;n&5ldaDl`vb+G13oOw9zcxe4;aON0B8|oH40a#V&byIK zhXyt?T+!IBxz*)T@J;a^&$rS^$jeuCT2t{qAjAxX5rKg%_*)-F1-74nBe> zi5LdGy@i0p>+Rp$8_2`sSLk{hgN*d0zyY(rGGI@0xWSBX8*Qr=``dMY_~Gm=Q-+Z8 z=SzAEU3cyy{}n3o75!IoImGyR4mDEdykJ40BQxaiz0tNvbxd@AbDN{v zF)xnSLLGJgHHl4;IbX3@Os#5BI!c6rEwewS$%ozWE2iZ{@GDQZdu)-q0AhSpTHVPn z?L{u}yb*K-r*^#M?r|2LNRU&~mee2&K89H+d+POJaBO>;VD0pokrqg=Vf8Rl+}eaj zZp9&27P(4Ds@CrhCl`u|`%V1=gbSGJM_#8IrBSPtS@(RHQ1ek%!|+^Sbm-YROSvv7i^SASYmy{;gu`g1f0~O++RwyopxO@M z>Kmdhbt7h~v{FTYg{V7Y9}ko3H;<##I(2ga*cL&#_UDrUJQbqmi576r15IU05P=B~ z5cb3+zjBjdP3SZ`;)Z-~zQ)eV6lC)>Plq5`nw*(BIf=fUHRP6gwNkeKZ8(&#@i~1` zfJDVV{EvJyiE8&~7o7Yx{!mw{A9CdL08eRW;2cee-7ra_piunh00d#?{JC+q3!Sy*&Mn_-ANykai5KW&gqaTMW zF2X<4Dt?cu#`b7&bgK(RcH6*nn`|X4?^o47c?q=hYW^dTA)8g*5DSQ>$nz`u9!tkm z@7q$^4jedMaYYT=rCNz9gP9{%Y+SfVpV&IX31An*g*Jr*Pd$J{3i*91)0d#;pwurW zYd#PresqC~JPX1(2uI^_pj#geTS5Cy2lJUj@)QFpeLe2mM;+kgQ7ivlo~?i$51lHA zCwKO}X%BEaR{ZzxNI9;Wnw^9arcr3I_*}HFwQw|;Bt(guzK>tEy99b{mgSU!5t7aS ze%VwSmg7AeO5vO|x{*%u#>bhrZQH84yMW{4}uq5Jz>t>lIh#&dQ9 z9^u}r8i5Z%)^8ARBl%XRJhN3RmvCG%Pb`RM&Z2~D&bl|dVZugUf=N=LT*?oELr6@9 zI1mq-%@o-?U3RuexW3imF&OFRNe>$GITTOk>b*0jF)JyBd`YAG2fqNgpu*7|=M$H< zQa}Nz|NKG_h*L{j#IMa!y!BeWgc-Q;H7hd}t5>Gj9o(N;YxNz=pR3sn_+Yuwr6y2} zVXwS>!lmzZFJc7>h5dG~%BuR9eMsu1#9qIqZWZrgV9nD@xvBu4c-K|-BO4eT;Atv{ zne#7@fL;S0ZbM$Lfz<_?^9zgPk(iDrp`1q_Q@1QW&=;k=*H3IW>|ZWkLbSbJg#H-) z@b)w(e1*WQ!z0li?Nc-b#=eK@got14HY5CJB{hcipE2Q;3I=tSRGFp`v3j9!14(n_ zH{z^)F0S?BTm#>~Qi80Go;wxwkRkKmz z03#2$DCoya?q6)|4@?q;2BEF3b`K z3`iNj`CSQJ-H_#N42uxtnJWJ6El|9yAFo=D7p}CbC1O9_o%QIcVq66Oj?kMiE1Ak! zLrTimfR@c=6iwB+6Vd($b`LY)l`N5HNJ{Mcc#`W4=~tr45*_#*&NHGLA|oS>4s~M8 zC3SPVFmXqk__h&L2p>T}XZw~jqFKyEl4H`SHCZ{-9lmZ5L|L<;g}BLbl}7f%*k!ocZCW6qM6sV81A7anpK1@COQBe~+4bGC*@Ha0r=cc+1MUeL zJorFHhnMkJnzqjS`Id%nRsY069ZVFKnJVE1)L=wJAO$?OeOXlkO4KfS(yn zApv4}Qqgb~n{&A1&IeA+6R(yuE$}JdW?3=JP-u6-%yBAV0+8nh`0fX!=Zd9Wx$c%5 zN*gx2Kjs=WF+WsGq!~`7K_<8q?=<-12@Za_M529dEfhI&L;3fAHtC1x1?>7BkUZRE zYfUAM_3t|3fdY~2b}?%0pM4a$M_7Q!q&ecen`m*?vHo!=;y9PteY2M?c@fj|MOl~K zzM1R?&B|#OX>83QC4_zc$BuCJd35R0{E3c~lAGI_L(|TVaoyo|oz?!$DhDfL zw0gbA-lf#aJl$=z0@fz4(mT;tE7JJ;;eCy8@f^ZJPd=!^QHOK7(2R^?*h+(>Fnj#< zF$Kyee)64m7}{nY&U(1e6@=M%yz$-jWb#(?DE$(}eI0dlnz*+<8p`CEeI?=tnZ(7AqN=q2>*AXZ_u?#^uDv5o_+l`q zr(ll|T*h|wb4E-~Q2N(dZH}Ya_vcVkeEDwCuT@PQNK=CT>rZiePHZ4(k7>?ZR)uO6 zjY;o!Lgj0rg2IZK#KNJQAPnA%)sM7dmFN9zzqTieeTTMpo|viX3AIJOu){dZ3@P`v z5j?23p;S;Oma}H#K2nsHl+QoWco&jY2r2Fc@@FnJOIqo6$4d&JI0yvSSF zxqPkr<(j;I*5N%Ih*Ts?!QF1{iS>ig##qVCUk^cw!-NTe6avAfA_=8y9($;R0nmgl zuZ(WGO;U6oyYrirF}fhFqeY}K9|^ay$ial>7ge`1xzwTSM3w-@axl6xsGj;wF%N3_ z#3$Y2z*T4=>u~8keDa~1in?IRs{p4{I09;#1ctEZuOQI{xJH*CHnOXj;6FM_TqvA~>eo_f z8?%cfPS+dqzDl#3tW{(_xcnw-@g-pQJ$-G%4nYr5E^6_(Qm9L3nRMxg3O%!y%P$H6 zX4>3_*>pDuvA_Kn=LYHpzdM9_eBmfJx5S*dhTNa5)IFrgeWq(Mz*;zg1}7pcU{69TD7`M+eADBbI@KNKij zgmlM1h`E1@O#o7~Hd4mKLnZywoXuWpPDM$nfpu~67q9Gd){7LX-QXmQh2NZ@8oUl+8NllvLw-11-7oI<qX`XU<1;sq?toF2)F+!%1EPXGR z&78&iWyPx$JixOobm-10xv2Lq3by;W+lnEct#OLlBMk`05Ka;Mv>%D7XJDo09rsIi zX^%J3ZE`;|0jmIhFhs;)AD(owVRIuiK^Cp%9Y0(bAImfDJN_n75e>4zbsjsU2kJOv57fZCZTBu&+B0nnUdA3R{kWdBq+w10Gyu`UuBb-wooGCz_ zGfb2!(9oM3pGkBk(aB(Cz;3=8(tkI;RP1EH(X#r6h<9GH%ez5d7-A(QCPy)S^H&?# zzI-`}Ogap$^EqIvj*dt~Lgvod({PDg;lvVWN+xWwDLTmd-m5F#gD8X(sGFCqsgi-+|#65Gv zpRMVVM~7JPUyDcaWFn=g(p(-}VM{pKai-6z4z{s8RyN}Y;W8AWdVK=n^Nw-#yMGE; z>p1(Ju$L1XH!3-|>mG*c!j;H!Lz8xZS@ojed*$ZHaLQ^gN!Z*MbTV%TFULA(($62o zV|m_qTgZmR_ZSHd*VAyCiCudphk|uJjY410;)0+yKB52`)p`0Soi!ThjCs#*KTb^) z@?i6lpYb8?GsUJs4IhHtz6}Xo?!HU}JU`7xrWt9oT7`W$k7}{C_hRcf&b3x4yH zd>|66_-3tDcdk){J+Cw2jUzoamd?EO7ACa7ovon_|F}c;*uVV}ymx4Qtfgfry49b0 zI2Do%yLSZ%897_V@luk0@NKsTk9F7dbC8Sm@Ukj_J$=}Ql*q?z^7mXAv0Ga&tlV*! z0s&rW1MhkniqokG@s zY+#*E9E$>VOzMfcs0t>*zOaEItkl(cZ~8ZF`{ai(KoeY~eWod z3mchi&#ziI_`(U{=}K6KxkS^d2$3-tg8Q{!!LpV>hTAaaO5P4B1j4G#VuxKeW=o8uNYF80C$5W31BZ z2;KPDW`2)zh@153xyE7xwh9}7<2GfwBbTN-ujjAzy9g4w~4%8ee-$TQ?J~q4^sbh;`iKbANH$&nKNZb zBux7rX9V?aVnYzPE+G1=XVjh~qfUW@F&ln$fM|hp*b9W=S#}KOaCdTfF~}2JuXiG9 z5B_qXiAm(u6`BCl(If39&9ewg8s{nTtM_#7ZO9M%mxN;QK^@4hN-^*;tNv=H_Ao6q z-4ipw0A3fl0V8Su2z06UU&(1`bXrCKwLqq4w66;F;hv+cxojUGk zL6;Mf*R{r5jGqNo2g62)dF*Hv_&igd`SmomXkHl!qrZ2X&)v;hfs2-pFaOh@9^gnA zMVlg>ORyS75oUW3bHkmW`3@ns8pb3;H?a4za*Js`HU8Zq$T;t++2pz@(f!tbl|A@2yT zgXpb}SRyXT{pHJAsUf&0T`b-$1>vG7+X%yQY{wmKHriO4+)=OIT!tWjYW>tTR5YsCF- z;-#Lo+bRANJ&QC<;k+?07=+~Z6#_-{gBdqMtO}(kl(e2M{?h2pE&L}w`CRdNORRHq zn*3+4s}+6o;RB78zQpyOD=9J~sJ8^aHnuzq_}ptG2l@vObHF_GZ0jE=t@2<7W}`0GsdztuAeI{eMKkS}=T)?enSm{UHU-8(@a`;*^|v;vf`V!UyG zh@sL^WF+ek$g2HEDDU}1k&u&$Urq=RhA3ACW_-W`NVs=7 z+=Re8fFxv3>+esQ?|ZxXDA_{Q$oDU(8-(~JA9emKx$1#^q(Tn5E{Zgu#V%XLI_g>< zj#y#4KfcxMz5$!aY77V6C9;`|1Y=GQi8UMAA|MZ!6iBMcw|PHRNL0i0etEmw`lkn7 zqDn|frMU0ry1Rlkoomru(oCT_M)zFmR~4lva`5c)URfbmD3SIpKeT`~_FVGvB$9vD z%fTHTJ;Hiuj=$m&n)2v(Q{=%eVNo{P*hn`wfEU|yiGwZpVGrMrAJUjDHvh5046+Pl z5`B7q*+&R?c-aA6k)P6d^+2}ym|tIHWGmq?enL%V$rYGhq>BK38N)JKYIMSYMMnfL zA*!&)h3W@f6zqE$B~FAih;N!|bQ`CfTl$QSJcb3qz3S}OrV=w*?fPg_puRpz5a%^! zAg2g4Cj-Or3Mx7B=I?n13|TZt9Hsh8SQ@hm_=h6+`E{_As?hEFr%L)ER7^Fl9H@~) ziBcbHgsPc5iU(i*)smEx%bdVK=^t!-%mHS zi|b+w3mUGG!TngFns@&#W$Z1*PpwiZW6Bz=Hz`Y2>vYjcZ@uyMb6KqB%``*!o1%?z za007=8Ttu(ZS`)H#$85-gkd#R(rlbUL*TF|R0B^Wxiz(7VsrAbMb3@YLeT{4ar?Ye z7#$J`wz9`!vB1nb&_$g_Q&0r!BLdJpbon|_o@-FG3iAEVj^`pNTJAc!&HKJ=I%M!T z|8|5z=HE=DR=vf3=H_{0_1oa$czzS`R0r1>oDPDO5JKZ6`Qc{gTFRNERD@A3Sl*t> zU5sE|-ZGVf;M>`#AO%gOw6?ArARGop67zmLv9Zw}gz}vsF7*sx^XTHLc5t!o&C$*S zxmYw6_LX2cy`$r{81pZNt56qo-ek1I_7H}0MCNxMido-HDWeSyi9_I*h@yaC1h}g+ zXHUo*6GnKn+EEgxEMhZ(*$8Pt=Q!r4iVFu}S&L!INH8H#kfW8R%tLj5O<%^qAryza zuqdKt6DI{H_2;GYPfHBHo9R?O3M8^ELQs`DIIcSw>b2JPjp}-JYh7pK^{hEo8|3GR zPeM!Mu*UMfIf0Op;Uvx25f5#V*CZy&+1G}U^rSRJBx-&;U z@wG(<&qYXZ;BgtSNCf7;IVEtbhZkV)%jgcQwxg`~;Kl2GoO$R8oV=`jymS_`evGqC zTF9(P^hgjROK*v&Ky=yx1)T2k>JGig7+88fwS`S*mm3a?m${<@j&t&>YK*aXtLc_n zV4k2RUK~T0zTE#2{L|Y1{LK$nJMW@1@j!l)E;G=nD&NZQDVf1TX`Z{7>o@>R#*B-t zR;28MwNk~zkJ*H;Om#t%pUrpBqWDiVp-SRng2jvBoz#o#jGDKF(0|KB5B}E+ET|9c zPkvS^Sk9=%&*FXE${+@$UFTdqz2|Ro#u7*GA*{yZVDsfa=Mz|e?SLWtgqHOw_3|7p zn)1t_da`=|+UEi)RXR{~m7`w-@76*Wl@wR6sxu6*7^z^LV{Q-(zW=fosh?qm6OGBK zl#kq8+zburT8&-|OHmbl=FCV1v)V+l$;}Ll_lpN?q=4Z^bl5!#IDJR5#B=xDQ}=N~ z@6wcJq=5=}?mHBB&Sy43N*fzV#^$a^4+Q$FgeOyEOy($R8GGmC_IZ5)WPfat#th9s zTTcA+X?wcBwnWPm^@snO)&P-g)ZZU_3t_3RZ>yb{F7$iU1WHFMV-g|-T zYB*e(CPJB55msO!g#SiM9H9y)Z02V(yrs~t9K~oW7dAXL{GK;_4U3ay|>NxV`(sQ;%nHx_FKMY43?AU&l%IP{#MXm*H@)YH4fxl zs1qTK9q&)&It+O@U9>#j(lgQNs?EjXdl93!VK_13fUBkSi&ti~6Cp2MA)c93$KhN_ zQuJwjA2}sBYc^co3T66z<{>liZ!=v=Z}sG$*E3PE4|#dDy;|h%uth!9F1nYzt0Vg!Z>2jn$mz*UMT^YATp9 z`?2roSwIW_j84>8WPsAaIG6Oc43!ZTJsHw*{XGH62m-iF!x&M|Bvc6Ry43veFjcor ziFbR!xg$Cg8Y9}sE1F-Vewvw7m@*#!%}1D{Pf!|3Pzn8*(p(bURbi@Ix@x}AGp>-a z=2h_WcNt-Jy0T+Cay}>vetG2E`*rj_LN``Jr1<>5l3)*iCpAvhYnRLT7;1+C5omb* zDXfV{Q3vkFr>~&k_sg{ z&m$~P>_0fCQPlllhTWE4Ka0RpObd($bR~eDK_dH_Wym-l{PsVbGVsM|4_Tn+`_Y7D zu$scqv6?Iei+Ab2jQR-4&{!;1H5Ms5MWJ_@mR-S{!l4g2m4p{B7rE_pcE&T5nIM-f zQL7v2el|bR8)H=WdDh*$N{6`D1b~3y5)}dym(@5t<~^j{qt~sEYjd)a)A#1eSg6*N zw6CkfKt+{f`6ZLzvgr{Fv*t!e!0iU8a*_|+gelcYt;A_s!FvKIuQMBZ^qaL<+oy$r zK0F?5fu`%>sQcmN&Wpv41KH_4qW_MioqvJ#DF4^oSw_UmT##lGSS3uy<2sU)?&pdN zQfQyt$}hz80bcykmXM?Tn*}ZTtwQ}L*oRqDszt=_oifWmf3oM>B%)X>72tcyP+NM% z-XcSYIcKi`aghR`RV}XI0hAfi^x8cTu@+SnrH&inN0c6C)1DgR?pgbqaW-wwE*9%; z1Z3o7GnMJe<{N987~h&hUmj2891m*>3PdBRtjmrR37mI_NAE3_AI!QTGF!{WHxip~ zzQD0dntpZ$hVZUHkRjpxJ7J{o1{LVIJi?lZ04EXNXb+d>PDw1>c9M>{vA9>VE28dF zev>cs-mvqfuQ}GcA21Gv(a#8eKV_$)1e#Il?=Gz4ANIlc+j?f3%HfZf{swfupO->y6K*YybGF>gwh5qtJH3e^1=2r?)3>Ji&SK(A} zf0{g8@QrSTv!^ujv%FM~SU^C)+~|7e8S7d)1j&Q#$@zL$dVP`E)!)*%WIK7_@3aK5 zfJ7d+?Uh?LUvaNUW`3pQmblAFo&7$lVTiPepS+)f@I@-%)+M=2wRB9$e*XkqrMzNX zuIyENoR96m9qB0Hvu{Zl`2AreZssoMpyLQk|Hn`t` zyu-uGS_F}J>5TiM_&M@D$^2YbZ_gC=QyJ7E&1v-6Y0`)&ficWn$CYM0rLq#oDX3lj zo@+{}AZSxxPk3m}oFk$h?a_DQFyySS=;$PfGIiQrCaDTtL{JatF#BQfBQEua zLUxsX$GxoW4NXCm_hE6JZh4)^jo8|wUYb!iTHW^10&IqE`N6FM^Qe;RGt{3gY?z&q;FG%?@&z3H-8qc!iK(NlXL+=c zPS8-A4&P>iva*Wg82}e*DM*B^23l{Qc#qIzKgycK7az}lH)f`9iNBiAv@RTRzn-0C zhU5JU97ym6CpYKz-f#>Kpy1Kd>Uel;z2Q{UDcL)RCPTlCV|_Fx3D&;7>Gl(*w+=!t zz4L|=Zo<(LQ22ev>}X3s*$DMMst2#2Yv?*;gZNndq%5VV z)r8U_!I+dcE5gaz-IOd28x83~cSy7{^VyWSE^n;x-5HZ0eN1xd^DBA8Tdj~Ns3@qL z5~#7zlp@#eb73;6=Yt7wy?jOQ*J*^6`iHc}5F7w@X6UrLu(}$A?`OSa4}})N>%-4w zIByeAI}@#OP{-rbhfg}60sdYMEK1jk&2AHou5G2Y`7-_ryR@$BcAt9^21?Qkjl3Zl zF=dX*L7QE*P;v-++g+99{3*w*nro1q^}V1+dUpk06C3-NRj7a)Mbl_a+`oSn_&FG+>=Y;_K`Ca#hHn zd9WZZ1oPzFZC5wNA$vVU6Y(t=J{syK3CaNY%m6#TtZsrT{*#L97{Bvnr2Fof2$E`G`$CyJwT{e4$l~ z<*_r)kdxqds`rjPg#ri}%?r-NPlU1x-pKJ4Kv3gS8g|=bj`q>hwb4(!yTaJ6f~hgp z`KD2@?#jxkc?XS=@%y}XN)svAUhyIo8{VgVI3Q^aHzkgr-u z9$&gZU;JXgwOwJo8GP=z`6h>0iR1Aa!WS$nvAaRZ5p6J66)&wHy>GNVj|2JzMhUPD z22;vqYS>$9M}qq?>YRk_8&WZc;B<@aDDUhJ@9_ z-b|4m&i+;Mt_L#E?Dc_eCfcxHOyTjOvsEjlyN&qxrgZ)zU1TxsZ_HAZj;`{MM33VS z1?s8TjrZ!1~HDc={PNC zB-O1!d-ptU*gVPdZ70k)uP-Q6OXmLazeo0;0I-CS4-uv`PGiFMPov(-*KsFgdrGU-4H-?(VBtpr#}7qV1m`fEyhh{naRl{e3c>!S?krj#L$tkX+)WgG7uB7; z=AH-=gK(FGU}@pcvJ7$5U9aO>N!=myHlJ(ZP=MBZO<#pqJ_+58of<7dZ>|5W%#U0M zsXgxr-XP{0RVMo}cnifk!sKq$I*|V-5W|x_W$ZOIk;?OtZOFFmHvDZk)6U&}sFg+X ztlXZAF1sO=?iPiuj7Z!WFV$Y(@p%4+@<7^t5KOr6^hyg#ib_h^k2v&t`|aHbO;leS&9994T!<2&Xp803;d% zSod_wn(e5MO}*G|Ru-2*=A{ko!#sGL-x-_YwuS`IxZJH)ACPU|GA^{R* z)4}Xg4t4j;TkF1Tv#I0y{TvmfOL0e-f!G%T&yA6ZZ*95|9Nxsg{w|yQk(zX}`KcE0 zpsXzRE=X4 zkkklSTn?Ufx9D?$A;^ByWC;&LU}9WIjD*IH@~CUVVeo>h*mqOQM}#Is2BZQv#WU&p zk2D^+_R7^DGUl9W64GFpv{=X!1iyWT7sLcdq3l;0)8w#y*g&34-Eh6Bw(?{!ioVYt z{ys`?X)`_w(5arfF05l8ne)3H@mEGHVHhsIG4$(pXi`FC#~gv0svPobFuU%<`Ryld zI9y)R-{FF>2XPw{V~4>ETdec2Ma|-JHhkBQtS_BTuUlQHSSTi~DLDextpZ%6uX->X z6H06V{LczD}6hK<6rkqMPsVv|BMPT%t&v+m5Z0L!I}w zF$J7Pp6b+vnbdI8IOpynC$S7ai39?szRvVU2i9n=@`-ZQ-AqOLlKE0vj`R zOI*=hxbSRHYgRbm*W)Ghlf!SB?1IwOm@Q+|)oKq>*oqM9L3_@1t~(qtUOXuZ*wvFM;L+^`}$8 zJTMGr>hbeNo2|4S{~3|W)pk?fJCm6OsN9g4mW(F)7CvtJD(_5Wwv+&eyySxsZs?A| zauPtr9;Yt>Tsbn#s0uvicm04b&CzOEJg-rX!eS8rtqswG)g8GfXT|Ku{oCjSX-@`l zjr;toqlZ9OeKy+eTpO^*q08x%QSZ^5QW~wtnf^qT^^2v@bFedc7PyW~+qsY+l)U8N zvgjXjjl$_nKj#(IFW^~;?wUDRwo5ldm$M#{`X$1INPx#Hr-o)tnB2W}*agM@CP48} zN&+QC0Hb>-Uddcl0lpb=VbqLc0N#`3RjO1pjENZ*B{r} z;hl2>D#QdXQn)XAiIr=>>$8vd;03w~E3jEQqVW1{ zfqNH^q?Yz(G}6oe#v)20S7+b_fL=6qR%NYk>N%iw=SZA|h1%a1MpBR0xbE-04`i4- z-)@w#l3mEHHk{Jl-Z1jMoj2Yd4DIi7XP?*XcYzZJf~8608jZ=>XZ(rx8$G1F^a^BNATZ-+ zf#c7{6uN$R9vQUaI-qR_*B7??jDE*$4PhjYn&8>1*S#?VYcqb(^Yp7~Q$ei_hw_uf z0{4Q*_%q|&MT3Os_3QfBOI3W~8SiS5dx6%FWh(x?w9IzaRtekQ_5OMXoBcCsH&coo z8h$EBjU}#jmY+kRRFBOHtnF%Z{byXa0tuNgm@lm`7*{Iuk#in5L*XvKeWLJGdGlKe zxwfypMBtw&EHiLOAK9bd|56@sU?M=!r=;V`hr?o)YtD!}_7M5Z>p(1mGY-(*ed@u^ zexa4I^1#v{e9@-%=c3qKI+FRvI(OZ{E%WR}>Q3l>sNc+o)0tgVBf2v$zbm+c6TT6R z#$LUp5Z^aHF@o4aQrNjRcx>yc*`R6mxI*+Ou;ME+2s6p_YWk{Rj^d~y9Tj@dw+(*i za=lxJMvrZu@{MCbiF*LSdxV>Eaz;uyX%2VjFP26z;^&wBjq%woPt})~^t0p-V^I#rXzx@Nmhwp=7>@s$a7D(^*p6MS2b)Zu zG6Wl8)h?p%kwRfFUqmX5OIQ;Aa3CNu)|Z4@D*~w`^|82KH9{d-Z1A}zi1VPQO+E<{ zTJ^3lQ}605_O@a44A%qC_OFR1{s!i7y+oce>L`^>N()SNK~H@!Raw1&YPEh=MLjLV z6E6kaBEjP3=D0xiiTkgwcro=7wdUTRx7J6Y(=_IAo*uN?B*mQyx^y~$;-W*>_x#eM zXJLb(rjq_t5K>tA-v_;%>axBt4GAF%%`Ow5lsY{0yu^ituY#YdFyp?L&DP%1CYp+jecI`ppc#%RU+#ue|Z!gE6ZNBZ;3+d_Qv<3{I z?=Vi5jrLf3qOT$Tmabob@cZ!*VbjJ`J7di&zGfx@i^jdkO8W;!)yE^JwGN78cpZX* zz6Ji(O;Gpx>Cdxb*nNv{`Q+;XWhONS)Jg%e@U8K7@3YW(j7>>HHjjUuz^l1(iRRg$ z$F*Dr9J6GRFE+l7;-$$e2U(lWbUFvAmzvSWGODXeh5XF-!KVg#&onUTRaf_}Q zftP_Y)Z&w3+Wk@?o+tB_7?&$yRWq@xXtQ}R_WMiqGk<2t2zUf12t~O`asiiY%f5p= z2J+1!c|QI#Ak1g!Tbn4afatAQQ8`H5^>Jn2vlra@X3nKOgJs<~=?EH2T06Gv8I9BX z|11Dakel)S(1qJY!hGnOw0*y;W0$QjB|IEdliS1d-p#Ph-5#_Na*Yi*(!*je6M*T! zF=V(UeSV!iHe+{B6b)!8B&{TY+GbnKGa`m=5SyAcJDoAhcz*}y{=?=;{5c|*Be>tK z`N;#Q@_S)FnRk3i@;2P8)+Wx}Nq8Fx8f`BT>HM;sBE9mlG} z1qT#SeU9WshRlR6_VODAQ; zQ55}(Ilq0yQqE**^)xA{*MwMKLH0F01@@DHTyANK7;;4s4G4lYwEi1Tx)gJTiS(k| z#;4fAN?D}Ri$}E*7b{p*O>N0}339naU@;_Mdwaytm>+$%U-NjDHcY?;4e(~Y)|{2sz#m! zj_-^2HL{Vv&Wq0m7K;_SyF z#unCy(`{$pTO9KIrN1|c)%Z_k;T4AnB(h0qN3=E-bXs12|Ed7RB02tPPsbw65drP- ze_Xxuf1GXi{XMapG;D0Mv27<4+eTwMY1G(BW7~Gp*tTt3-?{G3^V9P>|ALu0&OQ6s z>%GGKSYjYcRf~H>CzWv5t;)$jNUz7&1HYs>Y6eR< z2iA3ovu>OrKc%k}=xUQ%ye}`HJIGo#WG;aHYC6-*EW1YS-YrxP%-!+9Da}GRt5(?0^>B@l{S>EdOIGmnJV-;+LwH zj;3+i(m4|{rgwkm1R>zhBui#U1GOMz8ZGwEBZR5zX!ArE`6)v(_4g3c`wA|?aq0KW zQfJBU4?5cp))P)(L`qH4Iil7Bnm=ymwt>77_l-)#=6b&c(z}lbJGunfMTM#~?p{c) z{)YId{9j{C902CV(N<6i+CLR=dcft{ou(Ri=(z5rZQ`l1v@_(pvW8qHh|~`GQ&O}H z9Cg%=ZTD{jtw)5S#<^ugwDv98!wE_EZ&NQPL>I;r z+Z$K&rnZ`wnrNO`Dcv6|+;k!3iW;Go^L&zn$_0?YaUPoP^+hedM?{~ra$X*M7afG( zl;?$@5TB}Ia$_#_B%ZqTV`vse{;CtwzdBd@wawkN{caGcfd1QyGwMfan{-wr0|klo z-EFyW^ch(HnB?L(%5*S6%o0Qn@m}gXc3XkOFM*pvSY%ou84<0RgJ~@#;9(m;7ZgxA z6Ir7)x;iHyV?Ivs_S@AHF#SkCZ2W?uMLc;!iVoO=wKcSYhND-bW#F~jb;C(?d&J!s zM}Wl5AYB%Lla&w1+5Ors}R*SR;fy_H!e6)~Dsm27WvEbf| zmROQcQI>*H*v=R=wZsCr2RFyyX|q`mh^n}WI#UXN_g=!?h!cq`Uqhxl^KliE2CGV+ z_z?efx!aHqWJ#L8a?%Ekl1#nSV_Cf8@+kXH_1yZh?r*fse*}!~Pvz(+Et-OTmdVLX zZxAjPKQ^nPU~Ni9@^~Z<@^^*1Rpsvn4&wy#gxe%p{Hn=I-RyR0||Fk0qBjlw;_JN}f3R z0Y#rpA->Pfg|@)8GPZ=?!lCn8fC>U!eArTZCy_pGi-nN3CFg;D?mJ4aNs?Hd&JT%n z(F=q`KHrk2hlUys1>6=>T`2CBF~R{f+p7|)(rF4U(0y4L!|`1>xRjtpG1-y zK8au}?K}s!BfXyPBrN1#x2=Zv1aCup*o9qs#QHxfs$ddy{;v`VgKw-D4(0c+d5P+? z%#PfHNv^W}jg~K}&f282#!vz`sDBelDt($$9jX3d_RJYY81L>&@~zDPOxLGMc|mEm z0&yTEo)Gv9pI9RFO;^VJm`+}CO%uMXlnX)9C zU-KAvogE)ju$@;uyU-e9AE-z(+U0*#U{BH&dVSQ_yy0&}%JZq6ziEZEg(&lRLhJQ@;l(B_d*UZRI--LUUTBmMyjAOT9W^Yu z9<@bvb9czBicy@dAbYT4SL|>UGE~41Df+#Qqw$b1_Wv#tu>f`+MEn`4o+R^oPSVbQ zG9-J!2bz0X8^SXZ?)A_KDGFdX*UEBM&bHVd6lD^HpU;QpR0$vQb-TA6vT@P;+aBeB za$e)Yyu^1~=*0Z281=@+^3Y|zqnQ3?v<7|kNHg#H?3zm;kVWswv!7)_(+eT08mIk_ zz7AHK0_MRPdZCa_dYOCdDpE{i%a@m3xsR^19|K_#X}he|kOQ{wvkBD2`hL7bd6lZg zbwcI57pC0F;dutYQY{ZP_0%z?&Pn*6O5rA&D^l7EnQQ$6sWQ>W5&otv!0<~ zzjnT#@HX$!;GdnD_EV0U#dZ^9n4EqZP^srw9E~QhK2fGL$rbB||2is5xF@V0nV&yi zB|3FRusJj+69W& zH0E}x9ocr5E=#F-itEw}?B=Nqq}DoMo^H>A&kl1(`eriQpK1I z|Ix`^#r4(3X}b8Yv1sNKl}mnrh2O2U->dJvbozTgbRUj}w^Fs?*ZDK8b}b~EB{0is zo>3%s0m5XX2q(@Ze^lfVJadQe<8x!C19;UUD}ZO_RwUmykGdGW@nnPRb-I;izx!W_ zZUusaP{TY!Lf5G$T&U(+-7!s`;3Rd(QC!xa9QZXJ@kE_cGfUb*_2zUfFXa3r6P zk`VoidF|H7^!35$xeIjH0yW}7r*Y!?&e_ZaW_ZJPYd_@cKOIN%<(kXpFWanKfv4Pi zu;WI48QYjOQ%XOc#YSY4gm9=x-vK$l$h)jI`FGN8hS)vqmnyKxj<9)jJjV$T1c?FX z6hl>xHiF@ZF@=JB1C?a7fz43=EO8_w_8pQ^l{d#}Cfb;*ZY3v41pahdSxt9TL?6DO zL~dM}8^C55>DOCQ*cQP-2zXv6zR&!tBnd_B2nY4pguUrtg1$z5*xW88O6)AU(u#oW zsg8w^s)N`6!3FNokW9dv(_;c7=^-c2i_fgS_V45LmVqM$gS;1)%E3euK`_2xE5m_X zCQWssDsYu&IxiE=`G52sag>eYOg49&f-+wn&|KPci=NFC=!1YWa1DOytcGR2 zJbn)sdz`Mb#T4hi7)`O0hfLod%Gqwg;@kdmar{U7WTKWVv5HoxY&ZYivRu)ZppJLz z3i6J`%&U4*jaQGWMBicgCv>al*io#gDE}f9=2ztiE<%n(u5*$uM1yuX|IXC2xwoVE z)^G5YJlEi$m)MX!2UFpv%d2UrKclwfMUz0N5TsA9nS)#d(t31V11E2*-cR%|5}uPd z#|?@ZJe_Rgc0)?5=Y9t1aCQZMGcX^*_Fi@9Wyj2ONIX~*9%dLacjZO$T@U2gTu6Oi zt|x+h(=q^T;qTW1(1Whl=NkD9SNsgwQ_9XqDfQ6#>51}X!oH%3)d;- z=($yjNEV^yEnlcB2Cap&jkg-nu(ss-U(QN7GGbs4GF_Rdys2q4N&tpFl<%$G_d*;y z_;+sr8fDoJ6ee;Y-cbt!;D^WjJVKKSHWx{2)-_r7uH@*9=^S_ zt=oKLJ>RQ|KWO4P2~+34f2aM;JEC~BvJ5Z^`w264!6oHRc<# z0-JWZDQp_HjLo>^>tWE${r!M)lD8NN0| z)cU?F{q@kc>sO%M*GFfjt*`!SM?8aD>vVoLq^$?Xk9VK`XRdcYdmWEp97ECwauX%h zddPi>rr1usq0;%~QzKZi#`#4OCXQ=k9FLj%ji&eZCnsHAo}Yx`H8y!ZPgb{~JN=>< z$%=nX=q*U9*?OG-kD`$&w}l3-wdt!i7&h5_@5(%{2Fp5eo9K_m2!u^$5X$@=Y2&ec z;^0iUcaI!C`yLlRGbeka?Q~G&ib)bDpv^=9}F(Nt+ zZIBFQomoHFFJZu8Y0r;jVvxKx&C~_ie0)vk3FLHgFgt~pHGDWT<+_M6^848T{Wmky zeQ4!M{^1s_CWqW?ZOhW5RhA5=S)t$hd(-37l>0k|?NR~?mV(UTcuMz4!e@b!zTe;# z`h2E?X0Qr932tBCVm9hehC{YG4*nCZP)m-(!C~-0q?$hf_?-__B-WzdSNH{&1+7tB zp$!y(fX*;#W;q^ZBulEzHHQ^2KPT1{wYImS*mEUrJhP>3} zNRic^DhYDClBz)1p=^UG)nKp`ZfpOV5}6jJw71x7plymhQ{(`B=~4tb{~7k@e==C? z8<}FQl@t!!q-hrY)5G=Xlf?xc*0zc!e1GgZV^ns!-3_-6Oj9=Cx4zanDR0HQB{U*EGN=oRqEJ4{8G} z7Z}yY;)sXHH6NkXgF(mBf7H0%m{c0EAeT%)mfx9+=jnsteBB3IN#M6D0Z9d<)|g!* zLtCP~I)HsWe=lq>dyTDfu`zb$WfjV`Nx1Q0gY8q<>23~Kt0dkkK&()RKR%RsIB^ca znU~}*KkgkrC?Vm)dCvdrxf+J=ad_kY!%bgF6jC2p-X(KWY$35AYg_FSV1JLMY7)u| zQW3X5E-fsoX?Yv2$mk6g8s81*cW8FDeZ?AF~W#EyNK zrKh`*MK+L~k8g7-3Cwi0xyQZ2rFhFEJ94*g70jQMfJH=gIOjz2ySK!7*rn~ToKq#d zRrNW!D{pe{?=x*iMwU%ypN!deF8?de} zCf~>FuhZ3HO5Lq5ah#i%A=cvnuYzW!AySL}(SU_h zcC$^+PA2p18tXBKwL;cK-$f(SKNLC;Q6kP;=j`RwmKuk`B3MEmW&ueC3*wL@0s9 zjQ8LUz(Ltp2qLhuLw>F%i#gm zep4T)5=FJuQ{VJ99_~b?8fZTx^lA*!J)whsr#-xCo|5~Ip4~o`&XHZoyWf2B(Os0P zvU78kJ9}dvK+%y491VU2hBJrU^hqrU{4GZ!FLhGg zSOWj#uKl!OGpclzQNKLw;u5ury1$=c6aCbJZcHilXsy22RIl2T79_TpG5+m&(AUCT z6fyFDg~cZ%439;chrc0$A{x9x2>f=rtX3-u z=lx!t5j%O$ExA2VWiX!!0Qm#+`~k^Q%fcKU*#csq0aV2cSb-`MN=X1>;Cl2XuZz z(i&(R;7r&OyG0eA_gp!4iw;4Kv+JxCWnuH&r_$TSkbv?SeK~9oolZ#@0!Dd$gE%<3 z-Xo`QIblw*=nlM>d*CZ>@RfM_r-WJ!28DrepBr!L%}kE)=fGJOF$s}MEJ}-gPm3YB zP@R}j@2ymDZs!9=bWkgKdn%Uhbeo%cwfUwYx{Yt$c7;`9U}3qF&9hiCq-=|OVpN&5 zCR#MX_bbWPg7OZPozc^4e(1g@CB^~-*P)mwcn;{OJn|=*p_F`2--EGa^ z%vKoN8Q=Zum@O||mjIBm^X1m3ruAHHy*J}C)j)jy$)4zh>W^&MaW0sO`s41f@2~av zyv=__m>3S=&E2_R8b+Os&fT?DC`SiexV8NTIhxLHTdhQ0c#j}eNSh!HK%nWgs>HcJ zdA>T%DkjM9?>FN*N20=Xi2UjI0`&47X^ zTvdBD69-aw3waGc5piyhAuOZGiTShoV(=1NM}vb+q%euUX>wL)Z+LKsPX6T@Vkl2y z|3Ohpqe5-E6mhms=JOlHqlbmYH>=5Jg-C3z@l3YSdMTwP;j3xwG9DSr#AdbOlEk-w zXRMe%)D%Y!reEH~TFxd5kb@##SXQ{qJm)MXIipFY@iv^S-tE=gB)s{BT(|U8JI|8y?o6_jb}2JcyV26hJJnbO8%l5-ZuiAlQ*aYXJOp4Mzntm6P`c z9egw-DG29pA({FwUj4zEXF8wwqvN%PW%@syTETEU;x)pKHQ^L|lWTh|fp0Sjk1z6_{rGxL*kqv&5;JnvqW(jRJv)e;}EO zz@D*|AY%joNw--$ig-8<6#m~O0ePfVTRmYk{GH2YlLl~lnUg`-%{UP;bCqyhmRNlEWpu%jhNT6)ny zLjT!thO@hlkM6Qwh|P%c5BeJ8b-#=rlH_B-0mjT>8)yIVaxUBM*b7ayd~j?|`8vk{ zY_-iL0cqHJasR0(DEq>@)jc)~TA=v0g7j&M#Jt-@OT3>KO7Q0~uD!ir%r|>;zXiik zR>5Og_DJVw)%Dk`x$kF=Wsy0I!T65W`<=&CgElv9*KTd5Wps% zfK2|DcQ}C^E2E3Ow{-DVS7|3V>3i1j=Qn|E*r#$(hoK?_jp}Olg~((+PMVH^6aKgmRY^nB3=YK8Tq`I53&gb3<-S?adpA$v=Xeztdzi0OT_3TP%Bz{pj zP3F4T=HCMUYRhf+~CpOuNaN@)BNJ)4Y8{xIL$ovtYU8LT&rLB?u zPNUumsamd^Ubgs+l`vZU&gdY&3E>T+;2CJuGZKC@f+hd^-U~(v=Ew9ENk^!S_YPGC zs{60s3C>((=KlJtyLoLNEZ-`NW4dKG_>% z!mkxRg0BnQ!&$AhCU|C>`)}FNs=mqF+8X+)ch}QGOk6q3R8DY86YxX+x^W2;{R3eV zB_WJ2(Wc7&{`^y`%>+!@26XvFaXFt(5*8lSP1a9!Zs*?rSI?VKLCsU&>4E7l%y}Rp zGh2-II+v*5JRM`Kc8ehCF%}*jmO||zI|jk~n^_UbusNpCor6tBY}cBR`lcfFJ|JTl z!Ydzc@L-O_V)@de4Fgxp_2P$Y`CqAaX4Dop3tFwlWB-b`5VwLDy)22V_v#ouDF;(- zL#vkiz^T*SM#L#F&^hHI4#)%Bbly#6#&V-! zj*EaPMIy#g2`d6xvt$1mRpALjz&hM!&73Ob&dRG+GxQ%pyt5`KpG>8C=o0N5kk;~% zosoQ0h%nkH7AwwAJQ3xRTfizXHKCiP>gITNS#9yGRGGVaTr2t7UQU9LnMNJx!#5qmJ*~2kDeZ_V{4}B=grMkJxSKSLSGS+ z5Sz~GY^SohvU|Oof@?6lkoJ6RRWEfMP)t;_%@vZv8?w~8;3?kl@c=5TjeIDNTPZk( zApSS#~I5qE^TFV*>ng)x3=l&wXZ~c&$DF0_%q-BZD_8o7R#M7P|R=O2kVXBnFSCNiFBxbW4o|J z6vnTn;#YsptMgv$Z#kA|cT%)fxfz5o4*;b-*qnk>(=)W`wGdSSm=sQW%9QNO(B->(@!GY+n}? zohGq# z)zLeU3?ol>v~K7jNw;VaQNB?zd*%2Fu}lGaFFx8UZX##H)EE zxIU06hHj*6^ew$CRWGPtw;-ng>p_kfUWI0yQEgP%HEgl$`iZRuf67H_Ra4{1Ycahd z@1N}WyOb<=shfRR-egmDczo^=uJ+uM)&n{`iaX=mDYe$eAa~CUeoP|@Q$&nB=)_*e z3Nm>K%sQK><1Jk2tS(-T)G=m`2nuKOa7+!Ox8@_Ns8G-1d8F;Y2+kcS4a99!X$lnM z%j$OW^r19;l%5>hJzJ_9OKo8JlWsK2j2MBp@4vq_hbv2zKVBS{F6p^~-6LM-Bhin| zUz~O2I+|w}{^Y<99BuovksT(vJpnud(jkC`cX7WL1M|0J!6l(GX$q*7lE@_{wwmN% zxZUqiUXyHx#U;dMe@C5_SSBQ69}2iV;$=Eh-AKcjZ>)%Rf#tk%Zx;q8Uei?7vp*ewLM_F4|p2kjKab7glq-dFV4nfS4tbgVhh%4zDduQS!0wfb({}$ zYx-)8A;@mBt4(oUJjcy77+vyfaXZEQiwh#h(~#gbAC<>>+-V%F@s!sY_SP_87_36x z3DQ<5hK#{Xoi>p9*KhgAbz3QsiWE;rP)r2`%#L4cyBJ1o#bv^yG-%dC2Y7W zLJ80iY>WJy8QJ|#%}Xc0o*><+rhi^bdV^~GVn6EqYB!G6r&jGi>iN>yT&gJKs}JgZ z`?HJa@GthbEgkg)G7qCsc(!C)iAWRRkeU!hkiSK!j=gK zqdw0R7yT{c`2wHB$zjShu@wwP37|S&p6M5rL+?(8ICYFG$G;|Ab&JSu)j%0F=n!_e z9f4*TbpyiBo!S9`wkD5(EU*)3J}(v;LlUj+t!lJGV&|A$}2zgAG{p+=`kgvGK<7w}_=f2p(Ny zG6j6JuKN`)@04B|1ZRyF?p0w>QnxUBg*x7g{laYaDXp#0YWu_QaYuiWnbOQ*cu*$PwY<#v=magub4p7P)Dlsc5q>AW!Zo;b4u8UpHkg0qPi0!wc> zvGj=y^e;0a_-aZG($_;YmXq)$o|?I!w)6!M_n(&RpQ0dCwv@|SndYG5-pmk@$DB0g zq?4he>`ANp(@qoY_vtsx?N-YPPwt^ddbXX74gWX{wpW;MYXdbV;rfVaE& z(^?2cVEFLItn(0%Z7vRp6I(6XkAlB-XUIvS+7g?eA1`BekFGq^6`= zw&UwGBLQE$eiO18>}kdkR`W*oT6kh`>e?he@@`Ui9#qY?e5@4_(_81UU^y#sSvwOC zs4WMdMYlnly=U(LvQ0mSZ`$HNdLpYP(z|s0Zj@b6zCr7?oMof8uf1K16I(DO>FWDx zoGv_#TU&=IA{UQABolT`vYEIS!hT6DO<8phu%x7 zvOdD%3|a^7TFEQsvYNbGt1aB}hmLs;>m{=u6J3=i&GC=lqdR*6Il_FWSvtZmw!O3D z1eI=0P0iwHQ)7^rdkpfBLvEdwRhQ*I-pTkGmQRimb#!!;h(#_o7<~FQcs?+D-c4Yg zsBJ>&lQ(edyXE=3J)Mzd4pb{`khMz0zliR|T>k;~Smy@q;nCavkuwe{DmELaoO$~ zni~}nu^=dq1fB?(R&$W58P67HP4^MxWt5{~0xJ36w7S$FinoHj1@- zpnL(7T!_8*4R$S}J6ahjD|yIX=ZTF^)0@vSu$+q^13(!^L`f?YLFNz$Bo3u>!Euf# zHLbONfaC7cw^ey$(1~4LPvz?=%;;7*o*+QaxWjoQuYZz`!?=4?DlA(>6}l|(rn5Ht zOFGFBR*8HN{C4FPD4)eEgu7Us`*5Z{mTd-FH5$z7d`t_n?P8bC(a=Zz`rB{nq|zNb zS0^%HL+gkLXf&}2?4S*ZP?fH$TwJWnh0K4yICJTMtAt;uAWU?F$s7{@Jt4TZQo;+X ze~a9;o|WDdYK|ta2r~kFsbX|Bq2{E4s;u@*`u*q6H5ToT%v8rx6u-M`leaKZW7U08izfyd;!p40GV^0BJH-|KYb zd%AwT`|!%sM6jaA?GJ%646`yg4H!PU<=x8(^ZV}U@=W#ma^%opFoU;p@(ojNvqQc~ zz50{&*R}yQEwT!X0M6p7!agwq`rxX9djMo_kSZ3tZJI9gUF=Fy&dw7oTu+g4Kc;m5 zuV}YxLmGY_hJU<9(;fv0k(#(nKD%mOtj)ES1r!%_&7Q7hP&6+NrCZfnbEO11P0{{b z*EC1@3>FKy1Q(WfZ?9f63HENev&2>(Sm!X^{r>0%^RaP)YGl(b)+kpDj0_b=Q+hdm zLzjClnGDD*@rGM^i@JYLvlcGe;%%XmOtbZ}2(x_6d^;7?rJ~xCi)fIX?E0fNP$b?X zy=GjV)anwF<++99Lg!VgGgHHBsR%NN7fudL!G4Dzh8ep{0ZJsL7*Bnh%l+b0MM9Zv zqD#5FtmawYVlJGcD^Z8*e=|1dSmXV5_*hSng%0Z&-;U-X$Z^nD$g%Iv6lFyAip=tQ zWP80&aJV0v0v=BiBf~y7oJkMZw~GzjMSW$<@k`WG+Ry3csbva#a7lcB<1POVAy`kt z)qkXf+7n9ZJ<#8QdEB#!*1=^NA`wL_;EHKBGuYL+OyD^-nLDrP=W!P_BL%M*q17Yp z`ftH$-qT%sC2gN^Q2c}tZ&ObW$r0n%9aj(s4L0Z%FN1vL(~XKs-{U8TM~*BG>BdjO z>Oun0<>U%f&m-A1ngt-8$pXUFf=omF*cAe@xvK!`J0u|`Px-3nW!0hu_#nZ74h&Me zbB=#aLh9yddAaR1cl1houwp+cp>Da0HG+LyiRW%6o1YG$8}HgTxNR;Ecf}#%aS+pk zF8NS?glqm#pWF@3e^LNbX)jo3nvr9UR(@Vzt0 zmb^Uk&i9<{TQv8&5VU`rNJP=Mm{@>KGT*bXc6)V#-@0VR3PN)3I&Hw#U}gP8e4@b- za!|HKDM8kI!GMTLXCg}6*C`P;4KlJxqELKd?VjddwGNBF=jNg3v+vUl{H8;h-l|0( z=s1~?DOP!YKmGWHkzx8#vDe_~+2Yd;u5}Db_+h|WmIRY7M1e04I~<| z?z?_#ghZoBaU{#Qg2Y7v)d@d+VLwk|uMZ`|gz+^sr82e&mu5GpYZ(Ha#BJj@wTwb233A;bpXcVuB@M#m3L~NLD4AAI(jUcGTp_E37678 zcG8d8Y3h4{S+ZY$1Zl&j;ce9xepHEu!_zu0wEw6obLcxsz?prS%)|;UDy;q@VFznU z=Wfe*+CCPSdmrcCGRpgwfPGy%x4&(R6%so^f%|efGggp^2qcVjDKlDg(6o`^(|vmN#t?TnXN>Y+^;RIx4KA#M}AJ9@WN28k=Z3LP=xg(~HlCE~4LEEUWB3`{Pzb-&}T;Vl#|s5#>>GF})KPZfB#% z&;7A1w8o`sli~D*?h2V7;FXsnTxPcu3RkTcOH8M%_Mn0$gUp}}cpu(N6n;hGl|t_gkpK5Q>^RIUgQS~7V0zz5wG+{Q7aB>wK#bKTK3vYod<19s2l^t)RI#nh_&NKK48f zLAXGvuNVER5tiU%G_=g6<(i*0?E=+a*Graft_A2>AN%d0f6AA^G4LNg#4q2!7X0|! zFC3M;!hT;3GkQmQaT7vFz9nh-MduPofQc?dIV1v#fF5SC(7B(+~x{@iqTtNfuFOpBH*m!0}JnwFrTof1KpbAeD&5dKIM?&eGv+XWhjaUQoyC zItPLRus++;4&^q;wX`07?#^CwXUBxCIo7UuP9!E2+8n^#&bK*`f5XW z%31w~_wmG*&$^UQrf!?eBX_CNYR@J2^%4EBrE)`&#G;oux3dzEo4<|>Ohc>Xsk6=I zdBc=|;nslU(yJ3Q33uFn=r~$=(}P8E8)Dyy`diS?EruJ z{Uw7}D2KGO0d7H%ezn;3Y@&7vOGas+*>a?xb&iQE((6_;%yIMg_G1+9dUGJ=NClW4 z7x~{VFGJc3%`5O-3~Q{yp>7+=!W9J{JE960eC|A!r0R2!Gbv&N>g#z$n!E1H1YR($ zt$T4Jo_ob13pJL&OyEl3kEWEh`$Q>4>Q6lGyo9wypHt88I6OJ>mZ|Pt@jVIEE;;la za3?0t;P%epg^Zh8WS@I?Nhppd2AMbm(DY+K!$ruJFv9eAlSXvjcalE8GbQU{tk`O| zM6M|oD_70Ze|+x~JZh+JnI*F;`sxC5_jlzyuv&`KwVe*ECm$Q=c&7>vt5C{O$>i>#ZEn9! zz|!zG&?I=0B_esjtTKZiTBbV=DTty!!Gif8%qaiM2=m%Izv(XqxvA8E7vjA}nA9!2 z8DafFlP|xV2QwiW_sZU9M2g|WuWAqHq>x@#yoUDZhnJRK-d&Q1^?1##CiJoqo8x*g z;s8a8+1~l2oj1>jmiChZJf-;7Vr!?3ztsz{isBl`YAhSaxP>akP3Omw5a46?Q_7^b zLn*(SrDh+}&P4Bs#D+F{^;HDu!2{uQ3M{bS|fc|or7=^JkpDN5POc?Yh`K~c{a^JkNiaoSmAgj}On>ezHulJUt z3(lT$-k{~It0ja>MYk6+%@#jeRbaQyM7r&ToqTyE?}iAIU23UtyBPI8nOyYR0vVIa zHG{#IWBqDp`QLlB!oavQoTS?X;fkkb!}p}n9fh8wq?@=;AvD4I^mX-NQy3C zWaY|v&@Nbhze0@I0el@>jnT5NmY|Yv7c2N+Mh@pUZB})Vxr%!vrc73SFpdaj!L}nO zE>}e_5^#{zJ~e)Qlw1d9iU9mFF9WsRszxF=aiGXf$cr^}5iDh{Sn2BSYb%v*A0oCB z0?`GHz3|4}Eb#!LPv@B>G$Koeppd~2zRw3zz!Eh zz0xAQuj3BYOmV)AJ%llL!UQ!ZyoXzYW(ec`-}fA#!y&pKKwD+nnS?p%Ofb_Blmy5j zNmNiK@UZ_7{>(E195uu>KIT*qf%r3+$x8~n(lAzD?#_`NNvS#>1Kx`*XPW(_(Hb2> z;v42u?V)4v~EHuu;Mic?~{_C)0Ta-Y}xZGjmp@T2s?%{879y z>R^nyt=1pZ`Jfk-jyjP~|LOkp1i3k)BJAUYy!jo!v+Y`bOSNHkHYEo{o1%ZPGj;iM%@rw0fcGNLBjV$EM&sxAltlOB_=L%L1w%&YeLeJ^ z)j4JxwGsTT^?F)+&;^H9s6X4B?7HX9){=e=BE;c!Ih73bTQzrGCYcW&QA0S$lVj{= zcBKO_lYRp&xdV6u$T0*Ltoh=Kdx|4krp@H9v1pFV^w&`4KmLc#fZ&;=WI&dr;$Qc` z+kX$v-LuNf7uaz7%y7@QOFQ*f&bi>2B^nb=(?tr-t;A!d8x!>#HwV=oa?hSA9?oPM zr_#8$H?4(hDjsUsQfLj9l^Ciaj==)oKk8v!@&1QI|CefLA`1>0&dACasqn`M`sg9g zeNFy;wAd*^J9I(R<$^<}KV(Kg8=3^0)b{;T8;wSE-{CK_KzQ?OACLj>t>trohV>{q z{_*~kQYS;G!E1?@l6o#4#QlJtBk3N1;#8+=(GeF}Kzo*jSW;PX{Ho#J4Jd&={FXj6 zon@gY9w7VMAQKg~NF*=j?vMai6I_%AdRxA;YHl;^pQRRK*&Jl{A&TF>?~lVqN?c9- z=EER(>%WJ{7?sIM96KR_Iw^*1yIUD%K z)zHD5&i@y{H>1KG%n<}8+P6(P439F9$SeP#rTBMSXO;^*mWC{xlSvaSZ)HcIX2|pq zlHm;TKU2j2?~6?koOl&-J`0jN0fmN*4R^npKs6pKrm+q$H@H8WD#aJXEhyFi!nC_VR)#Emg7fi!enad4`>Ch}`H0 z*$RY+rLv-7Oy(c?7tY&5m{gO^fIkutB(V#?!`tG%L`Ct$2qKdnYuX!Va0@y9V>$nO zVt>N@0HpuqN>hGO1P2jz6rT=m^}3Dw1y1*$kxmxF#`G3_9M&TzG|csR0j*hI%NLZN zG-~ux%{55PRUGqqfzkL2X_a$mqsE;@o7;_XU@uN?AM_gxW0$mS0H|rmXI`&CQx$Ae zd(RwdT7kyZc#&}C9Q236q^hGm+e`{|`%(c@?#+pJ+~v!xBF`w1<+U&b)-z``od56p zE1(AhmA&LhDK=Ch_s|}dcViAY)b94{C%*SyODrkq!CC8Cs_(j{qgnVF7$mKG%qKZpyS}aZ9_a; zW@^=^-Jn5lu!{$Epq~<9M2s9}y*kXYG0fsd-{sL)5wa1k%crw-C?VCMN#1h9S|?Ya zRgD_X4`n8DCdwcMutq?xEH{Gzng>-sj4hVRXnUL=MvN5j4ev3nV(sUD5F9AoR4)!x z!#ob8(;fE1Acd_V6+;OYEO!3zp$`oDuo)tm|2O%FzB^^59y5TofJq%@{xG)O`~ju} zRq$8c!QZg=jct$h_}U)oE%)g&(fm%_jy?Y4f%H{w7? ziZ?6fg5U2QCpnL<(sy~$LX3C{fnV~}o!6)}sTM23!!yu0_JE1U3&p<8ZzUT0djMUP zT@E2Y`2>n1I{p;dB5mAN!tRpsDw9%a#iM4KegbbkOP{B;mSwt6WwXCQmuUBNNCLup zPWseVf8VqR1U8GJ{f>11>6a)H zm#Ng!>8>5%cdqBmbJ?<*H`;?rlB(lx#wi&9ZtP%< z{xcV^Y86~dok%r~b3bTQpkgT?{~OF1nmf=Ge%j+7m+DmyrVIWNF)q1-Uaco!LyIr= zwXU`J>vLItZqPoS+Sk8mt4mKtdpUCz#Pld+nJt>H!;D!hX0Jin_&(1?K_;lBI@)h` z#nbm!o<+j}LU^-1>(K&bW|4wU*Fd398xqS`4qUE$FoC=wM6AiBNGz33Nz|xIThQn0X-00yDRih*26)H73r_7pXSB zWsh8~a}e)*6=_=vZ_loT!*2335iH%%Aivl*L}->1;fx?4IyE>HnNvd3rt5^I0Ic!g zWR37ghpk>EJB^{w2}s?~a~ph^eAuLOy#)b@NTb8gOqo?|naet$7|S+a1N<`8ZbWNt zS|Duo(>Rr?SzvTZ_y6e%NFLJ~Ku@1k(#DQ7=isn(&eKZ+cMxfQCy- zR7l0>6ueYc2TPItx%n0*uuIM2@X#xxgnMG<|0*^goJLG3hrUmsR->e)Dmeo~08aCz z43F#YnR{%6vIBcK!MhhwvIi)ik9|okSAFoYp_kGZ z2#5;|(9pqRC}DK*xlGI{(8P{V*dd)j&PY+{UJHTVT$(ovvMk2B$`meEAYZX;{TUdg zlFpR$ty{cwmyCWY$xB*a!%HN$R7VD=A5c8)|csGi(OuK;c-V3cp%_=fM>(X?^+9hx9^a^1_Fy2%Mxsn%jVSS?2KdtQ+GX0@Il3b()PVF@UI zxqg(&S>RHK-X{2_IxG2PCB<$&bUW+Ck@(KPy~;Ds&(&5P=mClp_}?)7rk{$GO|_>% zAH2{WIMShA-F_Uhb2TS0cc`3lc9j!PJW(ojhHLpAOr01TD;dN80Igc>M~}fcm#F2^ z5`M_2lO|kHTYGbVe`k-NP|GY=;!xgo|Br=K>dE+Fbz;6~j()sZ__^(&Bhquzy<1np z+nWT*X9pkT!fI~V=$zuqn^1*fKw@FcG*-7I0R^7QfM>_(h>jgz*28Q>76)E=)#ATA zqoenf`sbs0Tm9;v{vA*Rof}3gY!QHCfJg1*(0XQHE`i*!9_{>{lh!V+bR7=9}ihVaVY$ zXGPals?v*mZz2aq(HBMEUcE`4rryr8kIDZZX& z9Ct=eAlh&)ug{&B&I{ZFw0NxyBsh{n~^UrS>RVTM?^8)Lylzy$MQV z@4dyU+BHJ$*g@^BR?XU5iyBp<_TIu9?eF{M^L+Bxv+nDhbDitC$GK?&uIAA6Yz8>) z#Kj$R>y+?qJbZklS%8#K_YTxjY9r!rKs4v+kJn~sF?q&MWfUS5_*QC&PL7ANH;|ti; zyZMUV6skC_iUUqJ2gxGQ|7ao4tB z-S?jIWFvG`Fhk)LL1UK3?xLz=`#Cen-Y71!Ot~QIyE|#t8t(In&e?YP8_|cIXkRK? zZ=RGH-clezhq!a~0YcLy`eDY@g70IWMpa&a5;8-xvWfU~?8hGTTh842WE*$)uwl<2 z?CSVRY({&|`U8TKn+-j-28u?FTNcDybHge8zItKM!UL8V_(R?{g{FFR;hBQ6fKqmg zQ1(O5+jyGIyDt~Ua@2L+_LexfrkSSZ*S?<8##1NmNZa{(QSJdZO#pPalAr=m+R19^z(uQxh9vf|`J3o@o*rh?=_0w;gA1O40eS*yFp- zbP=jfSS7O>D}jx~tBQH$Yma^NH@dc4zJ?~gpJ7k1MUPe(UBuj1w1hc~8Y_1Uxb@T| z@n~ljTLstOG~aDrd!M_}j|YpL{Cs_K+jw4V_n=Pa>5xyPSQf}GOL5aA@Kh4-K)`8? z(>a%Bv<0R~kp83HYWUfh~4a`3M9 z>pc4Qq842Oy;|LXSB#{#OQ8h`?ugZX*uQa^-Ju12njW6GbFp?=u@)mNJex6o1$pEZ za5%$obyShQV74Q2b6|Za5jrfnC>Hjvb$zP`%br*BM;K}Yvmal@4)$b4kQ!?Igx1_@ zPx@icm3!KSnz34s4)|Vb1n#Ke`Cm*J`8fRmX}zpXvU&^iWZFyh={2P8Fq*S$@)(v72{jke5Lk`u?m&A!Hfyb>KYDQ5hSdDAkd?D zG}pwg%<|HUlY7)A6O9nZX0bL%C4taXlVrw$MvPeHbW5xK+li*yCRz!&rsM?2w9e}# zghut4LHS*b*N?W>pKAqFVYcor7DQVQcYoH2%QPQ%qp20~DT^#AqQPy)mF=9=-OgR@ zzlFb=Ktr%1({wnErE;N5V?(L z>X3YQ(fmaAGK7EQfcP_(#|BXLNG>IZ-)~tzm4Q$TlR+xeic-acbO+o>RlJABZ20945^LVEdo+yChU)Pxx~sCw-Dg1q`I{` zUSoAeTo?4%T;iDxU9))hALZ-vztN?mbTKy0j=k<s-r&*gA$Fn7HJ&mO zdvx%dh@+ls$>!Fg_A^GG^_&8Zp=Ya3NhJm9uWpag7Q8$O6dn7@aunapJt_-vah&o` zEK?6C6(gqaB?=2GsLep8mK!xHtvNoWBM!{g%%V16FB=n5wF`-paML5r#HqHaQ+6!2 zsXh1Ih;swWST~U>*=F{#e*&%3z^sff2l2!KL|UzY^vdI6Omco8y1u9>A{~StC$pg%DhFj5~tNX#m-Aqu)-(K z&tE7-33-T&&GapX$c_#qln78zwOvRRSHBZL0~j+neR`JRcu_Ro!!+9QXTF(Amw!5f zS%XPu_rs&Lau1wsSFPyrqvGEu_0KoMqb*oA6l8I`BFs0ehd0RD(WVM6KUcPFan;|zruy_=M*4|nDU1bmm3vxV*0l45rGZIAkH|?{ECA8UT`6(~cUiW#x!(8hT38%)ra*Oc#2gz3Jcf# zf3e&4urss@1d0r&w?_0?IapL#A^I~7V-x+%e&^|_y~^{@WzuA)VVq-Pjx{rjPR5ay zgop@;op(P-sLE$BZXXp=!8*? z{nyqpS;LJ&DdN*m@Y2_s z2JUI)2f}4zys1E0s&3hK>=r#5J^c2%6&n^@{X5Tgfw`DJ!KXD)2 zkscL0Rmvhf{RoUxE^KyOQJuo`KcoiMTu)9Ij9(nSGT0o%GQvcF@FPbPQfl|xj0Y%4 zuIbb~G2dl++9Sg)pWIytb{5vXi#vbZU-0`>CyRv9P7G9CwG!?0X5yT7W{w!XbYOQ; zk!(3Ry^gojiHm;~YPj1ylFhlU9}cmJG1m7+>@T}D=jys9=%{kO@5xRd0-jF|l~DHk z-vobn=X}eX#p!95CDE87_(EXR&tII3ynQhjTvYYEbhcj2V zjSx@Z_~pdDNpAblO_Y#a^St9HCk)Zs@V>GQX#)w9yFc!0qppkF$Ddo?SK?-~n0RSK zyg9t|?!)jLyLq)fsZ1_r#*-H?k}Jr!8*i;R6;QQ*=q{ z>2WIH?jNY#3%jvi;>rws!2$QB^-5Uu4}3XlaHsXgVyi2$ckz=b7$(W`<$5IDYHjQE zWOHR&5jzSEcCwPZnRQ(>Ve8md^xjxL1qp75D_Rl}i&^>oSiS7H((!ep)Qsl>(hFkhN7$acN^W zcOq)!?aQpy-xby>Rd@Y<9$r}kyiMH9PTgf1BjZmM-=0hPR425mYZhZM z&6#sGvP&bN!Exc&wWCxO_8Gcj6e$5( zF>x*-=8!Onr`VW}&?&hQWt^Thkr!Gn>Y@*C(`qy} zF{$nlYpyr;Chp+LQr^#LW4&ck42`qiH|DI&qVaQXcAtN$xbLUu>b$C6u*Q_^U<5Eo z8FbgeyEX{ClNOgq`rk2L8jZaBiSR3_*2`L+hy|m~at1G8LTU#qfh_v<%olT%Q<&J?P5zV=g9A#KkF3kipNX}=<{j@O3ZSyC9K5M?Jcl%mxkR~kUk zIt_RNw3vYRP!7*x&XBMV<6gx{`ENc{m-8Xz3;>DDMUU8X`UOAze$5_DNO#7`7%j&)vs@A?et^AJ~opqbNtVJ8+~csTl`-+5(OO6A^n|ZP3f`Q z>+hTJK4aIpQ%gacB?*c!MS^JYv#Pen_?Q>14)_dTu0chx7!>P@U+gQD7RBm5&T+vH zjIMkN`dmLT*v)Fcl2uIIFmu`KHr)7N>a6YHjed!zHYEvjVj`VbY2RZ@Ullk+`B9IY z0BZfGtCV6OGu^rFp6h80^-Bi9%v$n?Q3~LEl?jR8@0+mIt{<8Ca3H9?mq`h+^#I;Y zy^+KkLHVmsn1R!A+%x(Ug}3p~rD~-blP6g~u~m_8xogNa3!unW(?Aoi z&7(#pUGhzBUr#S-?`;7-ln6>S$=EkRMq0g46kNB%U zpRmEo(=m3tUV?DT)IrGZJ}x%}MhZp{l%8&d2~F(tiPX8+6aNc~Yd6(_Y*Yq1@L9+H zEE)e+=d=DzBf6syxN2i9@ez z=f26YW5vL};6*25f6Vxst${T~g)HllfOyXB(2OC3L_B-NrdVBz@toyp6Ig)U=~v7} zSJ@gQ?B>^EQ?;4Ou$fkGWC<`uDy%3A&Fs-#9j(kH29R6iVevGJ^Zb ziIF9fv%Lgz<`r=83=GBjG-0|xFsgUxON7A&WnEJ&Mw~#p!P0?8ax3qQ&poEWrx&=d zBfgaQ`^_xWwWilZp*?<_;;7j5u9p=LGdNQsxM`?hig%y%ZiO_6)xrTHr2fHSmd{WU z_5?Jt0^e=qLn&%EU-{#VIe?cEfFA-cod!H%#NvpPM`} z|EzR=aL0v{d*{az?%8=51y_s`6b&17U=pFHkdGZW717jr);&=7S0^KMqW@@P2(l8d zz~L(F$)8M3kfth2buqe8E-CjuHj2=EZkBjz15+QDnKTi=8+eMBU93x@j=<)2W!I?_dla5ln{)Fg(p_##wP{fwS zE4ecHZG_P1%t~>rt886-fUZugzGChWdnTlwp_P=?Ss;A<#}b8cvj`UkfDR2nN62&! zff4<7R7%&83?4?1Da%-+HOD5`?n*B4T=OPY%8ZKjxR#VgXaRW&&~EQf%#b2qS9P7V zC1?KVupnwvQ_8ZMoSov_Qi2BvWOy;spJ?Y!MNOO#4V@4zXpR~6?u-m}oNz*Tof1{k zC1=pr?+rBr^>0rD@_fNj@|?gjUbhabD=qNhnJZH!n=E_nhpl{@?SQMtCQmCh&YFSK zMcc6Xz)!gkrkXkLaYh|liO?vt7@Ostcy2CfTq}_N$_X0t3p+R8(pAG-_fVCm!>`Wj zKJmpR)1DXi`b1{)`DbCPe%ZXB%BT3+a5V|mDevkN7_^b`d1)HRZK|Ne9o$!Nk2T#l z>_+UdZ>&XVoGW|sPq3%30M;Tz#piH7ZEfe;w$)bq879V}Mm~$LwnV_g0qJ*X!ou~JEQ)XvJT(tzA5*H*V5a3WE{edWlVc0}++aWb z$QafzBrLY6pcDqH0Gyo%BmIAs9xXTDyAB#4NTEXp+S`3Zm0d_C0kt9hF+&1Kr1_GT zYmVx<=)=!0xU6XhQSmkzf|YS(r|Y=v(}0~nk_im2{b*QV4&IE49!!3hCp>$u$5&mz z%$rmZce=~2eA>SOTlpyRFIFgfH%h`Y(A?{x>)GrsjDjlYLCf@GpCKZs^c+(5$bXo3 zMLaX5z-MwT?wc$#^P1`ddTSEc7L$K0Z_Jm?R~5p_xQjpSVCFl!sZ+l2m$K85C+Z!y z#viIqKV2XM8ae(tl?0U7i3olep{@fu8kK??ydXrp!YrqpkC$EiFHqnrfw7cm;tDOw-;Q z-x+7*JWM?4G2}id&mg2J|tOwQQs)-SL{ZwLul zdYkiby-H$44xfw~u&TIz%~^0Xo>9BNc?IZt>Ip|T*M?wv%oLJ4|sO-dsO87GnlG7+^-rX4tf)c0v7b5L^ZpX<^x`KFR zx0%^h%#~4Ha|WhcRoNo}zM^?qlRqZ11^t68R83yfj?9{^_J?cEGfhOl>igIpA#&|Y zPmcqrU0IOB`wJmd_}<|(sx_hOSx_{0EV>aK6~OpohCiMaMyiaBO2+f?NK32U3h|Z`JDR~vqW5)B?)*uj}m#f z>pWE}lR>t@9b`05Fe%&r@>YW*3FB`|={m3lL`Pk}Lcn(REU~GjU;kj+Ny4*;J|>SX z4Ly+s`+$mON6R1$$^}fZTkU!+;WJ#L>ke0LTd(*+=G;~Iucu)re3->q)%nsz4kWPG z6q|o?YHEKCV$_};+YJsU$oi68Uu9g#i)UY7Ppz@F*Xcy8V8qP66vO);&?5IhQ-dP3 ze-FRAYsndM-P%}R5XNm$& zM5|uZyf#~hCcpDKN2}}g-#W;5cpHUvSkrxxZoG8(>yB+-u)wd%Nfe?=#nS`0!Q$C}bY}UTk4)FEJ zfd3NTTee=5#{x(y!ClYSnX>y;@pJvZsHl^xG6+=)r^G(}me=wV*Da?bM@J$uHUjSD z;h3C|47aHF+?@^VnBOX_Vo)^Tgz@BmS;I>a9*hR7vYYb=NXZNNfns7U zDG3Aac@IUMY(;!5?WqyYk+)d8Ureo3)E11i9^TuwMH$`+uNe_dGn7G9NRoS#Tgh-A zz=#yg$S6fCigtop@c86q)|m7C?e3Ek^a~~sdyFaTYx?5Mlclxg)HcI5u@whn0RmKd zk;k!HKZmvubWhAN#ka8hKdNj&j{sUcTfE! zi2{Jz*tdEe8lFMj=B4|~PZOaccecrbsML#86OVw;{4*4YS*;jtcdCrCZa`kkn*y~x zfIIuy^ofu>0V?6cF;_3S1x!9Ga_>Lz7Vr2cG9=*7F@a?8gkPXn0^d7~ufE2n8DUsU zqG19)btF6(*;u+Y#$E>I{P}l(vFB<9XwP2OGg@QK@}Nu3RJ^}`XKujJPsdqPW$C2z zpcab%TBoK7(0(+wYEfkaBX8>HiIUD98Z6nY`$&TVqywA7k3~uJPGhGnWKv-f_r+h; zfWnt82-V;GPULEaOXpT;aY^!WBih+ihv`1&NGj3Y*%5KpxwpqvwGsr^Payso7^;hH zqydc-E{s0wP4KO*UG8&jKUU0fB0}ABiR9u#wx{=AkHPUodaM23te=Tc(m#ELlB}r9 z6ng?(992sLXoqH%EmbHCuJ19&WC`MJ$wGz)&YNkE+|pDs5dEWXG;{(SBONIIwYsk@ zgvq)8+eIhAc+aNAP_ zN;rHxsUiC!kX^=m6=sBawj-c$lwq5WqM3wqwEvjJCaMGS0AXa+QHi$&g2S3E^k-#! zHdDD3>QPt)Ei=Hg_N_-Yt_Mmri|@vwmrIyz{>i#!SAYYK8r#|`3zoWcsPk1UXP@;~ zlULU*2dpSBmDnY|=%cArq=rOG3^Ur93jLY?Cu;9CswydctTTN}O@I2Id z`fnQtkGC8>N!QTP39vuJEp4`6Wvn)lZ-1Jd>cM!ArO$x#pLZ+34FG%`97!~RZ!vqi zWlQklXv79h3gW%i>SNu%>VYqydT0+<^>eP{ciQ>^;HYQR z)cYB+zoH5C47GX85>AN%G>i)S*A1wV3K(QMcj2TLce~90o)G{c9n_;0dDGdu^^bh# zF?1)Uzt>is{pT4$&2-E0C=`C4I*C)c_zRb!w8xw>PYC%#l#QQYF8U%34PNv$&Bcq1 zdfwzZnv&8KVE&T?Rsed6S&=eH992E9t*<>N!@A+0IULe{gzRPVK&6%&=FCuDbU}jd zy;9I86~Jdh5}4hd4vOqVjr0o982%SGxBw6_TmzolNt||dER$5XiO_D#Y4O`gqU>T7 z`T6^y4m5=Xva84K4P``Ha z4ILOz&@^d@U0I2tJa#w0eTNUAbJ7RAFD-yDkzmy+3~o$v$Aw-@NmM@g+nNK^bTA^g zhQ?;>U3;JIM2gax-UG))o~*2QM00IQB<%S2XYG@Glwr(57EDejBuVu8iCu;N`r~na zyW2sAq8$nNA_)S74rGGZrGEa%w?FO3QCXdl{TXqT=1L_Jr6}fJ@7$Kfh5k;jmo!HNSd? zYjaaR$V-+~H-7*Dc3s9nFQH#BqF3Om z35UM1#h)lTZWwOUywab&EYj+U>&{cGg71khCttjbTp`J2g<(H4d6=oF>15{xT+wKR*;{?3|8pY#8WeLxKepqJR? z>$d!rR^Z#DeM0waNX%Y5^ab{mFJRL?5kb)4G4KMWvXD0IOM~_|66gp&Vcw`f=U!%s zxd+wXT|e1fOn!as-SQ{Lzi9I!-WBHYdTx>)4-lk6$G{VvR?vN1nJ7K*XH1XN(pM&K zJ?Y1jTUQL^V(!g9ulV_O2>d}sbsAklx>?Azsq~1{bAFJY`y7xd+_muOh7F}snnBzL z_43WaxX+jtvYM&2W=gqVevuzk%paWk1LS09|IMX!W(Wj-wrD8HWmx!pWFkTI2%7!` zDnqLJSVZFW?KcFTD?%1KY=H1FO*IkK*3&s6DhIqn>I+vo)cE9H^9H(z;8wG3kJ$l>bxvTuOAyn13L)p(Ov)PJfle zO&VIm!hdS&pSI}m#iWyH?W58K{4ZGVfj0#Z!Y?fUq51EBSsQSNzOtbp22b^gLPPx& MWK^WfrA&kW4=$J1KmY&$ literal 0 HcmV?d00001 diff --git a/pytorch_geometric-2.4.0/docs/source/_figures/graph.svg b/pytorch_geometric-2.5.2/docs/source/_figures/graph.svg similarity index 100% rename from pytorch_geometric-2.4.0/docs/source/_figures/graph.svg rename to pytorch_geometric-2.5.2/docs/source/_figures/graph.svg diff --git a/pytorch_geometric-2.4.0/docs/source/_figures/graph.tex b/pytorch_geometric-2.5.2/docs/source/_figures/graph.tex similarity index 100% rename from pytorch_geometric-2.4.0/docs/source/_figures/graph.tex rename to pytorch_geometric-2.5.2/docs/source/_figures/graph.tex diff --git a/pytorch_geometric-2.4.0/docs/source/_figures/graphgym_design_space.png b/pytorch_geometric-2.5.2/docs/source/_figures/graphgym_design_space.png similarity index 100% rename from pytorch_geometric-2.4.0/docs/source/_figures/graphgym_design_space.png rename to pytorch_geometric-2.5.2/docs/source/_figures/graphgym_design_space.png diff --git a/pytorch_geometric-2.4.0/docs/source/_figures/graphgym_evaluation.png b/pytorch_geometric-2.5.2/docs/source/_figures/graphgym_evaluation.png similarity index 100% rename from pytorch_geometric-2.4.0/docs/source/_figures/graphgym_evaluation.png rename to pytorch_geometric-2.5.2/docs/source/_figures/graphgym_evaluation.png diff --git a/pytorch_geometric-2.4.0/docs/source/_figures/graphgym_results.png b/pytorch_geometric-2.5.2/docs/source/_figures/graphgym_results.png similarity index 100% rename from pytorch_geometric-2.4.0/docs/source/_figures/graphgym_results.png rename to pytorch_geometric-2.5.2/docs/source/_figures/graphgym_results.png diff --git a/pytorch_geometric-2.4.0/docs/source/_figures/hg_example.svg b/pytorch_geometric-2.5.2/docs/source/_figures/hg_example.svg similarity index 100% rename from pytorch_geometric-2.4.0/docs/source/_figures/hg_example.svg rename to pytorch_geometric-2.5.2/docs/source/_figures/hg_example.svg diff --git a/pytorch_geometric-2.4.0/docs/source/_figures/hg_example.tex b/pytorch_geometric-2.5.2/docs/source/_figures/hg_example.tex similarity index 100% rename from pytorch_geometric-2.4.0/docs/source/_figures/hg_example.tex rename to pytorch_geometric-2.5.2/docs/source/_figures/hg_example.tex diff --git a/pytorch_geometric-2.5.2/docs/source/_figures/intel_kumo.png b/pytorch_geometric-2.5.2/docs/source/_figures/intel_kumo.png new file mode 100644 index 0000000000000000000000000000000000000000..750b48b7dd16ef4110c26325f1545d83db363d8b GIT binary patch literal 29952 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�ckz`^Cz`x(D!uGs9}-mpy+widh>AD4UL2^R`)DU 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 Qf&wmCNhOIYG2@{B1C+X9F#rGn literal 0 HcmV?d00001 diff --git a/pytorch_geometric-2.5.2/docs/source/_figures/point_cloud2.png b/pytorch_geometric-2.5.2/docs/source/_figures/point_cloud2.png new file mode 100644 index 0000000000000000000000000000000000000000..cda756a7dec30d30679e663df83b5e92c1a99c81 GIT binary patch literal 42965 zcmZU)1ymg|wsVFarjDUv#1_p*KEhVN51_n<3nJD03K1(wDD~vurlq^L>6{ST*Nfe#z z%`9z9!N72nU4QaRi74TQ5s#uO*9cohIz;$&k16H)`{0}zS5rgqdi4|R|g6BJ#%Gz({I*Np%|g%vDHFR zT>{Ok2RH|1e&WD|~F}xXFHG zcBgM7j|}3_JrD(-r0@|U^|g4w=CdB98O4<(>yQ^rle2^b0%LJKXO*XUGT&??l8hRJdIWd7=M+iC?Mdu33 z^)gSlr<|=I5S9RZVQXXO%;UjN_FoV@pZR~qjASJL z1>$1OPo^QKNFr+QWJ;01Gz@-+#gX|7!jp$Nzw7es?x?61BJeWa%RC|61n1k^gt) zeiut{;$$cI}0H2G5$}R2_Rt6N!Npc34uwA39EX5pSD}N5DvQ@eqEDx zfEEhCkK)xd!O|38=&+!XrqnJIx7AMZT3fHJ!@0}cy-(%dec~fN$mDkR@)8(pn*6G* z_V7cpvcXhy-z}L!wroKQG1Vyk`?snsc?U?ipCs@>P>oL?WM~Ft@v?i~X((}f(XD(5xum&xka^RPF+`=S zL>6$RExznAVeDSH(~!vE^SGbIpLpx{LZU+RXXTb`75@M~p$2gOL#_c9uxLAqhm4;} z6yW0Yc3{iua+1>Q`x2YR<`|U5VVaP}Vws=D#6WMgb}M`y7#865bJK5c8BKoCZjFOi z;Wi!8oH0!{ShU!80;$$hvs`nUV-}eB(<(^aBX zX}W_i6ooM31eU_qIOEI;BdXeL?k#DgK+AlnWIFY#O*Y=x`!vo50_H{2ozV6iyN!fG zWp0;){HOC5&hcn#9FXR03Fue_?;!i6bKv6oAD5An)%3+54m=*`2~VT?1Z=A)4;p;O zEo`MUiBt$j**4f?S%&YA(I?}HquQnoa`={;;PAD#)9NXeA7gdJE zdEBI#4K8jO+0nu1?Cz)XYhugB7yzU+S@qu;_Q#KXj1{bmmD&cyNY+aHsa0uuZ>^-Z zG^onP_`d;gi7kfmy0|~#J)BSBW9;$x6-7|kpj6?r(i=x8#!AICCX32B$Ep%>#s;Zg z#?YXWLV&Y%G-lGyiJF}z*`8`!cOsS&!JKwlwO_{Jw_OlXEt}RP{vLgFpEQn14o+mO zmsz(1JHE_23gYnBG}8=wyT)FYVCt;#kr`l>!Ma}emsqDHkGIjNo;s=WIDJhv-5epf?86W;-1>5W-nsZA zec7>Xks#?S{uH1%<1YGe<$T$_MIU#)9{7WygAspoAs_ayf8l&S&cHE|CJ1c_%}o6x z`2@R70$HRqk1$a80RikIy73`nnY9?Se`BsCL@*XP{8haP8{FM-tA(vPFJ6Txg`?iB zdu=<5yXyvYf~E*DkfX`2FXa7Zt>+6VYBpG{cXQ#_GMSm^>7$ExfNbcZ658MV2Hs*R zwP|kXLQXjUsCe`5Uru-TbPy#TgA)j-pSTU)tZJHsD~pC)spj>awh}yDU|#OZtk67U zzTLYi8pp`JDnST8!@fSToh?-I9;j}9M+Avd z8Z>?p;**EZ7XXS5r4Wv@N|fakMz)xB+uYQbq^=Hot)a0O>5gUlrItRGMWj1t6ff|@ zMj=Bp@m@Ai+mco2@(ADM8o7`|=Ee%LLCtZs6G$a3gOt2>rwXU?tMobz%`D6>uEMpx zB?qkYfH|6@8`b5-f5r#gBn>A*r6|;%+DU;fGns6sh(Ngp@)%S@ zr-|P=eE(A1oc1CDTPJu|oR?3lNgRdtd^7-S#YL4pX#mhTN`1N{W$6@0&qPnbh2E3C zD7w6)H_VuP;9{)Q$Q$SCi#niisj{_{aI!MIb$s$6ll`TIVaeS6;E#eeH|Ljvo8|^b zd2aqGRK@*UYqQFx91}x{v}7rIh)Z1>fjO(UVA3z}7}>LKXtaWSUV1BHznd+Ww*$#9 z-&JtNIsM%fgKUF}n6?&z?nCLuW}a%tF9hnx5}063Hj1vQYF0V!f8h5X9BC8h)Yuxo zd_;NZ&XPaq*E%$$kvFv1bC+bbJc$2(ygFAY*3OxXD4#EBxq+iP5ABNUJ@Q$d=KB5k zuWRnS%#}+(1)-RQJYi|@V=VO|2DS_U6D8`Dv<3$ZXJefWBmBMOTAL~9_eCw043wDi zyR^@x6thm7jpQQ~#M5$b>`&Svm48qD5kQjzue40l*tsm5@lf~F)tx#ZN$Yr;mcBWN z#W;w_rT}%%8k2UO5EL8nN^T%(Khb{+m;+RyWDr$wk0A9Gh}9#-vVd06I-e zSh{P4%PUzKRy45g71FpH*dM{E3nLWPM24Zx{2_f9?ds#_xIb~b*_GMiX<{3u7@xa0 zZMkirAyv@w68c)T06^MF7s>%l+voEa$uSykB62aEW=blPbXTQ0uvc*P25E9ki<}~H z(h#PTsZXh=;A#+j%SLS+bF$V9)#J?ZrdpRMw{NR(pF%R0>ni#yW?{r$Dvs~@n{H~) z=ehKJ{|(P~z8Xr%VptBKY0l8EXGz#w1kSx!EQSJ|j@6!Z1e2Ox5g9S|+}>AZ%WivZLN@U6tu-`Go(`SzPZ%}5 zPh(LFLs!%O5D~%Lh6_)aP@^XGUk$P$IwW$87q|~CV{O#4c)!33y|cxuY%aOY@wJzY zzvf{F*CQ^`-1*yi7YxKj{WCG`dCOl0F(?BWo22_-S=qHR8|W~=lq4BJLlpaa@;D(( zEDA=U=IYzoOb^IpdS_P~r+wg!&;qA`GGdmir>(q~@MezzgQ;e{-m)_i$0V*ZX}*e)+2cf@x!((}H2t1b{`L()(2@PS<;I5EZcvc?1kAyU`z=npdvv(PyrK_qI2BZUY#f^uWAX3yX z8;d5HaP9fuT_Q^gq1#`NMC!e>+jp9Pa=3R6GYvAq;zHA#@+8ja{sq_Dn{ejHXP8DO zeDtWAq1J|VqIl!iMPt#&rt2?$+#9HhyN`fv@ap;4hApXJ$MJ34!&ANmbL?ocpQc(* zj|=_lR42TEs$Jdg_7N4(oUE3av~{Kt3?Rb4zby_^tZp513U&{ILiSH1*I9xrb0V*n znZ}PV4lnoPAQ@MpLF`EIkEc7tF>}mGtKt=rZvKet=(oeM6jA;Hs6>9$XVPkRf-lXJ zE_D-Qn2L2!`a)~A`E@8jnH9|Ye=>%qyXpJe;Lh$odUcCzeM&jer$9^4>SH@}s{@b` zex*Rt=Ur%I@Tt3=ghLo?y`CoNao6JdJz&$^DuEiZ&N(~i@an=S z8imFZZ6CBN=P0M<*x~xy{x1`6+&##clTkZ-x$b03l^xMVA5e3^Ts<}j(}q9VDpStr zh4jroJLKvlPSC`w9-q531W9+tq#vHR4vTmUmRV-1{V9O&_7i%3;e+j|`8lerS+;RA zyQeaOun)IY=GyOO*Z}xqIK1q2Xbf|@SodTt$0L$ugA_X7`I1n`EVLsZt?H_CxF1oh zS~ms)h!i1uiA(@Jp1NQah)Wt-vCysxQD+%+`OI(*sY^j7(lG{eyBnf4UZH?q&ES>p zb4#_r=&;<73@oaU<_$}wEl@>i3}4>|7J4s zSI_x;KXkBTGJM5DCfu$rqF-RFl;kU{3kqw{oaR=KKD@!7;WCry;%<1LorZVF0~d9Y z#+ms$!V{KwZF-g+$k`81RW%v?L=vDy5uvBmI8`(H3lfz-oh0a@AXE;PED`-R?okV* zYrz3W%fwkHi2DL(o-HW1)Z7xe20x5Jgry3dO{L|Lnr!4X-EzLz`6+7V=C@$XP1ZGD z14U8g5LhwGd6{+zh+P^qY(up}G0lfX3F!3lll^}iS^ zfoV-LzQQ159F=wUP`746o`T?D=}6V|MV#2zTz%@( zlp0duO|f+YGYdzH_$l*k!|6!IWMi+ZyLJCf4k%T^HkC1EpGi~^rcy#_G zQX4cf(#`&HvhBfXXt|mcvpPXhce7hXQrKMad^Y`6&N+{zuoVZEt{xvct>Wbk9T{Ub z<3aF@yf`ts)=@ zl}^}2)2F@>i!$((vq}&y5lEpN^oFJ|+I+BN5Mp(s$8DBq(R1g1V^NaXhxuC`98c^3f^<{fQ}belOBf zhWnT0v&+j6r*ls6gZ|M0pE)k}?6HB1Q+|G+Ag-+we}_*8d$T}&LpxbzIA}Mr4wKzrv7toGaAAYxqt@dy!b_6k>u*qEYL|#O&x8x$Hsg zG)!WZ=TwJ1Tq*2U42CeqI4o*fn_H8IqEvv;569O%zvtmJLluf{qUl8n6KXO>J?w+s zB=PV;?m){AY=^kpAZ@5Yi)5fd(DBoj$bFvk>y{rM>+#lb69HUCD*zuJV1YQOVE}g@ z4mj9Fj9lQf+@Y{$Ku>5=+W9ws@4W1HJg2O)&Lk(Ife7hS7h_MqQ3!F-2a1zHcX)w^$2@wNs35^O_{KRHJ2>;v>5Ls03Yxh>&1# zj>5|<3Rck*kONubrQq)mcM*r{MLF%YcBr&$3;G^D$L{`zQQrr8E%-$uEb~^bkth?ewd^lZE%|qnlJO>T9D4^A_G!M3>j=_zPWD@i-{7-F#;Y-Dpl8 zs<(k%4qLd@y)cn=KOm~0Q{fR{?3g~M9FtDcZm7jMZGS-hi{7I^^WsJ50_Tc`6pE0s zgXh(O1CQLfE)uiArU#E@t>YSJZ6R zLC5o~UwQpiSSvgJPvG)6C|A=7>Y&=4DC@BqXIA~q?da4s(UAqQyO@4aQC&p zWY_+%YrI2g0Kf4lzWllA?U?)&HI&M=fvpQtwfS8e92(Z`%dDMgrg;07@OO6u%7?rd zT@}LZ1T3#R^WWNjrA*2wK+|34+ug_Zs7zj@&T-p$;79>o5`7WTc`7nJDc_{+IQWMKRGA)jH}d%$Ab@qF)Ed6LQB8g0TALLd<@j)D($F; zFGGDcDtN0aM_Euvb4-l5G2J)Et8|_3a99Wf{aAPIYTWaj2C*kO#yR1Wzf<3l8jtm! z*H9HH+v(N3$9UMNLShiNyU!}NrYV|eKNxD7|LATMfeT3b>0g`*S~CnWbI@k$uugxA z%{=4e#SFdLM~*&)GAn=gqqlHy$c#GR=H5_NYb&nsv+Z*p`J4AQmJ>?V^)1zdJ%9^@ zVWtaKGmsP2MT$Kq;5n@FjRLoxk}OpOi2^aw{>SyuzU!NLJs|$#PT(rNh9}Cq`jTyj z+w@L#|8ssXyY7%}Pxu!nV4@09)M~C27I2D^mlMp;kZv3g5D9!7pjK#g=O;AoA)j(& z4D3dhPRNpNcvgqA@4e!#+-u&T(otVg9m;k!X((9-Ql;j75ct&|YbM{XAsH$y7zYUq&kF z9s63j65=Cdjl4ZHA}ENMfMwb<8|(7XKL3&BK0O~QqF^BUPPqtKgJF%>((}@ol=Yb3 zgW^3xO@@=pj|Kyh%E0emw(4`HHLv^h5xL*2stYs5YJkDEE|9p7Nrl5bj`>Oq>Le|E z%p<{CCpT1AiEadEwO1**S|PtYW4)8Gf6FvYx(A!)>f{np9aClgmkvf}|>@ z3QJL0>mEsx$|9%ra_kE_wC4Zy3=}dUJ(BZ#xTYju@(`3NO3bQgBlY{HCPn=f9nBxt zr`SIxzY1I>{v_B^al9&}Z70%O*6L3rdqL*?)w$u!!z|C!6S;>**N3-BJ&Ssd2aicG z?dIck{@!W*`IFwpI+~}^y+S4I)}N5^1Ad9czw~~1YEl4$h6#^5Oym*bn)ATk=jv5~ z`;sYabRqWTu0=uy>nQzHe&|jDG(_Kv7H9pNkZlvv+!O%^-cjpzv-16=N|}hrdk=aV zzucJ=7$jM3+;A*VW0dv&xz*CXC)Z2exH(M1!uQ57?X9kuvmU-Tq8$2qB?;U_XB}kV zuA{{(0FMtCx!7d{wn6q}Y$kjUt&WbsMcDjVq?~V;DX@L=bpY4_Okx zOmrfX_f|lo)!og?L`+b;t)s8DvwCOYh%6R4x{I%|mNjcVf-eYPS*H$hEOzm|R_<$r z`!E(vxAEIojO$bIx|>&%F;Wt}aCFxoVZ(!X!Z0YLE$I-nhUEaPP54^Izc1n5a$kEQ z?-1!<(g_NrGvvGDGjGq`z-u@8JOn=jVTJA!TM#*2i|5)-`cFqoo};d0UjcbQ5Rjuh zd@Q;?`f$X%v)Kg*xt%n~`KPeztIFBZqjWbEp=&;-#F~ACBsBN+??wXlP2Z0Q0GpUJ zHGCub75QIyz=zyTWDgv1ve|QX9VwU-6ZIHhP4CZuK-@#k4*!Cc?^DEZMbYZ^OML~p zzQQ}xu_+{1)W_=uGz|zXw(IJ%4%iG=Sl~{r4n(aA_wXt$Hpc#(!-sa&Y7Pk|2~OS} zJE6PZek_EZ^r3Cb>+YE*(j+9oe!&P`rvo!$!j;j==9mzqPtEvvgUz9MgxOf<_$Xkk zP=OeOX3xN^vt5it*v{&#Qy=Ns>Zv!V zc{?u0mq@b#1@3Jb2Ny_fcGhuZC5qm@IC(z*Ctk)Fohy?@zZO4t#!*<^a~j}I853Uj ze6eqgj9k{&IA|ht$+Wx}?d*&TUKAJ?@E7%5_?Z%iGJudaLEJ7mZe1Yso~uYhQCP2` z+HM)LLwxerNvRunX&HgN`B|bvPzpTz_<;w^cGe^`O?#b{cD<20YC2O z5TDvA7%#XuoJr2g{;RHpywLSXd=iEf1&?Sre_zl3oR zb`5ubG)`Gge4@Ms?f8d zz-2;BxiznIe*7+U1q3m#{sYsXY5+aD@hb7kjv=cnO62rQ%ezZ z__TrsWew%*WTvae+p` zVZSxWh6M#iC3>RbmIz6isiaPLq>ErKN`Zj74(>!e(Lpq}*+bHT4Ctn>hs_21rP;vb zPVJJ{N5g=7QX~OOw(N%`1qfRNAy`_JHibBpB&47rC!0zOJ_AhQY!2>OfCY-q*YVi_cVkaY7VEj=TV6aG!Kv(n@l3k~>C(K)1?@CI zjCrlaSJ}hK2Ie}3F9u;7&^>58d_&(X#aZi0w-J}AFecK1Z!39WCG|bbo674D0~lH! zf0%y@J|xn!*aY8QHIx^yZRRB!8AUvrjjfsdg%93u2Xj?YUCvwYOE930YfzEWj%VZl zelNfq55u0JHHsR%xZ`0j6FTZlIX5o}9c$JOK%NfJs$21xIpLZ>@|>jeckv zST0S+7zD^HiAfRn)NCz`tS<7CCFE5)48CKt&iC8hcU6-$b+6t)xQKsvYE_`G-EyCS zxTBm#%T`GWx*@ZF4;?@R;jPf@4h4>hk%F0ol@HY7==uz>UR=CEnxAOwU`>#%Bw>C~nfM($U~OA? z`Vf8*)*V*mfs=!QS+L1-CNo(Yq`K5EV(jF(!WBmov1K*?0LL>?9pvp{cb(=JnivYN z`Bd!mX=B|-?`5 zT#N~D0!eHAumG@?`(=iqodfBUjF~`}jsoTBX!;CYZU{c0(7mi$p_;d{I$|5gTC}cn zLYiWE+Fq%(T2eNG>Pt;DME$8wL>60zGdK(^%ToFJ1nTsX7-PN*Q@N=J6xUII`X!pe zoQgC~@G}uWL##0m<9vhns?9c^T9BiwFBUa?MpBSvZ{55(MIy{#QoRFy03<8`e{}~R#~=c@F*woSdP-m%wEZEh&OD~ zip)4uQHB|ls{U)gi|nA1qS0b_C1zwD8A)FrZ5?&&w4BJwRqId*1J;EPM_oUI+We-{ zqu*}EMxN4hMB7*&hd%1W2?dy4dpQh>^#&oFI_jE+zF50p;6nc++j%cs)gBKVBuweiMgL3r{AtLVi z$!%$VY0!%n(=My+uvAg#s`owE@de`pV$`v<#^hI|L!u@T;)2}3;N4rDu59@oCf24k za$@(T-eICC1DX(odxA?NJ1Ql|-_d)yHFFPnq=6vGC z*pY`lC@nGY$?Z+oYR8P*j7swZ%AW1YI0a381~&K(7ny}FD0td-&)2rC<)nD`SaaE3 z{usX26=u!Vzw~%bvXnm~1owapY`ieH-z-tb@#fT_(sw6eDtv{vo>CC`12w5m564bqE*{>TUa&Xg83Mbv|ZBTBRpx2=_*>qRnuU3ir=MN}XAM-d>$O6S^pET(Yb zicu_DBmko>;Q9Y{7sGpecYK-)X;yofC%CngH@Jy660tIsKVbVgiZ$iApy}tFPrAWB zG`Veiz|x>sm3?ju=s9JW`MZpMVkyuO-1v;1HT6}xXVu~}k0)-*uESBY5s2vdY)|(? z1pFS(+BVwx+buI&m}^^GtWZz)ZrW`66TA=WPv-1QtRG43L3sL5=i8dhznx%h(s~s> zy1L*$Le7iLn*_U=HP;jSyZl8rIvR$IHORR46N94)9}U*W3LT> za3*}WUa(AjQx}w}#g41GE)?A{XRB`Jv>3ECYlAcRk1qXT<5+ zH??#$-Osw&=Qq950Wl#xU(me5t^H=x!_5=zcphWHe;F#vs$!LV`%(&PGhd6pKwaQX zV$Vm9bCda#K}>Gxmxk)&d!BB$fkKpJHmATsesg^!4|5Br)s4C?JT)8npJa8Si$96< zG_QTpCph?SWgf#+&>oXhRw3}1cP&N`kSyGKbAu}rIaSWAzRe+mjzo}=pD|Fi;WY{q z2}Sn1)v(wWM(uj@yBhlQa=`Hgg$PSPt>e%s)+?lv>G zYe3i(l0YNuXbE^PF#Q(Re40~b{Z1PFp}1HXL>%!DT{diy0V2b!$jm65zCJ}h`k?JV z;+Y&Vxi03fn}Yu=I~Xs<{V;%C8$=b-Cq>I20{1(`LiFO8IIjBBq9#0 z_s@hGq4u{W{O!o;lzimcoQf-a^U1%xUFDffD|cgVdf7{n$Ylr6WMlhEx6$A@f1dZb z%JJDX7N#_8#E#zaqj#mu)uCeiiRvZyD_}_?9LGtf9LF?L%6)RA&iF7YIb0g&u~=AE zDm!n2GsZ&%Uwmcsc7Ns^H?h8=%^7Z+%*cQ>@S0DsoRfgjjcOST%((YQJs=#4bTWE@ zBO8*a5@j59d-UciTem4$YeLjz<&V9^61zo3hjn;~A102%D3yR3=qcQ)v5%6C<{o0^^ zRjbYHU#wXX3U<%)7Fitei)o{W299jenq4%6@xs0Kh>C8-jMfBr223kuTt{_mW#4tJu4{tFp(#>!D!O zXBf*&qD@TSdu#XRfa(XP)%0ae;6w6$+%#&~hGZMvRhD2aDN{yZ(smI8k!zE)G_i>{ zE-+R?edGYh6!SH>@7t;2PopqD#xEh}$>ms(^@ltR^ZLva{KY?4N~o$RM$*}D4?^}D zazb=;!Hu$Y5c->JfZ{ktb@~=CdW(1_n)iMBWC8z;mn2_-HnKI|Tp5bMp0-V1mR-ZC z+IZ!&oj~RD>%aX^M$gYP;xEP7yO!dsUW~80I1o|&@VWRusN;qM0RbzMBO_bmyBRPJ zY5Sw!FBt!%AO0>e7ZpPFK_$Xbjl8rgWL?$t@#x%2U^*(FrmkQtz8u9^0p9@l%~+`C zag44J|GW>2OgoT0eE#{+RrO^>rE=GD9?|UZIsa(Wl{D8uFmStFg_a!+X1S8wiL86r z$01k7XEy45=&IsE&)<(r#H0j%tQ1OHMn71=me*&)EmNs?NonoHjowa$rF;330@VV$8)?vao(s z$t(XQ$2Bkf%dFWY7%^fY{GBE9{`%Uhx+ShZn@$Hy5GjwPHPbfO?x)kSX85Nlc#-pE z1KD~@oV$U`&F{UbY;^X*b5K-WgLl`iK6U~pE;*r7Lu@B1^aPlx_Ndx1K21e|3 z)=F7CM0b2glNYmxa6$l_Jm8m{^F{}eM;@wDt_23C{o3+X3Xg*fLU%74qW0;&v946R z_D36iOva1Z5g8;$T%A8Q+iXN2!u0fL{gmWJv^-taubkk?*f|k4gm|(mRqgIO7+7~A zM15XX``%%@cQ4^yHf+j&CJKA1v!fSn)bjipoKcY3hf~k>ea{VV_O8{Q802NksxB|e zyH9DmD~^6OJ(_N#jxg98PkTNO$O*B3(i5<|SVpkk_l5!MeAyG1H5~f;tqBO5H2qL7 zCu`$%%h%ze>8kGCraV@qJVs07_w_FHh9f1ugIYulT>O&vMqED+wY=qWA=_f1m z@=77${#DUvS?kJfvVq&Yf!b}O!o~p0_3b=RNZfWQxaNkpUPO4nxxv4lk->*wgfZq& zIX8`Jqbz}0%22PE!^OU%8&&7#;-*^ z9|~R8z{^QaPrn7BC3jA?tiQr%CzbSObZAx`1H9i0%eLRPIAQsA8rIj&u@i7ns(CRX%H=L_hcV~ijTq8pOe|!)=7tu#f=jL=2qk(~d#J#qHe5J6 zd6WL9?Ll3$i($-7Ir^yRJ>{GHiT!jhx=*IQ?kD&3v)^K_LqZ(c`D*ibQoql{v7;$k za#Sc3T=g3fTOnDPZ< zC>s_(>Is9t^iwpZCx)otiXaHk-M6_N)i9v~1p%jYajqH`+x%(KIu}wPg2Q*l3Vn;o zZk@iq@-zsCT1UO2~PgVM0Q%TbuIUAs^eobXoI4rD@Ai1qIQ%CK6r*PF|8}L-R8Xah0 ze98EaaJ9d@z$b9ZrK^~TrDY+Q2t%by(V?_XTM^d5kP3c)cH2CNH>tzpi#~-)OT7Tq z;C>vUD5Tqe{LM{Jp;r9^)pAl><4K>lxb-$|{%VkI+V6m}iF!s&x1sU)>h&r=QkJ5i+_DhfWt;DnmIC) zapAlQak%YAMU+b>?wa@@!NYc1+w+o9YdLz;1I0^FJB?1@^>2a3g)a=eRi~WuZw4Cq z{BKeuS8?uHY^i;7aVZ9_cfBt8iz#=FlaJl{vG6I_z5FWzAzE5()kjaeZ;jsm1}(gC z`iclIz8Z>M zxZE#wGlh0N!XF+yrF&?H)N%hF0(Z={YGP0`*@#3b#^|W}G5IO#=a$-Sc#f|1L3Afu zq0NkFV-PA0u=FazGP{Hr7ycWO^wktscDN+&kDKYMUk(j9`N>ac)0}Rucj>_hj=imv zNNh^@Q$M1#;BNT57n(nf$woFFCjPco(B`)3<()IFmo*Xl*~}};L+dN;1;OAh)zyh1 znC#qBnO2o0&3=hmzlK1&9UV$Gq4ud$$J6JUYKEh)iz_f6J(cpmtKyFlFW>{O0AmJen&B5Ulg}QpNeyfpU70bfAEPbgSfQ&p^Y^_m zzA0l_`xzCzPPG}d9BCGQS?G%?6`n{%%N+z!%N#+t&D?Vh-jqo>Uh`d zAfebb+nq^WQy4?MGMF$xc8EXQws01Ag1G5n!AX&u;IpmM{*Bt?n_elO=ji@(ZPZ@* zOiFh0aaiQ(2F!10(*92Gyg8sy^Mq85;c$(AUxHKPW z+u^7TM3h6mo{cTb0ZZUx>q4m8pHSXh9T(00;xRfmYX6Sb(R8i46jhyDeYNUr$Zyzza1?wlo%GDU_9JO{@n^d9RK{QLYVf7?hzBc$iPmh=GeJlL{E#AH zHnfUD5%7Mxze>{U?qaYd@lm}TcVP{K7xwUHeQE~qgq-XA%WVDESSfu=25)1-7mD4x zC+x8gcr@`YoD5TPyiKaFB_#iUsI%wWcchF2GDw>p##@{ol*nU zjC^hyXO}V~PpXhvw%4$(8y2?R>}Ez@UUD>zS4=oULz@-e{yFNcOMIlAoSUuzhZHF5 zU(-5GRN$EsNX{_do#95@>O(`nX_YX-Jgz@r&g$UZeNS7lx5Q!n320% zwaOt-4E3AyihnLDfz7N7={PlXhuQGDN_}YOC2uY!Api5c2^W4Eq+^H1Hcl5sdeQJp zRD+CQtzDi^^TEn+e*i=4r($`=y*lqJtfQE)+TZNJ_ceK$w%vlYo8p_K9##oIch>i}1I5!-8vPfN1M*XG$CU87$8oF+&0W_` zD06Jk4vl{`e8;g~yLy?B8~BMJ{#f{9Nm>Dg#2GL8sbw?yIBkxAVxx z8aV;lLvr7#!W z7TV(F@|#3f_ImzSA^V1X$aJ+y7TtF5vAypHTi!R4%}SUT+`ga9XUk5g zWI99%IZa5>MBh*u>k7g5dU(fLa*U3wVqPuGvI;uk9-B7|6Q2D*C=-`ZJ{Ib>DRy#$v#K%Tm;6%}{^F6mW&z9Kz z+J6NEyIszD!eOkaNxUf>`!d#EI0MMLKP|hT1GAcwX5gF&6(yJIY2tzj#!Vnvd`zkN zOVv8rU%sfqZ42ajooJ~i=jN(FYjt}u2)I2p;eXIFOngJnJpK86uYj!(`HDK;9d=_^2=>wegrf~?)K{I7@8%C0$L zJ;9%Ys#{c*=sMnCN0==acd`X_U;#|6E!K4^5B)LG<7Ew+4f+HJTDPx=o2?5uvS^Cp z#t0KQ(Ps95(x~w!c8a>g;>ME0zy>DsML$Z z@X2}2ar-_L2y}En&R3Vy1;b*cf9HsNb}@v>H9jxhJ%4w-)2k-6`o_Uo0XkN5s~=#- z1lo9x0_lb(;8LY`2$#c>+(?)1{RNP^)^W>zUfkeZr9=c zXO#fm0MUU^9oInxleJmyU>@D|*5|B)5(|a|chV<~QG4G)wy^7{)p+WdUt970sG07b zvZQ_Mvb}UP9d*WNNnC3~K=Rk`{+xsu{b&eJjIfs*Yiw%854Ib{lW#W>HFJJu>kv2k zolPrzRVH9Rzs(|urX5mZqvM5=5w0r!?tA>a*!z-3z6k5a?JpUr*!jAIPKVlB$J!*$ zwa)9MPfT#euItou5aTGoMHrOfF20Rp$ZPP%+AA*u2duBS-FlTd$)O9JrK|NRi6{c= z*^(oFn3MBtoTY3VW_#O=%$O%NJg9?SWqRAv)daLcEm4&`SCZS}+PJ^Fo*}B+gZy8D*AF}%D6PM=T#2=d|G;^6%Vv9!8%-ZC@ER0*F`>f4z@*#4u1|jyJ5AA>yXj5l zDaM_{D><-cA^u7GrXGG80>J%xQ*>usvz-vQ zsiCYK664hT1bLNIC0n?T{?g#{MdFFmA{>cdbw+g6P8AB{6a?#n> z`M~oiPf4*Hi)4U=Dx5<#T`zO>G!$JWG3)!jB(|oUV`nK&liO0AGE1%6$d6^NOf_1X zQ3T#xuwFrxq$yT(P$Y{uVfeAX__+iQWr!Zu`yxdQ2K{e<+oZ)8w3Ys8brJpf$^>d(_<)ln7g^}eGD7q}!DOS4z>4xz-d+2o z@Nkhl?2Yj_UZIO;q3JzZO%bXyUS6%>FQ6gPDIIhT5AB4iJC=_}Tc?_NuHPjTiwqOs zNInk*&eBwm3ZfCoI%?1z5IP$-V8>MSyvX+4)>KvQJ2HZ^(}uZ$)G3HywTn(Az#gk> zlyMbL_5s38;Yy^Q^PVn9Zi8%wU`Q=gb$A-U;NL0;u>}Ex7K+jh+!!fX#${k)CbR5? zWdalkbwh6!_6P&6@{pl_q0=F%75%+;TW|#UEGB1bEYZ{YU2s)15BmCzsg*eD~ zZQ>Mur%aYP)K~U3^}qPsIzT$BZp)`h8SGZG590_7 ze!&ea!r%Kp0Qo=$zg~fDvs=t$1{i8M7*%!&0AT=Ycv1CUFlWJ>Fzd2P*q5&ij4*uv zvg;4u%Y6=FbYGK}pT7I$&PTZ4kr2}9);$T6$N3Htf9Xi~6|+UVfsSSGt{eTkyzvr; zNkT;dbHc2vq`3Kkh2ewgRdSD_uSpe9!Af%5y!G)Z%hkw}XRcaIA^M=Ozwv6vaa6-X zhvNheAx(|lLMLz7iQXj^@FsC#mv)@aN-d@!tioEDqZxpy5X_EvQS5}(d%?Wx>Kn8e zgj4h5+RU-AFJBQDVOl&TcK@p3HN`zc)_2pi`volnqT--tV)*?gUF)=?sPEkof$W{y zfySvj&Aj7Y8<#1piQJsZ7%x#wQV6UC#KD}>-goqQsb`jUffvcdCr%VvSQe%itz*3Y zPMw8l9z^j+9{4#6qjcXe4-jmA=)7j^w4Uc^y4^+ZN6BO=g8mQzC5=%#J$m*HSG; zm=zCdw!m^+QNTnrgkp<*UkSXX=miKvFec16G$n))?+h~>+5^G};I;L`f&c(O07*na zRKH2@AC`6E`W3Bs_-}AahjHRN=;iyVYk9tzuM5zB4Xzvvr!b5EKDz< zt7`srs(?bhwK1#}KrC$~;aFUrIi`4}m_oEC*kvIe&>w26nX+A~F1}f~KLkEjlWnK7 z6}?%U5@JB{52^tFu4|^8m2mpON2kn(GW||UtHQCERd?-@xi+Z$7nD(!$yM)z&GikF zldWY2ACtvlPVTt-&9SgAUo{vZT1QsAsn?%bVVTl%#WU*D*m0B(t_|eA9|p(b+PYEixsX(ZL_CZ;dMg0etp_rzo|tjR=IYa5%U||GVFWjqX4%ujex~rJYc6-hB1IUJejzy=*t3=2?_i6+mG68vIt*xXnM7Zvm*leb9LKn^RU$4 zX;bbE?TJAL@8t(_HqI(xU%m+vY?WYy2n?TiQ$JNOxXmlu%)k8H!{$Hy{D62^*RA%= zIB|(VeJ~J&(?N04{!(FBwjI)fB$Eq_3GUJiy*HwM{u61u+eO~pr|`)5=)r~aG4I0t z74=Qb>-$-&nC*GqciQuXkJbCNH!zOG=X{g?pI>%b%?XzWCL06!*6ka%j-4`NzxB(5R`}I2mQ>tx`hLgC zJx^Q8zbQYxtJ)Gz;?2bQ@>PNn`o@DA5DOYyXTG+?|K!V$TJyRRUK5(rHzl05D#%>V za1J=$8P9!rf_O{=*Ua~}-cpvDLFM=(rd43_`}UtZ4@yedH_^xUlWW6BJn zNnx>L;?jrCH<8p!&`g}~C+XjJD*#}4K?~mt4G*oHg%RyO%%cjQSJdaE_uVT&jwyXf z#8b|Z;bV*R3ya4^pD#F?{4)#lquN@PQ~?E}7CRpws6FzpyC|k^m{-J0rU#17GgtJ( zSIWyNx*cWJm&BVPeiSAkZ0|VDlGm39BV_l}H{KMO&SeQ1t7TNcYdRw`DO>7jV`1S` zR38#cX_hcDfORtJlC+Y(pdj?YF~Kwc>?ixov7Sp70=VsVg@zl!MhmIZ@NytnVV)T5 z!&OxDEBe0o3GP6cA2@Zva--;b3VxU@MA7Fq9jv*t4 z&#Ck?{jpq@!Rw-wkVFB7Jr2v^Lin8**0hP)-emsG4|kh)_nr+Ow!6n9nI#}`En=9D zy1D)czwa0H3puqe2=T6=NdfJ_n5hiz3RSVo|R} zaqoMkZU(SV;?m}sV|^pBgrd(EZ6Ey&=EsJ_7K`~sX*@$RA+KBi&52)Fr{o^{!w+J+7fJyIU=eN-fHec4UQ4ySpL%_+TDQx3-RFom?%)G*5j@Vs`sl1=!D-F>MqkhpCiS*jzaz-#*ORluc}VEX<>-m4FJjo$1GY<9s8- z=OulHXU5z{bAl@v-nDm_-=H>Ph#S9KE<)=y?+JTTcJUHWGy(yHpsHmElA<2om-o}A zcvI`7`cDzi4@k=j%GNH=UcchEs9wshhd!7loaQy*HFvb5``!0%TH3)ianUGwF%Pam z3t@K<03M7BfrO^kF5&c;^1E&8Jf~e&&Wtb7b&>kqchCpsNvn89rrKkQhJep#8YUOL zLtf0yHwJt3KK1Z7=HV{k%+N^K4UI2&U>LapUABo&>qw&^FWPuh+1as+cm{6`s)(D7R~-!BG~N%}@oZWD!;a%NyDd9M6d2l&AmJGi zmN&~Juopc5KeFOM`CuN_T}By@Nis?vKTITum?V54raJM`pBF~-HF6D#_<7`Pzcr`Wf~01=|=*;Px-ZM=t#^JT;~0FCnvgd%ZJTGP7+&RTPVbDhtj163hGBII6Es;Fu)5$eAm z3WK#$%mYBSQ+|=8XHQCWN=$XqeSby~CJ~4`kM&s}N|J9*Q>bXdca@Y{Vs4eRugGg0kC7Nr6GVbdvhtV{2!Hyw7Uh8vP;@2( zHO%{AqV$P@{Jm|*Y-o+7_&U*eO3tLH#S6M0??EEf9Y^~tZG{jbVLwlo3hIzz!+&2I z)o0}&`QN;_%I>;ZA$1vEj$E4r(r)SqvKAvOTg=qLL0iU4(U@B;-Y3Q|j{dlF;jYGb zg+QIA*|OmU&j}}DcIyDdky4n=^e@F?dW!LeW{U8yMR}kERJ21Yji*%RR(`aN_v7FA zQ64DDdOwsp1TSRj~IP@qY0L5lO8K#L4EyB03{f_$( z41Gwj@XVlcu&Sb=X4S;~d-ac1o)tQ-Fge&ABq0Osre6MyN6Cx1Rog$6J|mHD@p&YE z8zGXQ1L5e8FD)h<9wAA2A9-hNAV9)|=LD4?4b#hd$CW-q^tuOHKt(&_UjCa2&364+ zIn^?uDe%+CU<=_9dV)5ojC&wfL#hG8&wslv-oc_Afj=^gL3=bDf zK^(jxVZw7N8q*8k%lGpGEuc_qed8&S`GZx6cgmta`qlb&cRA-J#*A-P%ys`T5DnA~x#LpGuyU#py)vRdLgf*o@k4qldbPLV}||zO=Zj;SmDqI?1^i zN(~&RTJW5*p0)npeAW|Gaojh)4qLA5D3JB4!w3zY#@tsZ$&^vOv z9kTfX9q>uh5e|r2A73)e;WLVTP98myn*wgTx?mkM0Z5QRUOSSElAR^VBzst^Gn!kl zfYXnNzeqtqY3CIIODd~+F9-;t&;Fl3-fJll)$~s#&x+=ZA6_l;_*K%rO0StzMrPqk z8&m7+2)99)4AkQRO*rzPSsH=Vs6 zz#Y^!Jd*=q3Wh@(l&dB$d6-%FOe+CK>W5c$XwD& z9LJM^flNOwmh&w>Zf)8biYsVNm=m|v|Ii7zzl$>u@p6*>tx^O8G9Z6ST&UTif&{`W zuD0?2j=Y5bW#3uz?-fssOfm4e7$ec*+dt9keEudQ^!tap%^ux95RUOz(X0h}H_MeH zk>nti6ficDg_1#hm&|>lnG&&f4q=}4UdN7}O70R|^FV4)XcXZX*MvaDBb>l@=QR<@ zt#(1%*=~^W`yzSN2IYsOeq#%kmoVPED1?De%=oO~fuC8HFPS@@nwL;F!n8o6BmPrT z>L>ttFfT%sfP)-&L``v-W={`djX$BCB0`|RNUvAn#AJ7Q3IFp4#}qK|tj%Z~Bb!EE zflvR8oLpxg#sgz}pac|xCMn(xJ5c}f)2q#1WiNh1yr_OfYYf}*XbdjqcfIhUd}GFE zjq_+s?zr>4@)D|lG51Kg$-lG${z3dCQa$bJ>NN+oyU3z}1_z5AT0xSDm{xBsk1-}( zUc&eGpVfH5>`g9=Ki~dIt|k5m8zM`Tr*is~DP~~84Vm?0&qL6oy@IC_dYKR{zP_eZ zR}=<0wq?oRJWv8EE8YzRz$fL>0%4PtJuTQrIM3X8@uDz|d}78Yzy9C|1UxhsghLWj zK2KgkeBgWn^D|+ahYsg2A_c((WBS#%?W1 zbiX6aG0nzO7n=)m2l_-Y+|h<{p7!xIEfRx_wmt3diUm{=yc(o37z*2&r1~L5EOBj! z361|$kw7%<&5Cz(;mSn2Rew=&al+bDv;#R7&NCN1UaP;s&}Pc51I&okxzgejvpP>+ z!j;lSeVN8iNFk_dS&A6HzC60S&lTitq<@ynJ*QtjpGEM}s2`R%(Hcmi`{s@lHccFu zBN`j;m*OzUgQxmUw=kqR!cl#EO~ITF$g=p6_*EyB!VSUf>I&+$)!Ta!Cw~9wi#C0I zl8GOj?e{ZPKr!Zd2@t-(AW-vJNoQy{e;`)zg*0`Q}KxMBfc{drs4=%)qRg2~(qg>ly;ZDZoZ z>^Sh8%RptQx<|Jgk@~_XW_6ytgd~N;Wulrw8iobY>5Jj#$j`^wY)?5$O4QY2#3)kKG0qXmAB;V$;u5_OF=E?MP%`6 z5Df^YxA&g0+tNr~9t>&k(h?D{o|w>|Qpk;JO(=LmM|-ZAUkSuS2qtP9Y8c1t4ik@* za3U|32nfXdhD$Y`g+WJbrmQkqro~M0i6%>!4axJLk|%ys-n@j>XupZPE@3Q~F=z@* zMi}0C3$HXQuV2>qb@%k;(a}m$Q>_rS;`cwh)=X5pzpp3`Ng=d-@9)~-e$yYzwG;bC zFReC5H!Kn{x7TLW`Nf{o=71Mw z@8z6?3HB=3%rt3GNKm%0!(0yj^`yXfYR)EZWqoomvQ^j4kMiU#N-BB%PI>L59ztJ3(O+@ z?pN+O3M5E)MoUG?^NHV7Op1wS~ ziCVay)-Lh?_~nh-;-6vuk00$ZKi*mW{arhvzflyJGjp{O@iRU2Ho*WW4rwKdsYWp; zJ1^CL%#ozRJy0-;#Moj56gDUB3^)y1QeG&J9O;C3(Q#@X-}4ArF`B`gFzc-5B;gcX z7d*DBgH%7KW%j)xeh(9At^n-3zGE~8VTfOM@NW(v$Vqm29nozY&1{ka;k80?MDc0(jq67HCT)$xjP@LLf-lD9>dDI!LeoG!eM&gT z>yIm2uh`dH4|hwL4%#ZS^31vW*6KH!&;5|M(Dj$^`$F?!g(p4~Az0G*Qj8rmCxlb4 z$hPOSdxiFrq;1lctnusG>wZV`)Fq7&3plSeLGN%S)lJ&jibz{zeM_A0im6+qES^fwFU2q>pN zd@(Lp6&Q^#PYA7G?yMk&HD=HZMHZYs`Hnoh7uuan>g0vziD~WHQPyu(F0|8oJ#V4w zAK&+daKVMAM{IwtNh*x1aLjXr6VX$FDbh;T_>H?3bGt?ELTTfLb83}WkT&{aWSkqt zRK0j_x{eK{6$|H?mp3jpzok5b#FS!=6jfpclusVHv<9H=g>&6U&xPj%l|av?!jF_e z7P>ePWZ4*(yM%W5@`Tz26n{ou`0N_O!D8|U*T;5|yT!Qwrk(eC-a^-j40g5_xy#Miz&u zdhy;g_VAm0PFZulthoKvZf3>3li1nklSj@~#!CqV2dSy_t^Q^4Y7hYMoS+i0TL&Oc z9hh}=svR8e1~I>VZFDBDFHdNm_*NUGngRevF|(K^)YVt_dfr0UnRzia!v1niv_Qg) zi+P@A)`ja}9AXX<9RNZ1)QVQGcv;~(;y&BmwHoCWFHZU~0m}f?nBZtQ$#<>qhHqyZ154GaGMeiH_J61p;=`q8;po|*uUfw&{t@zUd z7saVymur($-WOIYTdTr`VxC>qKS~~6jkDLWTW4x}mMw77J6+N4-Zy`KK)ym(ZJlvH zvM?@p4KKx)Cj^%Wu2mAI;p%))e;47q=F@iwscJE`W72+3%5wnPLXsBl)0W^`f6UXT zPR_|2}n_bfARboRZVJy$RY_t{-L`- zto)>_-||UFJrpMD`C?qIjYVM^uD%ELcddQbD#g?oKQN$=bxS~5pUPsiVPDKM&-ifK z;tDwp*Lw-T_TqVOKF=L1pm?p2HHi|4J4)DB?wmB6&eIpnL78C_Uz$*eubgWrnp={M zj>>J*T{?r@tz})Bv}M&vZzh3g<)w zE~@0gJd3(#t?J?ZI-VGF428jkyJ2o+9WT3`u>z{rzH-rrjN0fYAO~DTdCW{XCiA&(wL~E4ZfIXC3TPI zHSYc5{&PSWFeFlVTAPJ0uh4GeR4D*q9$EA_%0$^ERzUgs%HgL2zzv3kiB?o`Hahn2 zB>~ra6kO||+)nUvryNpeZa>mveiX{{1^*-|@7v1uSvJ)U*(^GRr4fFD(yEx*#ARk1 znJgDY4r+UYd;CYyzH4Q7NB;Osel7CFJpF1b=d8RKVH{5khWjk>(0;o6wB5yjM82E9 zJaEp&>c{mZe4LQXuPG!m%0wkmC474!RzUgs%HgNO?i&DiSU}NP;h5jkgjJEU3Gyav z>;#2pRGSe+*R->?Tf*spgwt{13h<-gvOv_6a39I@^<{Mwgv_+~R4WxE9wD?}p=EKC zpwOOm;&0&iib>HZqkEue-?h=T*Y{rx2LuzNB8%5I-cOPjBTV9nValQ{^4y)8bDzj> zbBA2LtZR-qv*F_;yMVs)d(W;gt@6N#P9Ir|g~aoU6;Qsua)e(&5Mg>zP#KeAenaFU z_q(IQXYH1;di&=2V&&xCZ*4znf2YN#dPdq(qxkgzm_#jo$NXBAe3q~8S#k|`k4%*t z)-1VW0VllvaN`&hEx3Or51m z^YXJJKif)~Cr8fq+a|lPJ}#cudbwFq_9=%PC3^gMIf(y;e9K-?PCoMcp&g_=zO7?C zepHGP_GlAf zu1{C2o6BbV;U3c?ukoiQ4GeO>7m`|8^@@%c^iH^Oq0eRTSVGm` zw;yZmJC?U2F+qv^N^r%GHKvYe{9V){h>tM>1&ykmti<{}S=fq;=k<)@H&M1JJV;u+ zFI+_Gxm1b~mi0^sJfA#`dE$A+3aGHJ+@JkqpE=eOu*h$_h+)G|h+E3H-ri^WL;={O zKvgHL#)G(!z=$mbZC9j9@l@C;OcPLEdA@WH)Nur0@;w7^@0tL8@G=H9g`Zr<)-)Iv z1q_2h4Pc(EFW6HPe;|v~cqNG!W*jK1y=k|l50ZFkT$d-NdD?v{IYxhkV`j7P@fr!= z1JH}ML{yH46)WNm zRI%?L_coVdyNq~Vu>y+5;w$%p!YC|O7?OYU!`oDdjwf&QQ)7(f@Lh7-Iit$5}6QYT?vAXvDk1Ms5t#_?DXN|5>pNY~XD1f=U| z2?nrFp0MaW_?zb|i#Jk6d*hxV?z<>24Yi(<$M-U>-fF(1KS=0-v$+jRZ8vHdlQP+) zGHWrn~Du$%1hy4OtV0 z9qChj0}7vV&9pC?JL-0f@wE6&qfV~FKPrtcga(S`;Ol|&(1OCZ&Ez3@HMFdiWSJ02ZK~5=v%Y2sOvK00K}0}tY%hV=`XY= zVoa?QF5r{(ft5R)=ZhHBgn1>H77w?nqt&XJi)J@jz6!hyOf1YyN)#iRJb8jZ)f-lG zLO8+W3YWAzVd3+lpM7{GX}pnWeeQ3xP|Q#?J)ibIuU)6f7Q0d?EDHhhv2#%+iB!PD@zA~)iSyOMtjj9V zJYi|)d+|!t7fHO4q`LF8_pEkKf4cXy?bkl7W|V3%wIX?KNzYj6_g*oxH8zUQ(^hGF z%e>Ba{72is+yO`0{7|bQ`w|KXb3W`WoOGPriXX=1&6IV6hY1!CeQy^D06`VP12gTv zB!1afpIT<`?SxjeZSL<>0hQOrCH>AkaZnIePzl(r0}uyqq7%`a5KcDcw`+mNZ#}Ec z+>ylO^~Ff84&AYUIGB?&>*8+DF*HZAb6{d+6(3#+)kJwCS@m*n0DPbJ9#dccwH5}n zRHrTYVrpR?5eYNc{aP$iEx*4h-rCmAZc80ur<6f#cR430LrD%^Th_DYJ?<4VTZTFl zWu+p-#%b)lS$I3_DC6D*UIj@R9w1}X@$};Qhp^bx$(Uq(jzX8PC7jqBWGgH0q_x8ONU=5bq=?eTNGAYM}`@#g;ieX6=4cqkm=j66!HiUCwv_- zF$q&c*u?ROSWxh-1YdY}|2bPXnyV{z14MsT%WI=XgfM_NlMAyg(2S;8Gd?X*L7te| zae3O%W+8Wy;hG4pm?{W%vJH{YgP8e`bu`;Y{#gE?VV;#;a0Lz%7TYbjNfZ2TpB3Yq z=IYC8KiUca_Ef+{<;Z)Pyh^_GW+4&&yI7XO21E~wAvnpN_TMPo}VsTvfQ z`q;Q%))p@K$00fN5@;Ri>m*6=TG z6Dj_@w#bE66XX6+1ssNf){1M*CSfBuaktM>&bwhVK6-sMF|&CdCfVD2&y0z8hFQY9 zBB94WdvTS$?RVZioC;aItZYEb1VJQ?lp=l8XpnFFiTO`h?V@)oee-70&QXNzVIJkX ziZh3h506LN(J?<#1(Z8K%f@9T{(8%LBFu*@ z;O*)hkKcKGwW4{#(%S3AD?va-cq3_bax71Kv+9asYG^K5JR(;o!Y{7yy)UmVdOe!k zjyMcMLi`Plqo)NI{Gle;T7|`q*%G-kGMytDtUcfbk*G}Ex3r{h_XP=tVvm@A95 zm?c3FMf#@E55Db(BSy^sqSHZDn>UkZh>l0Tiz{9NDhcC3GGoU5l~$M^?K){rDFg#= z)L8=q6C|iKG4acRyYxpdt+r-k(n=H8z#_lH{DFk|oAR^5>`9^-#N`P~YX_|NEM7?* zZzQcwj`_3~wV4GXNr+GnCLaX44OQ^lkYnaz1{ku6<~DTv4=d8qe+1esTpwm{IQEQ1jZAdKzpQSrX-kvh|N{SY)Mn z(n{m5E9*Cc5#SRrpU;>*X}(x-gFCKm48|;83A~Y4#T&sZp1$-cS?wjd=uLGp3&TZW ze-;~xshIEkG?6|$(rf;1)^Tf&<2Q9sv9Z{3aT6})Qm?OY&L!c5Z^_0mBv2Jv`kj4e z?3Oj#*(`9lXTX47zj%(l)xOi0=5}dpbC2C3FVa5l&v=-w47)}9rqRYq;@cni+F99$I0v2|RGO@Dk~dx( z=BW?n=8IXed-?F9dGf)VYA)PNf3}f_41LIh@m3|E%J97jJx8e@(TuM)a; zNV|m`Lr5cx!zH*T{7vPb!}rI1Wj&iYJ-W2mKj&*U9`|XX?E;v&Q?Wf6bqkt zZPaNO%cU(6em5+Y!e(cZFbqGlYjYfC71vh2V}s?S9L7J?j=g1#C!EM!0Hbt^o1?wt z!Fa0@Q1z5|PJLEL4CI8qF7<0)UpFRem^UDN@D>IWtG^vwS}9w#?T-dP($=IxeejqtqhKUYkxNmU?_Sv$2JPvQ*3{E~b&Q7O zCJWE!`piDpumI!PlLUOy^GCmT{c%jmLsuwa2c|ec|F9(*J>C8d$iGhl?fW}Un&%WD z0P_&oAg-jvYjX=un|$cl2?ezOMD@b+O2ga`R7p7oqHVxj+<&HD*z!e-(?yT-H+{VB%h}Kn=fWp;ev*JMEw7W+U1ukmqn3dQ`Xa)i5 zV;GMU#hT0MBF0q7_tQ`nmp~ zo{dT`;dpJBW$f04O;|K1N7HB% zm+YDrGDxUFzl^TS{Y4w1IR@OZ=x-kkk#+}eMpG@95Z=>Lam9W|&&6(Mi!zk^l&S<2 zji58eJMUc4JQJUeE8?6yzHZzv${TX(H3N$sr|{yC);`p3+zpn%hSp&D(^oeb{0VnT z5OpgQtaZkgU?L^gE`4`KEu>WSuQ5#t`D)3xPdZ-RCu<^?rl^9kk z1`KGl9IFYYJw(bev>gQ=BrvJhyhCCeAD?2+j*o$E^rv`8k;|Nza>dYkSD` zFY)@JM8wSxr^&gx_&bVW;f=xkiW5@own4&#=S1o^vMZsra?i~&>(HDKPH@HYVpcB4 zfNNXyw-1KM^IVfTeOg>H-X$=>aV25EEc~xTfc51?RwbZlIGwj<;p}nAJICNFgJ%+b zA!YoHS?3$W{q{?1Y!m*&FFMEYhAM4ai+DntB`6R^40a|`heF_j?@ZOCXqGxYPse7+ zRq5Blw$M0|3dfqohl9}jZTSQ47!Lb9+GGrT_x}9n2h0~YEHO`uuk`7M7ns>vS@+9S zV38TnD$mZ)Uion{uqzc1w8xri69U{!T|K6796lJr>C>9%?b&(&RnI1 z`xCN+{)KAb=Eu_3S>{)wP8?8h$BWvviwfbOoqjR&5yIf7kTA(hN$NK=K!nQzy<6TZ z&q&FOS#f<@@x>5%z5xG|cBZ!Q8UM{ZyvV8r6c2)}ylH9kNZvWr`b&fGYwnnbH0VM7 z0c9EN>?kA;^|Wpod#sEY$YbwP&Nr-fm_a@<+~4h-XB$CSTXwGK*J{cfsn;Efjm6-0 zzLEG#@-JMt3mInNa1qZcE#B4|(H1c8c4~!8ib)TSwNt_ijqkJsz@tl=MI3Fh=HGdl ztC%5}mA@8#@}4{slJ2)qp*|>QiR`IHYO%J(Doz?)E2LGhVjt@kH!pzNf)heNnY);= zXd3*384eSMg;JUSuHxiibg3vl>1w2g~j& zGe$57OoS)~5e~bW))869Fmd3x6wNcqx^EH3yJb#*(O?E88zPuG!kDxpMF}S2@NBHG z5ll?9hP5)`viLSEBtE{FL{?m@Xq6wIxL`LblAk9qyTB{=i%CxGFw8uB*_goGkFrXb zCLRh&@x5MpG~hw~LL4djFB<>r)h8aZS*ZWhuVt1>7}CST|4Wc?2U4a@GMJoCC~FOj z^WfXN&&&4vU&-9<7d8}jl(r{^eo!4|DcV?*v_FJNTpm5<2jiZYX)Fq_>@GL8|{aKy5BUxf)M9wrZ_l9d-PsdK{L-^)C#s{*6Z zGy$cP1|f=)^L697`CN_i#N-6HTq3QORnWI&`C{TVfAsv7%;$0UyDb%gL7L>tmUX`+ z(nKh~Eixu~*`hJh3B>}Yc0?M~yE3V8LqRJ6ymrpO8@0IuF_A>FXd&Uk{Xe6$Xy+xI z-umFUxungX5ltX;q7zO_B=FbE#M-=UzKzjMf5hd{<38h+XD|GV6TxGYVr9uTc!!B#E>bgT?eitU7@?a`HdGW@yH0BFBqX-_>c*Of59XxGk$BY## z?u8;ytgqYj;5G3%Z6_wCiy~hI@sUUY4*>34l6*14G06jPJ^gvy{WN~9M#Hnf&Dk$g z>aZrb3(4zqKdP9k{tL%QCw>`q63%(McEe7{4J$B-(eM>hOc28c@w6~mpVn4Bt{rGK z(Zc=FI+$oIf=SvA&%xr-DlnR?M!&gnkpx~4qnmdZEqUXs5!sS!iYR$7tE~I+Xqb&? zzBo$r{=g8)OTdmI^o}%I3jKyMgNB%7g1a^pCZO_QDn;eRtCokw;7W>zWOul7#QSj_ z>igTpWCjPBpx|$qAaMn98#^_WW9O1FmAGr&cL+cx3}y|QLtK0$cW%;euE%@{`(lRA z^?jc3HGGDf!{Cm_49~hB*M{4}Lfk8&<6mnB5fB#NP_Q}#7N9l%Y#-|vxYuVC)GaAW z0(A#Kd$0+FNtpP8bckms+)7g4P#*=;&KJ`|h&qfgxVo61KA4ryo#=a>nJ5k{F1){U z!WDn14Hd|+X#(nQ{mIyxJEt%Kl?PMt$&2S2$ZzH@fH;^FD;lc-!fC1qfvj9fJQKzw zgDZ}QMV)E!kPr+mL~&NUAMWA`tFBL8Ja&1W6#fAY!p=ro4EGnb%S2&!jEt}&?jP=^ zk>5P_WXoj=Lawqahalu$m^Ek)Xb43XyK4oWqkHtjh}Iy@DuISlOw4fl{6z0n;Z{ei z^K_V$7;GwN+goF2w>BD1^e(Z%@zMkoyPCu^BV-U!IUK+nekR5jLWgWdJbzZ9$9*w9 z9LuvX!nFG_zR}7tZ=D&%1{GMDU9i$F_B_V(&_*<0{#}rJ(K+o-c8bJ#UdL!dT(Q?_ ze9oCMSr$Uv8F#-cOhDzuRI>8o-ECs9vw~MRfVd<6JuHwH;WS-bmN=dX*V`Q`^+sF_ zWL{cUJftLyB;2;}XC@q=?N0eM9k9HVAOIWb!&x~QoUSlfz(4-@i|cLJk+{T@PC$N2 z!2l`OU%qYrT!~V9rADU#w}e?`C+kI}@MiZEJOof2K$v^RnKiCmmHxKRBkboJpMTi; zzkRG-nyg|cxG=GK+EtA1AZA?~J$_cJH^CB#N0vA*qYichPwtv+mCrSS%A4vu~otItyuB;TTE-JC9tGRtghP zxiA&&_Q5R8Dlo)R|KIxflp$OTyLB*{2_uYJjpl@K!rTAr&n!19l{l2a*Q@g=tZWRP zr!)}3T>_0NxGQxL$~pQN(Ccpg?}{^5k{@UryU0!*yhnBm-m z*ib}rC0L^7W^CcTqKPv;c>ieyFNv(Yj7%~XKgO4fQI%GwJLZG2g~zJ9&iD6t!TuvM{#71e7lZf$78wl9d;aK?Y;>&5urw!4zELPPVHN zEC{C!qBkIfSQ*{mL+xf|WAHF>!o~THWyM2E!brk(u|d#z?y~vY?Z*-mA;#s!!&GHA z^Cj&V5gG&*Hku{EoBm-t*J^>oH(Mw{%w*mn064ACcY&+M9qSvH*eIIdT04@CF^OPc!+2)Axdk$umyy&-WG7+VMaNfCz3zMa z{3)28J1@^~etno#! zalT+h@o1v;C;g2^=aWZ~rGn&+i$oUv{m+iY#F%J#;}?~I8KLR;U*BC zXpD&Z^5jwUi3vWc(HVd6UW>-q3KLLyFcmlyNZYhhG^P-}SCM(u;M`zZ20$u9Z*0-n zv7r1m0o`nkXYKfmtpUox`0;4s+7tcGw|!t_%Y}*k)>F%^i3>+3TwrtOjbBtIW@I%3 zcC4hqhBs+kUdC|SeLt6h5dnyAJ>0GMSLx;}ZS;)^?)yC9^NPgS3KLLB&pen4=ckoC zm;!m}0MGN3R$*AAc4n1KF6kJFyAB+yTilNzcD4I<^lvntYs$NJLT(P1#s8?Jj3^? zyU*t$F}A`46b;XdsrWo>);X9JC*&m!_VnD!>s~RH0kn@QR?i-JtwR`#7Vrerc3<8Q zv3xGe_b>^xrhYUi%st3#*JAD&ZA0AO{x-gL>^yD!xcgN4oqzl0nx|H_jbLoi`&ANi zn;juG1HSxNhcL(>3=L5=iShtG3WIyO@ViPeqi7o|`5WDOJTan5+Fa>1%%3n%t5IBxka$PPc4r_94O8O19=6i0m4p#D_ZT#px;{Il0#qrRhCQec9%NuhWFMbw> zAbhQn^Y2{k_TDsyl~4h~CCo#%%s1U2B>v-f0nOl5=-Ww=z^zDnX3Mf2=I6vd>TDk{e@Y1jkO znpca40)K9rxO3xC%EpM;6@7M9yZOPcuFS{tjR~GvQOPINt$+&iQ2s#z<&fB^NhTC4 zyiZJJv=>N}#LvcAF=;1^2}e-<3!*u!nmEh!$Yfya_Q$(VSpbrtW)w0MGZ^@d-ED)d zX)@EEXu)ipCcy-oduEmXRh8QKvGKwGUEK;OX{#eV6yhmEDM$+y436Oh^c(#2x|@skYeqa`0&K@`_|JW%AH= zi-(4$f}m%kfFuP7s09)LgbLoM$d1nm3xg~hrd4D;d*1j(y!Ve4SPgex}Rv@``+TX#E2G!SSMn{@AKiSR`Ed@8!yq z$Cr`1m}K}1;y36MbDIU^h={TX)g(U`A`)O?ZI?R?F_~6t5o0nH>6^yg(@L!{qNF^E zOGN&~1cc_oVw$%wp4n6)5-giiNipZy%?HOVqSUp3au3)lUoG5Lz;4oFBEkATB0kc; z`^UXvTc0<7r~$rKtG9Cs_2ucfn9@WRgn;S8D`}Sx(!+`&{r-WoT2*dZFMV8PeBuwe z=Pc`YCA=a(9$IpX5z?du{|osJ;+uund!B9jJn@TsV`Q^{?UH-b6|MRm&9f|^%!I`( zLMWD9YKajs){D;jSnGIiypNg+C>A&-OQ)po0SS`R^0VW+C1MmmEGGCGnLiBT=uq*& zBzPFKsOu6AJ<2e$rL&u_Mqv)VJRNp^P**o<72kTO#|F|5d&k>~LqF^>HJa!6*RO1_ zSPVXdgs{aC7WWj~Ig;WJg{ms$VyHZZg*0pk^02k z_KlGZuE^K}D9YK;-OJ}lyytQ(Uwr@#EgK|8m`rYQ?z&VNhC zi;DL~yK5$(90syQU?q9j4hsu9XLGSB_*De60D}l)7Ew$BRUOHOK#CUooxY|6qnLv~ zPbc6JEmM$tFfE@lS?t3$nU!DJ^pNS*izGgd6;J|j!NdT^Yq3hlwY3snQCvN_ztekw zd3{{9Z(V2tSuwYLV`Mw6uJ2MXZd@Wsk|nSxzP72OBGbqBS-3}~7!l?xW;dEG ziw6ZPjoofGl*(2B$0Obw&sY-y#c*&K$p5W8UW74mI1Pe9m}&u7p=KS7upO zJfy5=;=L2z7eURxvWjnvY}$iX=Zbru;EPSlj8e33n!8W*cV3KWyz@TNZ)da#vR&bo zQ4W$KjG{FlNb|;fi}p|W@0tjxyBNqmi%W!slWUAy-H3M-hgpO%iEqDm*!&j(*Czy= zCl%_0`$AxLQVDe^_!uNMFb6cY-+Ok29guM`tzA4GTr%zlUP&dqqC7mbq<4VE0QF+7 zvdfmaYX&Tk6eHU=&t93nX>t9N2O|P5AgTw!_=tB!NEr&j^uF^>r}_HxE4}l~#kD2t zJLWGgG#?4SV@}1*U+Tc1aWVAs#CuD-e@z6G!$80z!Yf#`VHUH{&QKg?p+vEkEO}1a z7w!v~Yk=9T&`9{WLT4S4DGBD#By~89IXtVF)Q?Eh3CFaK@^q;8e&Ch(V0df}V^)*& zk-TVO9-0lID;^p+MAG1l>woMfCL;Go%PFh;|LvVybQRZm#|MK!fG{8-VUUCo1`NU2 zfUmKe)NQ;Puf}Pbbmh{=bTxhHOZ(8iwoiTUTIoyro@Aw|{otfcY+5%L2iq|QjBOk+ zh?}@eAdI+2?*F&X*Pu;{L-qz=y^)fCH?S+NkXjrcZ2~M`tdnFLB?8ad5x-=(Ks3 zELuNqeP*nACZP**;d_hQNA$Z&9F)m{=q+GaAd|caJ=3xY-7L|Zg&~8}H1h7D(cqxU z7sy|^6x`aVY_y)Mipx2qu?leG7tI+&4c*GWqd7c4t(b&-9S;frdK6V6mkmy zhsL_UkU9!r*~@y+U7Qp*E4Z&DzNfP7fpd*=WM5Db`99&J7?zA9;Z(m5%070p_6Num z1V3C#xm9!a?qJ`?JGmIseEhzr5Uo<51Ozeo-r4`w}j27eO-xzA_p>V z6Y@J8u@%iZfX7uBJu#8Qm3Zg0Vb$za0{7d0 zxS=5qbgnnaVL-NAb0RWkV~L=-*5StA4EHQYHVF15;=N|(?v&Uz?e!0D!)KdA1SiBf z$2IOH930LLL^!S4II33aKBnQ|%*luTGZxc-L{HFEyYRh*Hc$OniG#8^5b^9Q=_4HraQS@5!!{_1j*57moM1 zeU*tjN~^_e7LJM$2Q)&^T!&w@(Q{=POrPgJN$0AMZkP6V9vmF}UOXRGh}DJfE$!Ih zWtBK6n}gsa6#U!?al$>}vpft#j&=2%1zy~xc8+a2HR}Y=F&HM~Z<>*F$jTW+Pp6&! zwtaWO718f7?&U3E$}VUYhuNDf$IrIBNtX((y|$+_SPXlBu20^Um*YKd|7GEhkZFJ8 z;|qps8~DlC@?Y`z z9#!I?Ob$eE(nnR7wO?;wtL|oytr(W}#CRw;ocWWm2b;+#%R*o76P3<9hySSVt_ARS5 zs{2@0KhpMt&H9BGM2Y#UlAMnldZ%rlwX6~c70!Wt_tgVtR_(fSQq0ED<|(n(pGg zN|{{yREdM4GvpyYC(^L>s*QU~swBLXhLi`P4eA7uUwTR`i(%b1-bSuk_PW2#4Rupa z4`Bh`d}(c_@ZoR{Of~1>V@f-3*JUm`htYj;!y*{^!uB!0NhDCHAUG|^0jvEe6 zaisc~R~IntxY1>mIVeIws{P49hjEZ?gejCM(H zzO=SkL&ztUGvLOiU+vn$I20>;6sHS__FdW1QZ71&adso`^T3KuBMRZ_oETPx`J8Mi zQ`$R*7ZOqU@WpXCvuqV(`fBgNXuqS!55q8`>&E@vOdOSQ0J^^4$f^4n*Uzl)us1J5 zaEm7d3xeioQ{QqEyCE_Zu&J@Nb+?pAzBQ#mm;CDg%n*fu)dR%rlJ7(^{Q3;V>uZc|o&9+~hC6ebk_+qx@0fZCpO{aPlT{#qC&}5fm0MFR<+m z4O{M29%uf%dFI9#(|NMr_{NNqfUKgffk4bvv^0KSQ@=GJO%1#MR)lj)?8P=ui5Q@@SWj1@|aR23-PpE9EQxbFY%mfI|tC?*^IH))d zZr}(1`{5}QEhRs|@uuSeV>amawFxsUWXkx>iRt`N@mt4#n-{ke#u>p~73J3n=G>_r zONt1ML(qBfa9Fwb_}=CJmisQObNGfBGI!}`NY3!4qJ=n{bF+eh!oI&fG7{|6OdMo? zQ4aSg|B@@86MX^{2#f)mWmqRD>~@_gOtOOO@sqaa``a4YUDnIw^3@wntBp%Lek03l zt*nWh6g7pft^EviXYA^&;D{nb5clxFSJ7sKgTfHp{Jb&4wR5l|Hk#xnB4FSW#~-RH{`cO&qescz|vLGW{iW18p8#r5#1*3Zw4;4;n}EwXNz;ugMhlFkeOORq^!abPZDmY zD9$K+4m_AlBtVBu&Zt=p9NR|WTox#-|J8vrX7=owNZxSlykV__z@ZV1P<2o4DT%{9 ziW^Ghb0Ta~giG1VD&gdiOGlBIZOX#kWFH@_-aQ6FL8N4Ip610CZ*i_a5$&F%qsFn9 z)zA2&HU8}g*cT!x z@;~SF_GdOQPeUmLmIWTx#5A&&;Q+zyoR;`Q5uDNVJ~bbQVviZlNo^H)5T19NKxJ5m z{v2f)Pd{{j(BqI3vbZ6@nLNOj&k3Og_QgJp16I_;v0z2`#}^+lm>?Vqj=8Lsb$t3W zAWgmJxAq4cHSG=%HLa0cF1t1^?RZrzpVDdCb1p1L$Sth3vPe@Agc>^qLnDUQ<}z;C0&`fy+P>~j3|()nAi zW51!I>DS~`uL^s`wTNrrgebW(v^9FL+qLmNB|&~*cudt7$>fjppR?daVfn)Nu8P*y z4hjQOn`LXGZisSYk@4a++!9l{Uw(AJKnz}e?^N)iL^*3YrTnJjZOss7qjDToBmkXo zM(Pu|vCaKm!ksKI&VV;FH-A+)l&~ekIjPN>W+u4`*cJx`-7z?smn5>va42shzZm6n zs*=;)<@h*OuE+k9qrowiQ|Z}`Z6xvS_03a@7`wA3d}(oa(D*XL%F6~C?zFa8FYZA_ zkwmXJ-l|&LIw%~CtC{`<98q}r0_8X;P~M@TL~qV~4!DqR{V?pf`Dy$N7cbHx`1 z*74`*W@=S!Tp8!j{T{~M!7&bvFRZf(!QkX!$#cRPwv_6N+Cw$DteGF$)*dd_Vf16o0>b#~dC$B=GGPQu= zavK-p16td-a_OWqjLk#gpcExo+)g;B1I`FlT!w+*h;U5IctQU4H_vYhp54%E0Hru% z60}4zyqOv1R(P*unxahprObo1U;t6K2l%DQi2m(x$nzeIWlfGx?_G3BXfV3r1z!}!zf1Hsc8 zE>wN9n@*JQUlp}+C3JJjF4Ay!Q&x=mqm?eO0XpV>08g9 zrB=u7hi@DfH`i@FBsE;wF_lSBtM;vDA8e|Q+w8Gq`kCOIl4?H(qyc$V8hURXK4)g? zPD(Ta@d($tRib+)eYmGz*pZ*#E4}CLOWV>xxzt8Af?IMoPyRKnlfqHmZB5UM!PQtD zx6{Hz=_PKG|JZ^WzL{97){fUPt@iU(iP}Pm!h{NCN7O=+yS--6{mF_v1WeRA!Z8kw zFHD(`(LFxcZKz&q5mmL;XiEp>QX7S_s>Cf-ds$}Y(ORkFHZv_&tk>DKpHuhCj5Q6O zwA9%;JyS&d2q3^Q&cqTlL`(uz2`vcszAYV8c5M`}`{KBzumSw%@+{Cw9k=q%qW$;e zQu`Tu7K{l)jfjbFY-D6`cfvcN&Vm3!QqDBAi>7~U%W(*X$*j#1ZV9fUBDkfdTlFqI z07Hsa>A2lZCU>g+%rFQM5gL>@DI62^hSWiVyDL-IE~6Wni`z1S!f39wSzw8LYYz*M zSZ$S#TYFfbnqIinerENA(v{U>hghcBRG3?-r3~Zlcm~^{wWWi?FeI6?a7|3lH>25F zB`8r~9iXt6+A7LZz*05msLeQ&YWLZQj+=rnGhL3NEkhU@xer(?K+I=d>PENEW2u>b ze-J%&>0W+JY^0B<&U1yzw5X+QN8DZ8Iw)=!96_^iOK~@3v{q^Fu~9Q*Au6Eu?J?Eq zSy?Qih1uH3OBB)J!;uuJRYSc7Xvy)BtHIlXAq;CuoYvRX89b@-q&3}(QaQdG-QFC` z;lFmdKU``*(@uvnDr#E)KqXYqZMxqO5vHx*%4KcspsF^^v|6PQM>sQv6cdy8LchO_lEmEsyaZ^9qbwrq{31NF~8Pj&$d#^+z4yjl=o#VUF?Om^9yWAg6wVxR$ zHB)pU=l-)=#<|=TiwWD$2s85C*A4`5grB>3O}LR;My&$|L8w2*^p+pi_p5~wStHiX zR>@Q~>w*x8oKO_=!?%tFKbDXL3cvdmMWV91|K!DBuVlJljp*!vFh4%`hm&IYDh=sEcf<#?AT8C2LMX!Fd<_j0ng+_E%ETFp}HYL0xn>Gn5qL} zfT$|pJ-c~z@MV=7Jt~F_{%+^yBdGe-Nvl<|9O2O1!a4wd4tz*ax{-Fi&{=)MVKB@p zLx(R~t2QJBogs0ypBSx`yc{?+7X0q?n8|~zRr$-#{ih6nxy9?)zSiM8T6Q@=xOC{@ zRZ~ia8o^!V%~`e6{gGAs*`??nurpk05Gg`aL?cx}j8RM}M!T z`vzItY;sW4bCCmLm<6YJ*jW_O;p2_HSP#h-)!iXi^{!N(ckVl37)Nm|G$H})NwdFe ze@*>AiQ~H{?uuw5Z_X>v{c%VR71g0WMUF(2&1hM*p94yI+fo;zej5B+Pd(Uc6t&wu za*% z_bCEm=*G^mBMoxD$yWbv^6$_Gc)j8{zKi0nisY>F+#iS0DLi#Kct*~EoLsY<6#HfW zv9+JVHg(MV)Fi>V7Bps{f#uAk2_EmD>JNewN4RbX%Z&p+PFW59D=21Qap28Pcuu(w z)4t4NHt8iirTa|nGkZpYIw_hl4qDOAaShpyNtHRNlK-qEr*k(Hd`x5q=+-N=Q}<}$$1(3mEFe$Yq%%)&U5Q) z1+(gq%l$#WIj7Sa%KmiEaZ&n=8*)4NqlkE#(X5lgQAL}HVg=Qh$!%u$zC_Dg4rylV z<{+Ax@J1&A38)R+NTZFqD40X{DEa&zA_O=n2|pSU0@3Mi?z=-+7k2|Tdi)~W)8~_N zPD5fQAc6@G6)+iZYn;=|?;H=1m*RnC8&_u(*Cz!7u^iudaaZfasXeSnk$e_;t?)3G zfJnkVta0afMiBzh-bE?RcEM3yp9x|z;gY`l zxvJ@LPElRFxP9@RIj_*kS!Y&zo|E~A^5U*GsrYs02d9k)hvlV@>r-6LYx?~mFsUvg z*D=~~$Z#=T(#r>}L>%LK5gIltii#e8HvK(4E}Ttgm*ZT*9N|g2Z)Mgh5ow&(Q0U(T zYuGO}8uBybw|F?oxj;>V(#H38eiXc=H@;0Q=QyQYs~Vj_A&ZgTihJn7JHv56;{n$Y zPS!TWI{6N{^E?e{t$BhG@Pm3V4v!x`BXyL-M`VXLaD=lC>!xiF!zZE>S2T>a!Wwb? zjLUgN?+=b+YuV!VQTuLc&MtX9za+^5K7y)Sh8K7qj_}Y6KgqVK-y@}kT8$Be(1RU* zquU6A2j$ZEb;GfKxPO^ZJ4xMX0}F{pdhc5hY*cgzsoA9~Hxl>8&+91TA+qBZ)oT9pKW!5TPymHe3Aa97b+&ZLC zS0+F5pfl@qQqBN5rbZf(5l$pYXOLmu7CFMB$}e5k@WkN18aZIfwm24&xIFlPH^1=k z>fl>X4F*TV=RP7}CXHd03m;JwcV(SHbbHt*A42y~b(Q3`>SzaZtnhzHIj`{ju}}^j z<_4nN@#{oNS#f9h2>!FH1-yfbu~Zox;oPn~;0$|gl)*3oX(p1Th>!xHBTtj$2)O5o zqCm0p(?}yPlBF|m+T@c`!uk zTm+zSu2H)|fVD?22Y!k)Y>J~wnptF@ZaFK65a$M~qyY4&kne00ZQLJyn#9;HVz)g< zMudKs%5aRSaKd1{hy-z#zU8-ocTo9l=ClP)iG;D`gk~ciUVw5)Gu0H5B_}1NWawCN zAkk)Sa6QO|5<>z6jWidX!Eb+lgC4r>;J@~r%sf^0V z$jl)Rauv-ujJmGf+7(NJcLYw|uUy~-BmJ$Y@6!n(>BohII-zo$%ZWH9A}b=u=eDd4 z{zuoDTvW8-u%Fqq%Ba{7o%)vF0^Vx*ZI-wNF%Xec7zf14(FdG||IZ!^MBmb76q4VZ zI2W83pi!9&6G`y^^B_TM%#0$UqA)2GZFzJC$-8Y4{%W3%zi7eS;Jh5HYc1C;4M$HX zNq()a;*!)~&JD*4=+(@G>2sBhq2N{($|8OB;qXNh0bzUjCjHbj7s)LhK7GmLmOPHB z%BwT=Sl&TRwMRpLW#NEqP6mt+5C3O1tv<{aU{9Za>gth)jE5Qjs~k$yxI!x>)T2ijR2Argya0!)%r_> zS4=JMM*=+!$3*QScKN>#P6cOBuZd~oAGy|#Ybdx`5p%bgD{;=gxm&G7p}z0_8Ix)Gf{`ZdGz%VVyw` z;(#zAGz%yB(`vbj*2cy4r`g{%T6^fUy*x3F@E0GRR^D;Ggb3D{9GG`f?pN14D0f?B zuE~S!f&*g6$FS*?-oOm!Rxev<=xzIzk6}h=z7n~p^7d-xCtOOB*@1)=is}rK%wC)$ zcf$HbaYhMUZ`#*+Y7gUZOitUY_c;E8qL%r=Zw?zyEfVz2tj%kh!CJIq@1R;_`0!zI zQoLdLX-2C`XE1MV95l*oGn<HIlAsYJ8^Vuo@q_E;=?Kr?9D`nzLs zMkSwq?CwnMp*YW>6((UH*XVB;#{{b;Qto3a24*H|2y6S-a*CNrO>w)2h^*?Z&r)L5oK*tba_=egFMg{XXH{F$GU9Oie_<49fC!; z;Fu`(9UZ?Fy#CRd;0JFW4SxB%vr4SPZ>8pZ4j|5h!18I;HunFgS-=nR(yWuPEQ!Bq zouUFjnBbg>;D{0q*YMXoKUL`r;&5DR<67mMFeuR;YB2~h!2bmO3d1ju`*1-~?n0!8 zqa6@t>-7U?gPrf+!L_k2#m(^6lY8SIky0Gs)?PrIldsLQ)^Pjn9h94$%v#)hF8oc~ zRQQTh$crP&(Ush*60KCFGw50ym-{42+<;-(G682PvB4q15k(Cj%$)#7sn=Vh7tU8C z0S<-l&i79z0#_NzE?PJ@Sg5K1@Kd)1L8t*1O6>4mx~n;Q6L?!XTzrf~Ny@Jeo^#@F zg4AxTUh3kCBXa15U!@5aFfv;g#tkkDIu---Py+vvzU5M$`F-$DFYO6l+j}CB-wNDX z|B6mi^!)b0v%$D>R76wJM#M-B;#X7@{dJMprPU2ax4m2c_7Rlhl?Os#`I`<2VI1by zW>`Qv!tyskE&Jz72XfM_Up8=izTUQs-~VgClb6ieIf{3osmKA|Z-szj5vN z&bYRlA{!*H^|hzg37CnDR&q}3@xg9`dn@@gX65d@gL1sAt>ABR?3!P#pamF&5g8}( zW98i~N%d#e_ZU1|TuuvU#a{@h$&4V_H{Y@?;2l)9jm#QF`I|^ZP`7nc{7)p=L59OO z#IWLSyhYo^9$X6-ek>RZviPkmuI&NM3T}||`ApwZBQi>@VK}D+?yHs13ddW$tyc36 z%JFg(;cwz$qyTu2IL8rkq`ak9vftZPV>j5dSW-rJ7YwbP?9ohqtT}oK#pSdZ0{Xzo z@qw$a<{gxyz2NK4!{5|Z4o2mC)aNW zFUdLm?A_zR6+N7q5He(FwNjHg(w0LrZ6f$fO*waWE|}GCR!T$;Nv7&Qq%hnpduYUF zhSIPMP{>Q8oCU-2-A(_^vTDvF3#ROs;P^OJktK!G9=jeYIw}5w0IczsyZ{m&Om(JpE+9##p zgJ;J~-Bki0#(YhF>g~f940Z0HfPS;7F*{~C*(r|QEpY)`x)yt$^?Y3sd!Tyr%DxkF z_($XrCyabM$Dj}x&Tz_EK#Z?d-j7xlKbAR||F0nncn6ikd?Yv#hs@${x+tc`5fRT( zcST}2t}!IJt~#z^u`yoJaBw!YC@1^*v1`HTmFuRswoH3qT2SCWd2iU%(+z9b3_udw z(ojfds+3wg%2~ei+c$`I*Kta7jZCOQb=F@v8W-Y(M<(;ue@)iI3uTD0Ryo&ER$G z$6%d8$=UEhNZNL&xU^6DYn>hK^PV8WVd%-M+oh{FmF&M|qLlix9zKO>pK(GA>rk_S ziyO_qG~K`O4vN^ra-ajW4Cnd6`{gssSO;7Z+f>Dm743)rJHG|m=gG+5_qN^QABGH92lov;7G$pYR%IhiTnN=$D*HrN$>_33qq)9ULaihywC z8Y$E=4c_Y32u{iJW4*7*f!8&Ad0Kh3=x{6U{K)B9*hLY06y-qIVJqXuiaT%rox26R zgL1c(^O`^sD0%q$6KhS))iDdyymdQRqN;afumNg*NkB~$b$L)**^1(nqWo9~C3Jb< zkdVlPps=HWDg?G?HY`*40UoVLfWIsQ3@88eOpo%aIQVDqY_ z<|nPsepzcQ;2l&G?al+jn|k{|cd$i{Dq1Yu#6#!WH4@)>aa;YO!A;`F$~ri9*(5re zzx(256G1LiG{uBM-e&EKloN^Ym)|^MoD;KqG&@NFZ7(bWT#K61%6lZgeyc3t9aNJo zZyzEaj&^P5h1qh!ZC$%@D>!g!OiH;_<>|LkZ1@1PtFHQQH%c@lCr_>&SxY+8Vmvbt`r{8;3j zeDfA4Vgc`jp5ADSh9(1)6OE@1UA(;TgDpSSp7uj2r$Wuj@7gFW@ZdvUgCk=wg<2Dj=GG z6F}|;=MuAXFb6OUbeP~Ps~dhl-U5MlQ2r+H7Vs8mTMKv`RNGz}-!X3iZvpS1{5{|; z;4RR$7Vr+LZ7+@Qn74qpfOk;-9`F|M7HC@wcn8(Cm&SL@TfkeuJ1Bn-cnf$7w5En?ZS&=S?|t8Q*L%HIt=_%a zwYyez*REfO%FBu&z~aDyfq@}Nhzl!%fqfzPY`DO)Y1skBqLg z^~B);Oj^u4BqH$)NOG)~BFwV8ZmYb-E@ZgtiM+u$lq|C7acEwBzWlu3^&1-= zmPVy;{fK)d1ELMih=n?~7i=}}rcd2?8OezzW*aMYDyM;WzdOdqQR?th_D4|IgL2$W z(`?9Q$_Ru`zGkTKg3;{i8+>IL5&O)ss`SmY7{n*_<+I^@HZZWS zaY0~EpJ$ZMCY%HQf2Cgta=!i#jr)(HfRd1e#OGPb(B9bC+QH1mQ7Mj}_tVw9xw5*W zx{NfZq0KKkeIpwKV>;Jgw*Q!bal3MUlD~`{^@&`6Sy?-9y7G|xOM~;1{)Y`DA^Mk! zqa_cCx{N%Lkd3`D5i1=%9X$yzED;eAx4n@Gr=qavf6PCxcu33~9c?**Ko=JmIu|B7 z8+%hA0|y5Oke(69$VmICLF?dV?WpfcYwZB|x0CkSug~;+ z#^7aSXX5^s{{JWW--!QZss7)Vtp9EKUy}dVQpLg8UdZOxXGllh|9vw5G5&Aie+;>S z|MdL7GV$*;|BL&XXI@xt;Qu@`URaXo))FuJ6h9UP<(XbPDt6JY_tqG&TEV$6aXTU1(b@X znMCdvZQp-mgE85Z^WdRCK%M?5FqP{0^4(;7$uzs|<1P8Fa%0>i7V-aZc$`#q5zEdC3m!}tY1Zu8i(`h3a z85%b0!8pYqGnE4zg>wg$0MF)F#CQNHsDD*F6lP$0Rd|;|tXp6U)#~pBw7MT}*2=?{ zxB7*ZnJ4%hevj+9I3UeEXo_#UztIClVJlZW?0ZkmD=Bv!C2A@R@~pRC^F;6+$GUij zAI?N%gwAEl0ynslvQsHn@YPBW!lH8-3;<1#0CDrm-OOUDw?=((nhPB0^RavENh-?W zdYT4AeeDkRgz$Sl4SxNyX1#`MC$nwlMX19rAN-{V7xnf^TH$)|HZ9}&@_}l$4smno z&B^STkcBsAq%n$pbUDUROy`sD3q^AxH3VRlY2Nk(9TXmcNpjq1I#h_XHuI%-rbsW|N zO*!K9pQExA7u$%M8nQeePv})u<5k3ZFY-??1kSKSPVSNd)UXKx`VgnnxxYvfw1c}w zMfRA2uWu1#0lw3zvEzLo@UXw=iua}mAi)>;(C@tGHkXe6c_yG}f3NlLul_UHFpB^~ z3cz@b?)0igb{?%|CMjzHuXn0H#J=g)Y(y5P^RqNSiC;&OZW4XM@n2Yi5*uk540q`~ zvCnI0z`)1H50R1;QJ&(|>oUyI<;YRpxs&eZnuVE&)!m#SY$BBNdd*jFb-fC<81>6+ zsz!#k;AUg>{@eGrCAirT-OV+H;U z!uEZhK@ut8QJTVoR1Yqgg$9-&9WoN(MUU{5Us4j5z-<>9Ejg(hH9n9Du;tp)3RgiT z$zs9V9L1NBm5CJ^*Oa^HZH8Cbam`pdJW}QPWY7I}J0mVD%S!Cx^Wk^#cOM!8a-#fc zwW4L=dI&yJCdYCxP=V7HpP1N;)OugstJ3aJ7L$_+NK$0;(TGmRhCpcvVK6PJ9|oiwk)Sb(5ivLIMyowYlM;QnOA|C!goMBU z6^U**s;>r(I&X!rYY25fUPUEvcvw=?N~cV#38fHCr>UulsRi@(4dY)UCy-!1(oqGx zPi6&VX@rLkZ=P*-ntzEc1V7a+sm8uCZA#CQ+!EC3Ma(b+Et6^}O%=`)0a6DejFdG% z!-i8`ePicsaQ;r9rK2ay!@%G>%tTRj5|~Z=VU3~95d>kj@*p6hC zo6T^70)sk-c_*fYZkjgv2uJ_PC=}EA#fu7=V<~6wC4e*9Sd~g{SR``5x)z1yv=6Ii z9{f_fM5AO)U8skF1$|^rCK#AG;hPSr^9LUlqm53wc79$}*U?fBO!sAZp=xiOD<&z{ zO(L%NBjb;1xuBgL1MmA)^v=r0JL~Z9u~`LICeg(HS;Z@5MHsYOdjm-|iNJnBOc9KJWE%5vcr_WQi;Ndj% zEUBl_u=t57p;c20voUUY}KxJ--P#o0!6gw z+WtFOpnDL8jLi8QDs7{SKKcB(gs6qpBH6)rg2zo!B1%`@#%iC93K}NS{kg3)Ygl~I z%<)vf@o$K66}D|l@)yk*ylvs3Zb)_}^WbpZ>@#>`_#WyhCTbm=X|&~)m8pOy{4`Rt)6LT2Md5}RQJXwFJ-d-~54 zZ^<6@S)X98AvSKWunj6onXHwzW&nNTW~P05pqGFG=if_nzdn(mTvEVzPFALD(bWPo zD=P^#HJtA2HYPHzl*1X$PiJRV-ka2kO^=Niw$-~$K$QutU?t1cV^P8bnLuf>_q?U9 z8*W3UwFsXKgSji)vg0>4nQ49UzuzO8bEQ2}%NIyGZ0ZpI_B{CGOq^Y!nXdW=M1grY zIXU%H*yq$hLTOUaTTPH;*xZZJF^x1@HS!mM$n{{VZ(N=o4*@W#IDth+`0C$&+Le|Q zvdn!TYHbZcr~6>yElD96)Y|37Plgi-1oojCl3d+tlYKj*F{u3h?CAa2Lug=S1%Ix=6F+ojODh1@u`N{PtSV%$7v{!>>M(Hu=i zMy9_k7A(%ks22xPx>xbA5$!zp8AW_*PluNU=0pz{^lfrdSKi#31HzUpFLP_=s-+)XmMJ`E`jk5E3l*Cl?hnEKUh+DlbEdtZTiUA0Y^ zY>Caox(ATJ^HN~(toFsJ!bHBUHJBmjmV#0oSoBN$rKGf?k1u;IQa9o+QP4Z7xh4z@ zO#eheaxzp~L0}+~CjHO!9GHb=wlFo>`faS(HJ+XwtXw{-h$gEmh1@}ju>N>zdj>Yz zWi7*o8;Izaf5yD^v~&z?g?t5hK}fmQt+_D$1Ql6-S4=%VF;jz}kM*qGzG$Y!xlm>t zV=6BCmY%h;Cj|JO=u@Dyt}bD7OUste#l;0%x2cg4g!@pLg1exnXDi40+J-;z->+F2 zXq{7{eZM(+{KKyL? zYI;n=5gInY=i?~Dx_hJ-RKJt}(%vFt02M9jk@?)9c$k=^6~x6*m^`fTof0n@3}vLg zpaDrREe3E#}~Axy8>oH zO;ET=_AH_luMk#8M64ov*g?V?Tyokl1_eDx-U2s{Pm|>Nb;_YhfdV%Lx6hwZ#RxRW zfP;CIQ=%B=_`olc z?Fj9vrXoeN>0-xBvQ*@eN0VZk@Okus#?&^DW=;|{&U3hgAFop(w#ukO8)z#I$>66E zjbu{S3?HXP5P0KoyadYt^rXbchP0eF!`X<)Y}p#qHe7h3!X?ulc)8o%_EMd$wIHUm z*$65idkLu>$*W$NSaudV%7_Kz5zA5F_qzjf~yniv#a1TSazVT37o;Pt~mnH^nk z+iH`odX0J36RmPeDA6Q5=27M&58-7nnSKvDpcR%r_k8t~V`>iW2ilLzO+An?$*l@* zWBm}164kemKWVy^(DEdubfqJRK6#eWSVJM%SWy@k;WD{S+Ff*%-*MZL=TT+Mc-d$` z%cW!qGTK+o$CeO3x|t(wv!CKP!h~2BVTtvCIe&S_HD5bkuWh$QK;@*%z5&1kj6#)B*2eweJ(`;4(R%AqGIw4(sFJTnWpOvNqVks zGs(nL!v^j_`Q)B&onH}Cv~?3Oz^_W~Zf{dsODcWdPRz{AI-`AF4gLQ-rFT5x?x=-D zLR ztQQ%z=g20iBv+M0?p1jTt@WgHRR)yzkdXiX@Rd`PIM zj$Wm(F#R|8+Msu8yk4A98Z>Pi}b&a3G(5r$5!i7+blA1AaX-SQ7w!sX(=)IYw)&*R>lJrX8gih)DH7Ujn@<*6|` zdB#$6_LM*#xwtrB_nfgnM}`Q7)1u0X{fK^HS~J&KE|INqqa~>G0Hg-1!l_x}vy3tT z#0RudN4cbggdx26(UcjF!C83z!klBZc{VWq^*_7*Cxgj^+0^eU1sc~=gIaO>c|+$m z?IQe_Iv>#Y@Qh@+Nuh~CZ&pl?KK~qx-sCFm@>RTsCNf-{g(=`P=C5Y3W?nhj)OK38*6d4Mj!D(vCBgB$L!dRDc+;{98*RVLx56BUguv~6r&+ib30)o zQaS|UtJH{VZT+UpDLIeV10eG2)--Zsx46!8;AU*N7{9caJ^Y9mAf8M<{)w5HI{@>c zj3@9>UXs$W$RdxlhhcYS6 zMs>tUW3~Xyp6YO`o6_^J%|MX|*L3=x?1MHl!&p5#>=6Si(6d)u5$DlCdBz%~-Yv8^ z9jk5u*aXOzmo|)6rj`wjj_Thux6W)ByH`-s;eXOZUwQblL2snqqEVe30bm)3Jz$95 z2&{a?K3}Kc(IYB^=sd-F3ij|54J)aqzxLTU43uK9zwYiE5xcK{!#js%fSWGD*7lT; z(G<}zI5LVdfNq??X2&c!J=EuZSTU8E6<45w$)Lz`?Pm8wPi;zTFd9Pfe4fef`gs5A z(<3Z{OT$o7Wd!WGXZp2x(+!+lQ8x}q`JDL0AJdy04oH}oX3Ug>sc|Tksp%(AIvd&K zi*?#uFFc91VI@Q03zrfDH<~of=VkRYMA>_mSrd}b4A+VwDT4ClS@5jce}hNCK&^JK zGW{e4C@NH6MlB*NoNZlP7rj*(Asc(5*a&A8+N@4z)eU*4% z*Antt)MX7l_|76dB66*W6}a6eRBy(0ixYH|tX^k^ybHhH>Q-yVtqW(U>nI3YlUyd& zTf+*!WS|FAl+;__P-_9bhDYUV;#I zXYk8_yx>#Yt*`i_Fl>I$YE`a;qBs2g*Q@IOt*q3nFv!9_GtMPn3G$xjx|!59BdE4f zYeM`Wj{x{kG$KYS?b&EoK&sP|2gxQhK3%^7GKZB|UxXnS}dp(w+OU z^Nk$GnAbJ&gVMKd?5HdB3zXpX0=@8f21TmmY*rf7Azn1FS6P(1bby56_EpLV6|W1+ ziywtM%pz2!D)^P#e+u#vG)byI;K|cE{C#ydT0)(26qub{$5cQ2XhuUl+FcR0J`ytk zH((^dIi}lE4h_h?^_k*!Ms%L>KK9F8ju45u0-JbvrM={EfuFp^cdT~Cvh-Kz<{4Vn zgB(&gBx@L%@FDHYg~c4!YF|AX&wgNiC8l((*vTD!($v+pA>nGdZ}so0a_qIyvZ!LT zhnCZIO;i8=Y*3@Lb9p`TDTWtlyIP#-Z4HG4s~*bm#ljvNZusp z@Bd}=Eha7U;jl8q;(YU5E?1l|ibVICSft1VHK3>%xhch15mH^2kt2aKb`Y{i95D$ooE!CdClY>@^94k|ySeIIh9DaY@lT_7 zV+O>uOCII3K9SlzPW#x3(s6V(%@6WC7=v(wsy34d98?kN>~e@YhDt}JFKN9O zr2b$Xt4h8bQ=|7W(Vw&aHlMw%Y(b6YfZ7FJ-*u}nsu!GX*vhlK{N<=?YweyadJMXp zUW@MgHKyxTA0|RWUv#WSqY-un0d7NdW*?Xm%C|M?Fslo{IVRcX;Br?Z2bd(2f%G+* zbV8!noR0N2{VU8{!{2%)<(@;A(xicQlXdse znWh`*XSKdjaG@(B$*;hJ`OQMYo$Z=nvD_+GT2|mh*RcUe4oPemaY|}joznwp#v=^k za!MGQBE3LCr9{32hgN1z#K%^IR~1Pe)5$+HE!p|98<}sFA17M(^6(jT2T;uWNX{Tu zLYdL=O=0PYU4CgO;;rOHH|Y`^Kt4$AixwMET!?7Uljd1QBThm;8|pT1qRg~Z@8jne zAUK4Q+KHPzb~O5Dni&@)!6Wz>Agu<83=hZ))Hs6|hkh|8GjouVIKIHw(2&2(NOw*{ z6C|2Q;!4D~{QRzk*KvP`gbh?J)9oP0emgZC8?PK%U!MOiwStX?nP3pWrL{3MV~g;h zuk-k$Y$RI9=n+y$!X!;_N)yju5tUW+JuYPstBh)lp%GVsE}}yzu%RdN@B)jsgPk{o z5KXe-CacE&CRR5_Y?m2-dnQeheEGPP!PXhb2%7}pr9f0_5Enfa?_t>LwpD}U#?NeQ zF)O)pc^n!5Wp0DsC?mzlbLd6Am89N_EjYW=Eq+wlIpEBrIJ2|OrZkgu9oe*J zA6>vi2GBYXKZl5MYAZy}A2Y%`AtOn6TVNddQZ%I)3W^IB>%sWe6TslIWa_*Vu;lAs ziNUbzcR=i;RUCu2c6pvQd{9ujK8CQ6(Is<{;jS`qf*nj9An%;_e|53y*L|DQO@$B) ztSYpJJ6fKV4@MtJ!s-xPO2;3CBrz89_!^|KOUKAPCQUx2lELB74^2QD5eSEwS5-AB z9AZRr=m|R#WzP`((9p#sn=2F_DNAtkmihsmOTE4;9rtUfpm9D4549h!oPNj0?uOI1 zjv$jYBAkPXH*Tsf{3X{zO|w6Wt---AtBXPn*f$^91aaP%n{HARJh&HskZr&-nFeP9@&09Jn*g!e6{Y} zGOoSh%;vmDc?WshJuQ+y-u%Q){!hMYz^ou=MTlqC*y=XNYkRiT%h?Ski~t?Isr;oD zr{Lc=WaC6#DwnXypX?aC0ep>rA+ne0FIp$3HYvLc@m0D0khkYi{W!=ol6=BJvsdlT zO(W4C{t^eK2(9IcbvF521`+K^4i0giJM+AB@rL`Xq}G+zv|E$&*XTJa;V-G!UVVeX zd4otv^}&1;M6!)(mRpv53*;ZzU8K9Oh+f$-91fS80Q7XWM5d z4`=5SYnAqv2`bho+~zlye{a}6qA`}Qok75eK=PQ4AgBEClBwqmPgch4-3NJsL}?%l zfk+3MH3o6AG?O`di^~P;xH(M9XR&fd&$^u9yuk?!7a#WgS#I6vQF?DIArh!Ah{d9V zQ&+Oq>3W08^n%{{!jJZnby>qTy`EkV_@Wa>VZxzX^i+=@yWMULk#y?}2fm{*acN^8 zH!nQoJ+TnL5SVi>BN_D{V|yJ*=`w<@NC)V&n6i78<4WT-U` z1jwxo;;P}(bk0>%dx&@St1+-r7b(qRYnB5L{~8x@sv!AA;FwXu|FYHQ>M{WfPxmvl z>QFch)QdC~;eK?-7Q$lD)gOs#_gT+PcMMBa!{~NfYj$!CY<>Xrn@?LMQ`0`1~} zJUYGmV`3AV(4roicEx#+OXeJp)5#x$G!`EmMI9$uy90_AL3LcICeL2Z9|N~Gx+@d0 zqX{knVkuQFY}m+uJMKO=7N}zf>}Ehj#2q_(2h|514a8Sjl_(qp5}ZmMK__reCt=g~ zAP3PGk6dOno&}f%c1D9!Xd9j|+o-kG(Uxk@DM=#`DN!`?r0pLlALX^*$kX{q;dlb#*)_`p_Ja4F$mV9{}w`4nb zYObF+(X&r;f7Ec5q&DIMjypzatB05`ZJxx- z+kbbzu7(>CbRherAw@>8KeNBC zJlDxuREMpI6$Yc*x!;Vj*$v>kV1-SY6SkZa7CDgER2qkHdyw6;Mdbmxv#r217N@KS zCXd*V`bkw`-k=CPp>LAVw#L}rA)}s663UuTw?;L>BVpP0qe~6T#^o3@rVbJkZoJ|r zr$EGAJG&qhd~AVVro4*Vd6ad(g^FZ1P5IouUClEH%heN6kw9{U&l|)<843LwiQ`M= z`gnp{>*s@jL?o#)*nm+ z;^WAF6V^zJ8FHiV)To$CRFN)jWXi$a}F=J76?3avN8|v8KRx$JiZ1fv%r?!R&(z(E}m#f9(cct*17vG8qoyl82GE#kdFl=P?A z74#c>b?8wDKsWaI_n1T|E0TYzpxE2gP0UcCozfH0FUD!rJ$g)f<%v>I^YB5&_*i$? zG${=!W^JAt3bz{P$K2{o`Fm>4<`!y#ze>hn9z`P3lEZN5yDxFTK(E7fwbe**93)q) z@rAGvO>H)XVq~p4dBP}~NM(WF$0ihCPJTT?`guFz{Udy1oD_pJv0?al0g+)hnS*bc zU7365kI%KX6L?Z7)8q8Od7nLIle>;d)}MUahnw>b3XTVlC*WDPMnwZ5u82}P}RrtZh{g6K@##-7Cy7wEzAd4ld) zAhztn4rNoU^VSUqF54E359ww&i8sIx;l?+?wbiizX0LwCEG@0-?fCx2Ane?!?4I(aS+MI$D*RO$2*PbEawa;Q+cH8UDc+tKu@iJNu&7wwIMc zyWWi!;>)$Fkj1{x*F;)KSN3eAhi5N!U98~f3Se&-)-?&?GY7Xei+YohFR}8%-`!fI zrsh}7ys#LUs}oG!u57Od)5npG%zpJ@5_QAr@xA*&ZjycfM~o-pR(%F&4O>1GDOCU~ zZx=LUDgcEWy|HzFUoWX%B#u^Eq^H7c0N9m?`=-ulq@lD@`VNd)>O-y>C@8_0L%se`~IJ!GJ z>NhnSU6by9#^3^rgT1{}{K|@4nDJf|cEkP7Gg6DBoF2IG8Mv0>`JgIx3@9a9QFV-z zI!qKT6z=J7yJkttbi<0N6e!&Gic+2CaT^ijW3ruMPf>O9!gzezD+-jF-hYHHPDS@L zlFF*%@FFz*0}e((+!s`AW7W$ukKTQBuXNKE(yXb3e(-~cLk*3l!r28O_NxSiG_4-d9g=5VBIBQZS}Vc}EOf}1`llYyT!D#hl>9qjmV+

mTB2p)3 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%0Ar|LCZ4XTuMj4$pC3?n;f+iu*KFI=! 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 z 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

-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%0DrGGsaFBNSkjH zD0a)@!Cl@f^a!+H5=967q?(H}3& zVCz#X&&NXjOxn|VX;dGVj!!W!y80SU*vp#{n;D4=YT1U}(GW0(qZP!+sr_g>tPCXw zs?Ba!OssdAkdg?+HT(4ioL(;NkoP-KKvx_~U}+Swb2?kyc>U8cog#<0QfhhB6t^P# z#$;-w^|6p%IdDSS^j2RrCg)`WP zvFGb#b6z@|2r-YE>N-?yX+-R(C=91MzsuTQ!aoK9V>qcavpsE21|Gb72hzxJv@}di z;;N#3V<4m>m`xd>k8+x(p*cK^nwZ9u z>YmDDhg0oV{d4QbKqM#;ju*@yiJ$$gAFpv(gNJ^wo6GuI-k+0?jVlUho`{EA$Mm%o zPb^ojQM{g7`!eb>5uavS=9Ud8S-Z~PS%CvIR@%&ehc-8H&nyoA^@GW{;R7=;l-8_8 z%tDD*Pk^|CL+82-<6+(pf93*OWN5+q*YdG-^8u`Rxe!aAJdBb(rL;^@fj@nD9p>MX zg{$8`1|!Gtw$dT}%=(1#5^RKjUA0$m_~Q>(;WrO%#W!!8g0Ft>3bUK1zHp4NbA3+5 zx9TJXjtDZ>R&He;DyTqpO&y90Y5$M?rc3?mYDj!Z0~09b>pw7o2b(>MIMYt0 za)b6g9pjN$`c%~H)aD`h3YNjPHUot`XR~L=Aw2WoPQ3EBd?XEzKuI2N?&QJlOFx{2 zk>k_MYDM|RMot83*l(H4L!vcN9FP8ZP35m>kC83E@%;9fhofX3O>0lbc#3+Abbc-t zF1nXj!UOO{a6}`q-7NPa#tfV8>3UNRbo?bsDbuuMwEc>js98%rFH7)K)fe@<96J=PCMQ{m3G`QdE+o zKYIF|tNvz)v~4Y(rDM45{V0t{naiPLI@Moi$qpal1Yk=AVlpErz8zxLTD+9u-%tod za0V4nXBX|S!VhnM9vhYxA!kxQyz{@Ndm;lL&c;Yc=z>qz0Svb@8GMGa6`Lt2j>46W z|AKyg4dm}d@#4vw^GiJakM-E_#9>_c{!D!9=kGAPU9Q~F%Af1+p@gH7SKj939>V%n z2YKK6KCD|&!s`;E5T6o_W^QEGS5Wj)$zGr$h6t0cSm1mfGv*J(W$z!3sWXRS_^1p{ zG{}MILi09{Ui2d(V?>9lLvB@ELt<1|Sca`M(ew2EyRhcDL$qYU8S}nouIYHV_9KJL zh^THXoibyH5Ye2&JLQ?Ty96~g^=8O*XioprCQ@^-S6{7Mx`)?v?7%a>+E116I%H*& z;gJwVlj)^qCL&n}wKSX+mTj71p_eb2Z&6W884*33K&9oF9_6t3QX z_{nno^Z#u?Vqz?=`q%{Ij2%cga3V#3s0^p;)PeH#x^Px#K~DelvITE}~@mX5C?5VGO6hX(mx zesnvEXdmq}zd8>e|I$1XzfMLXJLYyyf2j`yAI*g2nj70FUZ_Q5V-x;*=WBSLXIBPJ zh{sso*^xwMBJ=I(Bvjd>`q5Zv8Wl2Vj)Q8xQZbcNe@9S6;Ez4?>&-vHZ6T^N!z0m? zwAu=2f&1Bi@5GYFXg9p60Tp>Iyn85sSr_)j)Vb+qM073*bpL^GucCk>#6`TK{BL)y z!VCB1p|r38gC&x=7dgUH$UQ>)!PnNM2tr$3* zD{?NqFS;fh@4R^evWNFa+5qn3dMMgK^tpd;89p%bpNJmXhG~n2;KEDC_zF*6^Fry5 z(HhYnIeyr;_eC6WFW$4ubbk5m`A`H%_}5f4;Mu=#<~8y)sNEEShYN3}C^N+}>Z;ux zOFFl{Ixw8Pou&BpZOScGM)0@Xd`Ii{-GV@y{nhJUU1)vCm?&y3-6fD zTkE(O3e!Ll!PK?N&p*5gyBC*X=&U6C?EkJaLy2w>x-{YE(GU=f1ou!;&s{%Rf?s}P zJ+8cI5We}-caYKav6YKp-Pus72(t#6o8=u{LhtqwYy_iF_=wgV!V zw<;gM`0pjiU0#VKijz_@;xV3wU?*La#f$uC8`<{dR5<&b4Ah%zyY#A$_IujwuYpEy zw^5w9edR%v7uVs)o@NZ6m5fjQ&m3I-uJKmu(>1=-CezDS<(VGXWc0X4?udc2nRlGe;=XCDdYgYs|y|y1q9^8!t8b5C1VbrnH2jFwx zT!1kX2U>=w3%;(lz3FKTM-_IPlMnrE4SsyJV%aeD(rc`J8GqD!r+LPP(q_ z3>}0MQ~Bu~&*G;)+JcXNYB+xI+v`n~5}KdjE~mcH|8vD1ivVn;HEvy%y=7wowlA*0 z?jv=)Dm(^h6JyP~xU|Avf36ts|MFNW4O~exP*H}vTAd3=Lka7fg{8{>&Iewi20$C) zk|Hr`W(F=K0q&Q<8NO6JDJGQaul1dcEpLdaJl8IDtC*o(LPmcv*{afdta)iSwk?t6 z^=7mjh{WgrG8^yv=nSi>YlD5f#UJIRx`eJO>&WMP>-i5MHoMg>2E6KKYH_9|P=imab@mJ4VKj>w z*clu?h3>-s;J%ITPwBef+jQ^Zoz;_ ziTKQS=HRO9Ct6>a6iNLRl8?$b*Id+h>C|Wq7Qtg!&H&^W7h~U+DpXO6DS>vXWKv!L zRtI=-h1`78pB$e-IQo9UZw6b(F@f^$kWQNkOssQ2J2w>KwI}n@8r_P?i_-ChZ(U-m zt5Y$ERmwTze83BCFFvys&#x-QBJR`ZE*k4Yb%O7_KIeD4mkTg)*kvFdpuf3-t-Xx~hPUfP0% z2g|YIN#CqiJEum5X&&*WP5G?nVZusN`6Y*Vp(-dmgrE#KkG%_9wp3Yxd zw#h@H@Z=x!5SPaNN^0#59@f_wmsWss%GKcE!%82lJz4>$k&8fF3t9`J@!h{%VRzS9M&X~6gMbDJXSc01#QNM5o3WA> zm#kE<;SLA z;;dmDZ#0*p!;H#{&YN@l+0xI5qJ?-P(_VeTrqL&-UlBX4d@pPTTDkFLOz_w7V|fGYThn=p24 z8g99L0&co}8g96GhM6JKu?OL%+{xC#;dIWZ0VuC6$GXQ$(a@$oX{EA}$8-c^yPCvr zlSi9W<#w1EjMNMR8DET6wbM62P_#~MjiXkYCgU&jE~g`<)wIUZg3tVTCJoO{!}uwK zFmZl=>{wTV>V|r3e(ErG9Vj$$*Fka*SQ=3 z0qoyVj(Dn?8o(G&jK@qCd6?`WwE9kea(>6PcOu^u#)r)+_#p&{=6%vTxUyOPWG-5w zno+VLfbTzi31-h9ZrOx?P96dxEb7N9YOTG%)7ZtEYcc!k#KjQ*=o*N4N%UDrOA$Z(@{2gan`#sKMdON(PR8gdgKZze8#L`{t&Xgp z^`(A7oL6_xlSP};)8d*(gjo?uC*eyQ+y}X9N)bP}4Xd9yNE1m}yu_@J$G}`-KaVaS z%+yvyVlqCX*}A?6%U+^-{$Jj}Pd~pFJ6a2DSC@#$P`QxSlx z8L8@v8CaYAJi09FIG$>=6kW8}JZbu1?9MMl{?ZyUpIS6DHDVyoAtiDmAY}@qYPm7H9fx-|;Nokuaoz=-Ewd{W7Iw#nfI#GC z>tYJ}>%;4dGk9;nsE4V73N<#y8Ei$DwcWG@J!dz=XT+df3C%Y zcWuO9f4dWhHdG>QSQIbJOT>-0O~O}xbrG()aS|EA5Ysk`;B2+kR&9cTG$OkI(DA#d zL#P;@CJ0ifm^N!Dw(KrI!RlILI;ADmkjPDYIwJD=^8x1P;n6L97#Qv8LC%k04_1?t zqZh%6p3tncj@& z|H%F6=xU4}pK0+`mABaR&?@$d_oEn&YApm1$aNBX;>BrL^7s8{Y$a0e=jnf*{uRTJ zT`9$j;-7~uLimm|0_8^0PKmljXi#afA_BG*>8%LU!l?yuu!Sbe?EIc&EKy9d>-SHys{o@K+qK?F6 zS5Lx%YewSA4~{`vMgkg|8+b2EEAm!VWAQ6R*s-b*>o@L2L0%+tkohFQF z6qC2aHlb)UulQbGg^@E-p#$KdPGzV9UY_kCdApC`;d|e}{eN18$N#VsPd`+71#BvD+P#Gax{o|d0M*lVQ0StW~}xe15WkuWHyhT^K1aNWxbd44@#XJbVvJ6c5~Z>9EI{9Jv{)`CJ89tnY<}$!8G8fX;Q7Lx`31BkEr zo$B<_@U@K2!k;b~j%a0nC1PChqv{<(Pf(aIe_lAhFNz z&q+eS5uyA&Wq9ea-6pbFL>pqGC!_}n)JbL;j!p=OSpM_(8*uM4xfnykjI!>aS*-}% z)R{wY)r}J{ekwPIGa_hGD1bw28nAM6Ir3jF!KBS>jH*P|=kW%I0|t_6Sl z-D>Q5t(4-HI9&db$w+2?8Z$=q_z<)4-u)K^X>7S(35I*o%v*jzfA7WZTPWPplORUL zMB1f>#f259BVjHmsKnK5hpqq-!Sv#4EK6(^pvbTRYgg>YT|Zimzu&zUD<3+5)$1#e z(i)AKSEk{T_m044zCI5h`s^%>o18%=!$Yc60%&K5US2BybU2R=1x#&y{uQGTNN(XZ z8>J}T+JLHtTI}7)gS)iLCQ+Wwop}lcoHUbBc#~plG270oP^gh8^H0SGE3tOje)iu! z9NbOikzLJ5ACrhL{^lZl=+hT)@)2$AbIiuI%hg5Cq1pX#;i4Q=)>dQps!ANGsKt^; z^LTKViX3AzLSW?4O_#^n_zbE=AFFXf76Gl6OXsH_-GrzAwH>RTD@8wA1n4^{hKJFj z(Vw#40lcj-H7%Y82|0t1-6tYweQh(UxtDO5_MS?MXcUz94V2SfS2;(+?92M&%J+=p z?T*uENYOjpeylo#{ksnV5e6BxT=Lv*{NQ6RAu1_=Z~ec^G54~Oo*2}hg>^s2a7;l! z1o(-6ZlpDb67K0_Vi8a5>&gT-K0={XOnZc{zPuY-HXXqF7fY~qGj9pydH+5VGbJX_ zvcpJR`+-Tc&Rv6#&v_bYqk)-MjlitSMqA&B);pRUD%>GCVlj@BxDwsBdwTxeNhe&1 zr}0y%OE3P>4#bX#!qGp3DA#f+;5 zV(Rp4=#Z?m{6d{K`3d!Td)`CKUA;69|M|xTEc;U-s;G0AIhF@#$t04K5m+06a) z;lv@9H--vkO^vOnuAni{!!(yuP-Vt!>no{kM~f6A$0Xt6cW2?oTV@0g&W4tCqSoo$ z*T4R{7We+(4K%biqPZ{v@BQ{T-290PXjUn?17ki>UcEK^gbYUw3k9lX&Z}4K;qsD) zo$fEDfz5gh<5`8cp`5kRj*-Sga}{N@m0azla^TPgXk$Se57V{K_EQ`#{oo+XT9Abc z=8mF8)pk2+r)$>JTRY~>*4t@4J@fDueE-HJ7&s#qKe+1}OyMlNE8_TO%L%9J0s_Q+ z5iL#7ZYSb$gdmSZ$004bR?YRkH})>5mpj1#rg2*md1YL16Dn`;6nJ3@n; zZ11JCJaN%GhG5p5k+v@*k!Pp~O&~p?^ZQZpR=%>AdtI+#BQ@&ch5}n~I86Z=xdb0BhPqGITf$Dhzi1FH<^jRPWSvxJj*h#qvrH65FOzUPF5(xeXwKi5llgm{>}iAg z5q);#zCzO}OI;|p_@Rwh`Ir3|b7e9u5R9YApM1Rf{2^-Gaoiswf#sy~y4y$KqDyly zd_;!bK&$-3;_Qat9y*RgiFX|pIri>4guzliYTEkM9AoCoe%g|B^LB^FY)e&>Df zHP#h7}27T$5gG&3S8B63WaGEB+=Vj#|lsP=6R6;)D7 zkc+$SSc8Ux&A9fvlQDVLaGs3!Zmnc8pHbO2gI%Vx3izSk8mK*; z?u3bni^gW|%`BsBIi1emzqf%K+R>Cu@M`n(`{7+58_S~#*~lEkam+)ga)O6e5Zbf# z7^KUy=RMU&>IZ3%IakM3k7(8ruI}#s%`#qpP=L!nnvL7;xS0JJiA3HhmD(>cWMbiI z)`jNb@;ce4r!c}BLTPOEi3d00cVAwOsDZ6KT-=8D-7yXy{?vtLuvjoY+i0X`v;HI? z<^ez(Zd4aF#uH(CH`>2(ZYM9Q`af(%^^s-_$?j{LctTDCAV=rf21M8Hp7fLoyY3T` zTCTLD)gds4-FXkCQAE1o%kduYAk8=sEEm7Ixst|RI1P<=5PpU7#vC=VG=)iv3L z+zY8a*n)o9@pcu6l%^DJ;y7lh1D|@Qm(g=8h07Lw%c(Eh-+fPdc=5b2j}0lk=dX2& z%hSulVxyHxJ?TSI5l747ZJaQUKR<~x`wU!v>m+XeXHp4*iVn`WE88LG=zx9n@E^fS zj6(2rFw+&``itd7lXgslFdE8uZ^VH-+D;SN<_uP6O z_k#xF*WY>tO%)Y*&M-bHZ! zKYQN+SXXhS{mJURTC!}}mgQcs!8XQ#jWNB11OjQK2NIH9((@;r!l4o zMnLGdFZ0==D~kOBq-xF#NhQzeRF}3;r`r%Dr@2Y9udBeOHd7iV?Ng_{GvBVV?{n7! z@5V(GCW+6DHmSw0zV{#a>u=vM!)_{fII-;0g7kA{yY>+5+T)EUV>NcWM zKF!i9%bJjzmu@qJ?$SoW`VIm%KsY#Bc_6W&rj3$O6njnST6y-}mrlK$gmiBD>b%1$ zel&q@Ta^)TX;j~%Y1iID#_(p4C_6V9-?;N~ zDlvTnzqw~QsyDRap0B)$HOorznOo*j0?_Sy+k}CAaj-f+P3xQT2dxy(WokiG64BiO zGwjwknMZPYdk6?!08L!oG}N?%3RcWm*xRRz#ONsmyfVn1#_ukk5WF-t%f(O}SH#S% zUV_+c#t;EgkcfqvR>a6Pu|m7TeVC$&NZGrv_dZ=Ho+9eK#k9N9iM5o#J|it49qj>o zFGR(HxF^dkAi(0l)a`3WY|ap5W;@$QCjyZml z{Cgk9n@e_EJ87ltIZ1ud6k0iHMHl|_E3dxD|Ij@8mf!@rCnUsS*x6Ji!DmUc1#Nri zwk5uAFia1u%K(*ia@AAjnU%T5FG@rTyp*Z=!6o_}(Ko!1Z$Jj{Cy5RcWA z0e?2g%}ak6(J+7TUWCfx={%HB59zmg8e!)ARj&Tl4r@Z)Y(r~(4MR=wEWOlxK zEzNDHE7N#LunlR8u*3)tPpO5JEGxAWn)Xh!RYUb8~*;S(z$qtr4wyYp8S40rA(VSW+j%Z zvo%6C0n@@IJ_)Zaw2WI#gL^R)bI+i@wG-;t7DD*y4`QKx_TLub-yb|5?OQ2^PbI5A z_{3}Y;WwT#8$4bJqBrHWwhz8x`-zmPFQrbn&1=iChKg79lfQIN14Z54o}(i`K_BVO z$Bq!UPxf#^dE2O{hb)+FINppyXt??-xqL_b01sYikFMOkiAWJTfUb zF%X=HiD`kLMB|n3nQo>d?)btB=xnQ^2LCPCw!V`4I`b*2UTDP)<_m9IbWLic)OQKh zEN$CT!n0tts48tmeN~(7`>GSgCl5htW*iOvQCThb-iyZN;mmUjkxNZ7ec}3+;8;h8 zi9zR%NTMnU5*)5@*!BCOtdTt44gvwP5u2c{m~4WS2*G(fkoEMvq>8@sy@mMFe=IPT zhBo@;!Z&_!ab8VDw7m3P=<%*q5wC3ta<5u`|;#6vdAvA^M>;B zUs0agJCONo8J5eYuun!t-yj$Nje&UgE4OCCzKJcNvq-4}NX3?yVpIQ`Oj8wi{pnq} z_wHBm*e^F><5Si6*0v{b{bx_d2XC4al9&u9JZ?49)tT0>EWzJ-K63Sneb~3YnWhz5 z(8gmE>1^)=nu&?dVqE@rmhVRkXFXJ4L=H(b&jZCHf66jUnLZ5Hd~gQ!1?GoVy@!6I zC+*y)1V@c1-rx|P#Lme}!X9?@%8EuF2xWtY*(UEv!6I>b4*{VWxz^Tp)N&&UoM&AxFe|!L%N~Lskl>Grz5U^Aka!SK@Hgi8L>PqeWLl&{Zr-R{uK@SHx})p zeys+w)Y38KwBezdWp6&N@uA@p4mXs9wZJZ3y3X6EC8Fe1&%Ii+UD5?ni`43*fYY*CjY{K)j%>2|nJMs0uo{NQ-O}2x~y&*b%Dl`z@7n2e>Q=+oY zcAg25q*}!F9|YRlX$pb_N6Yez$O@-V0Ixyyf8Se-ORoA059CqXZ<7-m@T-cRe#GOn z#3Y&{c;8smZ12FXHPxI^(po70jI0PBYTr{>#(sQOnEVzVJd;oypvo3s2EDd8$|WqF z`5D*cp(r9UOvk)rqM%}LJxX_Jj7Fhoe74hE%y)j4%oiu6Yo^BQ+R9dnf;&!tZ<~Qw zSzk7BkWQO59N)V83fyqVbkyvklF{0FeEEVW@Y|m)G9p@E-HKn_{SrQR^)pDAPN}vg znvb}l5LbNqbX@$tnY33_h;*9u?%-lTXRbQh_|u(4%7?Xc(wdr`fa#2T5z}08)9E?|o(w_Ux*rs-pdP=to;nI62PLCY|%qi729~qBzAR+3xA!gyOX>l;UM$1qRpK1<(EWeG7WKLL&0l`JoH1V`0~xZ?!@ z*GXD$)N>yEtIbPp9b@Ele9!3S1ql<Peho z(@IWMI~G5?!&n-cB>3@fL)Sm}*&ILY!a3%dk2%JXIS@-IzXHS3*)xOeP8=gGh<b zZuxGM?`%Lz=>dHBv$JefZ26r67b7_PXqteqkT!LXy9PtmH32f#DBF0->G@QPa~bAb zI2`dKhhXSbYI>QPg)2Tbi^L{{`{+CoNtTx<1io8X-(mN0D{0q{{Hj_o@bBf9!coyC zSwYRnNx>DLn2CbPImnw5hd=yiJ^uQ@G77%9Z-nQewBfGL2~NK?7RdTFzTeF znpAm4Tz^17QYKpA#B&hoAlq9^Hu|GDC(SoBNVn6h`sz1|v1@yk5sYK0oS#k4m^BKY zxN9o*tZBnu8a-S2`Yw)ivA+C(_XI@&A}a3g2erlY7$n3%b8&cOn!xYVkwD2CLs8gm z8%wbI#S*gvbLpqYP+4b@Qk*ibjfl8OpUWW8aMe+_hH)y6O_>1`UNxK-S;V5^eA2s7D^Yy712qgrPzzFKaB_c z(^0^!lRH1Vj7ILZT3M{~I^SW}J|{SuC5XqUlggPCyDR4kr?!@g3R&2}G=n${QUg6e zoq?{Ehxf#n);V?w40y!m-bSuR3jx_Mx%*o$VEU}z;sI{XHq)4woFAmU%~xYVs~m2j z;HvA+z&Te9Lp?>=-+XB|Hm%ynbJC9JSe#(sI|LvW2*;Az+kSfKo~(t zd6beZ`hT}CModu$;whQB@V!&1`8u8}4sOC2wNVXSzp!VkKZ%d-*4*+3QOpy>x0{dS z!Zck`mf9zhcI}1ln+oa9%%2j2pMLXo+pky8JyJjFbAqE{d6$x$gaV>I89OT9=TsdHfj!ySegJhIU6SCMpA94nr?=+T~apl^AA3e(Lxi^cc-$m08SVQDNqBWb0R zL-w-1*;xT>e614C{bK_&)A$I0Y`v=Ma$E^cYFZNVNN^f!I#6EX*=nj-#2qgPh+kXF zjZihL5u6B5txrHL;&9V9=HTV$uEl#keg^f8$(qfP2Ubr%>NbG)W5(zYUcuJMq=u&%?Zn##wO<=k&DTgE*c?h7EP%1aL2nlAMz098Au)RaI33 z?)%;f6i$uD@F|%nn#MC!>K2@&>?bAh@f=lA4c*FD{X)O4_w*a#QJ3l_oxOBv!qaM^ zQ#d&fMf0n}94$?%^C^qH#>$I29ACPoFlk0P_}3z@%yU6l?Cgp<^4e92nmIPl z=(Rj`r_;F|NyAQ@J)GjPL%4m?jMtvq=3aJl?YmLaP3D=|$w)7VL;dD1g40d3NKhX_ zpq&J#iYiLvGI_Ww;`#^z9AFh?jo3re&{Y*~PqL44wru<)?VN?<@ITA1LSAmVnLt?o zN;#hT+d91PkM$_0W?vy1t!y-KCC%oZg)eQrV?@cqgZH&OnD@$4TkynR)?npxC1~15 z{aKkw`2ORU_j!ski-#|ncTyQK9+-3ec2Iuk(X44J^ts7 zNG=$H5py!g-byEZ&|l!_QGM;FAoJ^@e_kxi0)sFYU#?LLFShL$?_r&5Tv+hb}1N?xkr0)6C z)p+3Ni}1wnw_w+jCRFcf!468vWzyvHs4-a>HY$y#ClU@rlsZ>YU)x6IjJ4QJsW)*J zYD!vBy@UMr!g!p2-AH`;Yx6ODB+vWM32}IF*{*_|{64ANswr==L!Vi>l;#|S1gEjS z1uGZtL))GM81c@TT*o1DK0u0Sh z!56=C5$0b!0gwGhk1i^qlFh@xo#Xk#@sJ)Q{g0P5;FNa;?+ z*^~qI@x6K^B2^ROOK0Xu{Yn^SIliAi>2nuie(z^a!+Gy2z?gAEsa-b^8aQYe_AMAh z(`KJL%6>~<*@?BQcG1Rt8P>g2jnymbC}Gt>DbOJpmJx@PJPu_x_YSI_-^*g0Jv0?( ze=rx*&K!!#Q%7RX{6dO7Q*a2Sph$FeS&R9_dJgT$g=5veZO%T=ZTrRwv{%ts z+ms}lgh@2vkV7cVK}1CFta|KMA}-DaKJL+kJB2F5?n>vQDU!W#0g`^xV<&|aGPs43 zIy?@0UTMJYomGn2Un?B@mR-_QlQEhkS7$?n48`WLWqkNLt1EiMcQg=S+Y2FbpP9-C zTg)zf=18iwi4dHlfo8X9B&BxoRg({Yr_pwtoQ8;P-12_rywUb6+uMM>d#brP+kjfC zkgqIl!Rn=@Shc7Gv7NE_%006v)IiPCiHR6azWQ*o-n`Q!Q1ys7?mO^|N)>GpNuV!F z1SeSG3}DH<=|filt_}0$y{6{rpC}}?2!-qAD0!5s^wi)b_z1cxvQZCN{P!kf+Ga! zV?^%93IVmfz-ep(5*(@P%*YkN@j&+XWBt;poxZ8DoiN^SD}_W_W9$#-IRbVThl5*| z7sIVD?x#S~KeE^0^+)#bEJ-3RylfiAPRt1vO+-crB#M)duKo~uead>Y;a<75g{U!L zsgWHu*jzoux;u&aw;3+miZG{L9S2#KGBsdX7b4*|jORT}U;-ymD_skaL(*T>TIP87@_GPVjT&s4q zt!9>#??nqmo`p2!#3J&mBMXRJ90UTeIpG?a@ra_9<3O5|pzDvxLtiyTED^kVgIMWO zBq2IsKf9@B?%B};*H29Zo-aa#NReEZvAg=YxMUWa3GJCV9h5GBp-&fdIa8&haUuM3 zBr)^jM{rzqF?1O1hor|~_x>i-)j5LW>nC_bT;D-J1gDy!o`P=%XKm3uT`o7629Xtb z0A4hUTX@YFjGUZ=Gv*Y8S^M;(@5B{4f$Y5~PAJ7Ym(Dlm3}u|SLJiO_+iaX=tLDT^ z3T~5ml_Jx@eRvxF*h@FKa}aClBmZ*NVU_Ux{ID1O7?6<26;5ZA5geTt zGACRRaot0Ju&FL@vNIvs1>yvFiNo%r54g~P;%G7-OPe@NHSK7wZ>1GauGD0robI6J zCsh%l^~C7lcZ{ngi3K{MV;Lyutjl-?R5qfaybUP@F_e(Zu*?sg zkR7)bPEZxQWo4zHh|OD3(u~HscB-}JCTBoB!{bH##|8l@-K#3*EQ8s|f}val&IX2K zzDU~Z&%arQ-McC=b;fX9bj8%*T+4}LSsFWpNHS3?9J+cD9K$#c&m425Ptpvep}UGJ z9MP9d+U$ybs@At+*qj7RoH^EW<=H28E~@0l)$Bl_gLfk!uvix>(g z)m1m6Y)>8EAE0I2R1}WOvg{9C;T(6Cn!cJ#8`wM*f{Nm1)KmYDoGZ9_BbTFrfEwF= zy0{E#tD4D|J^(JXO&$HwWE)A-Jp{xCo;o)d?>(o;beVNY03JMp>pu1I4b|*2E+dBL z-J)oF-if0|*w%-`+#}9TBFQQW*XRsO=FkMh(fq?;bP@`>_?q!(FF$~t%c@aTR)-j# zxAI!VMKlaYuyXSIMTsXoMpS|bws;|2TpS`4`T&?fXTOD4eB6*f2=f{1TQYr7R$POf zZ`2?@ZwTh`*uaq_B>RQ5i{ix%8-nu9;x#&gV+D5A8;oszLdxtrkUp+WY=`Q2bsp4K zNf{ye(v-XrPc`ED4gxw~@a6xwz%taV%_HM=SO9gScfK^3kFhu7Un3wB|4!tKIh^hPUaUQI-?UC-YiAlh)l#L$o3J5 z2XTZE6^|hJEv-PT?@Ga^T@;5tNEH?h)r*{LNa9>ZlFvip*qN9|Tn-OhQ39~3wFS4n^Lb1gf&4;Ud) z1+AV6WGHVIZk2aE#o`9Qu&5SE5&6bmIw+~nNq6It7q;@aOCz?eYQqnHe-8IIo$9jg zh>cSA3&GJ0EUzF1*(+;Nx~GB5{!TMppnCaE;HnY1dI*Tv?Auj~NB+D5uROUEFFaj= zVI(l=6Jl`oeyStSOhm@;WF)1<8P8USK3f{vsR5T7gf})KZS(=`;ZpbZFO^V*{dz3? z+z4ED^;Dd5{#ffcN1B27??>*3K!Ag7*r-%YLk=>sl5ItKNQ@Kqs4=9oIMEzuEiF2W z<50y3E6@P{a3$H#Q9LFxtVY5$4h0IA4oat{X5lZTt)sQK?!)hH-++#ma!xK|arVM- zi1I64PMAUjLzT7Xpw{7dm`GW~BFNSW4KP}0b)>k&O`3o$CSlwBMg{h5Y{f^vHW8Oz zJdw zBxgin`ivxGQM`QotbB}`noSmpvv(s&6?Ge>RUhi4(!5TpxGATI;^yV0NMB!$=7u&r z{9jwK=<&U{@Vc$I@$=^*J1_Z^hj(uPAl+oQ-gy!J-}gHx)kLkh+?bU+(oC*5c^_+B zl|ckYj8n1Hw8AkfT*sR6Nt(WzhdzZcvxiV%Al98>8mu#4A%Af#Wb5e0&(Ei&%{sjH z0J$I?d$FIB(6bhdMLhe49aa{)l?&ay$A!67kWm+l<|vfji5jC=?0NIUeX-=$|bet(Z5 z_hTeSaHPR1oZzSck%sNA8LBIqu)l#K(KF%@ACge(F6Q6}6M`4f$>AjOE4N*Y@3lOE zC4VWy+E@|;Q4uGYDTZn#5^fV)!xyTb?<2a)`8$2YFGhrjTD&sOs?tWh&XvvX zjWwtyv6=nuTzui%7ef2=ejC8$)BUwy2##il`D90kwv=pb;~AebG*xP~T8> zH7)r5txw_UpY1@(=pnS^mx?)8j>V+eR2CUWGs2p=5@?#ag!)MUChI05KoTJdoH}AE zS#R^No{ULn7I1~L5nC3OV&{fheCfJJ@ZI|^#hK?8TBkCChAVFvjnDnt1^i})5vR9W+4zz> z@g@IsobEajqO&-vTJf4Dw6;kCKH>xcPiz{vk$DG+&67XdfwXZ$Ps%meUW><`7+L3_GN=JryO?D-w| z$8XnQ%^Q1oJf#K=wXL>lNu+6uc(UW-sNN@@2VmplVhkqI%hp5#Zza2Hu=dS8c$8^h zeR>I@x}D3RW!+1yA>rqtjwzgi0!aQg1e&*0AAUqvgCxrV3)lc`;+WPe=<+JrdG zhU2O1k;t9xHc*_#y7=cRkwoM*iHW%GA)xUhN!d0Il#J|n5^BGP(|!EG7OK9WiDnvA zTYdT~3ow1=a6I(DD*WaCoftE=6EFO|fu;lEFk*ZfC!rKRqV#Yq_pyYBgeRl`SjN*D z>f2CW+=#uK>(SWQim12)*t)45S6@F0*M4+5=3g{{W59i@H)G+r6CB@QNy%|YH^Jy8 zJ1?Se0q0b9epc|zKi1p!~O6n^>@mrEVFdI*TU z@a6B%$7jAh2kG1&i%W3K0pEr`-if%Y3?evkEsdPJM^>vxZUznx5gdvQAT28niJsut zs5)}8!SqH1z>nj37mep$?Qp!~{k!q^->kzEf7nGlOv}LKWGhxnw1h_~M#LZ{IQ-f{ z6Y4D`#1iDFL{q}Ky&R||Zn@;WBk_&9r(nkHQOM490!RKEy@5@?5gctgjhK^y+9fU6 zx3k_(%ExfVEu85QWp4^T*yGyDgcaYjvl>77+9Kpm=W;eW5eu%H%zc*xs=@Ct9;%}$ zT_i+4?`%U)10^8b7T1mei_ACzj?VKj8irs-n@7syF=dZGu->Su{&u+&Xuk6JJY9?r^Z9^+p#Vz&J!N>SfJU|{r zQ#M-pOrAXyv(6iVb1p1I?yz(!1nxQ{8^sx{zR_FPe*}l(yLp8v*tDdAJj4dFkvb@G z#pNs!qyvmAx+6YX-u1RBgDbvfr5&6_Jb3RLoNY8AnR4^ze`x}8^3#pwXftQ+!LV8a zh4XdQQ3FKp^v2`_n4hhL)MPA}gG(Ry*9+&Xs**qqGcwlAKOp zKr{6&Wvqv%8LT1dpCSyl@5=?bOlj*^G(H#azoFCEXO+Y~6(tQks-kU<16=XN(MoeN zvPq3i5G+;z6 z^^;$K(#EF&N|8=dSG=nl4}Nz&64RqF?XrA~7&{alb3P|UjyOR;Y^opL`YbM; zazB25@1iiFffElOjT^Dl)a=dm?GcvRTQrGOv50MyM`ludT=!;>-y->-d?gl}{`|yV z1SFm&Es}VaZ)9O6&X_wA=U!OE-&o8%dnBZ}Ac;mZ6-RM>I>Xk?>sZ`zTj5BASIaZM z3EjkjAT6dkrdYhAmM7;oaF94dY^k&gnvs=A>4-QaCnq2)C&kX2sA3{Ko)8^NMF(Qq zhkv^YaU%|J6FLqP&d6sY$MGCao0~xhd(atS3H(mtnIT;=j26QTd$1pbhreAqb(;g+ zAk3v@zKIKmVcpBc_~Y$sarFmhaCVbooh(9k)B;_up`rt(53sSbD{uh#v_Gf42+0|? z)PxBQsNWnLei#6?>!TtBu#kkBthVM-^ISrFATZEJpBU)b9PM~M+H~E)qt6MB*gB$! zrX-U0P3w5>V|y8vk!QH_wSC;HNJLF-6TbT1XK5&m#DpWF(dK4Rm_Rda)8CteSqp|y z@#HWRjm^W*d}kZ`WK%pTeNL~xumdf{otW{l9OP21cv}l4()j0CV+0;s+6V(%&hUl+ zOOL%*YX-=~;t<sqYg3@XQnVFr6;j`0eK&c8Z{$m?1xMGs6Do=3V98jMZTVgKNgbY-tJsc4nGK@lO zY_+fJDFe0C{a-Gz)Y=+(24`XdO>?_F95=%HzbvQX7yFdpXi!RR#2@cnil_dz1#6bn zqF_uc=1fWEnUZ9TqzspVH$GjC4QooNE2)G0+f$3( z5CHNmZ!&P##`8?tFA*DfAUO3G?YW7iCJUBLx;nk|1EF{Ws0?ltNJ6cxct29-$C7;? zv|)rQ_ggz1GrYH<4VM`dHuoC1^5+Dhwnt8;czf~(P#(XD==0@r-17&m_LT-)pL1Fhd6b&MYp zoK#6K5wm+&CF*E%a8iCevZyLW5^EvHxZxxt0FSY6JiCNBF}fQmVx^h0bk0zlwF?9F zMr@#X4-6jWYIo~ zj~AGDsDp^09CY9l03zQ;CcesYXqD4WRYr1=wmZB*>S~&~3M9eFB*EeSWdu%#!{~U1 z96iCYapnfwQxC7hcR%zzVrca(WjO7%TsICg<`p51hpKdbot2#iDKlByF9Qmy<|N);O$TG7_tj?&^f+rLTUib9fkR(Ffbi-?L#=z`79iviI^ zvhOLC53@or;O)}64E z^uYFaAM?cAHI|aupPISOX=Y!Gxb7iPSKoqq5uEfm$S|aH1EUSQFY(D0dej7GKarIr zcNV|24d4I#i-;ReEmP5PxcJ7Yn0Q73&y#R*Pky(}?g=vy899$5%^zY51xPkP-fDh} zN00V)@(VL?=||4MYg7TVE~XgE|6Gb6ragmi+m)2wJx@v6WZ_Dx;>{?fc?1?c*&X=4!_py{Ge^Gv8-^0PO9URF}3XIvjgc`85s6ecf;oa!NSwfmb6ptZ##EKBGDv2a8TS^15PP1r}gla$8E zUJ@t7oUk6tLB>-OsK-$0qarvS!SCE!i67naB08fwku)S0mwx&*j6ZESH=W5%=18=` zz}6OVlJl$_e|KTReL}X1z@Lk1=}qd5VQoZ!$+T=a|6Nn<{l>Urs@~p#!tsmosV~kq z)%^z{US-?|&J~*la{o?p%h$`*4oy7ST~b_2{csHw_ijK{RXuiZuEWlab=dx99X8P4 zO6FN61;AsOMlyO*Vu}L}^tQjNRgL}y2fd=-dAh2aM;m9c*#E_-%VV=q;ll$O?@vZ{{ku?7@x zX{6bOMr_^Qh%F>1<2mqCL|~GJ&>%5S^~NV*?0K0enwEv}l++tBIvw}^B6&`d3KTvfKRW|H>Fyqj` z5s{M<(Mh2$p!2SsjEC-8ip+`o@r&D+U@})#nc2ZPouGW7Eag!i7T~VF4hO|KlxsO0ks&-au7WIt50R|Lm5 zKrLn2fBl2y7%_?a5Xp&{F~5*(t!O*Hp~edJb0whj2r+n6fU8=Np?f4^bfKa5KAmRZ zM2+@V`$9SSshE51SUmIdb$IisGQ9NEX1wbIGu*5u$lHIy%EODxJM;xg${pb9LKg3+ zj+-a^cWtf4*7X(GzPZwfOj#N2K-6@gj#78k{OvHIQ(z2DEDSA*!_);SICp3ka&pp8 zFe(e9$7NyMa7jKZjUwT>d&I1ix60E$gaKxspVNW0pE0kTNb7 zIkVyrLz5C>VVhCHcJ5U+bYja>by$u{q@e_lP2YfVkIARU0Anzhvm;Sg%k2HdR7VcQ*!MOKUs+jubfD!lLRY+vh`(^zn#kZnwzMGn}*-oxW81g zrw*IeRB$7|5?j|+V)xcs6LM&8V!Vn@cE3*S;%>`n}{yo+k(oHdTOrCp($6gLV{_j#Z!i= zNO%Sea;p+Tg&+~k1yjLIt}C5A1b}cb*0eViGssuG|7NP$k*#vQ&7rLe*(Z;%8YR-T&<@eb7(5ZS`rd?{9p)ah*UbYlI>VW7F%^W`3$9XDBIeAlEn>JQN9mL z{_qc6aMNgf{Bvhv{FFQ!V>Ye^N@EY=M(q{BQ9Y&8?BU<6LHdYja|Xu_Gpu;tMT>@2Cl zx)mjub6z3Zs3%GM+6Ib0Hn+5*vZ8^6r3zcuRAI|X{uXK8)6R8@JF_5}{4)M>dF*lg zloX7-AcbPssoZBtLq>Wka@bk(hNol1sEm-&Efyiu|0nTKt*t68pT3AhzMis4SBb zZR3h?-}Y+kIoLM z8(;fIsi}u3dS4D_56Nu!VDE;5@o=Yka~QT0E;J;m$f1YBk|~vYAG``h)u`9N@1)&^ zbmY%ZMcMWS{Pj00P+mom<4x7vd#S~?Rkhf(td7g-R%CFWMHST-Yj~x-Mw)R>$JjH{ zxzCc0(c?3?2b6-;lq9a&QtW(BJVhoCbt1MN)2QFMwwFANx(WAlMke-q2Q_;OHgYyJ z=rwJQJR94|0KrS|M^4PfsEI>O%67x@J$U1x-H4yDA76O)v$*9ab$I{BDQZB1?(?t= zBbQ!7pyvcfEyKoIv8b5J?>dn>Dh}Dh(m3dbm<{YM%CCrWVU4V24KS@{UJmWKSY6j{ z(ixTv^5KB@-;k)I+sjEq{=_sCzg&l<&lTeb_imThO#}9!5s&gYhPvb~y=D>((!GZ5 zi)%1>Ry8J4_@Rw#wF8biuyZ?@2m&5Dy6ZWBiVXlO0$;e{qk(ngbc&_48o03(WN6^Y z>-9@Z5R(N=;-Hhnj$CA585lwr&5-~2)74IB;A?X+cRpniWwF-a=~^Qc`2={h!ilF8 zr(6rgxBXEB7SDGUdpDRb>enI;%`~HZ|Np#-|GDK&jHaMY3WYcpd~ym#Ps+6;5;E~& zV?<+?Klu#|K{NT*vI(OA!k6vA*|S^<_+;f#nQdVAj|qLR6tOii1ml1YP?ofkS*c zpXfV)`$kwg1+X``aQ6*8E515kEN66DnZ!`CDlsD(SItU8R#vJJ7B3-Iz(b=_l@k|7 zb>uuvFHzP*osh5c3nwo9p}pXucTU8wZhHfriLF?>cprw*M1f8}>(H#D&tZcl3=$3^ zs)Z}FKpP(BAsT{P071nu*zvA`sCw_*RF0DEb=bAJ6<@ynbfl&^GqUdcheGNUekS0? z&&bAw8=7fuS9$?GEPU_v&nM=tJ*LnKht?Z49#1Cc$7d%u`~ULWrTE`lR-j-C^$=2k z=(3NUj%?mLId0m>W>eqxRK~`IM=~Lh1S7)+gY#<=t6^f?8v4i5JW5(t5}y9uO75)! zKmFwU%5CSI7D6VHwA1k=OS)w*u*IpSlj$z*Of z#^u6DeMx!pdv3{X4;J2E7a2PHOSx_k+8?;4m1z zqY22@@45sBenf;u|3I^cBeNC>)EF%UD@_Bw+o(Gn-1>t7+D9(qE6;Dj9iLf(kvxu( zNg%e~-=$u50_;vBi5j_{@%lzfDkL2z|VBe&dX`#L3tJk2obT^~2v=o&m9u-{QN*=hfo6=t`&V6c(3$5gaMLOvs2u+a5}ua4$)S zL6T#h*yy|Nrwmv|0%O4gNq|^S7#K5IMw1u7)=*FcRDlP~Q)#Z_v@B!UA`|6gK(?-hK2So$vlSHj$o_gbS}f zjmH+^kuz}!e)^3?*tW64@P{}A5!X8i^qAnN5!za$AC0O#h~{F0vnDo^5ZncPHkd<{ zd{&tKbfK5;U85_W1-UdwN~iex(|g^0-b(7z@UDZDVw1I#_%znFSjOQU!4Z`cM_8;t z-CR^I)kz0dKl|-@KphQe#ZctUw`u^YU>-(SsR7(uA9j7c(fxWVx#^~ zXTw1KTzx(WFlkPE7vK{AitXuPBdi?`up# zPLo!jMxTqgw}(KF368STM!Fi)&8c`5wB5fop4usd*MR2mZfGs40HtwR$EFiIGn9cSk&pW3h;VywxdvpXAW#vmbh zYl+IcBy`nYK})*VYCOHu&EE0OFq7szES=B5#R*TRw4rpw!bX6|m(?LInLwbKHUAlLfU7PDovG?P>VepPq@bRqbeKY{3)1Ux$sW_S)e+Arsa8uz@282Qc-pa&QrG z3f>t=4%65w zyR0XVt0-&0tIzB}^R`Y*T9}JGYWnD))(}af86IF|-7pBBlo2pCCI|=rUXcVCdv=pD z3knN2>7+x_3B)2gS-Gj0e8Dipa;!Z3)p?xL(_P&rG$FM+R<3s zLc0=9aKKnPu8ke0QzNRS!tZKqYi-^XSF0a|D4sd>1bPll7rgcF{A^z+Qu{VdM4*W| z(G)8loGMw27fe`)IK2PH*~lA_io0)l2^FiGv8sL__R{2Y;rMJ!Ib%4|GNrypAmT-W z4*_fhL;oZKrhzCH=r)S6uX|%3l^8Z~kap6d=K)IgOu}bwndcOqir6uqhg>}cfMYWp5KAS>UN}1kKJ(UEtFx$R%#THX?3-W)s-Hr zvYu6MaY5{*1A_Oer@MUp-KF#IkCbjdxhRRrvD8A6g%uC(LCcUS!BIoWjV{VYVpcS&ih=2Z+TbSY*}AU175Aj%1Oq^!Yo5}Z<(l{UTP=^Vaj}m=G-kM zw1*RnkA5n`asA9Hp8T)h*^Y^qW^n_bs~Z!6cAvCr3SY?CL(s4FXn_irj{xHRfB;2j zVGMTfc-I)>d%f*0oziFmm%(#>`LoloV@WlZzD$Di4iX%frJ_XK+d!bl1jhqa_Ge<# zhoEXD3C?8=7#)@4Rw`U>biqAnG6gs`s};jHq{Z`{!9`$uFyED;$)6HN>{O6ML}?+|X#s$K!w!Syj84L)XDhIQ=jN1?=PVp=c$^IR_nhDawVg06m$Qsy>@J~5 zEm=L|CbuF+r}x=V*7#iJS|c;Q=z}%9d0Yl=a9Y>kJ9YwV-mpftbS@9yaV#SxXJ$%y zfHRGF?j`Lmp{<(LwMe8bnz{2wE5=FTe7%Q6AHeySO~Ba;#$v@ayRd1~UaWe(3~QdP z!pco`G?m*<0z{(2T1z^qfzYYueHOLFO}#V+*M4RwrkybYRonx*>*I^Cbp1a3apn@- zeCq{)GQt6XEC*4G9cb6ohUlo1y;gmCfH*grc$hbunm26vMWPcj6Fz_n+6#EuYJ))D zx4Vw!JKETzqfHBj_8O&`-b=;EEW5)B%sd!4j&$(ZPg*^Igg*=%jB!XhWA9s|GP0i} zhter;29x+D67QsCX|Fg6)m6=?t8GO(55PxU&mhoif+O`X3*RvozuUF~TVAikv$fs4bp)=?PYkaVho(y83stKmSkQwOUJ-mDY(x{}-L)oQD9Lj^{Nz`m2 zB4YT$MFk`{x#*33%h+xT@ROy8T;2i#y(T!?Yq;z^lkuxtS0Zj)2R5%NB`b>-E#rn5n?`-XwXs?! z=o_3dxS543iJQHs@q&_BYtgSH5_t)Iv6K-z5f%l@y2r{sL83f^CXi_%O^n^ zn493?bsH#t!CtGy0qFvYBlR}PBsiL)OWEXLcI@&t^kv7YodN(lvE%0utmU0)7B$^e&_g@|p(XS3crj4LhL*=nR^ z;E3xv1jHlgu_LU_jTo7U4}5zH8mJOw-OHuioUXFjl{JnUNb!QW?#_oG%!yF@mtCKB zo#+VZ7;Nd7v1XdhRLipJwPJL}&>H8i19;z!r@MWO!?W%Bz##T%P>Jw(X*TV@*dg42 zWgtb8A~u4d#5YBpoTM6z*eJY^dqOvTYYxg+A0UgZ0l&Qa)j?#Tq}~ zzuSgK|G3Iti#SExTSGuZ{QI{&jq8ejg9m@Jgopkd%!G7KymJj5&6$VHmJ0_D_7#qY zsR_lzQ^AwrVgz$_$#&@=gu{6OqI4%sb zK{`cKJc&qmaMcwZ!&O&8ubD)a&8d3n6~PgZOpQ115|94e-DeT$cbH|(mmb?hQ^jp| zmc-aU?DfV1^9`uPfnSYo169uo48;ljMvQ{^iV_efom1Jlr2>ne++lL~Qx;_7nh%{} z1W-uxPz0-_r-XC(=7?1lArgEvK(4)hHfCHl6iuZa_}$NzW5?!7BTkx0M%-IKfZ*A; zxd}@t2c|>01JP-+5kH*EU6xgQoP*iU7 zSBMxnfdTsYY)&_ZYl5rSE=&*f1!*juUh?PDSzKORI^h^fgVIcWYZY15B!rpVGnMn@ zwTH;%h!E&C!BI}uFuY%Q#T0z_>r+v>vW@3HYVgYAn~mtmY_V87zJaZU)fs}u^aR9a z7(uvoAa$f5f4}na3M^wNfwOx{C7%5=RZ7T6*}ft8@*U@KA0pk5sb=&McVq|%K5CPK zF&X&y7tZ7%x>#&{u@3kB_aYK+T17M#fgg!S&gWEpqlwnXZ=H$X|MC(nxP->n2rs#T zglM$tO-R>_n?eJ$`Z<`Ltu|Nz?O7(#))kK}qoJYM2#xAxJypbnoA{0>ghCC^gjOpS z?1+f-(tl7o%gJRZ!lFptd3?oZN8~6C%01D>hE}vuE;KPEmbQ^neC)`*2M{=_^`M_I z>!8__F}MPTcmlg_t#Ww8e=Kn;x_@qi6;!m@c?<0^a$_J^1_m>+sl* zx8d|Tt8w-9r}Ld}tDfa|D#cPCyX2iy26UB;;LsSMMo{x0Cpcb7a7I=lZP27+8LD{h zt_e+bI)7qQ7Dt^f;(87NO%~)n{OP&K=V95j@lp8o50>*3eVJpe1+edVj;Bt{hPpOt*Jv@J zm4R4m5uAA1snX~XOHIRUusY!vsjqpSx&(J`sl(9Gv8dSHLNVkz+bcF4!TK3zM3q!! z?Ozu+SyiyTcdztF=N^nj7CZ()E}g|uH09wR+_P|5U3DW$wlp9nn^KE2hYzR~Zdhpt ztoNu1j%uV1uDyXATHd?urQ=vWiHd{S$I$L z2_rxZ(>sgDaM^6>psCmui+17hKd;8Jr;2&rrUTJ!G5G!ym*O4QO%F+B1^83NiMSp@ zKm#e8nvcIs3#l!eY58+s6Ml8iV$|~xo7zdUxrjR$0-9X?^!DfQg^&LUfBzHBf``l# z92~Ddo(^puwV9kY*b}+mK_-*gt~%1#7-;Q#XnESG^Y5vL*W=q?e1z6;pTp)SY7n0q zjf!PWC@ZZc?r?a=69pq40*d|I%^*VDq(Axf({~)93W$j%k>BAVC3llv_5Uv1#PtRON5xVL|A0qO>6wZ6>g^X}+L^=f%kM2g#hMn>6_=3U z)bN~6DhelLQwLZk4{uSa7oDGJi|DAK_XoV#YKok0-&jfU(<*97Zbrr0HYDdoF-}mLwzSB!jZN|gDTZJtvtFU8J zGlo(LVBrO+)Cf-^TGWYct13`5fpy7FFru%$HNi!Wn8YTsdbAK;{3O@n7}a4!-aP>l zEG>E9IV@d3v~>2SwyFu6mX;%CXcT6imxtjaPtLP{2F&AhIc9>Ra;d|pL3J?e>JOZb z(`S#uAAh|BOP(*r>P59wx6y>%(`ZnP?^9EG3O+m0%u`FeTAi+y9j$@9*%~%zGY_n_ z)OTRt);6S)Q#$k7p}73&$!0G`>es#Vozy=^?!AM6+Dn20@BZNFSoQ)Hgsv{fk3X{* zQ>l@9!c-ZzQoHsp&yzW}`rDNs8INi6vvAtX5f~D5#r^=1+QQmPD;fH$DjTro&AoWy z&ztbZ%f-e%Yp>zit2!Q8Agf1Z-L$BM=FiH|+o zDo{qHxFy><@b$ZCb~;%~r6R635a0?j9QwUU+I?KtaIT40E!~U7uWiE0MWtB!#|msD z;mPM_TM9dq2F4J!mm0WJvzLYgD5E3_Pncllv~|pHZQM2 z`betj-`z=bA+gAqm4K9-cw;@8#32!6J126Dl{_51wHb}&ZDup7rR)Gwq7(3uyH3MJ z@0?^>uT@Lm7mjC*#hQ{ZfLQTzW&7&PT=#G8UV+UoRw6p@0QMDk; zV^~3|#jUGt#;4!)7gSc&Avrz~SA6s|+NVi&(y)eZ+*(HT!w8F!ABTr51ACV5(6A$? zvwT?IAv}&zO%*$j{&E%So0~CaY&L#)|GS)d55A8~ejS8+a_w`1qmPO(@EU4};vKcv zxuYEAWi>oUL#3ZP8^|teMJo-b4dL04KhmBvgvB}SVm!rMqg zVbvAXlCY*4J702$y_^C*MKja!iLcGX#qXTPbdKBLR~>y>H{k=F&GUptZ1z=e?!sUG zZ!H!-QHo(xW3XdwJ1)LvIIg^YB4*AhqTL&(c1h>Mq(wtW{l%v?;l@k7qVyii)0Cn)Nn#gbQ4i0{+bo{KD6Mx~c4cNK496R1@$NxNW8P30S zqOFu7#3l^BJ@6hEg5$rdPOqlb$#?HsnmTDIuf@ctWg1!oO8imn?WEJTjyi;Q+Njk4 zh%~B)NZ;Q*F|Vs`!FRs+7+$=;7`YP?@V)!5z!`H#Mu<)Tav{Fo{`__9*;9>KXN|(e zS57mcBV;P1)Ys0pOB1bkKK#e!xbu_CkTRNVYmSw?ap{_to*Z=_}_Uo2JIYITU?S zr||rW$&PycrA>I|p)EAgyqET?Vo|$sKW1E#iw}N&2BuCg;EKi(n((pj^N=vXPrmmY ze*5ohkvB0OGZz+M&VnLzvd)fZIP~FZjG85&F$d9|u6mJ}@$X1+lwJynm%g+WZ@jP@ zd)K$&W8a>N&)#wYVea(0MQ~FWG<)Lf+7#(Y>|Vxkvn4iYu$0!oOh}66FZqZ$siUb8 z_46~LBSwzAIA#c_jRbR968+fCbFq2lKT*1(8Tb8Uk!h32qBNUFe#iW=L7ahDL67`$ z6aMz*HvHh5(YWYxFP7i;mGbbG2==}I^)i0-?`tq(N*v;2;xYG{ahSk;wj{1*WLDa( zV#q1rcyXKNLX!^BN(GA?^|)I|8uv~!NL2C*vM}k)e7yXpO^BJ^h(G;cBlhj8$JcJZ z1O^PEDrFT*wp5gWlHd^SM8^6|vW-U%uOE~Ycj z!EqG-jn}qg+0!%tx1}BDUYCateR8f58{bAMbHw!=0@2^0>v{B}i>Ze5vn}-j8xFk7 zZ_hz5(QL!VW0HvLCkP1U8bC5)*Rj6?D;Mv>rX_XA8bj&8Ge_DC-VWHE!fhf1wS8MT zhDOKX%mpL4zgS?b9yL*4_EmjH?IHC!KfCiq{PsWAVg#kmhK@|fzh$(iE2a`3LP#GANDHtvGL$#05XIk|`>;?B-XL*Z#T{7wr^i!@`~OZC{WqZo5& zS1KhfK7^Pp;~rdW9P{J)j(6oH4fx&9m*U=gUd0ptwH=$**J0Ge1WcNjgMaB}TG&+I`XEvOcrla5=ze+dmEW<@4og4I#F zu{^Px?&1_2G6<~HRyUagv@jjk!~f6d+}2n zvHZ~;G~?Wfb3Z(smS*2!-?Hxn#Oz4bSJs|LDvnrpI;-;7pVs2h->pMUSqqByw4#t! zGG|tU>1FSQL!Q#98N$;rTKe zXb=mLn{C=}>jHzgCIMkl#*V`Hn@McSyn|Nzm1T{1{kZ|NC`{LF*t@+3mFsBQ`l1Zn za{EO%ZT5&>6XNdba4LuO%L?aI2Jm33yEb9R@XXYczuk=JVI36msG;FEH|y0ZsHccw zu+@7YlsBLuc=n&`aN8$dMFH7pd1JY<`Pdnd5=&dru%Jdm4l1wjMs>_JHC*MqPzR*6Va~iU_95lzk@i8Ky=Bl;Vm&Nr&RJ z*~3xZRLxaL6`~W`vFVL+vdCm0ErxqtF-S;^MYP3N6`X`zNRK0{B{pO%iLUHLwYPNg z+)^Xfy}1uBaF3~>iKg6Fx8cH%jKEj_^Ab#+G0Z`YX(I0EArM*N96jt#>XZ-veg(e! z!Iz}$9yi`K6QBITd^bZR0y`DQoQUl+kFG-{&%lhEl#AJO$AnmFec2Iq)85X<&iFH8 z3fhs%gPK>}G@BBfsZ?0oNu(Ku{5>IIkS%k=)~WyiCj?1EK~!LTA%qVtK!hMPk?$fJ zN*81!uV0-=f$QVPgvb5=8n5YSW+jrV+QEaqP{4riV{1_{Yjxf2w$Hv~rC>(2RAkyayrd0-jt`|?^G zAfZef6^nSXJtxe}!SKR#q@*MuDJkBFk64K!G7>V7@idumXliPuQqUIcr6ld9H!9I~ zpcS>7J20d*79ai5G`#ntXPQQ6|Gn^D^FCI9Tkp7xXW%Hgrj>2z`(3NtRZENU`YW56W($gUQQz5wSk!Ea!gZ8-yY%Xb zm^5_+lGB`K5wWTcC0t=eIV!IRpWq_a+44o(@z{fF@u&aVN&y5QK8;FDn}#5JR1z}t z;_?66`wsZNiZk1zUM)+qnk7rJ+-+I5DYn4|Vq??ckwO}58rkfoyo40kJW@%rWZx!_ z5Pocux7pn+yW}NH76=d=swpwm1>CSLSGlTKz3Z>`&Y8LMmn;lemgFMMB>LZbr_Z_O zJNKLU=9}bH8eMShOJ2Ua*q0Cqwu#5nYs#6U4@<|D;8ckyIu zW0qjmjt@geU_`CdhTc72!>L9G(d@KgS zg2I`pDA|yO)bUAgn-&@hCXTeWZLGixkM2X~KAH-DHV;$h<{IMwLnuZa30jdwfYg+L z>I7NgD1lnp)h)LRGG+|;2&c9|dUg_G2hweLot3FhQmDd&< zOD+``2C7I4_Rl@J4S#v`0Jgr-fJsxi@s!(7S6nw0*Z)-srcBF1B3<_@h-hR8Fx+IL zx((TgbVwo#mlko;axPsn&BN+H?ZTh$-HiqrL^L(x@Earzt}O`~jab9b3X=8!M$i*O zsJX{%;=Jw)Q?c^>)7k%QPGQC|hbJ2Y!Z7}L4QCj^98Fa@O=s0ZoAIq1UcmU=2wZ>j zY<%NKD@W5X2Q`)^?snJLvAmckC0l_ss0!X8v-?v2>35#SLwD{#)_IAz;#2cbI6IST z3v}N?>Db2?Rx7cbV`9UakBG^br|GTy9(*}!xC!E0|Hb(M0!U?ta;I1D$g$MulPK?is z#qGab&YkJA?1FLNqGXIfG9trtI9D8M!tG!DBR2i11{Z!ZA6I_-TxuO68$%<(mw7-o zrY8Yu4Cs}WkA3;<7k%GzKwYLjSF}&2+Pkf<@5c+j+m5n5U3lcp4d31aYpc~-cvy|uK(^TEEW2f#zg&eqYwGdaU#&y&{E5gdeNHj+B z$B0Tv#Xz9iJ&JY@&OqicLY4V!c0TdO3DI{dXE#5xdM>8xh=V+Ob&u$X#+2en-0?T7 zd2B^Hnrb^xS>4S&Na?s>1qqSoQO%l1qUj$@bEog$!$6`D2IkNF8-4eF30j-~-ShPy zuD>5V0-DP7!6R^71l$~X(aZ_>^f%5&;>2ide6j|={g>CxUJ>IYG7y5ttzZ;IYX8eW z-ugT)x$O5?_3%cnt=Pd0b@=YP`{2Q&ILOl^Q*vUFKRtt1RMslZ5(wMkjUf(2=!>01 zW!7ud4VT7vWANkNE)GSDC!npm3rT6wII^JSGk}}p*9x&W0m|$h}XJJ0%D?KhQ%aW*l97nlZOpf@FYte4xP-M z^y5v;!F(FO{%WEadD=ciBOCy&xQ5w z2%0d*B4hMEw*^_#^wZ()(0I%96TzM=Q7az1zjP83C5{0#@k2xAz+EcWe5mGWTWyy=na?aE3bE|X+j%V zr}C(rj3VM=A-`+%JB>XX8nOH`9TUJQ)FA(8f7byh{xSjx_$jp!0CluhDNnw){_G+& z?(D&l(kA@Jy=&3d(rK)N`U|+xIDQG}qG=h%^mZcGaEwwg#DO|-FYoD%Jg+8>XGA5X z&||u*ydPu|ZZR>4fg5YZoP1hz(G+~*M+cm~rt0Bu|ONJ-5D!{d>4Qn?Z7Kv<6w^{pf2?VsXiRc$nwY(5bcw!!l;e4`#+p z65bFDxx+TVU*Q@wq%=*Vg$YQROuD_Avd6@cP+Vq}?f;Hky{^0|XF6ai3lq$+3{sW* zFxC<9gfrIv1q@>RnobevWap;f^WVAvg&Pt!c1l4=ux}Q zkN2nau%LWf1!qn~b5%DQxCM#`@=u<$>@_>M5SYoWs!BfKc%Z) zLrj4HHIQR#FP@>7B$RG@iW0E$Vwjb$&C}%>>*mP&) z;PKbtL%>_94Ih?cq9zGgEg{IM;YUBS5L?!jW9@^L_>Z5xNvpLy%vq3Qv=|Xf1i#$n zSaEM@HOddyqp_g{ZM5>z*R$%0p$qw>qy(g;CnLWw4HJWN>;lP6R}#Np${*5aVVvy<+nB;rlnd75>lg3SKS=eXd*`dsc1g56O(lZnB>91UXy<4Bekxec5&tJTTZ~yda?jwms>6R+I#V_0O)yjNi#S>uL)f(bFt(9o_U*00&h?EbeYF9Zg)vCX zib7*`8+Y}$A&Jf-rICoB!qZ)jc+@~}Z_`{J!!D*bYRjaVtc>qhMj75-jwHpYJbfs% z(w|!8z9za{jzG!sOrE6a#e@OX{|p%c|1W9C5RT0XB$y<$7F|3U@Bd6Oe)oSi;k73Z z#fEkgOvsSRxS7$&&yB<6*o3e9oK!d1X(-_M!^Wkw@L9+hrOIp{^Pfw#->-wanqOQ;ikV{YP38f$884< z2Z$iT-K4PZVFnS^`j-yi&9w)xXZKN*?{39j5^x3AgQn5Ta=|(A=DZe>QEP1{4(+YQ z9B!=DF~@LLQcmzD*3?4IIVgLf4`SKFH{PccQ@Jy5!{z&FmIq-;5O>hrwyCZSwdGByJXFW?SQ>G(v=uv^ti%4z z8}Ru3rTE+LEW+|DXPUE2wD#fFJqC1P#2?vR?0mf*PrX%%E2>(leUMCex}@SozD^qJ zc<2sJ8`kpl$aQ}?h*wvaq4cdPv^933YIg_+so~9_w}J&cwzzOc3Z_lV!Qx9MBbn1y zKfG-fHa=Q|LuECXbxtnZ(A*`bCOJAw6#;RWXZ-|IX90m&`p^_y|9m!NAfZ6{7Im98wP80)7sq0 zvsXA}Sk-9U|Gf0X0c?NbC?axt&|1+=y{#KXNW{_`CSt~dbQBe3p_uDk)8}TYl5m(# z7x~*Bt;3-m^*Br|Cx2QxLez2$gD{tj*QBMmpgZ#pbki?h>3TK7TS2s>H|0ty+Ld#8 zluzqaZLJ|}UUQgk{JU}ejRnZg;U-rfJOaanfIpsKn1CEh)mVW=0mcvTzdTcl+pk=W zn0yMx)(FhKdLl}e7NTHAmT`xp1?ceCv6X_9Y(z`aFSt5ED4`z1vu4_wLfEfz6(OA}n1=nQbf8DhLQ%GR4ev{SPsR)K7&EmYBZgOol)OFyo+}u zmff9Lc+(_Ybj2)UqzwEs*o7}9S_Bkk5#B0`3CwP)HFIfks0UCw61&mUjHhBbU)DbV=X)3##`QkHEWRUUPfbVh;zA^(#PSGVoth#csEHc=k3ul`;tmT*BNdH2R8FG>b?^&YM>m%&DWseH zbiDfKo!Avsf$f`);=7-F3P1ey6_`3pq(cHQZs*m?Fb5;BZRbq?X_2S??b%U-{rirh zsusEOUR_jH*-zM9EYVJo`i+Va*;QQ(}~$Md7jv3RxAxoI7A8; zl8gZ+=>FVuCt~U4g?PSgFSf0zW;%shOjETl&pDDpq3ddebw{BW;ISs_+cQ8rJ*@bWkL|d2A`rk{! zNifIoY!+>Ve05bRHa~j+Ee)O2p0e@XpI?dG0_#k2q}Ox~?{CEB^@p%`Z#fMHDzW2{ zM(m-TT`EVBmJ^MhYM@|YDwbYVfD0}yKwe=wl44~`d#<@t#NJeK@w;?H~pRmef$jT6o1^d`kTJOGZ|0+DPPUoqk{~o+!~7A6^aUdl!;kh0ynlKiKl_za@hECBx~}=-Hf(kG*>?Yu2t>#^L|yHQbHS!@jN!bFs`|>QgGS3@!B?K$h0QOOqhePG zpZ#G8Zu#~Krg`ng;pwl#gMgn>8y*}-eJw_Kl5Dg<{%?1^hMJ?zNE#Q7Wgnk~$+Iol zm>C@+VFaHF=!TNd2tNrorRhgkSzu8R+q57LA2e;`%4x=_o2JuI(UDlnW35|wCVfP7 zC4T+)Z(-hf6LH1+OKfE)@aqUb8j+R%wj&+wT@>V9*tfF=FF&&nZ@hjG6^9#9%W0+k zwe6&s2+Sx-!qrQ%ke-!*rkYM%cKvj`|KsNwzj6bc7Ac!?X>7KMfmz=1*xiSR*tEi4}K}xb{vc^-s6bSZOxTyOvWft}!&zg!*9~ ziBMn5DXrvjxchj_M)Py6K%|PZt-}`T9S&Q=@T$xW-bq$n{>=tjH^pm)AzpW`zHC ztFh{ryOBLV7U`T;TXyXXl3p^w;It))Sa=G*{t3SS_J*TqpyoLD+6;XE?yI>0H_Z^(U^TNr57rkLa|n11XUx6wlOJ$vO9=mb=j+Ix z9!+!RB+R?G&`cwRXo;pTVF@?MHK)ZmvXT6ge&fEvjZkFfKm^(jnMmE*Sl!ujHbw`7 zC8s7}$@Mev-HMF`obRM<)pM2B{9q&M>Y7M0)p+%pLwNb$ z52L1|1xZ;A_h0OMiA zBkRzjiSu z@_;>k6nL^ZnYZT4oCpG5!#NR@d>(_q~h1<>N7FN(SRNt;1gbu^LsiO=j=PvMa|KODdgF^VY_4>?$p% zVZ%|pwU$Klcn$fn9fc7wh~|l!6Kdjd?#0=-_?kk@Ta=5`@kxfTV!1ih1qpktgJ{v* zS!ijD_y1%w9^YPuyZ`=TT(o=!(@CQw!jVu0)UHgw$EC*MlV4bZS@W`S&+V^b-;P@B zjv#5gQIEXhWK1kf!G!d2NS%;qw4V5c7^CrNkCZ+J>ggA)zNQtm#HxzZh6mqjG^eym zGwR(Rhdb|oAFle~TqMvxoJdt<=YvOJq!93gGg8Qol6o~8BY}E^ZfmsW(b3U^f;s8P z$Q@5VXdwzHnKC(z#Z8mx*%8aJK-hRkGp<};{ywJpE9q z@jAVo-U;OKplo{+w*RGxB-4RHItERj7K4KEsVL?imy0ed#Qep1NEx5VGhX7%+LP;@ ze5I)!jn$EiOVd^H#Y;2MQP+datdtQUnf~qRUTZBPf#{eBELk=UGakvoQ;%%JAAYfg zQ(?~x(2V_q zUz~*xesVqvsL^rQo@@q!@1I8m0dF)gBCw90O5Gy%Q-9o!pMK*7t`z{6-CT^>Ttx3^ z=cJSfN5L^uaCKTwSTZwSvtrtW7>)~VXpY8Fb)orHPxw%mVTjIGJGqkHvlu+vAe zbh~ppf+Is=tNZkfB>ayX=b695bhNo`QzbRfT27la^Sq%BV@wdm4}rM2SneB2!o-QG zm@zjSQ)hE0QU573y(`w|ust1P^KFhT1WwO?L1PQ!Q8C);ng%q{({WN-3{tsJEwfxn zKdX`0s~M<~jv^jW2ZN-fk(9cch`@?XNe zDYN6~g*k*3H%!9~pFY!Pk?*@JT*#_0p0Bi!nuXG$EB22beUG4TZS9*JVIC<}_TRcok7ebI)}R5>7mK_9v43 z+RJ*(*ZZt_bQa1*d=Y~sE*2U_fvS4%x^)e%`|!hf{>km^d(bP}Jw2S3U|?h4)Ia;z zWAM?Ml>Hlk$!Y1OZ`31T5%3z0|CjKN2uPSo^Jr`CG6$u_aSBTd&QA7QLI^C?Sc_So z;nkGW)nx3Kz*`qA5t*v`l?$|2#hfVJmHM77e1)rQpjpuAd34y5|X01kAoIr+)UUbg8|+f!vN+H zC0Ih>jgk~22`$YixH=*-8V=)B#+Ea>ja|=CC8|l~bgQ894B>JjEyn4*o%W_KM5XhX z0B(95>7e#^Y^i|U`();fLjirb`QQ=o2n-H^5t{KHTqk_)GarHU)Nwo{If_?tj$wb~zbZ~F;D!0{pnaj)M3gk1+@9 zS5EqlT)s3lwxYG7lRN99cmk;0?3{uS(tj?ryXMAIqlle?CVdkgfzgD3pHdr5Z*v63 z63l2}_WX%RogRal4IQXn-iT@3NZ4t-L>t*_TNVL{C>V5WC&PmKehbZ<4fB$8 zOq)Sf;e4!6b;>hz6VIus*w=*Uj0jAgm4?)`grM}uUE~Dwd;feXZlz}B)^fbjz{uh4 zYaX2lc)}T-?{(Nl-d4`!34Q{`GhD{KCDD;FXsB<-fj8^X)zr%~Vy0MaOW8*-2#4a+u-S72 zhvcjF2%K^R{FK@$hy3hp(44xtVk+WuqENQ39!K`q(5a-3c(znx*JbS36sLsnnv2Lq zab{|aH@asqe8haZS`xC?f#uu=QLP(wwDByL9o6WH>Oxyb1TMOQghTDaw5fVVD5!p& zsZ+L_E@Y0jj!-MUT93f!M!*x!=zhP$I=ZWFn1i^e7<5NN_Tl!SnEc0bX>W04Xwp$y71B4W+E$l zG$EW2RGPpac~-w4;}%Jz=XO%f=(vU8N%snze(|KR|$s#;(-&I(;e5!4PeHv+^ z8=2AgT0H`%2LXQ`&gsGZtZwy1p2Kp>l}{n}oG6}_nSzz?pM&JIIAgA?foWT3FgX?; zr=gyJf5MUG#%eF(pW`NzY+~pzbkDX*Jo{fe(0DY2=?l|v=l{JHx%sJPW9l(3_m8dI zKY0W^0%s5cUc)(qUdEZ;6*nDr$>lTfKkr^ZO(TTLLydUxi5=Vw+HMaxBXbz?Ab~h7 z#%=nHFzYcSm>|uq=h!tIJKg5eT-g|&L9=grC7%25ooEkr8ZXg*`*%wX+2|#$*ln^M7r{qGg4cIwyRQtmSY0b zg1ZRT?dor7?7$nZ9>Deu6=*ryh3JSVeEru;am`0cT<+j{YA)*ky2q;UWZ3~My}U5o zs2P{%oG>2##v|}<2zU+W-O%xA$3;M2^%AskJdbA4MMa27?Zo=uSD`h;DYnW6RC2#c z(l{Q}#(g@`JU>U*2&ynn8Q{X9As(G6BZ7&Eib53sxb3cGxblO=;r_U~!Vx2V!#;OLwPR69CeB@4fTHP{rbVyej5P4R{?UYhHyRjC zZ}T*c<=Mx!<9EN_fEQO)VOj|d2)HRTZ}NEFXJA5h65?V>Kym!zF$daDL&`Bn40MLN z(B4kZ&+Q>@CT+mZjWuX#Z9{W)7n&=8>%UTjPk!M7`b)C{{xlBJH|-Jd2n-PcPdGya zaI6=XvLY)0IkY)cR&S19e&A=@uxnQXCQgk(Bu%4ZBBL>3QXj!)JItXyPHOg62_JG9)_oX()}{p-)yp!`S! zE~1N{l~)%V()3emr}M4&w$C;MJmH*eZ|n^2?=e~kiKV`_6^%`;*uJp}JNS3FtO2!E zZD^xevDR*q#>XN%FBt_>Q&F-w2L+SUkvuLD$tkgBl&Vi_HD`iQ*GZ>W7ySm$96Er1 z`pNt7rQ23o!ZFNw2EP>FHIKjy#>nUJ2zUfM0v>^3K)_F_4Fib2 ziqVgNrU_R)v~%d5qL)gJmI_}G(N#2(1(Eb8BIMW4GWNiloZ)_2f-T+I3)bl zBk-OG_%)pOgve*`2v`J~o7&A046$+1^d%SLVetrf1O|z~{|Bz(fob}kGLQfO002ov JPDHLkV1ke-i;n;R literal 0 HcmV?d00001 diff --git a/pytorch_geometric-2.4.0/docs/source/_static/thumbnails/explain.png b/pytorch_geometric-2.5.2/docs/source/_static/thumbnails/explain.png similarity index 100% rename from pytorch_geometric-2.4.0/docs/source/_static/thumbnails/explain.png rename to pytorch_geometric-2.5.2/docs/source/_static/thumbnails/explain.png diff --git a/pytorch_geometric-2.4.0/docs/source/_static/thumbnails/heterogeneous.png b/pytorch_geometric-2.5.2/docs/source/_static/thumbnails/heterogeneous.png similarity index 100% rename from pytorch_geometric-2.4.0/docs/source/_static/thumbnails/heterogeneous.png rename to pytorch_geometric-2.5.2/docs/source/_static/thumbnails/heterogeneous.png diff --git a/pytorch_geometric-2.4.0/docs/source/_static/thumbnails/load_csv.png b/pytorch_geometric-2.5.2/docs/source/_static/thumbnails/load_csv.png similarity index 100% rename from pytorch_geometric-2.4.0/docs/source/_static/thumbnails/load_csv.png rename to pytorch_geometric-2.5.2/docs/source/_static/thumbnails/load_csv.png diff --git a/pytorch_geometric-2.4.0/docs/source/_static/thumbnails/multi_gpu_vanilla.png b/pytorch_geometric-2.5.2/docs/source/_static/thumbnails/multi_gpu_vanilla.png similarity index 100% rename from pytorch_geometric-2.4.0/docs/source/_static/thumbnails/multi_gpu_vanilla.png rename to pytorch_geometric-2.5.2/docs/source/_static/thumbnails/multi_gpu_vanilla.png diff --git a/pytorch_geometric-2.4.0/docs/source/_static/thumbnails/neighbor_loader.png b/pytorch_geometric-2.5.2/docs/source/_static/thumbnails/neighbor_loader.png similarity index 100% rename from pytorch_geometric-2.4.0/docs/source/_static/thumbnails/neighbor_loader.png rename to pytorch_geometric-2.5.2/docs/source/_static/thumbnails/neighbor_loader.png diff --git a/pytorch_geometric-2.5.2/docs/source/_static/thumbnails/point_cloud.png b/pytorch_geometric-2.5.2/docs/source/_static/thumbnails/point_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..5269bc16a86055aae4e60801aa509642777259db GIT binary patch literal 94922 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 2.1.0` to be installed. + Note that when :obj:`dynamic` is set to :obj:`False`, :pytorch:`PyTorch` will *never* generate dynamic kernels, and thus only works when graph sizes are guaranteed to never change (*e.g.*, in full-batch training on small graphs). + By default, :obj:`dynamic` is set to :obj:`None` in :pytorch:`PyTorch` :obj:`>= 2.1.0`, and :pytorch:`PyTorch` will automatically detect if dynamism has occured. + Note that support for dynamic shape tracing requires :pytorch:`PyTorch` :obj:`>= 2.1.0` to be installed. * In order to maximize speedup, graphs breaks in the compiled model should be limited. We can force compilation to raise an error upon the first graph break encountered by using the :obj:`fullgraph=True` argument: .. code-block:: python - torch_geometric.compile(model, fullgraph=True) + torch.compile(model, fullgraph=True) It is generally a good practice to confirm that your written model does not contain any graph breaks. Importantly, there exists a few operations in :pyg:`PyG` that will currently lead to graph breaks (but workaround exists), *e.g.*: @@ -85,18 +71,18 @@ The :meth:`torch.compile`/:meth:`torch_geometric.compile` method provides two im 1. :meth:`~torch_geometric.nn.pool.global_mean_pool` (and other pooling operators) perform device synchronization in case the batch size :obj:`size` is not passed, leading to a graph break. 2. :meth:`~torch_geometric.utils.remove_self_loops` and :meth:`~torch_geometric.utils.add_remaining_self_loops` mask the given :obj:`edge_index`, leading to a device synchronization to compute its final output shape. - As such, we recommend to augment your graph *before* inputting it into your GNN, *e.g.*, via the :class:`~torch_geometric.transforms.AddSelfLoops` or :class:`~torch_geometric.transforms.GCNNorm` transformations, and setting :obj:`add_self_loops=False`/:obj:`normalize=False` when initializing layers such as :class:`~torch_geometric.nn.conv.GCNNorm`. + As such, we recommend to augment your graph *before* inputting it into your GNN, *e.g.*, via the :class:`~torch_geometric.transforms.AddSelfLoops` or :class:`~torch_geometric.transforms.GCNNorm` transformations, and setting :obj:`add_self_loops=False`/:obj:`normalize=False` when initializing layers such as :class:`~torch_geometric.nn.conv.GCNConv`. Exampe Scripts -------------- -We have incorporated multiple examples in :obj:`examples/compile` that further show the practical usage of :meth:`torch_geometric.compile`: +We have incorporated multiple examples in :obj:`examples/compile` that further show the practical usage of :meth:`torch.compile`: #. `Node Classification `__ via :class:`~torch_geometric.nn.models.GCN` (:obj:`dynamic=False`) #. `Graph Classification `__ via :class:`~torch_geometric.nn.models.GIN` (:obj:`dynamic=True`) -If you notice that :meth:`~torch_geometric.compile` fails for a certain :pyg:`PyG` model, do not hesitate to reach out either on :github:`null` `GitHub `_ or :slack:`null` `Slack `_. -We are very eager to improve :meth:`~torch_geometric.compile` support across the whole :pyg:`PyG` code base. +If you notice that :meth:`torch.compile` fails for a certain :pyg:`PyG` model, do not hesitate to reach out either on :github:`null` `GitHub `_ or :slack:`null` `Slack `_. +We are very eager to improve :meth:`torch.compile` support across the whole :pyg:`PyG` code base. Benchmark --------- @@ -104,7 +90,7 @@ Benchmark :meth:`torch.compile` works **fantastically well** for many :pyg:`PyG` models. **Overall, we observe runtime improvements of nearly up to 300%.** -Specifically, we benchmark :class:`~torch_geometric.nn.models.GCN`, :class:`~torch_geometric.nn.models.GraphSAGE` and :class:`~torch_geometric.nn.models.GIN` and compare runtimes obtained from traditional eager mode and :meth:`torch_geometric.compile`. +Specifically, we benchmark :class:`~torch_geometric.nn.models.GCN`, :class:`~torch_geometric.nn.models.GraphSAGE` and :class:`~torch_geometric.nn.models.GIN` and compare runtimes obtained from traditional eager mode and :meth:`torch.compile`. We use a synthetic graph with 10,000 nodes and 200,000 edges, and a hidden feature dimensionality of 64. We report runtimes over 500 optimization steps: diff --git a/pytorch_geometric-2.4.0/docs/source/advanced/cpu_affinity.rst b/pytorch_geometric-2.5.2/docs/source/advanced/cpu_affinity.rst similarity index 100% rename from pytorch_geometric-2.4.0/docs/source/advanced/cpu_affinity.rst rename to pytorch_geometric-2.5.2/docs/source/advanced/cpu_affinity.rst diff --git a/pytorch_geometric-2.4.0/docs/source/advanced/graphgym.rst b/pytorch_geometric-2.5.2/docs/source/advanced/graphgym.rst similarity index 93% rename from pytorch_geometric-2.4.0/docs/source/advanced/graphgym.rst rename to pytorch_geometric-2.5.2/docs/source/advanced/graphgym.rst index 344898f..a7807fa 100644 --- a/pytorch_geometric-2.4.0/docs/source/advanced/graphgym.rst +++ b/pytorch_geometric-2.5.2/docs/source/advanced/graphgym.rst @@ -78,6 +78,10 @@ In sum, GraphGym can greatly facilitate your GNN research. Basic Usage ----------- +.. note:: + For using GraphGym, :pyg:`PyG` requires additional dependencies. + You can install those by running :obj:`pip install torch-geometric[graphgym]`. + To use GraphGym, you need to clone :pyg:`PyG` from :github:`GitHub`, then change to the :obj:`graphgym/` directory. .. code-block:: bash @@ -87,7 +91,7 @@ To use GraphGym, you need to clone :pyg:`PyG` from :github:`GitHub`, then change #. **Run a single experiment:** Run an experiment using GraphGym via :obj:`run_single.sh`. - Configurations are specified in :obj:`configs/example_node.yaml`. + Configurations are specified in :obj:`configs/pyg/example_node.yaml`. The default experiment is about node classification on the :class:`~torch_geometric.datasets.Planetoid` datasets (using a random 80/20 train/validation split). .. code-block:: bash @@ -96,7 +100,7 @@ To use GraphGym, you need to clone :pyg:`PyG` from :github:`GitHub`, then change #. **Run a batch of experiments:** Run a batch of experiments using GraphGym via :obj:`run_batch.sh`. - Configurations are specified in :obj:`configs/example_node.yaml` (controls the basic architecture) and :obj:`grids/example.txt` (controls how to do grid search). + Configurations are specified in :obj:`configs/pyg/example_node.yaml` (controls the basic architecture) and :obj:`grids/example.txt` (controls how to do grid search). The experiment examines 96 models in the recommended GNN design space, on 2 graph classification datasets. Each experiment is repeated 3 times, and we set up that 8 jobs can be concurrently run. Depending on your infrastructure, finishing all the experiments may take a long time; @@ -125,7 +129,7 @@ To use GraphGym, you need to clone :pyg:`PyG` from :github:`GitHub`, then change #. **Specify a configuration file:** In GraphGym, an experiment is fully specified by a :obj:`*.yaml` file. Unspecified configurations in the :obj:`*.yaml` file will be populated by the default values in :meth:`torch_geometric.graphgym.set_cfg`. - For example, in :obj:`configs/example_node.yaml`, there are configurations for the dataset, training procedure, model, etc. + For example, in :obj:`configs/pyg/example_node.yaml`, there are configurations for the dataset, training procedure, model, etc. Concrete description for each configuration is described in :meth:`~torch_geometric.graphgym.set_cfg`. #. **Launch an experiment:** @@ -133,14 +137,14 @@ To use GraphGym, you need to clone :pyg:`PyG` from :github:`GitHub`, then change .. code-block:: bash - python main.py --cfg configs/example_node.yaml --repeat 3 + python main.py --cfg configs/pyg/example_node.yaml --repeat 3 You can specify the number of different random seeds to repeat via :obj:`--repeat`. #. **Understand the results:** Experimental results will be automatically saved in :obj:`results/${CONFIG_NAME}/`. - In the example above, this amounts to :obj:`results/example_node/`. - Results for different random seeds will be saved in different subdirectories, *e.g.*, :obj:`results/example_node/2`. + In the example above, this amounts to :obj:`results/pyg/example_node/`. + Results for different random seeds will be saved in different subdirectories, *e.g.*, :obj:`results/pyg/example_node/2`. The aggregated results over all the random seeds are *automatically* generated into :obj:`results/example/agg`, including the mean and standard deviation :obj:`_std` for each metric. Train/validation/test results are further saved into subdirectories, such as :obj:`results/example/agg/val`. Here, :obj:`stats.json` stores the results after each epoch aggregated across random seeds, and :obj:`best.json` stores the results of *the epoch with the highest validation accuracy*. @@ -186,8 +190,8 @@ To use GraphGym, you need to clone :pyg:`PyG` from :github:`GitHub`, then change #. **Understand the results:** Experimental results will be automatically saved in directory :obj:`results/${CONFIG_NAME}_grid_${GRID_NAME}/`. - In the example above, this amounts to :obj:`results/example_grid_example/`. - After running each experiment, GraphGym additionally automatically averages across different models, saved in :obj:`results/example_grid_example/agg`. + In the example above, this amounts to :obj:`results/pyg/example_grid_example/`. + After running each experiment, GraphGym additionally automatically averages across different models, saved in :obj:`results/pyg/example_grid_example/agg`. There, :obj:`val.csv` represents the validation accuracy for each model configuration at the *final* epoch, :obj:`val_best.csv` represents the results at the epoch with the highest average validation accuracy, and :obj:`val_best_epoch.csv` represents the results at the epoch with the highest validation accuracy averaged over different random seeds. diff --git a/pytorch_geometric-2.4.0/docs/source/advanced/hgam.rst b/pytorch_geometric-2.5.2/docs/source/advanced/hgam.rst similarity index 100% rename from pytorch_geometric-2.4.0/docs/source/advanced/hgam.rst rename to pytorch_geometric-2.5.2/docs/source/advanced/hgam.rst diff --git a/pytorch_geometric-2.5.2/docs/source/advanced/jit.rst b/pytorch_geometric-2.5.2/docs/source/advanced/jit.rst new file mode 100644 index 0000000..e126781 --- /dev/null +++ b/pytorch_geometric-2.5.2/docs/source/advanced/jit.rst @@ -0,0 +1,94 @@ +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:`Python` process and loaded in a process where there is no :python:`Python` dependency. +If you are unfamilar with TorchScript, we recommend to read the official "`Introduction to TorchScript `_" tutorial first. + +Converting GNN Models +--------------------- + +.. note:: + From :pyg:`PyG` 2.5 (and onwards), GNN layers are now fully compatible with :meth:`torch.jit.script` without any modification needed. + If you are on an earlier version of :pyg:`PyG`, consider to convert your GNN layers into "jittable" instances first by calling :meth:`~torch_geometric.nn.conv.MessagePassing.jittable`. + +Converting your :pyg:`PyG` model to a TorchScript program is straightforward and requires only a few code changes. +Let's consider the following model: + +.. 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) + +The instantiated model can now be directly passed into :meth:`torch.jit.script`: + +.. code-block:: python + + model = torch.jit.script(model) + +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. + +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 compatible with :meth:`torch.jit.script`, 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.MessagePassing` module the types that you pass to its :meth:`~torch_geometric.nn.conv.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] = None, + ) -> Tensor: + return self.propagate(edge_index, x=x, edge_weight=edge_weight) + + 2. Declaring the type of propagation arguments as a comment 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] = None, + ) -> Tensor: + # propagate_type: (x: Tensor, edge_weight: Optional[Tensor]) + return self.propagate(edge_index, x=x, edge_weight=edge_weight) + + If none of these options are given, the :class:`~torch_geometric.nn.conv.MessagePassing` module will infer the arguments of :meth:`~torch_geometric.nn.conv.MessagePassing.propagate` to be of type :class:`torch.Tensor` (mimicing the default type that TorchScript is inferring for non-annotated arguments). diff --git a/pytorch_geometric-2.4.0/docs/source/advanced/remote.rst b/pytorch_geometric-2.5.2/docs/source/advanced/remote.rst similarity index 99% rename from pytorch_geometric-2.4.0/docs/source/advanced/remote.rst rename to pytorch_geometric-2.5.2/docs/source/advanced/remote.rst index 6b4bd9e..ad22965 100644 --- a/pytorch_geometric-2.4.0/docs/source/advanced/remote.rst +++ b/pytorch_geometric-2.5.2/docs/source/advanced/remote.rst @@ -108,7 +108,7 @@ An example usage of the interface is shown below: assert torch.equal(col, edge_index[1]) Common implementations of the :class:`~torch_geometric.data.GraphStore` are graph databases, *e.g.*, :obj:`Neo4j`, :obj:`TigerGraph`, :obj:`ArangoDB`, :obj:`Kùzu` are all viable performant options. -We provide an example of using :pyg:`PyG` in combination with the :obj:`Kùzu` database `here `__. +We provide an example of using :pyg:`PyG` in combination with the :obj:`Kùzu` database `here `__. A graph sampler is tightly coupled to the given :class:`~torch_geometric.data.GraphStore`, and operates on the :class:`~torch_geometric.data.GraphStore` to produce sampled subgraphs from input nodes. Different sampling algorithms are implemented behind the :class:`torch_geometric.sampler.BaseSampler` interface. diff --git a/pytorch_geometric-2.4.0/docs/source/advanced/sparse_tensor.rst b/pytorch_geometric-2.5.2/docs/source/advanced/sparse_tensor.rst similarity index 100% rename from pytorch_geometric-2.4.0/docs/source/advanced/sparse_tensor.rst rename to pytorch_geometric-2.5.2/docs/source/advanced/sparse_tensor.rst diff --git a/pytorch_geometric-2.4.0/docs/source/cheatsheet/data_cheatsheet.rst b/pytorch_geometric-2.5.2/docs/source/cheatsheet/data_cheatsheet.rst similarity index 100% rename from pytorch_geometric-2.4.0/docs/source/cheatsheet/data_cheatsheet.rst rename to pytorch_geometric-2.5.2/docs/source/cheatsheet/data_cheatsheet.rst diff --git a/pytorch_geometric-2.4.0/docs/source/cheatsheet/gnn_cheatsheet.rst b/pytorch_geometric-2.5.2/docs/source/cheatsheet/gnn_cheatsheet.rst similarity index 100% rename from pytorch_geometric-2.4.0/docs/source/cheatsheet/gnn_cheatsheet.rst rename to pytorch_geometric-2.5.2/docs/source/cheatsheet/gnn_cheatsheet.rst diff --git a/pytorch_geometric-2.4.0/docs/source/conf.py b/pytorch_geometric-2.5.2/docs/source/conf.py similarity index 64% rename from pytorch_geometric-2.4.0/docs/source/conf.py rename to pytorch_geometric-2.5.2/docs/source/conf.py index 6abc74a..95b20e2 100644 --- a/pytorch_geometric-2.4.0/docs/source/conf.py +++ b/pytorch_geometric-2.5.2/docs/source/conf.py @@ -39,28 +39,43 @@ intersphinx_mapping = { 'python': ('https://docs.python.org/', None), - 'numpy': ('http://docs.scipy.org/doc/numpy', None), + # 'numpy': ('http://docs.scipy.org/doc/numpy', None), 'pandas': ('http://pandas.pydata.org/pandas-docs/dev', None), 'torch': ('https://pytorch.org/docs/master', None), } nbsphinx_thumbnails = { - 'tutorial/create_gnn': '_static/thumbnails/create_gnn.png', - 'tutorial/heterogeneous': '_static/thumbnails/heterogeneous.png', - 'tutorial/create_dataset': '_static/thumbnails/create_dataset.png', - 'tutorial/load_csv': '_static/thumbnails/load_csv.png', - 'tutorial/neighbor_loader': '_static/thumbnails/neighbor_loader.png', - 'tutorial/explain': '_static/thumbnails/explain.png', + 'tutorial/create_gnn': + '_static/thumbnails/create_gnn.png', + 'tutorial/heterogeneous': + '_static/thumbnails/heterogeneous.png', + 'tutorial/create_dataset': + '_static/thumbnails/create_dataset.png', + 'tutorial/load_csv': + '_static/thumbnails/load_csv.png', + 'tutorial/neighbor_loader': + '_static/thumbnails/neighbor_loader.png', + 'tutorial/point_cloud': + '_static/thumbnails/point_cloud.png', + 'tutorial/explain': + '_static/thumbnails/explain.png', 'tutorial/shallow_node_embeddings': '_static/thumbnails/shallow_node_embeddings.png', - 'tutorial/multi_gpu_vanilla': '_static/thumbnails/multi_gpu_vanilla.png', + 'tutorial/distributed_pyg': + '_static/thumbnails/distributed_pyg.png', + 'tutorial/multi_gpu_vanilla': + '_static/thumbnails/multi_gpu_vanilla.png', + 'tutorial/multi_node_multi_gpu_vanilla': + '_static/thumbnails/multi_gpu_vanilla.png', } -def setup(app): - def rst_jinja_render(app, _, source): +def rst_jinja_render(app, _, source): + if hasattr(app.builder, 'templates'): rst_context = {'torch_geometric': torch_geometric} source[0] = app.builder.templates.render_string(source[0], rst_context) + +def setup(app): app.connect('source-read', rst_jinja_render) app.add_js_file('js/version_alert.js') diff --git a/pytorch_geometric-2.4.0/docs/source/external/resources.rst b/pytorch_geometric-2.5.2/docs/source/external/resources.rst similarity index 78% rename from pytorch_geometric-2.4.0/docs/source/external/resources.rst rename to pytorch_geometric-2.5.2/docs/source/external/resources.rst index 0443165..1dcd20f 100644 --- a/pytorch_geometric-2.4.0/docs/source/external/resources.rst +++ b/pytorch_geometric-2.5.2/docs/source/external/resources.rst @@ -41,4 +41,12 @@ External Resources * Kùzu: **Remote Backend for** :pyg:`null` **PyTorch Geometric** [:colab:`null` `Colab `__] -* Aniket Saxena: **Graph Neural Networks-based Node and Graph Classification, and Explanation App using** :pyg:`null` **PyTorch Geometric** [`Website `__, :github:`null` `GitHub `__] +* Aniket Saxena: **Graph Neural Networks-based Explanation App using** :pyg:`null` **PyTorch Geometric** [`Website `__, :github:`null` `GitHub `__] + +* Mashaan Alshammari: **Graph Attention in** :pyg:`null` **PyTorch Geometric** [:youtube:`null` `Youtube `__, :github:`null` `GitHub `__] + +* Mashaan Alshammari: **Graph Convolutional Networks (GCNs) in** :pytorch:`null` **PyTorch** [:youtube:`null` `Youtube `__, :github:`null` `GitHub `__] + +* Mashaan Alshammari: **GCN and SGC in** :pytorch:`null` **PyTorch** [:youtube:`null` `Youtube `__, :github:`null` `GitHub `__], + +* Mashaan Alshammari: **GCN Variants SGC and ASGC in** :pytorch:`null` **PyTorch** [:youtube:`null` `Youtube `__, :github:`null` `GitHub `__] diff --git a/pytorch_geometric-2.4.0/docs/source/get_started/colabs.rst b/pytorch_geometric-2.5.2/docs/source/get_started/colabs.rst similarity index 100% rename from pytorch_geometric-2.4.0/docs/source/get_started/colabs.rst rename to pytorch_geometric-2.5.2/docs/source/get_started/colabs.rst diff --git a/pytorch_geometric-2.4.0/docs/source/get_started/introduction.rst b/pytorch_geometric-2.5.2/docs/source/get_started/introduction.rst similarity index 100% rename from pytorch_geometric-2.4.0/docs/source/get_started/introduction.rst rename to pytorch_geometric-2.5.2/docs/source/get_started/introduction.rst diff --git a/pytorch_geometric-2.4.0/docs/source/index.rst b/pytorch_geometric-2.5.2/docs/source/index.rst similarity index 97% rename from pytorch_geometric-2.4.0/docs/source/index.rst rename to pytorch_geometric-2.5.2/docs/source/index.rst index 7f231c7..dcef5e1 100644 --- a/pytorch_geometric-2.4.0/docs/source/index.rst +++ b/pytorch_geometric-2.5.2/docs/source/index.rst @@ -30,7 +30,7 @@ In addition, it consists of easy-to-use mini-batch loaders for operating on many tutorial/gnn_design tutorial/dataset tutorial/application - tutorial/multi_gpu + tutorial/distributed .. toctree:: :maxdepth: 1 @@ -58,6 +58,8 @@ In addition, it consists of easy-to-use mini-batch loaders for operating on many modules/transforms modules/utils modules/explain + modules/metrics + modules/distributed modules/contrib modules/graphgym modules/profile diff --git a/pytorch_geometric-2.4.0/docs/source/install/installation.rst b/pytorch_geometric-2.5.2/docs/source/install/installation.rst similarity index 87% rename from pytorch_geometric-2.4.0/docs/source/install/installation.rst rename to pytorch_geometric-2.5.2/docs/source/install/installation.rst index 56da2f7..e649e0f 100644 --- a/pytorch_geometric-2.4.0/docs/source/install/installation.rst +++ b/pytorch_geometric-2.5.2/docs/source/install/installation.rst @@ -1,11 +1,11 @@ Installation ============ -:pyg:`PyG` is available for Python 3.8 to Python 3.11. +:pyg:`PyG` is available for :python:`Python 3.8` to :python:`Python 3.12`. .. note:: - We do not recommend installation as a root user on your system Python. - Please setup a virtual environment, *e.g.*, via `Anaconda or Miniconda `_, or create a `Docker image `_. + We do not recommend installation as a root user on your system :python:`Python`. + Please setup a virtual environment, *e.g.*, via :conda:`null` `Anaconda or Miniconda `_, or create a `Docker image `_. Quick Start ----------- @@ -16,8 +16,8 @@ Quick Start Installation via Anaconda ------------------------- -You can now install :pyg:`PyG` via `Anaconda `_ for all major OS, :pytorch:`PyTorch` and CUDA combinations 🤗 -If you have not yet installed :pytorch:`PyTorch`, install it via :obj:`conda` as described in its `official documentation `_. +You can now install :pyg:`PyG` via :conda:`null` `Anaconda `_ for all major OS, :pytorch:`PyTorch` and CUDA combinations 🤗. +If you have not yet installed :pytorch:`PyTorch`, install it via :conda:`null` :obj:`conda install` as described in its `official documentation `_. Given that you have :pytorch:`PyTorch` installed (:obj:`>=1.11.0`), simply run .. code-block:: none @@ -37,8 +37,6 @@ For this, simply run: pip install torch_geometric -PyG 2.3 requires that at least PyTorch 1.11 is installed. - Additional Libraries -------------------- @@ -68,14 +66,14 @@ For ease of installation of these extensions, we provide :obj:`pip` wheels for t .. code-block:: none python -c "import torch; print(torch.__version__)" - >>> 2.1.0 + >>> 2.2.0 #. Find the CUDA version :pytorch:`PyTorch` was installed with: .. code-block:: none python -c "import torch; print(torch.version.cuda)" - >>> 11.8 + >>> 12.1 #. Install the relevant packages: @@ -85,23 +83,24 @@ For ease of installation of these extensions, we provide :obj:`pip` wheels for t where :obj:`${TORCH}` and :obj:`${CUDA}` should be replaced by the specific :pytorch:`PyTorch` and CUDA versions, respectively: + * :pytorch:`PyTorch` 2.2: :obj:`${TORCH}=2.2.0` and :obj:`${CUDA}=cpu|cu118|cu121` * :pytorch:`PyTorch` 2.1: :obj:`${TORCH}=2.1.0` and :obj:`${CUDA}=cpu|cu118|cu121` * :pytorch:`PyTorch` 2.0: :obj:`${TORCH}=2.0.0` and :obj:`${CUDA}=cpu|cu117|cu118` * :pytorch:`PyTorch` 1.13: :obj:`${TORCH}=1.13.0` and :obj:`${CUDA}=cpu|cu116|cu117` - For example, for :pytorch:`PyTorch` 2.1.* and CUDA 12.1, type: + For example, for :pytorch:`PyTorch` 2.2.* and CUDA 12.1, type: .. code-block:: none - pip install pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv -f https://data.pyg.org/whl/torch-2.1.0+cu121.html + pip install pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv -f https://data.pyg.org/whl/torch-2.2.0+cu121.html - For example, for :pytorch:`PyTorch` 2.0.* and CUDA 11.8, type: + For example, for :pytorch:`PyTorch` 2.1.* and CUDA 11.8, type: .. code-block:: none - pip install pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv -f https://data.pyg.org/whl/torch-2.0.0+cu118.html + pip install pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv -f https://data.pyg.org/whl/torch-2.1.0+cu118.html -**Note:** Binaries of older versions are also provided for :pytorch:`PyTorch` 1.4.0, 1.5.0, 1.6.0, 1.7.0/1.7.1, 1.8.0/1.8.1, 1.9.0, 1.10.0/1.10.1/1.10.2, 1.11.0, 1.12.0/1.12.1 and 1.13.0/1.13.1 (following the same procedure). +**Note:** Binaries of older versions are also provided for :pytorch:`PyTorch` 1.4.0, 1.5.0, 1.6.0, 1.7.0/1.7.1, 1.8.0/1.8.1, 1.9.0, 1.10.0/1.10.1/1.10.2, 1.11.0, 1.12.0/1.12.1, 1.13.0/1.13.1, and 2.0.0 (following the same procedure). **For older versions, you need to explicitly specify the latest supported version number** or install via :obj:`pip install --no-index` in order to prevent a manual installation from source. You can look up the latest supported version number `here `__. @@ -173,7 +172,7 @@ In case a specific version is not supported by `our wheels `__ subsection. In case the FAQ does not help you in solving your problem, please create an `issue `_. diff --git a/pytorch_geometric-2.4.0/docs/source/install/quick-start.html b/pytorch_geometric-2.5.2/docs/source/install/quick-start.html similarity index 93% rename from pytorch_geometric-2.4.0/docs/source/install/quick-start.html rename to pytorch_geometric-2.5.2/docs/source/install/quick-start.html index b9af902..0d16009 100644 --- a/pytorch_geometric-2.4.0/docs/source/install/quick-start.html +++ b/pytorch_geometric-2.5.2/docs/source/install/quick-start.html @@ -75,6 +75,7 @@