k3-node 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- k3_node/__init__.py +122 -0
- k3_node/applications/__init__.py +17 -0
- k3_node/applications/bio/__init__.py +21 -0
- k3_node/applications/chemistry/__init__.py +155 -0
- k3_node/applications/materials/__init__.py +127 -0
- k3_node/applications/materials/basis.py +449 -0
- k3_node/applications/materials/chgnet.py +360 -0
- k3_node/applications/materials/core.py +351 -0
- k3_node/applications/materials/grace.py +246 -0
- k3_node/applications/materials/io.py +230 -0
- k3_node/applications/materials/m3gnet.py +462 -0
- k3_node/applications/materials/megnet.py +395 -0
- k3_node/applications/materials/qet.py +220 -0
- k3_node/applications/materials/readout.py +235 -0
- k3_node/applications/materials/so3net.py +234 -0
- k3_node/applications/materials/tensornet.py +381 -0
- k3_node/applications/materials/test_materials.py +167 -0
- k3_node/applications/materials/wrappers.py +95 -0
- k3_node/data/__init__.py +47 -0
- k3_node/data/batch.py +102 -0
- k3_node/data/collate.py +282 -0
- k3_node/data/data.py +532 -0
- k3_node/data/database.py +154 -0
- k3_node/data/dataset.py +182 -0
- k3_node/data/download.py +49 -0
- k3_node/data/extract.py +45 -0
- k3_node/data/feature_store.py +70 -0
- k3_node/data/graph_store.py +92 -0
- k3_node/data/hetero_data.py +374 -0
- k3_node/data/hypergraph_data.py +59 -0
- k3_node/data/in_memory_dataset.py +177 -0
- k3_node/data/makedirs.py +7 -0
- k3_node/data/on_disk_dataset.py +77 -0
- k3_node/data/separate.py +115 -0
- k3_node/data/storage.py +593 -0
- k3_node/data/temporal.py +154 -0
- k3_node/data/test_batch.py +67 -0
- k3_node/data/test_data.py +68 -0
- k3_node/data/test_dataset_and_stores.py +111 -0
- k3_node/data/test_hetero_data.py +33 -0
- k3_node/data/test_temporal_and_hyper.py +32 -0
- k3_node/data/view.py +43 -0
- k3_node/datasets/__init__.py +88 -0
- k3_node/datasets/actor.py +101 -0
- k3_node/datasets/airports.py +84 -0
- k3_node/datasets/amazon.py +66 -0
- k3_node/datasets/ba2motif_dataset.py +73 -0
- k3_node/datasets/ba_shapes.py +81 -0
- k3_node/datasets/bitcoin_otc.py +77 -0
- k3_node/datasets/citation_full.py +81 -0
- k3_node/datasets/coauthor.py +66 -0
- k3_node/datasets/dblp.py +106 -0
- k3_node/datasets/digits.py +63 -0
- k3_node/datasets/email_eu_core.py +60 -0
- k3_node/datasets/entities.py +158 -0
- k3_node/datasets/explainer_dataset.py +101 -0
- k3_node/datasets/facebook.py +51 -0
- k3_node/datasets/fake.py +256 -0
- k3_node/datasets/freebase.py +90 -0
- k3_node/datasets/geometric_shapes.py +69 -0
- k3_node/datasets/github.py +51 -0
- k3_node/datasets/graph_generator/__init__.py +6 -0
- k3_node/datasets/graph_generator/ba_graph.py +20 -0
- k3_node/datasets/graph_generator/base.py +29 -0
- k3_node/datasets/graph_generator/er_graph.py +21 -0
- k3_node/datasets/icews.py +58 -0
- k3_node/datasets/imdb.py +96 -0
- k3_node/datasets/jodie.py +56 -0
- k3_node/datasets/karate.py +56 -0
- k3_node/datasets/lastfm_asia.py +51 -0
- k3_node/datasets/mesh_correspondence.py +50 -0
- k3_node/datasets/molecule_net.py +148 -0
- k3_node/datasets/motif_generator/__init__.py +7 -0
- k3_node/datasets/motif_generator/base.py +29 -0
- k3_node/datasets/motif_generator/custom.py +17 -0
- k3_node/datasets/motif_generator/cycle.py +25 -0
- k3_node/datasets/motif_generator/house.py +27 -0
- k3_node/datasets/movielens.py +55 -0
- k3_node/datasets/planetoid.py +137 -0
- k3_node/datasets/polblogs.py +63 -0
- k3_node/datasets/ppi.py +189 -0
- k3_node/datasets/qm7.py +65 -0
- k3_node/datasets/qm9.py +132 -0
- k3_node/datasets/reddit.py +121 -0
- k3_node/datasets/sbm_dataset.py +165 -0
- k3_node/datasets/seal.py +74 -0
- k3_node/datasets/shape_scenes.py +92 -0
- k3_node/datasets/test_datasets.py +322 -0
- k3_node/datasets/tu_dataset.py +131 -0
- k3_node/datasets/twitch.py +66 -0
- k3_node/datasets/webkb.py +102 -0
- k3_node/datasets/wikics.py +85 -0
- k3_node/datasets/word_net.py +184 -0
- k3_node/etl/__init__.py +37 -0
- k3_node/etl/encoders.py +248 -0
- k3_node/etl/graph_builders.py +270 -0
- k3_node/etl/relational_to_graph.py +201 -0
- k3_node/etl/table_to_graph.py +244 -0
- k3_node/etl/test_etl.py +318 -0
- k3_node/export/__init__.py +15 -0
- k3_node/export/cross_backend.py +172 -0
- k3_node/export/onnx_exporter.py +190 -0
- k3_node/export/runtime.py +254 -0
- k3_node/export/tensorrt_exporter.py +201 -0
- k3_node/export/test_export.py +337 -0
- k3_node/export/tflite_exporter.py +112 -0
- k3_node/hub/__init__.py +29 -0
- k3_node/hub/dataset_hub.py +242 -0
- k3_node/hub/hub_mixin.py +599 -0
- k3_node/hub/model_card.py +133 -0
- k3_node/hub/test_hub.py +419 -0
- k3_node/io/__init__.py +22 -0
- k3_node/io/fs.py +117 -0
- k3_node/io/npz.py +45 -0
- k3_node/io/off.py +29 -0
- k3_node/io/planetoid.py +98 -0
- k3_node/io/tu.py +137 -0
- k3_node/io/txt_array.py +58 -0
- k3_node/layers/__init__.py +14 -0
- k3_node/layers/aggr/__init__.py +70 -0
- k3_node/layers/aggr/attention.py +77 -0
- k3_node/layers/aggr/base.py +403 -0
- k3_node/layers/aggr/basic.py +412 -0
- k3_node/layers/aggr/deep_sets.py +65 -0
- k3_node/layers/aggr/deepsets.py +29 -0
- k3_node/layers/aggr/equilibrium.py +107 -0
- k3_node/layers/aggr/fused.py +43 -0
- k3_node/layers/aggr/gmt.py +89 -0
- k3_node/layers/aggr/gru.py +58 -0
- k3_node/layers/aggr/lcm.py +143 -0
- k3_node/layers/aggr/lstm.py +58 -0
- k3_node/layers/aggr/mlp.py +75 -0
- k3_node/layers/aggr/multi.py +154 -0
- k3_node/layers/aggr/patch_transformer.py +137 -0
- k3_node/layers/aggr/quantile.py +125 -0
- k3_node/layers/aggr/resolver.py +68 -0
- k3_node/layers/aggr/scaler.py +133 -0
- k3_node/layers/aggr/set2set.py +87 -0
- k3_node/layers/aggr/set_transformer.py +107 -0
- k3_node/layers/aggr/sort.py +68 -0
- k3_node/layers/aggr/test_aggr.py +337 -0
- k3_node/layers/aggr/utils.py +210 -0
- k3_node/layers/aggr/variance_preserving.py +54 -0
- k3_node/layers/attention/__init__.py +5 -0
- k3_node/layers/attention/pair_attention.py +448 -0
- k3_node/layers/attention/performer.py +187 -0
- k3_node/layers/attention/polynormer.py +160 -0
- k3_node/layers/attention/qformer.py +143 -0
- k3_node/layers/attention/sgformer.py +106 -0
- k3_node/layers/attention/test_attention.py +68 -0
- k3_node/layers/attention/test_pair_attention.py +91 -0
- k3_node/layers/conv/__init__.py +149 -0
- k3_node/layers/conv/agnn_conv.py +120 -0
- k3_node/layers/conv/antisymmetric_conv.py +94 -0
- k3_node/layers/conv/appnp.py +105 -0
- k3_node/layers/conv/appnp_conv.py +157 -0
- k3_node/layers/conv/arma_conv.py +231 -0
- k3_node/layers/conv/cg_conv.py +92 -0
- k3_node/layers/conv/cheb_conv.py +137 -0
- k3_node/layers/conv/cluster_gcn_conv.py +102 -0
- k3_node/layers/conv/conv.py +100 -0
- k3_node/layers/conv/crystal_conv.py +140 -0
- k3_node/layers/conv/cugraph.py +84 -0
- k3_node/layers/conv/diffusion_conv.py +144 -0
- k3_node/layers/conv/dir_gnn_conv.py +93 -0
- k3_node/layers/conv/dna_conv.py +192 -0
- k3_node/layers/conv/edge_conv.py +107 -0
- k3_node/layers/conv/eg_conv.py +155 -0
- k3_node/layers/conv/fa_conv.py +107 -0
- k3_node/layers/conv/feast_conv.py +126 -0
- k3_node/layers/conv/film_conv.py +143 -0
- k3_node/layers/conv/gat_conv.py +244 -0
- k3_node/layers/conv/gated_graph_conv.py +136 -0
- k3_node/layers/conv/gatv2_conv.py +205 -0
- k3_node/layers/conv/gcn.py +144 -0
- k3_node/layers/conv/gcn2_conv.py +126 -0
- k3_node/layers/conv/gcn_conv.py +135 -0
- k3_node/layers/conv/gen_conv.py +163 -0
- k3_node/layers/conv/general_conv.py +218 -0
- k3_node/layers/conv/gin_conv.py +218 -0
- k3_node/layers/conv/gmm_conv.py +172 -0
- k3_node/layers/conv/gps_conv.py +153 -0
- k3_node/layers/conv/graph_attention.py +262 -0
- k3_node/layers/conv/graph_conv.py +84 -0
- k3_node/layers/conv/gravnet_conv.py +93 -0
- k3_node/layers/conv/han_conv.py +175 -0
- k3_node/layers/conv/heat_conv.py +131 -0
- k3_node/layers/conv/hetero_conv.py +128 -0
- k3_node/layers/conv/hgt_conv.py +218 -0
- k3_node/layers/conv/hypergraph_conv.py +182 -0
- k3_node/layers/conv/le_conv.py +81 -0
- k3_node/layers/conv/lg_conv.py +58 -0
- k3_node/layers/conv/meshcnn_conv.py +84 -0
- k3_node/layers/conv/message_passing.py +451 -0
- k3_node/layers/conv/mf_conv.py +95 -0
- k3_node/layers/conv/mixhop_conv.py +108 -0
- k3_node/layers/conv/nn_conv.py +110 -0
- k3_node/layers/conv/pan_conv.py +100 -0
- k3_node/layers/conv/pdn_conv.py +109 -0
- k3_node/layers/conv/pna_conv.py +177 -0
- k3_node/layers/conv/point_conv.py +101 -0
- k3_node/layers/conv/point_gnn_conv.py +90 -0
- k3_node/layers/conv/point_transformer_conv.py +132 -0
- k3_node/layers/conv/ppf_conv.py +135 -0
- k3_node/layers/conv/ppnp.py +89 -0
- k3_node/layers/conv/res_gated_graph_conv.py +126 -0
- k3_node/layers/conv/rgat_conv.py +251 -0
- k3_node/layers/conv/rgcn_conv.py +321 -0
- k3_node/layers/conv/sage_conv.py +154 -0
- k3_node/layers/conv/sg_conv.py +96 -0
- k3_node/layers/conv/signed_conv.py +100 -0
- k3_node/layers/conv/simple_conv.py +75 -0
- k3_node/layers/conv/spline_conv.py +182 -0
- k3_node/layers/conv/ssg_conv.py +101 -0
- k3_node/layers/conv/supergat_conv.py +195 -0
- k3_node/layers/conv/tag_conv.py +98 -0
- k3_node/layers/conv/test_backend_consistency.py +164 -0
- k3_node/layers/conv/test_conv.py +176 -0
- k3_node/layers/conv/test_conv_pyg.py +566 -0
- k3_node/layers/conv/transformer_conv.py +168 -0
- k3_node/layers/conv/utils.py +403 -0
- k3_node/layers/conv/wl_conv.py +151 -0
- k3_node/layers/conv/x_conv.py +187 -0
- k3_node/layers/dense/__init__.py +40 -0
- k3_node/layers/dense/dense_gat_conv.py +149 -0
- k3_node/layers/dense/dense_gcn_conv.py +117 -0
- k3_node/layers/dense/dense_gin_conv.py +88 -0
- k3_node/layers/dense/dense_graph_conv.py +95 -0
- k3_node/layers/dense/dense_sage_conv.py +85 -0
- k3_node/layers/dense/diff_pool.py +76 -0
- k3_node/layers/dense/dmon_pool.py +223 -0
- k3_node/layers/dense/linear.py +327 -0
- k3_node/layers/dense/mincut_pool.py +92 -0
- k3_node/layers/dense/test_dense.py +377 -0
- k3_node/layers/functional/__init__.py +13 -0
- k3_node/layers/functional/bro.py +49 -0
- k3_node/layers/functional/edge_dropout.py +55 -0
- k3_node/layers/functional/gini.py +44 -0
- k3_node/layers/functional/test_functional.py +34 -0
- k3_node/layers/kge/__init__.py +17 -0
- k3_node/layers/kge/base.py +255 -0
- k3_node/layers/kge/complex.py +98 -0
- k3_node/layers/kge/distmult.py +79 -0
- k3_node/layers/kge/loader.py +50 -0
- k3_node/layers/kge/rotate.py +103 -0
- k3_node/layers/kge/test_kge.py +76 -0
- k3_node/layers/kge/transe.py +96 -0
- k3_node/layers/norm/__init__.py +23 -0
- k3_node/layers/norm/batch_norm.py +328 -0
- k3_node/layers/norm/diff_group_norm.py +141 -0
- k3_node/layers/norm/graph_norm.py +105 -0
- k3_node/layers/norm/graph_size_norm.py +57 -0
- k3_node/layers/norm/instance_norm.py +163 -0
- k3_node/layers/norm/layer_norm.py +245 -0
- k3_node/layers/norm/mean_subtraction_norm.py +57 -0
- k3_node/layers/norm/msg_norm.py +58 -0
- k3_node/layers/norm/pair_norm.py +94 -0
- k3_node/layers/norm/test_norm.py +275 -0
- k3_node/layers/pool/__init__.py +83 -0
- k3_node/layers/pool/approx_knn.py +101 -0
- k3_node/layers/pool/asap.py +173 -0
- k3_node/layers/pool/avg_pool.py +165 -0
- k3_node/layers/pool/cluster_pool.py +168 -0
- k3_node/layers/pool/connect/__init__.py +10 -0
- k3_node/layers/pool/connect/base.py +103 -0
- k3_node/layers/pool/connect/filter_edges.py +113 -0
- k3_node/layers/pool/consecutive.py +30 -0
- k3_node/layers/pool/decimation.py +48 -0
- k3_node/layers/pool/edge_pool.py +189 -0
- k3_node/layers/pool/glob.py +139 -0
- k3_node/layers/pool/graclus.py +66 -0
- k3_node/layers/pool/knn.py +253 -0
- k3_node/layers/pool/max_pool.py +159 -0
- k3_node/layers/pool/mem_pool.py +145 -0
- k3_node/layers/pool/pan_pool.py +144 -0
- k3_node/layers/pool/point_cloud.py +212 -0
- k3_node/layers/pool/pool.py +119 -0
- k3_node/layers/pool/sag_pool.py +174 -0
- k3_node/layers/pool/select/__init__.py +10 -0
- k3_node/layers/pool/select/base.py +112 -0
- k3_node/layers/pool/select/topk.py +206 -0
- k3_node/layers/pool/test_pool.py +456 -0
- k3_node/layers/pool/topk_pool.py +103 -0
- k3_node/layers/pool/voxel_grid.py +70 -0
- k3_node/layers/unpool/__init__.py +9 -0
- k3_node/layers/unpool/knn_interpolate.py +57 -0
- k3_node/layers/unpool/test_unpool.py +31 -0
- k3_node/loader/__init__.py +62 -0
- k3_node/loader/base.py +69 -0
- k3_node/loader/cache.py +68 -0
- k3_node/loader/cluster.py +127 -0
- k3_node/loader/data_list_loader.py +45 -0
- k3_node/loader/dataloader.py +117 -0
- k3_node/loader/dense_data_loader.py +62 -0
- k3_node/loader/dynamic_batch_sampler.py +93 -0
- k3_node/loader/graph_saint.py +188 -0
- k3_node/loader/hgt_loader.py +90 -0
- k3_node/loader/imbalanced_sampler.py +87 -0
- k3_node/loader/keras_dataset.py +334 -0
- k3_node/loader/link_loader.py +179 -0
- k3_node/loader/link_neighbor_loader.py +202 -0
- k3_node/loader/mixin.py +190 -0
- k3_node/loader/neighbor_loader.py +159 -0
- k3_node/loader/neighbor_sampler.py +167 -0
- k3_node/loader/node_loader.py +185 -0
- k3_node/loader/prefetch.py +115 -0
- k3_node/loader/random_node_loader.py +89 -0
- k3_node/loader/sampler_utils.py +499 -0
- k3_node/loader/shadow.py +115 -0
- k3_node/loader/temporal_dataloader.py +98 -0
- k3_node/loader/test_dataloader.py +113 -0
- k3_node/loader/test_keras_dataset.py +221 -0
- k3_node/loader/test_neighbor_loader.py +122 -0
- k3_node/loader/test_sampler_utils.py +82 -0
- k3_node/loader/test_samplers.py +96 -0
- k3_node/loader/test_subgraph_loaders.py +89 -0
- k3_node/loader/utils.py +232 -0
- k3_node/loader/zip_loader.py +88 -0
- k3_node/metrics.py +94 -0
- k3_node/models/__init__.py +424 -0
- k3_node/models/attentive_fp.py +232 -0
- k3_node/models/attract_repel.py +108 -0
- k3_node/models/autoencoder.py +318 -0
- k3_node/models/basic_gnn.py +443 -0
- k3_node/models/bio/__init__.py +4 -0
- k3_node/models/captum.py +52 -0
- k3_node/models/chemistry/__init__.py +4 -0
- k3_node/models/correct_and_smooth.py +146 -0
- k3_node/models/deep_graph_infomax.py +113 -0
- k3_node/models/deepgcn.py +121 -0
- k3_node/models/dimenet.py +737 -0
- k3_node/models/dimenet_utils.py +153 -0
- k3_node/models/gnnff.py +263 -0
- k3_node/models/gps_model.py +1122 -0
- k3_node/models/gpse.py +638 -0
- k3_node/models/graph_unet.py +199 -0
- k3_node/models/graphmae2.py +954 -0
- k3_node/models/graphormer.py +1258 -0
- k3_node/models/graphormer_3d.py +868 -0
- k3_node/models/grover.py +1066 -0
- k3_node/models/jumping_knowledge.py +200 -0
- k3_node/models/label_prop.py +110 -0
- k3_node/models/lightgcn.py +171 -0
- k3_node/models/linkx.py +181 -0
- k3_node/models/lpformer.py +404 -0
- k3_node/models/mask_label.py +114 -0
- k3_node/models/materials/__init__.py +33 -0
- k3_node/models/meta.py +133 -0
- k3_node/models/metapath2vec.py +234 -0
- k3_node/models/mlp.py +264 -0
- k3_node/models/mole_bert.py +379 -0
- k3_node/models/neural_fingerprint.py +95 -0
- k3_node/models/node2vec.py +213 -0
- k3_node/models/pmlp.py +157 -0
- k3_node/models/polynormer.py +229 -0
- k3_node/models/rect.py +93 -0
- k3_node/models/renet.py +221 -0
- k3_node/models/rev_gnn.py +128 -0
- k3_node/models/schnet.py +484 -0
- k3_node/models/sgformer.py +195 -0
- k3_node/models/signed_gcn.py +185 -0
- k3_node/models/test_attentive_fp.py +32 -0
- k3_node/models/test_attract_repel.py +33 -0
- k3_node/models/test_autoencoder.py +119 -0
- k3_node/models/test_basic_gnn.py +102 -0
- k3_node/models/test_correct_and_smooth.py +40 -0
- k3_node/models/test_deep_graph_infomax.py +68 -0
- k3_node/models/test_deepgcn.py +21 -0
- k3_node/models/test_dimenet.py +86 -0
- k3_node/models/test_domain_apis.py +138 -0
- k3_node/models/test_gnnff.py +24 -0
- k3_node/models/test_gps_model.py +271 -0
- k3_node/models/test_gpse.py +34 -0
- k3_node/models/test_graph_unet.py +26 -0
- k3_node/models/test_graphmae2.py +226 -0
- k3_node/models/test_graphormer.py +233 -0
- k3_node/models/test_graphormer3d.py +163 -0
- k3_node/models/test_grover.py +287 -0
- k3_node/models/test_jumping_knowledge.py +129 -0
- k3_node/models/test_label_prop.py +37 -0
- k3_node/models/test_lightgcn.py +38 -0
- k3_node/models/test_linkx.py +31 -0
- k3_node/models/test_lpformer.py +22 -0
- k3_node/models/test_mask_label.py +90 -0
- k3_node/models/test_meta.py +159 -0
- k3_node/models/test_metapath2vec.py +45 -0
- k3_node/models/test_mlp.py +62 -0
- k3_node/models/test_mole_bert.py +164 -0
- k3_node/models/test_neural_fingerprint.py +13 -0
- k3_node/models/test_node2vec.py +57 -0
- k3_node/models/test_pmlp.py +81 -0
- k3_node/models/test_polynormer.py +104 -0
- k3_node/models/test_rect.py +23 -0
- k3_node/models/test_renet.py +32 -0
- k3_node/models/test_rev_gnn.py +24 -0
- k3_node/models/test_schnet.py +43 -0
- k3_node/models/test_sgformer.py +48 -0
- k3_node/models/test_signed_gcn.py +28 -0
- k3_node/models/test_tgn.py +77 -0
- k3_node/models/test_unimol.py +179 -0
- k3_node/models/test_unimol2.py +114 -0
- k3_node/models/test_unimol_plus.py +131 -0
- k3_node/models/test_visnet.py +44 -0
- k3_node/models/tgn.py +382 -0
- k3_node/models/unimol.py +1156 -0
- k3_node/models/unimol2.py +616 -0
- k3_node/models/unimol_docking_v2.py +301 -0
- k3_node/models/unimol_plus.py +456 -0
- k3_node/models/utils.py +97 -0
- k3_node/models/visnet.py +759 -0
- k3_node/ops/__init__.py +4 -0
- k3_node/ops/conv.py +56 -0
- k3_node/ops/creation.py +43 -0
- k3_node/ops/graph.py +27 -0
- k3_node/ops/host.py +41 -0
- k3_node/ops/matmul.py +49 -0
- k3_node/ops/numpy.py +24 -0
- k3_node/ops/segment.py +54 -0
- k3_node/ops/sparse.py +51 -0
- k3_node/rag/__init__.py +49 -0
- k3_node/rag/encoders.py +312 -0
- k3_node/rag/pipeline.py +192 -0
- k3_node/rag/projector.py +184 -0
- k3_node/rag/subgraph.py +270 -0
- k3_node/rag/test_rag.py +347 -0
- k3_node/rag/verbalizer.py +162 -0
- k3_node/tasks/__init__.py +19 -0
- k3_node/tasks/backbone_resolver.py +125 -0
- k3_node/tasks/base.py +67 -0
- k3_node/tasks/graph_classification.py +270 -0
- k3_node/tasks/graph_regression.py +228 -0
- k3_node/tasks/link_prediction.py +306 -0
- k3_node/tasks/node_classification.py +194 -0
- k3_node/tasks/node_regression.py +138 -0
- k3_node/tasks/test_tasks.py +319 -0
- k3_node/test_docstring_examples.py +106 -0
- k3_node/test_training_forwarding.py +116 -0
- k3_node/training.py +115 -0
- k3_node/transforms/__init__.py +166 -0
- k3_node/transforms/base_transform.py +32 -0
- k3_node/transforms/compose.py +58 -0
- k3_node/transforms/general.py +676 -0
- k3_node/transforms/graph.py +1070 -0
- k3_node/transforms/spatial.py +797 -0
- k3_node/transforms/test_random_link_split.py +45 -0
- k3_node/transforms/test_spatial_transforms.py +65 -0
- k3_node/transforms/test_transforms.py +253 -0
- k3_node/transforms/utils.py +102 -0
- k3_node/utils/__init__.py +5 -0
- k3_node/utils/backend_import.py +12 -0
- k3_node/utils/graph.py +286 -0
- k3_node/utils/keras.py +94 -0
- k3_node/utils/random.py +103 -0
- k3_node/utils/smiles.py +235 -0
- k3_node-1.0.0.dist-info/METADATA +284 -0
- k3_node-1.0.0.dist-info/RECORD +459 -0
- k3_node-1.0.0.dist-info/WHEEL +5 -0
- k3_node-1.0.0.dist-info/licenses/LICENSE +21 -0
- k3_node-1.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import os.path as osp
|
|
2
|
+
from typing import Callable, List, Optional
|
|
3
|
+
import numpy as np
|
|
4
|
+
from keras import ops
|
|
5
|
+
|
|
6
|
+
from k3_node.data import Data, InMemoryDataset
|
|
7
|
+
from k3_node.io import fs
|
|
8
|
+
from k3_node.utils.graph import coalesce
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Actor(InMemoryDataset):
|
|
12
|
+
r"""The actor-only induced subgraph of the film-director-actor-writer network
|
|
13
|
+
used in the "Geom-GCN: Geometric Graph Convolutional Networks" paper.
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
root (str): Root directory where the dataset should be saved.
|
|
17
|
+
transform (callable, optional): Transform function.
|
|
18
|
+
pre_transform (callable, optional): Pre-transform function.
|
|
19
|
+
force_reload (bool, optional): Whether to re-process the dataset.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
url = "https://raw.githubusercontent.com/graphdml-uiuc-jlu/geom-gcn/master"
|
|
23
|
+
|
|
24
|
+
def __init__(
|
|
25
|
+
self,
|
|
26
|
+
root: str,
|
|
27
|
+
transform: Optional[Callable] = None,
|
|
28
|
+
pre_transform: Optional[Callable] = None,
|
|
29
|
+
force_reload: bool = False,
|
|
30
|
+
):
|
|
31
|
+
super().__init__(root, transform, pre_transform, force_reload=force_reload)
|
|
32
|
+
self.load(self.processed_paths[0])
|
|
33
|
+
|
|
34
|
+
@property
|
|
35
|
+
def raw_file_names(self) -> List[str]:
|
|
36
|
+
return [
|
|
37
|
+
"out1_node_feature_label.txt",
|
|
38
|
+
"out1_graph_edges.txt",
|
|
39
|
+
"film_split_0.6_0.2_0.npz",
|
|
40
|
+
"film_split_0.6_0.2_1.npz",
|
|
41
|
+
"film_split_0.6_0.2_2.npz",
|
|
42
|
+
"film_split_0.6_0.2_3.npz",
|
|
43
|
+
"film_split_0.6_0.2_4.npz",
|
|
44
|
+
"film_split_0.6_0.2_5.npz",
|
|
45
|
+
"film_split_0.6_0.2_6.npz",
|
|
46
|
+
"film_split_0.6_0.2_7.npz",
|
|
47
|
+
"film_split_0.6_0.2_8.npz",
|
|
48
|
+
"film_split_0.6_0.2_9.npz",
|
|
49
|
+
]
|
|
50
|
+
|
|
51
|
+
@property
|
|
52
|
+
def processed_file_names(self) -> str:
|
|
53
|
+
return "data.pt"
|
|
54
|
+
|
|
55
|
+
def download(self):
|
|
56
|
+
for f in self.raw_file_names[:2]:
|
|
57
|
+
fs.cp(f"{self.url}/new_data/film/{f}", self.raw_dir)
|
|
58
|
+
for f in self.raw_file_names[2:]:
|
|
59
|
+
fs.cp(f"{self.url}/splits/{f}", self.raw_dir)
|
|
60
|
+
|
|
61
|
+
def process(self):
|
|
62
|
+
with open(self.raw_paths[0], "r") as f:
|
|
63
|
+
lines = f.read().split("\n")[1:-1]
|
|
64
|
+
xs = [[float(v) for v in r.split("\t")[1].split(",")] for r in lines]
|
|
65
|
+
ys = [int(r.split("\t")[2]) for r in lines]
|
|
66
|
+
|
|
67
|
+
x = np.array(xs, dtype=np.float32)
|
|
68
|
+
y = np.array(ys, dtype=np.int64)
|
|
69
|
+
|
|
70
|
+
with open(self.raw_paths[1], "r") as f:
|
|
71
|
+
lines = f.read().split("\n")[1:-1]
|
|
72
|
+
edges = [[int(v) for v in r.split("\t")] for r in lines]
|
|
73
|
+
edge_index = np.array(edges, dtype=np.int64).T
|
|
74
|
+
edge_index_t, _ = coalesce(edge_index, num_nodes=x.shape[0])
|
|
75
|
+
edge_index = ops.convert_to_numpy(edge_index_t)
|
|
76
|
+
|
|
77
|
+
train_masks, val_masks, test_masks = [], [], []
|
|
78
|
+
for filepath in self.raw_paths[2:]:
|
|
79
|
+
masks = np.load(filepath)
|
|
80
|
+
train_masks.append(masks["train_mask"])
|
|
81
|
+
val_masks.append(masks["val_mask"])
|
|
82
|
+
test_masks.append(masks["test_mask"])
|
|
83
|
+
|
|
84
|
+
train_mask = np.stack(train_masks, axis=1)
|
|
85
|
+
val_mask = np.stack(val_masks, axis=1)
|
|
86
|
+
test_mask = np.stack(test_masks, axis=1)
|
|
87
|
+
|
|
88
|
+
data = Data(
|
|
89
|
+
x=ops.convert_to_tensor(x, dtype="float32"),
|
|
90
|
+
edge_index=ops.convert_to_tensor(edge_index, dtype="int64"),
|
|
91
|
+
y=ops.convert_to_tensor(y, dtype="int64"),
|
|
92
|
+
train_mask=ops.convert_to_tensor(train_mask, dtype="bool"),
|
|
93
|
+
val_mask=ops.convert_to_tensor(val_mask, dtype="bool"),
|
|
94
|
+
test_mask=ops.convert_to_tensor(test_mask, dtype="bool"),
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
if self.pre_transform is not None:
|
|
98
|
+
data = self.pre_transform(data)
|
|
99
|
+
|
|
100
|
+
self.save([data], self.processed_paths[0])
|
|
101
|
+
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import os.path as osp
|
|
2
|
+
from typing import Callable, List, Optional
|
|
3
|
+
import numpy as np
|
|
4
|
+
from keras import ops
|
|
5
|
+
|
|
6
|
+
from k3_node.data import Data, InMemoryDataset
|
|
7
|
+
from k3_node.io import fs
|
|
8
|
+
from k3_node.utils.graph import coalesce
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Airports(InMemoryDataset):
|
|
12
|
+
r"""The Airports dataset from the "struc2vec: Learning Node Representations from Structural Identity" paper."""
|
|
13
|
+
|
|
14
|
+
edge_url = "https://github.com/leoribeiro/struc2vec/raw/master/graph/{}-airports.edgelist"
|
|
15
|
+
label_url = "https://github.com/leoribeiro/struc2vec/raw/master/graph/labels-{}-airports.txt"
|
|
16
|
+
|
|
17
|
+
def __init__(
|
|
18
|
+
self,
|
|
19
|
+
root: str,
|
|
20
|
+
name: str,
|
|
21
|
+
transform: Optional[Callable] = None,
|
|
22
|
+
pre_transform: Optional[Callable] = None,
|
|
23
|
+
force_reload: bool = False,
|
|
24
|
+
):
|
|
25
|
+
self.name = name.lower()
|
|
26
|
+
assert self.name in ["usa", "brazil", "europe"]
|
|
27
|
+
super().__init__(root, transform, pre_transform, force_reload=force_reload)
|
|
28
|
+
self.load(self.processed_paths[0])
|
|
29
|
+
|
|
30
|
+
@property
|
|
31
|
+
def raw_dir(self) -> str:
|
|
32
|
+
return osp.join(self.root, self.name, "raw")
|
|
33
|
+
|
|
34
|
+
@property
|
|
35
|
+
def processed_dir(self) -> str:
|
|
36
|
+
return osp.join(self.root, self.name, "processed")
|
|
37
|
+
|
|
38
|
+
@property
|
|
39
|
+
def raw_file_names(self) -> List[str]:
|
|
40
|
+
return [f"{self.name}-airports.edgelist", f"labels-{self.name}-airports.txt"]
|
|
41
|
+
|
|
42
|
+
@property
|
|
43
|
+
def processed_file_names(self) -> str:
|
|
44
|
+
return "data.pt"
|
|
45
|
+
|
|
46
|
+
def download(self):
|
|
47
|
+
fs.cp(self.edge_url.format(self.name), self.raw_dir)
|
|
48
|
+
fs.cp(self.label_url.format(self.name), self.raw_dir)
|
|
49
|
+
|
|
50
|
+
def process(self):
|
|
51
|
+
index_map, ys = {}, []
|
|
52
|
+
with open(self.raw_paths[1]) as f:
|
|
53
|
+
rows = f.read().split("\n")[1:-1]
|
|
54
|
+
for i, row in enumerate(rows):
|
|
55
|
+
idx, label = row.split()
|
|
56
|
+
index_map[int(idx)] = i
|
|
57
|
+
ys.append(int(label))
|
|
58
|
+
y = np.array(ys, dtype=np.int64)
|
|
59
|
+
x = np.eye(len(ys), dtype=np.float32)
|
|
60
|
+
|
|
61
|
+
edge_indices = []
|
|
62
|
+
with open(self.raw_paths[0]) as f:
|
|
63
|
+
rows = f.read().split("\n")[:-1]
|
|
64
|
+
for row in rows:
|
|
65
|
+
src, dst = row.split()
|
|
66
|
+
edge_indices.append([index_map[int(src)], index_map[int(dst)]])
|
|
67
|
+
edge_index = np.array(edge_indices, dtype=np.int64).T
|
|
68
|
+
edge_index_t, _ = coalesce(edge_index, num_nodes=len(ys))
|
|
69
|
+
edge_index = ops.convert_to_numpy(edge_index_t)
|
|
70
|
+
|
|
71
|
+
data = Data(
|
|
72
|
+
x=ops.convert_to_tensor(x, dtype="float32"),
|
|
73
|
+
edge_index=ops.convert_to_tensor(edge_index, dtype="int64"),
|
|
74
|
+
y=ops.convert_to_tensor(y, dtype="int64"),
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
if self.pre_transform is not None:
|
|
78
|
+
data = self.pre_transform(data)
|
|
79
|
+
|
|
80
|
+
self.save([data], self.processed_paths[0])
|
|
81
|
+
|
|
82
|
+
def __repr__(self) -> str:
|
|
83
|
+
return f"{self.name.capitalize()}Airports()"
|
|
84
|
+
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import os.path as osp
|
|
2
|
+
from typing import Callable, Optional
|
|
3
|
+
|
|
4
|
+
from k3_node.data import InMemoryDataset
|
|
5
|
+
from k3_node.io import fs, read_npz
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Amazon(InMemoryDataset):
|
|
9
|
+
r"""The Amazon Computers and Amazon Photo networks from the
|
|
10
|
+
"Pitfalls of Graph Neural Network Evaluation" paper.
|
|
11
|
+
Nodes represent goods and edges represent that two goods are frequently
|
|
12
|
+
bought together.
|
|
13
|
+
Given product reviews as bag-of-words node features, the task is to
|
|
14
|
+
map goods to their respective product category.
|
|
15
|
+
|
|
16
|
+
Args:
|
|
17
|
+
root (str): Root directory where the dataset should be saved.
|
|
18
|
+
name (str): The name of the dataset ("Computers", "Photo").
|
|
19
|
+
transform (callable, optional): Transform function.
|
|
20
|
+
pre_transform (callable, optional): Pre-transform function.
|
|
21
|
+
force_reload (bool, optional): Whether to re-process the dataset.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
url = "https://github.com/shchur/gnn-benchmark/raw/master/data/npz/"
|
|
25
|
+
|
|
26
|
+
def __init__(
|
|
27
|
+
self,
|
|
28
|
+
root: str,
|
|
29
|
+
name: str,
|
|
30
|
+
transform: Optional[Callable] = None,
|
|
31
|
+
pre_transform: Optional[Callable] = None,
|
|
32
|
+
force_reload: bool = False,
|
|
33
|
+
):
|
|
34
|
+
self.name = name.lower()
|
|
35
|
+
assert self.name in ["computers", "photo"]
|
|
36
|
+
super().__init__(root, transform, pre_transform, force_reload=force_reload)
|
|
37
|
+
self.load(self.processed_paths[0])
|
|
38
|
+
|
|
39
|
+
@property
|
|
40
|
+
def raw_dir(self) -> str:
|
|
41
|
+
return osp.join(self.root, self.name.capitalize(), "raw")
|
|
42
|
+
|
|
43
|
+
@property
|
|
44
|
+
def processed_dir(self) -> str:
|
|
45
|
+
return osp.join(self.root, self.name.capitalize(), "processed")
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
def raw_file_names(self) -> str:
|
|
49
|
+
return f"amazon_electronics_{self.name.lower()}.npz"
|
|
50
|
+
|
|
51
|
+
@property
|
|
52
|
+
def processed_file_names(self) -> str:
|
|
53
|
+
return "data.pt"
|
|
54
|
+
|
|
55
|
+
def download(self):
|
|
56
|
+
fs.cp(f"{self.url}{self.raw_file_names}", self.raw_dir)
|
|
57
|
+
|
|
58
|
+
def process(self):
|
|
59
|
+
data = read_npz(self.raw_paths[0], to_undirected=True)
|
|
60
|
+
if self.pre_transform is not None:
|
|
61
|
+
data = self.pre_transform(data)
|
|
62
|
+
self.save([data], self.processed_paths[0])
|
|
63
|
+
|
|
64
|
+
def __repr__(self) -> str:
|
|
65
|
+
return f"{self.__class__.__name__}{self.name.capitalize()}()"
|
|
66
|
+
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import pickle
|
|
2
|
+
from typing import Callable, List, Optional
|
|
3
|
+
import numpy as np
|
|
4
|
+
from keras import ops
|
|
5
|
+
|
|
6
|
+
from k3_node.data import Data, InMemoryDataset
|
|
7
|
+
from k3_node.io import fs
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class BA2MotifDataset(InMemoryDataset):
|
|
11
|
+
r"""The synthetic BA-2motifs graph classification dataset for evaluating
|
|
12
|
+
explainability algorithms, containing 1000 random Barabasi-Albert graphs.
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
root (str): Root directory where the dataset should be saved.
|
|
16
|
+
transform (callable, optional): Transform function.
|
|
17
|
+
pre_transform (callable, optional): Pre-transform function.
|
|
18
|
+
force_reload (bool, optional): Whether to re-process the dataset.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
url = "https://github.com/flyingdoog/PGExplainer/raw/master/dataset"
|
|
22
|
+
filename = "BA-2motif.pkl"
|
|
23
|
+
|
|
24
|
+
def __init__(
|
|
25
|
+
self,
|
|
26
|
+
root: str,
|
|
27
|
+
transform: Optional[Callable] = None,
|
|
28
|
+
pre_transform: Optional[Callable] = None,
|
|
29
|
+
force_reload: bool = False,
|
|
30
|
+
):
|
|
31
|
+
super().__init__(root, transform, pre_transform, force_reload=force_reload)
|
|
32
|
+
self.load(self.processed_paths[0])
|
|
33
|
+
|
|
34
|
+
@property
|
|
35
|
+
def raw_file_names(self) -> str:
|
|
36
|
+
return self.filename
|
|
37
|
+
|
|
38
|
+
@property
|
|
39
|
+
def processed_file_names(self) -> str:
|
|
40
|
+
return "data.pt"
|
|
41
|
+
|
|
42
|
+
def download(self):
|
|
43
|
+
fs.cp(f"{self.url}/{self.filename}", self.raw_dir)
|
|
44
|
+
|
|
45
|
+
def process(self):
|
|
46
|
+
with open(self.raw_paths[0], "rb") as f:
|
|
47
|
+
adj, x, y = pickle.load(f)
|
|
48
|
+
|
|
49
|
+
adj_np = np.array(adj)
|
|
50
|
+
x_np = np.array(x, dtype=np.float32)
|
|
51
|
+
y_np = np.array(y)
|
|
52
|
+
|
|
53
|
+
data_list: List[Data] = []
|
|
54
|
+
for i in range(x_np.shape[0]):
|
|
55
|
+
nz = np.nonzero(adj_np[i])
|
|
56
|
+
edge_index = np.stack([nz[0], nz[1]], axis=0).astype(np.int64)
|
|
57
|
+
xi = x_np[i]
|
|
58
|
+
y_nz = np.nonzero(y_np[i])[0]
|
|
59
|
+
yi = int(y_nz[0]) if len(y_nz) > 0 else 0
|
|
60
|
+
|
|
61
|
+
data = Data(
|
|
62
|
+
x=ops.convert_to_tensor(xi, dtype="float32"),
|
|
63
|
+
edge_index=ops.convert_to_tensor(edge_index, dtype="int64"),
|
|
64
|
+
y=ops.convert_to_tensor(np.array([yi], dtype=np.int64), dtype="int64"),
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
if self.pre_transform is not None:
|
|
68
|
+
data = self.pre_transform(data)
|
|
69
|
+
|
|
70
|
+
data_list.append(data)
|
|
71
|
+
|
|
72
|
+
self.save(data_list, self.processed_paths[0])
|
|
73
|
+
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
from typing import Callable, Optional, Tuple
|
|
2
|
+
import numpy as np
|
|
3
|
+
from keras import ops
|
|
4
|
+
|
|
5
|
+
from k3_node.data import Data, InMemoryDataset
|
|
6
|
+
from k3_node.utils.random import barabasi_albert_graph
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def house() -> Tuple[np.ndarray, np.ndarray]:
|
|
10
|
+
edge_index = np.array(
|
|
11
|
+
[[0, 0, 0, 1, 1, 1, 2, 2, 3, 3, 4, 4], [1, 3, 4, 4, 2, 0, 1, 3, 2, 0, 0, 1]],
|
|
12
|
+
dtype=np.int64,
|
|
13
|
+
)
|
|
14
|
+
label = np.array([1, 1, 2, 2, 3], dtype=np.int64)
|
|
15
|
+
return edge_index, label
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class BAShapes(InMemoryDataset):
|
|
19
|
+
r"""The BA-Shapes dataset from the "GNNExplainer: Generating Explanations
|
|
20
|
+
for Graph Neural Networks" paper, containing a Barabasi-Albert (BA) graph
|
|
21
|
+
with 300 nodes and a set of 80 "house"-structured graphs connected to it.
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
connection_distribution (str, optional): Specifies how the houses and
|
|
25
|
+
the BA graph get connected ("random", "uniform"). (default: "random")
|
|
26
|
+
transform (callable, optional): Transform function.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
def __init__(
|
|
30
|
+
self,
|
|
31
|
+
connection_distribution: str = "random",
|
|
32
|
+
transform: Optional[Callable] = None,
|
|
33
|
+
):
|
|
34
|
+
super().__init__(None, transform)
|
|
35
|
+
assert connection_distribution in ["random", "uniform"]
|
|
36
|
+
|
|
37
|
+
num_nodes = 300
|
|
38
|
+
edge_index = ops.convert_to_numpy(barabasi_albert_graph(num_nodes, num_edges=5))
|
|
39
|
+
edge_label = np.zeros(edge_index.shape[1], dtype=np.int64)
|
|
40
|
+
node_label = np.zeros(num_nodes, dtype=np.int64)
|
|
41
|
+
|
|
42
|
+
num_houses = 80
|
|
43
|
+
if connection_distribution == "random":
|
|
44
|
+
connecting_nodes = np.random.permutation(num_nodes)[:num_houses]
|
|
45
|
+
else:
|
|
46
|
+
step = num_nodes // num_houses
|
|
47
|
+
connecting_nodes = np.arange(0, num_nodes, step)
|
|
48
|
+
|
|
49
|
+
edge_indices = [edge_index]
|
|
50
|
+
edge_labels = [edge_label]
|
|
51
|
+
node_labels = [node_label]
|
|
52
|
+
|
|
53
|
+
for i in range(num_houses):
|
|
54
|
+
house_edge_index, house_label = house()
|
|
55
|
+
edge_indices.append(house_edge_index + num_nodes)
|
|
56
|
+
edge_indices.append(
|
|
57
|
+
np.array([[int(connecting_nodes[i]), num_nodes], [num_nodes, int(connecting_nodes[i])]], dtype=np.int64)
|
|
58
|
+
)
|
|
59
|
+
edge_labels.append(np.ones(house_edge_index.shape[1], dtype=np.int64))
|
|
60
|
+
edge_labels.append(np.zeros(2, dtype=np.int64))
|
|
61
|
+
node_labels.append(house_label)
|
|
62
|
+
num_nodes += 5
|
|
63
|
+
|
|
64
|
+
edge_index = np.concatenate(edge_indices, axis=1)
|
|
65
|
+
edge_label = np.concatenate(edge_labels, axis=0)
|
|
66
|
+
node_label = np.concatenate(node_labels, axis=0)
|
|
67
|
+
|
|
68
|
+
x = np.ones((num_nodes, 10), dtype=np.float32)
|
|
69
|
+
expl_mask = np.zeros(num_nodes, dtype=bool)
|
|
70
|
+
expl_mask[np.arange(400, num_nodes, 5)] = True
|
|
71
|
+
|
|
72
|
+
data = Data(
|
|
73
|
+
x=ops.convert_to_tensor(x, dtype="float32"),
|
|
74
|
+
edge_index=ops.convert_to_tensor(edge_index, dtype="int64"),
|
|
75
|
+
y=ops.convert_to_tensor(node_label, dtype="int64"),
|
|
76
|
+
expl_mask=ops.convert_to_tensor(expl_mask, dtype="bool"),
|
|
77
|
+
edge_label=ops.convert_to_tensor(edge_label, dtype="int64"),
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
self.data, self.slices = self.collate([data])
|
|
81
|
+
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import datetime
|
|
2
|
+
import os
|
|
3
|
+
from typing import Callable, Optional
|
|
4
|
+
|
|
5
|
+
import numpy as np
|
|
6
|
+
|
|
7
|
+
from k3_node.data import Data, InMemoryDataset
|
|
8
|
+
from k3_node.data.download import download_url
|
|
9
|
+
from k3_node.data.extract import extract_gz
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class BitcoinOTC(InMemoryDataset):
|
|
13
|
+
r"""The Bitcoin-OTC dataset from the `"EvolveGCN: Evolving Graph Convolutional Networks for
|
|
14
|
+
Dynamic Graphs" <https://arxiv.org/abs/1902.10191>`_ paper: 138 who-trusts-whom networks of
|
|
15
|
+
consecutive time steps among 6,005 users. ``edge_attr`` holds the trust rating of every edge,
|
|
16
|
+
from -10 (total distrust) to +10 (total trust).
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
root (str): Root directory where the dataset should be saved.
|
|
20
|
+
edge_window_size (int, optional): The number of time steps an edge stays in the graph
|
|
21
|
+
sequence after it was created. (default: ``10``)
|
|
22
|
+
transform (callable, optional): A function applied to each graph when it is accessed.
|
|
23
|
+
pre_transform (callable, optional): A function applied to each graph before saving.
|
|
24
|
+
force_reload (bool, optional): Whether to re-process the dataset. (default: ``False``)
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
url = "https://snap.stanford.edu/data/soc-sign-bitcoinotc.csv.gz"
|
|
28
|
+
|
|
29
|
+
def __init__(self, root: str, edge_window_size: int = 10, transform: Optional[Callable] = None,
|
|
30
|
+
pre_transform: Optional[Callable] = None, force_reload: bool = False):
|
|
31
|
+
self.edge_window_size = edge_window_size
|
|
32
|
+
super().__init__(root, transform, pre_transform, force_reload=force_reload)
|
|
33
|
+
self.load(self.processed_paths[0])
|
|
34
|
+
|
|
35
|
+
@property
|
|
36
|
+
def raw_file_names(self) -> str:
|
|
37
|
+
return "soc-sign-bitcoinotc.csv"
|
|
38
|
+
|
|
39
|
+
@property
|
|
40
|
+
def processed_file_names(self) -> str:
|
|
41
|
+
return "data.pt"
|
|
42
|
+
|
|
43
|
+
@property
|
|
44
|
+
def num_nodes(self) -> int:
|
|
45
|
+
return int(np.max(np.asarray(self._data.edge_index))) + 1
|
|
46
|
+
|
|
47
|
+
def download(self):
|
|
48
|
+
path = download_url(self.url, self.raw_dir)
|
|
49
|
+
extract_gz(path, self.raw_dir)
|
|
50
|
+
os.unlink(path)
|
|
51
|
+
|
|
52
|
+
def process(self):
|
|
53
|
+
with open(self.raw_paths[0]) as f:
|
|
54
|
+
lines = [line.split(",") for line in f.read().split("\n")[:-1]]
|
|
55
|
+
edge_index = np.array([[int(line[0]), int(line[1])] for line in lines], dtype=np.int64)
|
|
56
|
+
edge_index = (edge_index - edge_index.min()).T
|
|
57
|
+
num_nodes = int(edge_index.max()) + 1
|
|
58
|
+
edge_attr = np.array([int(line[2]) for line in lines], dtype=np.int64)
|
|
59
|
+
stamps = [datetime.datetime.fromtimestamp(int(float(line[3]))) for line in lines]
|
|
60
|
+
|
|
61
|
+
offset = datetime.timedelta(days=13.8) # results in 138 time steps
|
|
62
|
+
graph_indices, factor = [], 1
|
|
63
|
+
for t in stamps:
|
|
64
|
+
factor = factor if t < stamps[0] + factor * offset else factor + 1
|
|
65
|
+
graph_indices.append(factor - 1)
|
|
66
|
+
graph_idx = np.array(graph_indices, dtype=np.int64)
|
|
67
|
+
|
|
68
|
+
data_list = []
|
|
69
|
+
for i in range(int(graph_idx.max()) + 1):
|
|
70
|
+
mask = (graph_idx > (i - self.edge_window_size)) & (graph_idx <= i)
|
|
71
|
+
data_list.append(Data(edge_index=edge_index[:, mask], edge_attr=edge_attr[mask], num_nodes=num_nodes))
|
|
72
|
+
|
|
73
|
+
if self.pre_filter is not None:
|
|
74
|
+
data_list = [d for d in data_list if self.pre_filter(d)]
|
|
75
|
+
if self.pre_transform is not None:
|
|
76
|
+
data_list = [self.pre_transform(d) for d in data_list]
|
|
77
|
+
self.save(data_list, self.processed_paths[0])
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import os.path as osp
|
|
2
|
+
from typing import Callable, Optional
|
|
3
|
+
|
|
4
|
+
from k3_node.data import InMemoryDataset
|
|
5
|
+
from k3_node.io import fs, read_npz
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class CitationFull(InMemoryDataset):
|
|
9
|
+
r"""The full citation network datasets from the
|
|
10
|
+
"Deep Gaussian Embedding of Graphs: Unsupervised Inductive Learning via
|
|
11
|
+
Ranking" paper.
|
|
12
|
+
Nodes represent documents and edges represent citation links.
|
|
13
|
+
Datasets include "Cora", "Cora_ML", "CiteSeer", "DBLP", "PubMed".
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
root (str): Root directory where the dataset should be saved.
|
|
17
|
+
name (str): The name of the dataset ("Cora", "Cora_ML", "CiteSeer", "DBLP", "PubMed").
|
|
18
|
+
transform (callable, optional): Transform function.
|
|
19
|
+
pre_transform (callable, optional): Pre-transform function.
|
|
20
|
+
to_undirected (bool, optional): Whether the original graph is converted to undirected.
|
|
21
|
+
force_reload (bool, optional): Whether to re-process the dataset.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
url = "https://github.com/abojchevski/graph2gauss/raw/master/data/{}.npz"
|
|
25
|
+
|
|
26
|
+
def __init__(
|
|
27
|
+
self,
|
|
28
|
+
root: str,
|
|
29
|
+
name: str,
|
|
30
|
+
transform: Optional[Callable] = None,
|
|
31
|
+
pre_transform: Optional[Callable] = None,
|
|
32
|
+
to_undirected: bool = True,
|
|
33
|
+
force_reload: bool = False,
|
|
34
|
+
):
|
|
35
|
+
self.name = name.lower()
|
|
36
|
+
self.to_undirected = to_undirected
|
|
37
|
+
assert self.name in ["cora", "cora_ml", "citeseer", "dblp", "pubmed"]
|
|
38
|
+
super().__init__(root, transform, pre_transform, force_reload=force_reload)
|
|
39
|
+
self.load(self.processed_paths[0])
|
|
40
|
+
|
|
41
|
+
@property
|
|
42
|
+
def raw_dir(self) -> str:
|
|
43
|
+
return osp.join(self.root, self.name, "raw")
|
|
44
|
+
|
|
45
|
+
@property
|
|
46
|
+
def processed_dir(self) -> str:
|
|
47
|
+
return osp.join(self.root, self.name, "processed")
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def raw_file_names(self) -> str:
|
|
51
|
+
return f"{self.name}.npz"
|
|
52
|
+
|
|
53
|
+
@property
|
|
54
|
+
def processed_file_names(self) -> str:
|
|
55
|
+
suffix = "undirected" if self.to_undirected else "directed"
|
|
56
|
+
return f"data_{suffix}.pt"
|
|
57
|
+
|
|
58
|
+
def download(self):
|
|
59
|
+
fs.cp(self.url.format(self.name), self.raw_dir)
|
|
60
|
+
|
|
61
|
+
def process(self):
|
|
62
|
+
data = read_npz(self.raw_paths[0], to_undirected=self.to_undirected)
|
|
63
|
+
if self.pre_transform is not None:
|
|
64
|
+
data = self.pre_transform(data)
|
|
65
|
+
self.save([data], self.processed_paths[0])
|
|
66
|
+
|
|
67
|
+
def __repr__(self) -> str:
|
|
68
|
+
return f"{self.name.capitalize()}Full()"
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class CoraFull(CitationFull):
|
|
72
|
+
r"""Alias for CitationFull with name="Cora"."""
|
|
73
|
+
|
|
74
|
+
def __init__(
|
|
75
|
+
self,
|
|
76
|
+
root: str,
|
|
77
|
+
transform: Optional[Callable] = None,
|
|
78
|
+
pre_transform: Optional[Callable] = None,
|
|
79
|
+
):
|
|
80
|
+
super().__init__(root, "cora", transform, pre_transform)
|
|
81
|
+
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import os.path as osp
|
|
2
|
+
from typing import Callable, Optional
|
|
3
|
+
|
|
4
|
+
from k3_node.data import InMemoryDataset
|
|
5
|
+
from k3_node.io import fs, read_npz
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Coauthor(InMemoryDataset):
|
|
9
|
+
r"""The Coauthor CS and Coauthor Physics networks from the
|
|
10
|
+
"Pitfalls of Graph Neural Network Evaluation" paper.
|
|
11
|
+
Nodes represent authors that are connected by an edge if they co-authored a
|
|
12
|
+
paper.
|
|
13
|
+
Given paper keywords for each author's papers, the task is to map authors
|
|
14
|
+
to their respective field of study.
|
|
15
|
+
|
|
16
|
+
Args:
|
|
17
|
+
root (str): Root directory where the dataset should be saved.
|
|
18
|
+
name (str): The name of the dataset ("CS", "Physics").
|
|
19
|
+
transform (callable, optional): Transform function.
|
|
20
|
+
pre_transform (callable, optional): Pre-transform function.
|
|
21
|
+
force_reload (bool, optional): Whether to re-process the dataset.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
url = "https://github.com/shchur/gnn-benchmark/raw/master/data/npz/"
|
|
25
|
+
|
|
26
|
+
def __init__(
|
|
27
|
+
self,
|
|
28
|
+
root: str,
|
|
29
|
+
name: str,
|
|
30
|
+
transform: Optional[Callable] = None,
|
|
31
|
+
pre_transform: Optional[Callable] = None,
|
|
32
|
+
force_reload: bool = False,
|
|
33
|
+
):
|
|
34
|
+
assert name.lower() in ["cs", "physics"]
|
|
35
|
+
self.name = "CS" if name.lower() == "cs" else "Physics"
|
|
36
|
+
super().__init__(root, transform, pre_transform, force_reload=force_reload)
|
|
37
|
+
self.load(self.processed_paths[0])
|
|
38
|
+
|
|
39
|
+
@property
|
|
40
|
+
def raw_dir(self) -> str:
|
|
41
|
+
return osp.join(self.root, self.name, "raw")
|
|
42
|
+
|
|
43
|
+
@property
|
|
44
|
+
def processed_dir(self) -> str:
|
|
45
|
+
return osp.join(self.root, self.name, "processed")
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
def raw_file_names(self) -> str:
|
|
49
|
+
return f"ms_academic_{self.name[:3].lower()}.npz"
|
|
50
|
+
|
|
51
|
+
@property
|
|
52
|
+
def processed_file_names(self) -> str:
|
|
53
|
+
return "data.pt"
|
|
54
|
+
|
|
55
|
+
def download(self):
|
|
56
|
+
fs.cp(f"{self.url}{self.raw_file_names}", self.raw_dir)
|
|
57
|
+
|
|
58
|
+
def process(self):
|
|
59
|
+
data = read_npz(self.raw_paths[0], to_undirected=True)
|
|
60
|
+
if self.pre_transform is not None:
|
|
61
|
+
data = self.pre_transform(data)
|
|
62
|
+
self.save([data], self.processed_paths[0])
|
|
63
|
+
|
|
64
|
+
def __repr__(self) -> str:
|
|
65
|
+
return f"{self.__class__.__name__}{self.name}()"
|
|
66
|
+
|