k3-node 1.0.0__tar.gz
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-1.0.0/LICENSE +21 -0
- k3_node-1.0.0/PKG-INFO +284 -0
- k3_node-1.0.0/README.md +237 -0
- k3_node-1.0.0/k3_node/__init__.py +122 -0
- k3_node-1.0.0/k3_node/applications/__init__.py +17 -0
- k3_node-1.0.0/k3_node/applications/bio/__init__.py +21 -0
- k3_node-1.0.0/k3_node/applications/chemistry/__init__.py +155 -0
- k3_node-1.0.0/k3_node/applications/materials/__init__.py +127 -0
- k3_node-1.0.0/k3_node/applications/materials/basis.py +449 -0
- k3_node-1.0.0/k3_node/applications/materials/chgnet.py +360 -0
- k3_node-1.0.0/k3_node/applications/materials/core.py +351 -0
- k3_node-1.0.0/k3_node/applications/materials/grace.py +246 -0
- k3_node-1.0.0/k3_node/applications/materials/io.py +230 -0
- k3_node-1.0.0/k3_node/applications/materials/m3gnet.py +462 -0
- k3_node-1.0.0/k3_node/applications/materials/megnet.py +395 -0
- k3_node-1.0.0/k3_node/applications/materials/qet.py +220 -0
- k3_node-1.0.0/k3_node/applications/materials/readout.py +235 -0
- k3_node-1.0.0/k3_node/applications/materials/so3net.py +234 -0
- k3_node-1.0.0/k3_node/applications/materials/tensornet.py +381 -0
- k3_node-1.0.0/k3_node/applications/materials/test_materials.py +167 -0
- k3_node-1.0.0/k3_node/applications/materials/wrappers.py +95 -0
- k3_node-1.0.0/k3_node/data/__init__.py +47 -0
- k3_node-1.0.0/k3_node/data/batch.py +102 -0
- k3_node-1.0.0/k3_node/data/collate.py +282 -0
- k3_node-1.0.0/k3_node/data/data.py +532 -0
- k3_node-1.0.0/k3_node/data/database.py +154 -0
- k3_node-1.0.0/k3_node/data/dataset.py +182 -0
- k3_node-1.0.0/k3_node/data/download.py +49 -0
- k3_node-1.0.0/k3_node/data/extract.py +45 -0
- k3_node-1.0.0/k3_node/data/feature_store.py +70 -0
- k3_node-1.0.0/k3_node/data/graph_store.py +92 -0
- k3_node-1.0.0/k3_node/data/hetero_data.py +374 -0
- k3_node-1.0.0/k3_node/data/hypergraph_data.py +59 -0
- k3_node-1.0.0/k3_node/data/in_memory_dataset.py +177 -0
- k3_node-1.0.0/k3_node/data/makedirs.py +7 -0
- k3_node-1.0.0/k3_node/data/on_disk_dataset.py +77 -0
- k3_node-1.0.0/k3_node/data/separate.py +115 -0
- k3_node-1.0.0/k3_node/data/storage.py +593 -0
- k3_node-1.0.0/k3_node/data/temporal.py +154 -0
- k3_node-1.0.0/k3_node/data/test_batch.py +67 -0
- k3_node-1.0.0/k3_node/data/test_data.py +68 -0
- k3_node-1.0.0/k3_node/data/test_dataset_and_stores.py +111 -0
- k3_node-1.0.0/k3_node/data/test_hetero_data.py +33 -0
- k3_node-1.0.0/k3_node/data/test_temporal_and_hyper.py +32 -0
- k3_node-1.0.0/k3_node/data/view.py +43 -0
- k3_node-1.0.0/k3_node/datasets/__init__.py +88 -0
- k3_node-1.0.0/k3_node/datasets/actor.py +101 -0
- k3_node-1.0.0/k3_node/datasets/airports.py +84 -0
- k3_node-1.0.0/k3_node/datasets/amazon.py +66 -0
- k3_node-1.0.0/k3_node/datasets/ba2motif_dataset.py +73 -0
- k3_node-1.0.0/k3_node/datasets/ba_shapes.py +81 -0
- k3_node-1.0.0/k3_node/datasets/bitcoin_otc.py +77 -0
- k3_node-1.0.0/k3_node/datasets/citation_full.py +81 -0
- k3_node-1.0.0/k3_node/datasets/coauthor.py +66 -0
- k3_node-1.0.0/k3_node/datasets/dblp.py +106 -0
- k3_node-1.0.0/k3_node/datasets/digits.py +63 -0
- k3_node-1.0.0/k3_node/datasets/email_eu_core.py +60 -0
- k3_node-1.0.0/k3_node/datasets/entities.py +158 -0
- k3_node-1.0.0/k3_node/datasets/explainer_dataset.py +101 -0
- k3_node-1.0.0/k3_node/datasets/facebook.py +51 -0
- k3_node-1.0.0/k3_node/datasets/fake.py +256 -0
- k3_node-1.0.0/k3_node/datasets/freebase.py +90 -0
- k3_node-1.0.0/k3_node/datasets/geometric_shapes.py +69 -0
- k3_node-1.0.0/k3_node/datasets/github.py +51 -0
- k3_node-1.0.0/k3_node/datasets/graph_generator/__init__.py +6 -0
- k3_node-1.0.0/k3_node/datasets/graph_generator/ba_graph.py +20 -0
- k3_node-1.0.0/k3_node/datasets/graph_generator/base.py +29 -0
- k3_node-1.0.0/k3_node/datasets/graph_generator/er_graph.py +21 -0
- k3_node-1.0.0/k3_node/datasets/icews.py +58 -0
- k3_node-1.0.0/k3_node/datasets/imdb.py +96 -0
- k3_node-1.0.0/k3_node/datasets/jodie.py +56 -0
- k3_node-1.0.0/k3_node/datasets/karate.py +56 -0
- k3_node-1.0.0/k3_node/datasets/lastfm_asia.py +51 -0
- k3_node-1.0.0/k3_node/datasets/mesh_correspondence.py +50 -0
- k3_node-1.0.0/k3_node/datasets/molecule_net.py +148 -0
- k3_node-1.0.0/k3_node/datasets/motif_generator/__init__.py +7 -0
- k3_node-1.0.0/k3_node/datasets/motif_generator/base.py +29 -0
- k3_node-1.0.0/k3_node/datasets/motif_generator/custom.py +17 -0
- k3_node-1.0.0/k3_node/datasets/motif_generator/cycle.py +25 -0
- k3_node-1.0.0/k3_node/datasets/motif_generator/house.py +27 -0
- k3_node-1.0.0/k3_node/datasets/movielens.py +55 -0
- k3_node-1.0.0/k3_node/datasets/planetoid.py +137 -0
- k3_node-1.0.0/k3_node/datasets/polblogs.py +63 -0
- k3_node-1.0.0/k3_node/datasets/ppi.py +189 -0
- k3_node-1.0.0/k3_node/datasets/qm7.py +65 -0
- k3_node-1.0.0/k3_node/datasets/qm9.py +132 -0
- k3_node-1.0.0/k3_node/datasets/reddit.py +121 -0
- k3_node-1.0.0/k3_node/datasets/sbm_dataset.py +165 -0
- k3_node-1.0.0/k3_node/datasets/seal.py +74 -0
- k3_node-1.0.0/k3_node/datasets/shape_scenes.py +92 -0
- k3_node-1.0.0/k3_node/datasets/test_datasets.py +322 -0
- k3_node-1.0.0/k3_node/datasets/tu_dataset.py +131 -0
- k3_node-1.0.0/k3_node/datasets/twitch.py +66 -0
- k3_node-1.0.0/k3_node/datasets/webkb.py +102 -0
- k3_node-1.0.0/k3_node/datasets/wikics.py +85 -0
- k3_node-1.0.0/k3_node/datasets/word_net.py +184 -0
- k3_node-1.0.0/k3_node/etl/__init__.py +37 -0
- k3_node-1.0.0/k3_node/etl/encoders.py +248 -0
- k3_node-1.0.0/k3_node/etl/graph_builders.py +270 -0
- k3_node-1.0.0/k3_node/etl/relational_to_graph.py +201 -0
- k3_node-1.0.0/k3_node/etl/table_to_graph.py +244 -0
- k3_node-1.0.0/k3_node/etl/test_etl.py +318 -0
- k3_node-1.0.0/k3_node/export/__init__.py +15 -0
- k3_node-1.0.0/k3_node/export/cross_backend.py +172 -0
- k3_node-1.0.0/k3_node/export/onnx_exporter.py +190 -0
- k3_node-1.0.0/k3_node/export/runtime.py +254 -0
- k3_node-1.0.0/k3_node/export/tensorrt_exporter.py +201 -0
- k3_node-1.0.0/k3_node/export/test_export.py +337 -0
- k3_node-1.0.0/k3_node/export/tflite_exporter.py +112 -0
- k3_node-1.0.0/k3_node/hub/__init__.py +29 -0
- k3_node-1.0.0/k3_node/hub/dataset_hub.py +242 -0
- k3_node-1.0.0/k3_node/hub/hub_mixin.py +599 -0
- k3_node-1.0.0/k3_node/hub/model_card.py +133 -0
- k3_node-1.0.0/k3_node/hub/test_hub.py +419 -0
- k3_node-1.0.0/k3_node/io/__init__.py +22 -0
- k3_node-1.0.0/k3_node/io/fs.py +117 -0
- k3_node-1.0.0/k3_node/io/npz.py +45 -0
- k3_node-1.0.0/k3_node/io/off.py +29 -0
- k3_node-1.0.0/k3_node/io/planetoid.py +98 -0
- k3_node-1.0.0/k3_node/io/tu.py +137 -0
- k3_node-1.0.0/k3_node/io/txt_array.py +58 -0
- k3_node-1.0.0/k3_node/layers/__init__.py +14 -0
- k3_node-1.0.0/k3_node/layers/aggr/__init__.py +70 -0
- k3_node-1.0.0/k3_node/layers/aggr/attention.py +77 -0
- k3_node-1.0.0/k3_node/layers/aggr/base.py +403 -0
- k3_node-1.0.0/k3_node/layers/aggr/basic.py +412 -0
- k3_node-1.0.0/k3_node/layers/aggr/deep_sets.py +65 -0
- k3_node-1.0.0/k3_node/layers/aggr/deepsets.py +29 -0
- k3_node-1.0.0/k3_node/layers/aggr/equilibrium.py +107 -0
- k3_node-1.0.0/k3_node/layers/aggr/fused.py +43 -0
- k3_node-1.0.0/k3_node/layers/aggr/gmt.py +89 -0
- k3_node-1.0.0/k3_node/layers/aggr/gru.py +58 -0
- k3_node-1.0.0/k3_node/layers/aggr/lcm.py +143 -0
- k3_node-1.0.0/k3_node/layers/aggr/lstm.py +58 -0
- k3_node-1.0.0/k3_node/layers/aggr/mlp.py +75 -0
- k3_node-1.0.0/k3_node/layers/aggr/multi.py +154 -0
- k3_node-1.0.0/k3_node/layers/aggr/patch_transformer.py +137 -0
- k3_node-1.0.0/k3_node/layers/aggr/quantile.py +125 -0
- k3_node-1.0.0/k3_node/layers/aggr/resolver.py +68 -0
- k3_node-1.0.0/k3_node/layers/aggr/scaler.py +133 -0
- k3_node-1.0.0/k3_node/layers/aggr/set2set.py +87 -0
- k3_node-1.0.0/k3_node/layers/aggr/set_transformer.py +107 -0
- k3_node-1.0.0/k3_node/layers/aggr/sort.py +68 -0
- k3_node-1.0.0/k3_node/layers/aggr/test_aggr.py +337 -0
- k3_node-1.0.0/k3_node/layers/aggr/utils.py +210 -0
- k3_node-1.0.0/k3_node/layers/aggr/variance_preserving.py +54 -0
- k3_node-1.0.0/k3_node/layers/attention/__init__.py +5 -0
- k3_node-1.0.0/k3_node/layers/attention/pair_attention.py +448 -0
- k3_node-1.0.0/k3_node/layers/attention/performer.py +187 -0
- k3_node-1.0.0/k3_node/layers/attention/polynormer.py +160 -0
- k3_node-1.0.0/k3_node/layers/attention/qformer.py +143 -0
- k3_node-1.0.0/k3_node/layers/attention/sgformer.py +106 -0
- k3_node-1.0.0/k3_node/layers/attention/test_attention.py +68 -0
- k3_node-1.0.0/k3_node/layers/attention/test_pair_attention.py +91 -0
- k3_node-1.0.0/k3_node/layers/conv/__init__.py +149 -0
- k3_node-1.0.0/k3_node/layers/conv/agnn_conv.py +120 -0
- k3_node-1.0.0/k3_node/layers/conv/antisymmetric_conv.py +94 -0
- k3_node-1.0.0/k3_node/layers/conv/appnp.py +105 -0
- k3_node-1.0.0/k3_node/layers/conv/appnp_conv.py +157 -0
- k3_node-1.0.0/k3_node/layers/conv/arma_conv.py +231 -0
- k3_node-1.0.0/k3_node/layers/conv/cg_conv.py +92 -0
- k3_node-1.0.0/k3_node/layers/conv/cheb_conv.py +137 -0
- k3_node-1.0.0/k3_node/layers/conv/cluster_gcn_conv.py +102 -0
- k3_node-1.0.0/k3_node/layers/conv/conv.py +100 -0
- k3_node-1.0.0/k3_node/layers/conv/crystal_conv.py +140 -0
- k3_node-1.0.0/k3_node/layers/conv/cugraph.py +84 -0
- k3_node-1.0.0/k3_node/layers/conv/diffusion_conv.py +144 -0
- k3_node-1.0.0/k3_node/layers/conv/dir_gnn_conv.py +93 -0
- k3_node-1.0.0/k3_node/layers/conv/dna_conv.py +192 -0
- k3_node-1.0.0/k3_node/layers/conv/edge_conv.py +107 -0
- k3_node-1.0.0/k3_node/layers/conv/eg_conv.py +155 -0
- k3_node-1.0.0/k3_node/layers/conv/fa_conv.py +107 -0
- k3_node-1.0.0/k3_node/layers/conv/feast_conv.py +126 -0
- k3_node-1.0.0/k3_node/layers/conv/film_conv.py +143 -0
- k3_node-1.0.0/k3_node/layers/conv/gat_conv.py +244 -0
- k3_node-1.0.0/k3_node/layers/conv/gated_graph_conv.py +136 -0
- k3_node-1.0.0/k3_node/layers/conv/gatv2_conv.py +205 -0
- k3_node-1.0.0/k3_node/layers/conv/gcn.py +144 -0
- k3_node-1.0.0/k3_node/layers/conv/gcn2_conv.py +126 -0
- k3_node-1.0.0/k3_node/layers/conv/gcn_conv.py +135 -0
- k3_node-1.0.0/k3_node/layers/conv/gen_conv.py +163 -0
- k3_node-1.0.0/k3_node/layers/conv/general_conv.py +218 -0
- k3_node-1.0.0/k3_node/layers/conv/gin_conv.py +218 -0
- k3_node-1.0.0/k3_node/layers/conv/gmm_conv.py +172 -0
- k3_node-1.0.0/k3_node/layers/conv/gps_conv.py +153 -0
- k3_node-1.0.0/k3_node/layers/conv/graph_attention.py +262 -0
- k3_node-1.0.0/k3_node/layers/conv/graph_conv.py +84 -0
- k3_node-1.0.0/k3_node/layers/conv/gravnet_conv.py +93 -0
- k3_node-1.0.0/k3_node/layers/conv/han_conv.py +175 -0
- k3_node-1.0.0/k3_node/layers/conv/heat_conv.py +131 -0
- k3_node-1.0.0/k3_node/layers/conv/hetero_conv.py +128 -0
- k3_node-1.0.0/k3_node/layers/conv/hgt_conv.py +218 -0
- k3_node-1.0.0/k3_node/layers/conv/hypergraph_conv.py +182 -0
- k3_node-1.0.0/k3_node/layers/conv/le_conv.py +81 -0
- k3_node-1.0.0/k3_node/layers/conv/lg_conv.py +58 -0
- k3_node-1.0.0/k3_node/layers/conv/meshcnn_conv.py +84 -0
- k3_node-1.0.0/k3_node/layers/conv/message_passing.py +451 -0
- k3_node-1.0.0/k3_node/layers/conv/mf_conv.py +95 -0
- k3_node-1.0.0/k3_node/layers/conv/mixhop_conv.py +108 -0
- k3_node-1.0.0/k3_node/layers/conv/nn_conv.py +110 -0
- k3_node-1.0.0/k3_node/layers/conv/pan_conv.py +100 -0
- k3_node-1.0.0/k3_node/layers/conv/pdn_conv.py +109 -0
- k3_node-1.0.0/k3_node/layers/conv/pna_conv.py +177 -0
- k3_node-1.0.0/k3_node/layers/conv/point_conv.py +101 -0
- k3_node-1.0.0/k3_node/layers/conv/point_gnn_conv.py +90 -0
- k3_node-1.0.0/k3_node/layers/conv/point_transformer_conv.py +132 -0
- k3_node-1.0.0/k3_node/layers/conv/ppf_conv.py +135 -0
- k3_node-1.0.0/k3_node/layers/conv/ppnp.py +89 -0
- k3_node-1.0.0/k3_node/layers/conv/res_gated_graph_conv.py +126 -0
- k3_node-1.0.0/k3_node/layers/conv/rgat_conv.py +251 -0
- k3_node-1.0.0/k3_node/layers/conv/rgcn_conv.py +321 -0
- k3_node-1.0.0/k3_node/layers/conv/sage_conv.py +154 -0
- k3_node-1.0.0/k3_node/layers/conv/sg_conv.py +96 -0
- k3_node-1.0.0/k3_node/layers/conv/signed_conv.py +100 -0
- k3_node-1.0.0/k3_node/layers/conv/simple_conv.py +75 -0
- k3_node-1.0.0/k3_node/layers/conv/spline_conv.py +182 -0
- k3_node-1.0.0/k3_node/layers/conv/ssg_conv.py +101 -0
- k3_node-1.0.0/k3_node/layers/conv/supergat_conv.py +195 -0
- k3_node-1.0.0/k3_node/layers/conv/tag_conv.py +98 -0
- k3_node-1.0.0/k3_node/layers/conv/test_backend_consistency.py +164 -0
- k3_node-1.0.0/k3_node/layers/conv/test_conv.py +176 -0
- k3_node-1.0.0/k3_node/layers/conv/test_conv_pyg.py +566 -0
- k3_node-1.0.0/k3_node/layers/conv/transformer_conv.py +168 -0
- k3_node-1.0.0/k3_node/layers/conv/utils.py +403 -0
- k3_node-1.0.0/k3_node/layers/conv/wl_conv.py +151 -0
- k3_node-1.0.0/k3_node/layers/conv/x_conv.py +187 -0
- k3_node-1.0.0/k3_node/layers/dense/__init__.py +40 -0
- k3_node-1.0.0/k3_node/layers/dense/dense_gat_conv.py +149 -0
- k3_node-1.0.0/k3_node/layers/dense/dense_gcn_conv.py +117 -0
- k3_node-1.0.0/k3_node/layers/dense/dense_gin_conv.py +88 -0
- k3_node-1.0.0/k3_node/layers/dense/dense_graph_conv.py +95 -0
- k3_node-1.0.0/k3_node/layers/dense/dense_sage_conv.py +85 -0
- k3_node-1.0.0/k3_node/layers/dense/diff_pool.py +76 -0
- k3_node-1.0.0/k3_node/layers/dense/dmon_pool.py +223 -0
- k3_node-1.0.0/k3_node/layers/dense/linear.py +327 -0
- k3_node-1.0.0/k3_node/layers/dense/mincut_pool.py +92 -0
- k3_node-1.0.0/k3_node/layers/dense/test_dense.py +377 -0
- k3_node-1.0.0/k3_node/layers/functional/__init__.py +13 -0
- k3_node-1.0.0/k3_node/layers/functional/bro.py +49 -0
- k3_node-1.0.0/k3_node/layers/functional/edge_dropout.py +55 -0
- k3_node-1.0.0/k3_node/layers/functional/gini.py +44 -0
- k3_node-1.0.0/k3_node/layers/functional/test_functional.py +34 -0
- k3_node-1.0.0/k3_node/layers/kge/__init__.py +17 -0
- k3_node-1.0.0/k3_node/layers/kge/base.py +255 -0
- k3_node-1.0.0/k3_node/layers/kge/complex.py +98 -0
- k3_node-1.0.0/k3_node/layers/kge/distmult.py +79 -0
- k3_node-1.0.0/k3_node/layers/kge/loader.py +50 -0
- k3_node-1.0.0/k3_node/layers/kge/rotate.py +103 -0
- k3_node-1.0.0/k3_node/layers/kge/test_kge.py +76 -0
- k3_node-1.0.0/k3_node/layers/kge/transe.py +96 -0
- k3_node-1.0.0/k3_node/layers/norm/__init__.py +23 -0
- k3_node-1.0.0/k3_node/layers/norm/batch_norm.py +328 -0
- k3_node-1.0.0/k3_node/layers/norm/diff_group_norm.py +141 -0
- k3_node-1.0.0/k3_node/layers/norm/graph_norm.py +105 -0
- k3_node-1.0.0/k3_node/layers/norm/graph_size_norm.py +57 -0
- k3_node-1.0.0/k3_node/layers/norm/instance_norm.py +163 -0
- k3_node-1.0.0/k3_node/layers/norm/layer_norm.py +245 -0
- k3_node-1.0.0/k3_node/layers/norm/mean_subtraction_norm.py +57 -0
- k3_node-1.0.0/k3_node/layers/norm/msg_norm.py +58 -0
- k3_node-1.0.0/k3_node/layers/norm/pair_norm.py +94 -0
- k3_node-1.0.0/k3_node/layers/norm/test_norm.py +275 -0
- k3_node-1.0.0/k3_node/layers/pool/__init__.py +83 -0
- k3_node-1.0.0/k3_node/layers/pool/approx_knn.py +101 -0
- k3_node-1.0.0/k3_node/layers/pool/asap.py +173 -0
- k3_node-1.0.0/k3_node/layers/pool/avg_pool.py +165 -0
- k3_node-1.0.0/k3_node/layers/pool/cluster_pool.py +168 -0
- k3_node-1.0.0/k3_node/layers/pool/connect/__init__.py +10 -0
- k3_node-1.0.0/k3_node/layers/pool/connect/base.py +103 -0
- k3_node-1.0.0/k3_node/layers/pool/connect/filter_edges.py +113 -0
- k3_node-1.0.0/k3_node/layers/pool/consecutive.py +30 -0
- k3_node-1.0.0/k3_node/layers/pool/decimation.py +48 -0
- k3_node-1.0.0/k3_node/layers/pool/edge_pool.py +189 -0
- k3_node-1.0.0/k3_node/layers/pool/glob.py +139 -0
- k3_node-1.0.0/k3_node/layers/pool/graclus.py +66 -0
- k3_node-1.0.0/k3_node/layers/pool/knn.py +253 -0
- k3_node-1.0.0/k3_node/layers/pool/max_pool.py +159 -0
- k3_node-1.0.0/k3_node/layers/pool/mem_pool.py +145 -0
- k3_node-1.0.0/k3_node/layers/pool/pan_pool.py +144 -0
- k3_node-1.0.0/k3_node/layers/pool/point_cloud.py +212 -0
- k3_node-1.0.0/k3_node/layers/pool/pool.py +119 -0
- k3_node-1.0.0/k3_node/layers/pool/sag_pool.py +174 -0
- k3_node-1.0.0/k3_node/layers/pool/select/__init__.py +10 -0
- k3_node-1.0.0/k3_node/layers/pool/select/base.py +112 -0
- k3_node-1.0.0/k3_node/layers/pool/select/topk.py +206 -0
- k3_node-1.0.0/k3_node/layers/pool/test_pool.py +456 -0
- k3_node-1.0.0/k3_node/layers/pool/topk_pool.py +103 -0
- k3_node-1.0.0/k3_node/layers/pool/voxel_grid.py +70 -0
- k3_node-1.0.0/k3_node/layers/unpool/__init__.py +9 -0
- k3_node-1.0.0/k3_node/layers/unpool/knn_interpolate.py +57 -0
- k3_node-1.0.0/k3_node/layers/unpool/test_unpool.py +31 -0
- k3_node-1.0.0/k3_node/loader/__init__.py +62 -0
- k3_node-1.0.0/k3_node/loader/base.py +69 -0
- k3_node-1.0.0/k3_node/loader/cache.py +68 -0
- k3_node-1.0.0/k3_node/loader/cluster.py +127 -0
- k3_node-1.0.0/k3_node/loader/data_list_loader.py +45 -0
- k3_node-1.0.0/k3_node/loader/dataloader.py +117 -0
- k3_node-1.0.0/k3_node/loader/dense_data_loader.py +62 -0
- k3_node-1.0.0/k3_node/loader/dynamic_batch_sampler.py +93 -0
- k3_node-1.0.0/k3_node/loader/graph_saint.py +188 -0
- k3_node-1.0.0/k3_node/loader/hgt_loader.py +90 -0
- k3_node-1.0.0/k3_node/loader/imbalanced_sampler.py +87 -0
- k3_node-1.0.0/k3_node/loader/keras_dataset.py +334 -0
- k3_node-1.0.0/k3_node/loader/link_loader.py +179 -0
- k3_node-1.0.0/k3_node/loader/link_neighbor_loader.py +202 -0
- k3_node-1.0.0/k3_node/loader/mixin.py +190 -0
- k3_node-1.0.0/k3_node/loader/neighbor_loader.py +159 -0
- k3_node-1.0.0/k3_node/loader/neighbor_sampler.py +167 -0
- k3_node-1.0.0/k3_node/loader/node_loader.py +185 -0
- k3_node-1.0.0/k3_node/loader/prefetch.py +115 -0
- k3_node-1.0.0/k3_node/loader/random_node_loader.py +89 -0
- k3_node-1.0.0/k3_node/loader/sampler_utils.py +499 -0
- k3_node-1.0.0/k3_node/loader/shadow.py +115 -0
- k3_node-1.0.0/k3_node/loader/temporal_dataloader.py +98 -0
- k3_node-1.0.0/k3_node/loader/test_dataloader.py +113 -0
- k3_node-1.0.0/k3_node/loader/test_keras_dataset.py +221 -0
- k3_node-1.0.0/k3_node/loader/test_neighbor_loader.py +122 -0
- k3_node-1.0.0/k3_node/loader/test_sampler_utils.py +82 -0
- k3_node-1.0.0/k3_node/loader/test_samplers.py +96 -0
- k3_node-1.0.0/k3_node/loader/test_subgraph_loaders.py +89 -0
- k3_node-1.0.0/k3_node/loader/utils.py +232 -0
- k3_node-1.0.0/k3_node/loader/zip_loader.py +88 -0
- k3_node-1.0.0/k3_node/metrics.py +94 -0
- k3_node-1.0.0/k3_node/models/__init__.py +424 -0
- k3_node-1.0.0/k3_node/models/attentive_fp.py +232 -0
- k3_node-1.0.0/k3_node/models/attract_repel.py +108 -0
- k3_node-1.0.0/k3_node/models/autoencoder.py +318 -0
- k3_node-1.0.0/k3_node/models/basic_gnn.py +443 -0
- k3_node-1.0.0/k3_node/models/bio/__init__.py +4 -0
- k3_node-1.0.0/k3_node/models/captum.py +52 -0
- k3_node-1.0.0/k3_node/models/chemistry/__init__.py +4 -0
- k3_node-1.0.0/k3_node/models/correct_and_smooth.py +146 -0
- k3_node-1.0.0/k3_node/models/deep_graph_infomax.py +113 -0
- k3_node-1.0.0/k3_node/models/deepgcn.py +121 -0
- k3_node-1.0.0/k3_node/models/dimenet.py +737 -0
- k3_node-1.0.0/k3_node/models/dimenet_utils.py +153 -0
- k3_node-1.0.0/k3_node/models/gnnff.py +263 -0
- k3_node-1.0.0/k3_node/models/gps_model.py +1122 -0
- k3_node-1.0.0/k3_node/models/gpse.py +638 -0
- k3_node-1.0.0/k3_node/models/graph_unet.py +199 -0
- k3_node-1.0.0/k3_node/models/graphmae2.py +954 -0
- k3_node-1.0.0/k3_node/models/graphormer.py +1258 -0
- k3_node-1.0.0/k3_node/models/graphormer_3d.py +868 -0
- k3_node-1.0.0/k3_node/models/grover.py +1066 -0
- k3_node-1.0.0/k3_node/models/jumping_knowledge.py +200 -0
- k3_node-1.0.0/k3_node/models/label_prop.py +110 -0
- k3_node-1.0.0/k3_node/models/lightgcn.py +171 -0
- k3_node-1.0.0/k3_node/models/linkx.py +181 -0
- k3_node-1.0.0/k3_node/models/lpformer.py +404 -0
- k3_node-1.0.0/k3_node/models/mask_label.py +114 -0
- k3_node-1.0.0/k3_node/models/materials/__init__.py +33 -0
- k3_node-1.0.0/k3_node/models/meta.py +133 -0
- k3_node-1.0.0/k3_node/models/metapath2vec.py +234 -0
- k3_node-1.0.0/k3_node/models/mlp.py +264 -0
- k3_node-1.0.0/k3_node/models/mole_bert.py +379 -0
- k3_node-1.0.0/k3_node/models/neural_fingerprint.py +95 -0
- k3_node-1.0.0/k3_node/models/node2vec.py +213 -0
- k3_node-1.0.0/k3_node/models/pmlp.py +157 -0
- k3_node-1.0.0/k3_node/models/polynormer.py +229 -0
- k3_node-1.0.0/k3_node/models/rect.py +93 -0
- k3_node-1.0.0/k3_node/models/renet.py +221 -0
- k3_node-1.0.0/k3_node/models/rev_gnn.py +128 -0
- k3_node-1.0.0/k3_node/models/schnet.py +484 -0
- k3_node-1.0.0/k3_node/models/sgformer.py +195 -0
- k3_node-1.0.0/k3_node/models/signed_gcn.py +185 -0
- k3_node-1.0.0/k3_node/models/test_attentive_fp.py +32 -0
- k3_node-1.0.0/k3_node/models/test_attract_repel.py +33 -0
- k3_node-1.0.0/k3_node/models/test_autoencoder.py +119 -0
- k3_node-1.0.0/k3_node/models/test_basic_gnn.py +102 -0
- k3_node-1.0.0/k3_node/models/test_correct_and_smooth.py +40 -0
- k3_node-1.0.0/k3_node/models/test_deep_graph_infomax.py +68 -0
- k3_node-1.0.0/k3_node/models/test_deepgcn.py +21 -0
- k3_node-1.0.0/k3_node/models/test_dimenet.py +86 -0
- k3_node-1.0.0/k3_node/models/test_domain_apis.py +138 -0
- k3_node-1.0.0/k3_node/models/test_gnnff.py +24 -0
- k3_node-1.0.0/k3_node/models/test_gps_model.py +271 -0
- k3_node-1.0.0/k3_node/models/test_gpse.py +34 -0
- k3_node-1.0.0/k3_node/models/test_graph_unet.py +26 -0
- k3_node-1.0.0/k3_node/models/test_graphmae2.py +226 -0
- k3_node-1.0.0/k3_node/models/test_graphormer.py +233 -0
- k3_node-1.0.0/k3_node/models/test_graphormer3d.py +163 -0
- k3_node-1.0.0/k3_node/models/test_grover.py +287 -0
- k3_node-1.0.0/k3_node/models/test_jumping_knowledge.py +129 -0
- k3_node-1.0.0/k3_node/models/test_label_prop.py +37 -0
- k3_node-1.0.0/k3_node/models/test_lightgcn.py +38 -0
- k3_node-1.0.0/k3_node/models/test_linkx.py +31 -0
- k3_node-1.0.0/k3_node/models/test_lpformer.py +22 -0
- k3_node-1.0.0/k3_node/models/test_mask_label.py +90 -0
- k3_node-1.0.0/k3_node/models/test_meta.py +159 -0
- k3_node-1.0.0/k3_node/models/test_metapath2vec.py +45 -0
- k3_node-1.0.0/k3_node/models/test_mlp.py +62 -0
- k3_node-1.0.0/k3_node/models/test_mole_bert.py +164 -0
- k3_node-1.0.0/k3_node/models/test_neural_fingerprint.py +13 -0
- k3_node-1.0.0/k3_node/models/test_node2vec.py +57 -0
- k3_node-1.0.0/k3_node/models/test_pmlp.py +81 -0
- k3_node-1.0.0/k3_node/models/test_polynormer.py +104 -0
- k3_node-1.0.0/k3_node/models/test_rect.py +23 -0
- k3_node-1.0.0/k3_node/models/test_renet.py +32 -0
- k3_node-1.0.0/k3_node/models/test_rev_gnn.py +24 -0
- k3_node-1.0.0/k3_node/models/test_schnet.py +43 -0
- k3_node-1.0.0/k3_node/models/test_sgformer.py +48 -0
- k3_node-1.0.0/k3_node/models/test_signed_gcn.py +28 -0
- k3_node-1.0.0/k3_node/models/test_tgn.py +77 -0
- k3_node-1.0.0/k3_node/models/test_unimol.py +179 -0
- k3_node-1.0.0/k3_node/models/test_unimol2.py +114 -0
- k3_node-1.0.0/k3_node/models/test_unimol_plus.py +131 -0
- k3_node-1.0.0/k3_node/models/test_visnet.py +44 -0
- k3_node-1.0.0/k3_node/models/tgn.py +382 -0
- k3_node-1.0.0/k3_node/models/unimol.py +1156 -0
- k3_node-1.0.0/k3_node/models/unimol2.py +616 -0
- k3_node-1.0.0/k3_node/models/unimol_docking_v2.py +301 -0
- k3_node-1.0.0/k3_node/models/unimol_plus.py +456 -0
- k3_node-1.0.0/k3_node/models/utils.py +97 -0
- k3_node-1.0.0/k3_node/models/visnet.py +759 -0
- k3_node-1.0.0/k3_node/ops/__init__.py +4 -0
- k3_node-1.0.0/k3_node/ops/conv.py +56 -0
- k3_node-1.0.0/k3_node/ops/creation.py +43 -0
- k3_node-1.0.0/k3_node/ops/graph.py +27 -0
- k3_node-1.0.0/k3_node/ops/host.py +41 -0
- k3_node-1.0.0/k3_node/ops/matmul.py +49 -0
- k3_node-1.0.0/k3_node/ops/numpy.py +24 -0
- k3_node-1.0.0/k3_node/ops/segment.py +54 -0
- k3_node-1.0.0/k3_node/ops/sparse.py +51 -0
- k3_node-1.0.0/k3_node/rag/__init__.py +49 -0
- k3_node-1.0.0/k3_node/rag/encoders.py +312 -0
- k3_node-1.0.0/k3_node/rag/pipeline.py +192 -0
- k3_node-1.0.0/k3_node/rag/projector.py +184 -0
- k3_node-1.0.0/k3_node/rag/subgraph.py +270 -0
- k3_node-1.0.0/k3_node/rag/test_rag.py +347 -0
- k3_node-1.0.0/k3_node/rag/verbalizer.py +162 -0
- k3_node-1.0.0/k3_node/tasks/__init__.py +19 -0
- k3_node-1.0.0/k3_node/tasks/backbone_resolver.py +125 -0
- k3_node-1.0.0/k3_node/tasks/base.py +67 -0
- k3_node-1.0.0/k3_node/tasks/graph_classification.py +270 -0
- k3_node-1.0.0/k3_node/tasks/graph_regression.py +228 -0
- k3_node-1.0.0/k3_node/tasks/link_prediction.py +306 -0
- k3_node-1.0.0/k3_node/tasks/node_classification.py +194 -0
- k3_node-1.0.0/k3_node/tasks/node_regression.py +138 -0
- k3_node-1.0.0/k3_node/tasks/test_tasks.py +319 -0
- k3_node-1.0.0/k3_node/test_docstring_examples.py +106 -0
- k3_node-1.0.0/k3_node/test_training_forwarding.py +116 -0
- k3_node-1.0.0/k3_node/training.py +115 -0
- k3_node-1.0.0/k3_node/transforms/__init__.py +166 -0
- k3_node-1.0.0/k3_node/transforms/base_transform.py +32 -0
- k3_node-1.0.0/k3_node/transforms/compose.py +58 -0
- k3_node-1.0.0/k3_node/transforms/general.py +676 -0
- k3_node-1.0.0/k3_node/transforms/graph.py +1070 -0
- k3_node-1.0.0/k3_node/transforms/spatial.py +797 -0
- k3_node-1.0.0/k3_node/transforms/test_random_link_split.py +45 -0
- k3_node-1.0.0/k3_node/transforms/test_spatial_transforms.py +65 -0
- k3_node-1.0.0/k3_node/transforms/test_transforms.py +253 -0
- k3_node-1.0.0/k3_node/transforms/utils.py +102 -0
- k3_node-1.0.0/k3_node/utils/__init__.py +5 -0
- k3_node-1.0.0/k3_node/utils/backend_import.py +12 -0
- k3_node-1.0.0/k3_node/utils/graph.py +286 -0
- k3_node-1.0.0/k3_node/utils/keras.py +94 -0
- k3_node-1.0.0/k3_node/utils/random.py +103 -0
- k3_node-1.0.0/k3_node/utils/smiles.py +235 -0
- k3_node-1.0.0/k3_node.egg-info/PKG-INFO +284 -0
- k3_node-1.0.0/k3_node.egg-info/SOURCES.txt +463 -0
- k3_node-1.0.0/k3_node.egg-info/dependency_links.txt +1 -0
- k3_node-1.0.0/k3_node.egg-info/requires.txt +39 -0
- k3_node-1.0.0/k3_node.egg-info/top_level.txt +1 -0
- k3_node-1.0.0/pyproject.toml +65 -0
- k3_node-1.0.0/setup.cfg +4 -0
- k3_node-1.0.0/setup.py +3 -0
k3_node-1.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 Muhammad Anas Raza
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
k3_node-1.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: k3-node
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Multi-Backend Graph Neural Networks on Keras 3
|
|
5
|
+
Author: Muhammad Anas Raza
|
|
6
|
+
License: MIT
|
|
7
|
+
Requires-Python: >=3.11
|
|
8
|
+
Description-Content-Type: text/markdown
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Requires-Dist: keras>=3.0
|
|
11
|
+
Requires-Dist: scipy
|
|
12
|
+
Requires-Dist: pynndescent
|
|
13
|
+
Requires-Dist: sympy
|
|
14
|
+
Requires-Dist: pandas
|
|
15
|
+
Requires-Dist: huggingface_hub>=0.20.0
|
|
16
|
+
Requires-Dist: onnx>=1.15.0
|
|
17
|
+
Requires-Dist: onnxruntime>=1.17.0
|
|
18
|
+
Requires-Dist: tf2onnx>=1.16.0
|
|
19
|
+
Requires-Dist: onnxscript
|
|
20
|
+
Provides-Extra: examples
|
|
21
|
+
Requires-Dist: scikit-learn; extra == "examples"
|
|
22
|
+
Requires-Dist: rdflib; extra == "examples"
|
|
23
|
+
Requires-Dist: matplotlib; extra == "examples"
|
|
24
|
+
Provides-Extra: test
|
|
25
|
+
Requires-Dist: pytest>=8.0.0; extra == "test"
|
|
26
|
+
Requires-Dist: pytest-cov; extra == "test"
|
|
27
|
+
Requires-Dist: torch>=2.0.0; extra == "test"
|
|
28
|
+
Requires-Dist: torch-geometric>=2.5.0; extra == "test"
|
|
29
|
+
Requires-Dist: networkx; extra == "test"
|
|
30
|
+
Requires-Dist: scikit-learn; extra == "test"
|
|
31
|
+
Requires-Dist: tqdm; extra == "test"
|
|
32
|
+
Requires-Dist: fsspec; extra == "test"
|
|
33
|
+
Requires-Dist: requests; extra == "test"
|
|
34
|
+
Requires-Dist: onnx>=1.15.0; extra == "test"
|
|
35
|
+
Requires-Dist: onnxruntime>=1.17.0; extra == "test"
|
|
36
|
+
Requires-Dist: tf2onnx>=1.16.0; extra == "test"
|
|
37
|
+
Requires-Dist: onnxscript; extra == "test"
|
|
38
|
+
Provides-Extra: docs
|
|
39
|
+
Requires-Dist: mkdocs>=1.5; extra == "docs"
|
|
40
|
+
Requires-Dist: mkdocs-material>=9.5; extra == "docs"
|
|
41
|
+
Requires-Dist: mkdocstrings[python]>=0.25; extra == "docs"
|
|
42
|
+
Requires-Dist: mkdocs-autorefs; extra == "docs"
|
|
43
|
+
Requires-Dist: pymdown-extensions; extra == "docs"
|
|
44
|
+
Requires-Dist: mkdocs-jupyter; extra == "docs"
|
|
45
|
+
Requires-Dist: pygments; extra == "docs"
|
|
46
|
+
Dynamic: license-file
|
|
47
|
+
|
|
48
|
+
# K3-Node: Multi-Backend Graph Neural Networks
|
|
49
|
+
|
|
50
|
+
<p align="center">
|
|
51
|
+
<img src="docs/images/logo.png" alt="K3-Node Logo" width="180"/>
|
|
52
|
+
</p>
|
|
53
|
+
|
|
54
|
+
<p align="center">
|
|
55
|
+
<a href="https://anas-rz.github.io/k3-node/"><img src="https://img.shields.io/badge/docs-GitHub%20Pages-blue.svg" alt="Documentation"></a>
|
|
56
|
+
<a href="https://github.com/anas-rz/k3-node/actions/workflows/test_torch.yml"><img src="https://github.com/anas-rz/k3-node/actions/workflows/test_torch.yml/badge.svg" alt="PyTorch tests"></a>
|
|
57
|
+
<a href="https://github.com/anas-rz/k3-node/actions/workflows/test_tensorflow.yml"><img src="https://github.com/anas-rz/k3-node/actions/workflows/test_tensorflow.yml/badge.svg" alt="TensorFlow tests"></a>
|
|
58
|
+
<a href="https://github.com/anas-rz/k3-node/actions/workflows/test_jax.yml"><img src="https://github.com/anas-rz/k3-node/actions/workflows/test_jax.yml/badge.svg" alt="JAX tests"></a>
|
|
59
|
+
<a href="https://github.com/anas-rz/k3-node/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-green.svg" alt="License"></a>
|
|
60
|
+
<a href="https://keras.io/keras_3/"><img src="https://img.shields.io/badge/Keras%203-TensorFlow%20%7C%20PyTorch%20%7C%20JAX-orange.svg" alt="Backends"></a>
|
|
61
|
+
<a href="https://github.com/psf/black"><img src="https://img.shields.io/badge/code%20style-black-000000.svg" alt="Code style: black"></a>
|
|
62
|
+
</p>
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
**K3-Node** is a next-generation graph neural network (GNN) library built natively on **Keras 3**. Write your GNN models once and execute seamlessly across **TensorFlow**, **PyTorch**, and **JAX** with full hardware acceleration (NVIDIA GPUs, Apple Silicon, Google Cloud TPUs).
|
|
67
|
+
|
|
68
|
+
K3-Node achieves **100% public API parity** with [PyTorch Geometric (PyG)](https://github.com/pyg-team/pytorch_geometric) and incorporates state-of-the-art foundation models and architectures from [Spektral](https://github.com/danielegrattarola/spektral) and [StellarGraph](https://github.com/stellargraph/stellargraph).
|
|
69
|
+
|
|
70
|
+
📖 **Documentation**: [https://anas-rz.github.io/k3-node/](https://anas-rz.github.io/k3-node/)
|
|
71
|
+
📋 **Porting Checklist & Parity Status**: [Checklist.md](Checklist.md)
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Key Features
|
|
76
|
+
|
|
77
|
+
- 🔄 **True Multi-Backend Freedom**: Switch between PyTorch, TensorFlow, and JAX with a single environment variable (`KERAS_BACKEND=torch|tensorflow|jax`).
|
|
78
|
+
- 🧠 **Pre-trained Foundation Models**: Out-of-the-box architectures and checkpoint loaders for **GraphMAE2**, **Graphormer** (2D & 3D), **GraphGPS**, **GROVER**, and **Mole-BERT**.
|
|
79
|
+
- ⚡ **65+ Convolution Layers**: Full PyG parity (`GCNConv`, `GATv2Conv`, `TransformerConv`, `GPSConv`, `PNAConv`, `SchNet`, `DimeNetPlusPlus`, `ViSNet`, etc.).
|
|
80
|
+
- 📊 **26 Aggregation Operators**: From elementary aggregations (`sum`, `mean`, `max`, `softmax`, `powermean`) to neural aggregations (`SetTransformer`, `GraphMultisetTransformer`, `Set2Set`, `DeepSets`, `LSTMAggregation`).
|
|
81
|
+
- 🌐 **31 Pooling Operators**: Global readouts (`global_add_pool`, `global_mean_pool`), hierarchical coarsening (`TopKPooling`, `SAGPooling`, `ASAPooling`, `EdgePooling`, `ClusterPooling`), and 3D spatial pooling (`voxel_grid`, `fps`, `knn`, `radius`).
|
|
82
|
+
- 🧱 **Dense & Scalable GNNs**: Dense matrix convolutions (`DenseGCNConv`, `DenseGATConv`), spectral pooling (`DMoNPooling`, `dense_diff_pool`, `dense_mincut_pool`), and linear-complexity graph transformers (`SGFormer`, `LPFormer`, `Polynormer`).
|
|
83
|
+
- 🧭 **Knowledge Graph Embeddings**: Multi-relational link prediction with `TransE`, `RotatE`, `DistMult`, `ComplEx`, and framework-agnostic negative sampling loaders.
|
|
84
|
+
- 📦 **Data, Loaders & Transforms**: Full suite of graph data structures (`Data`, `HeteroData`, `Batch`), mini-batch samplers (`NeighborLoader`, `ClusterLoader`, `GraphSAINTSampler`), and 62+ graph and 3D point cloud transforms.
|
|
85
|
+
- ✅ **Rigorous Verification**: 700+ unit tests on every backend, training tests that check each layer's weights actually learn, compiled-vs-eager and cross-backend consistency tests, and numerical parity tests against PyTorch Geometric and reference checkpoints.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Installation
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
# git should be installed
|
|
93
|
+
pip install git+https://github.com/anas-rz/k3-node/
|
|
94
|
+
|
|
95
|
+
# with the extra packages the example notebooks use (scikit-learn, rdflib, matplotlib)
|
|
96
|
+
pip install "k3-node[examples] @ git+https://github.com/anas-rz/k3-node"
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Selecting your Backend
|
|
100
|
+
Configure your preferred backend before importing `k3_node`:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
export KERAS_BACKEND="torch" # or "tensorflow" or "jax"
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Or programmatically in Python:
|
|
107
|
+
|
|
108
|
+
```python
|
|
109
|
+
import os
|
|
110
|
+
os.environ["KERAS_BACKEND"] = "torch" # Must be set before importing k3_node / keras
|
|
111
|
+
import k3_node
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Quickstart
|
|
117
|
+
|
|
118
|
+
### Building a Graph Convolutional Network
|
|
119
|
+
|
|
120
|
+
```python
|
|
121
|
+
import keras
|
|
122
|
+
from keras import ops
|
|
123
|
+
import k3_node.layers as gnn_layers
|
|
124
|
+
from k3_node.data import Data
|
|
125
|
+
|
|
126
|
+
class GCN(keras.Model):
|
|
127
|
+
def __init__(self, in_channels, hidden_channels, out_channels):
|
|
128
|
+
super().__init__()
|
|
129
|
+
self.conv1 = gnn_layers.GCNConv(in_channels, hidden_channels)
|
|
130
|
+
self.conv2 = gnn_layers.GCNConv(hidden_channels, out_channels)
|
|
131
|
+
|
|
132
|
+
def call(self, x, edge_index):
|
|
133
|
+
x = self.conv1(x, edge_index)
|
|
134
|
+
x = ops.relu(x)
|
|
135
|
+
x = self.conv2(x, edge_index)
|
|
136
|
+
return x
|
|
137
|
+
|
|
138
|
+
# Instantiate model
|
|
139
|
+
model = GCN(in_channels=16, hidden_channels=32, out_channels=7)
|
|
140
|
+
|
|
141
|
+
# Forward pass on graph data
|
|
142
|
+
x = ops.ones((10, 16))
|
|
143
|
+
edge_index = ops.convert_to_tensor([[0, 1, 2, 3], [1, 2, 3, 0]], dtype="int64")
|
|
144
|
+
|
|
145
|
+
out = model(x, edge_index)
|
|
146
|
+
print("Output shape:", out.shape) # (10, 7)
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Training in a Few Lines
|
|
150
|
+
|
|
151
|
+
The task estimators in `k3_node.tasks` pick the loss, readout and metrics for you:
|
|
152
|
+
|
|
153
|
+
```python
|
|
154
|
+
from k3_node.datasets import Planetoid
|
|
155
|
+
from k3_node.tasks import NodeClassifier
|
|
156
|
+
|
|
157
|
+
cora = Planetoid("data/Planetoid", name="Cora")[0]
|
|
158
|
+
|
|
159
|
+
classifier = NodeClassifier(backbone="gcn", hidden_channels=64, num_layers=2, dropout=0.5)
|
|
160
|
+
classifier.fit(cora, epochs=100, lr=0.01)
|
|
161
|
+
print(classifier.evaluate(cora, mask="test_mask"))
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
`GraphClassifier`, `GraphRegressor`, `NodeRegressor` and `LinkPredictor` work the same way.
|
|
165
|
+
|
|
166
|
+
### Example Notebooks
|
|
167
|
+
|
|
168
|
+
The [`examples/`](examples) folder has 90+ notebooks that follow the architectures of
|
|
169
|
+
[PyG's examples](https://github.com/pyg-team/pytorch_geometric/tree/master/examples), written with
|
|
170
|
+
`keras.Model.fit` and K3-Node's loaders. They cover node, link and graph classification,
|
|
171
|
+
knowledge graphs, molecules (including pre-trained DimeNet, DimeNet++ and SchNet on QM9), point
|
|
172
|
+
clouds, temporal graphs and large-graph mini-batching. Each notebook opens in Colab and runs on
|
|
173
|
+
any backend: change `KERAS_BACKEND` in its first cell. Browse them in the
|
|
174
|
+
[documentation](https://anas-rz.github.io/k3-node/examples/).
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Pre-trained Foundation Models
|
|
179
|
+
|
|
180
|
+
K3-Node provides ready-to-use architectures and automated checkpoint loading for state-of-the-art graph foundation models:
|
|
181
|
+
|
|
182
|
+
### 1. GraphMAE2 (Self-Supervised Masked Autoencoder)
|
|
183
|
+
```python
|
|
184
|
+
from k3_node.models import GraphMAE2
|
|
185
|
+
from k3_node.models.graphmae2 import load_graphmae2_weights
|
|
186
|
+
|
|
187
|
+
model = GraphMAE2(
|
|
188
|
+
in_dim=100,
|
|
189
|
+
num_hidden=512,
|
|
190
|
+
out_dim=100,
|
|
191
|
+
num_layers=4,
|
|
192
|
+
encoder_type="gat",
|
|
193
|
+
decoder_type="gat"
|
|
194
|
+
)
|
|
195
|
+
# Load reference pre-trained weights
|
|
196
|
+
load_graphmae2_weights(model, "checkpoints/graphmae2_ogbn_arxiv.pt")
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### 2. Graphormer (2D Molecular & 3D Structural Transformer)
|
|
200
|
+
```python
|
|
201
|
+
from k3_node.models import Graphormer, Graphormer3D
|
|
202
|
+
from k3_node.models.graphormer import load_graphormer_weights
|
|
203
|
+
|
|
204
|
+
# 2D Graphormer (PCQM4Mv2)
|
|
205
|
+
model_2d = Graphormer(num_layers=12, num_heads=32, embed_dim=768)
|
|
206
|
+
load_graphormer_weights(model_2d, "checkpoints/graphormer_pcqm4mv2.pt")
|
|
207
|
+
|
|
208
|
+
# 3D Graphormer (OC20 Catalyst Adsorption & Molecular Conformations)
|
|
209
|
+
model_3d = Graphormer3D(num_layers=12, num_heads=32, embed_dim=768)
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### 3. GraphGPS (Hybrid Local MPNN + Global Transformer)
|
|
213
|
+
```python
|
|
214
|
+
from k3_node.models import GPSModel
|
|
215
|
+
from k3_node.models.gps_model import load_gps_model_weights
|
|
216
|
+
|
|
217
|
+
model = GPSModel(
|
|
218
|
+
channels=64,
|
|
219
|
+
num_layers=5,
|
|
220
|
+
local_gnn_type="GINE",
|
|
221
|
+
global_model_type="Transformer"
|
|
222
|
+
)
|
|
223
|
+
load_gps_model_weights(model, "checkpoints/graphgps_zinc.pt")
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### 4. GROVER (Self-Supervised Message Passing Transformer)
|
|
227
|
+
```python
|
|
228
|
+
from k3_node.models import GROVER, GROVEREmbedding
|
|
229
|
+
from k3_node.models.grover import load_grover_weights
|
|
230
|
+
|
|
231
|
+
model = GROVER(hidden_size=128, num_layers=3, num_heads=4)
|
|
232
|
+
load_grover_weights(model, "checkpoints/grover_base.pt")
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### 5. Mole-BERT (Masked Chemical Graph Representation)
|
|
236
|
+
```python
|
|
237
|
+
from k3_node.models import MoleBERT
|
|
238
|
+
from k3_node.models.mole_bert import load_mole_bert_weights
|
|
239
|
+
|
|
240
|
+
model = MoleBERT(num_layer=5, emb_dim=300, drop_ratio=0.5)
|
|
241
|
+
load_mole_bert_weights(model, "checkpoints/Mole-BERT.pth")
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## What's Included
|
|
247
|
+
|
|
248
|
+
| Package | Status | Contents |
|
|
249
|
+
|---|---|---|
|
|
250
|
+
| [`k3_node.layers.conv`](https://anas-rz.github.io/k3-node/api/conv/) | ✅ 65/65 | `GCNConv`, `GATConv`, `GATv2Conv`, `SAGEConv`, `GINConv`, `GPSConv`, `TransformerConv`, `PNAConv`, `SchNet`, `DimeNetPlusPlus`, `ViSNet`, etc. |
|
|
251
|
+
| [`k3_node.layers.pool`](https://anas-rz.github.io/k3-node/api/pool/) | ✅ 31/31 | `global_add_pool`, `global_mean_pool`, `TopKPooling`, `SAGPooling`, `ASAPooling`, `EdgePooling`, `ClusterPooling`, `voxel_grid`, `fps`, `graclus`, etc. |
|
|
252
|
+
| [`k3_node.layers.aggr`](https://anas-rz.github.io/k3-node/api/aggr/) | ✅ 26/26 | `SumAggregation`, `MeanAggregation`, `SoftmaxAggregation`, `PowerMeanAggregation`, `MultiAggregation`, `SetTransformerAggregation`, `Set2Set`, etc. |
|
|
253
|
+
| [`k3_node.layers.norm`](https://anas-rz.github.io/k3-node/api/norm/) | ✅ 11/11 | `GraphNorm`, `PairNorm`, `DiffGroupNorm`, `MessageNorm`, `MeanSubtractionNorm`, `BatchNorm`, `LayerNorm`, `HeteroBatchNorm`, etc. |
|
|
254
|
+
| [`k3_node.layers.dense`](https://anas-rz.github.io/k3-node/api/dense/) | ✅ 11/11 | `DenseGCNConv`, `DenseGATConv`, `DenseGINConv`, `DenseSAGEConv`, `DMoNPooling`, `dense_diff_pool`, `dense_mincut_pool`, `Linear`, etc. |
|
|
255
|
+
| [`k3_node.layers.kge`](https://anas-rz.github.io/k3-node/api/kge/) | ✅ 5/5 | `KGEModel`, `TransE`, `RotatE`, `DistMult`, `ComplEx`, `KGTripletLoader`. |
|
|
256
|
+
| [`k3_node.models`](https://anas-rz.github.io/k3-node/api/models/) | ✅ 46/46 | `MLP`, `GAE`, `VGAE`, `DeepGraphInfomax`, `Node2Vec`, `LabelPropagation`, `LINKX`, `LightGCN`, `SGFormer`, `LPFormer`, `Polynormer`, etc. |
|
|
257
|
+
| **Foundation Models** | ✅ 5/5 | `GraphMAE2`, `Graphormer` (2D/3D), `GPSModel`, `GROVER`, `MoleBERT` with pre-trained weight conversion. |
|
|
258
|
+
| [`k3_node.data`](https://anas-rz.github.io/k3-node/api/data/) | ✅ 19/19 | `Data`, `HeteroData`, `Batch`, `TemporalData`, `HypergraphData`, `InMemoryDataset`, `FeatureStore`, `GraphStore`, etc. |
|
|
259
|
+
| [`k3_node.loader`](https://anas-rz.github.io/k3-node/api/loader/) | ✅ 26/26 | `DataLoader`, `NeighborLoader`, `LinkNeighborLoader`, `ClusterLoader`, `GraphSAINTSampler`, `ShaDowKHopSampler`, etc. |
|
|
260
|
+
| [`k3_node.transforms`](https://anas-rz.github.io/k3-node/api/transforms/) | ✅ 62/62 | Topology rewiring, positional encodings (`LapPE`, `RWPE`, `GPSE`), spectral diffusion (`GDC`), and 3D point cloud transforms. |
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
## Testing & Verification
|
|
266
|
+
|
|
267
|
+
Run the comprehensive test suite across backends:
|
|
268
|
+
|
|
269
|
+
```bash
|
|
270
|
+
# Run all unit tests
|
|
271
|
+
pytest k3_node/
|
|
272
|
+
|
|
273
|
+
# Run training tests (each layer's weights learn; slower, not run in CI)
|
|
274
|
+
pytest tests_training/
|
|
275
|
+
|
|
276
|
+
# Run reference parity check against PyTorch implementations
|
|
277
|
+
pytest tests_reference/
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
## License
|
|
283
|
+
|
|
284
|
+
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
k3_node-1.0.0/README.md
ADDED
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
# K3-Node: Multi-Backend Graph Neural Networks
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<img src="docs/images/logo.png" alt="K3-Node Logo" width="180"/>
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<a href="https://anas-rz.github.io/k3-node/"><img src="https://img.shields.io/badge/docs-GitHub%20Pages-blue.svg" alt="Documentation"></a>
|
|
9
|
+
<a href="https://github.com/anas-rz/k3-node/actions/workflows/test_torch.yml"><img src="https://github.com/anas-rz/k3-node/actions/workflows/test_torch.yml/badge.svg" alt="PyTorch tests"></a>
|
|
10
|
+
<a href="https://github.com/anas-rz/k3-node/actions/workflows/test_tensorflow.yml"><img src="https://github.com/anas-rz/k3-node/actions/workflows/test_tensorflow.yml/badge.svg" alt="TensorFlow tests"></a>
|
|
11
|
+
<a href="https://github.com/anas-rz/k3-node/actions/workflows/test_jax.yml"><img src="https://github.com/anas-rz/k3-node/actions/workflows/test_jax.yml/badge.svg" alt="JAX tests"></a>
|
|
12
|
+
<a href="https://github.com/anas-rz/k3-node/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-green.svg" alt="License"></a>
|
|
13
|
+
<a href="https://keras.io/keras_3/"><img src="https://img.shields.io/badge/Keras%203-TensorFlow%20%7C%20PyTorch%20%7C%20JAX-orange.svg" alt="Backends"></a>
|
|
14
|
+
<a href="https://github.com/psf/black"><img src="https://img.shields.io/badge/code%20style-black-000000.svg" alt="Code style: black"></a>
|
|
15
|
+
</p>
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
**K3-Node** is a next-generation graph neural network (GNN) library built natively on **Keras 3**. Write your GNN models once and execute seamlessly across **TensorFlow**, **PyTorch**, and **JAX** with full hardware acceleration (NVIDIA GPUs, Apple Silicon, Google Cloud TPUs).
|
|
20
|
+
|
|
21
|
+
K3-Node achieves **100% public API parity** with [PyTorch Geometric (PyG)](https://github.com/pyg-team/pytorch_geometric) and incorporates state-of-the-art foundation models and architectures from [Spektral](https://github.com/danielegrattarola/spektral) and [StellarGraph](https://github.com/stellargraph/stellargraph).
|
|
22
|
+
|
|
23
|
+
📖 **Documentation**: [https://anas-rz.github.io/k3-node/](https://anas-rz.github.io/k3-node/)
|
|
24
|
+
📋 **Porting Checklist & Parity Status**: [Checklist.md](Checklist.md)
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Key Features
|
|
29
|
+
|
|
30
|
+
- 🔄 **True Multi-Backend Freedom**: Switch between PyTorch, TensorFlow, and JAX with a single environment variable (`KERAS_BACKEND=torch|tensorflow|jax`).
|
|
31
|
+
- 🧠 **Pre-trained Foundation Models**: Out-of-the-box architectures and checkpoint loaders for **GraphMAE2**, **Graphormer** (2D & 3D), **GraphGPS**, **GROVER**, and **Mole-BERT**.
|
|
32
|
+
- ⚡ **65+ Convolution Layers**: Full PyG parity (`GCNConv`, `GATv2Conv`, `TransformerConv`, `GPSConv`, `PNAConv`, `SchNet`, `DimeNetPlusPlus`, `ViSNet`, etc.).
|
|
33
|
+
- 📊 **26 Aggregation Operators**: From elementary aggregations (`sum`, `mean`, `max`, `softmax`, `powermean`) to neural aggregations (`SetTransformer`, `GraphMultisetTransformer`, `Set2Set`, `DeepSets`, `LSTMAggregation`).
|
|
34
|
+
- 🌐 **31 Pooling Operators**: Global readouts (`global_add_pool`, `global_mean_pool`), hierarchical coarsening (`TopKPooling`, `SAGPooling`, `ASAPooling`, `EdgePooling`, `ClusterPooling`), and 3D spatial pooling (`voxel_grid`, `fps`, `knn`, `radius`).
|
|
35
|
+
- 🧱 **Dense & Scalable GNNs**: Dense matrix convolutions (`DenseGCNConv`, `DenseGATConv`), spectral pooling (`DMoNPooling`, `dense_diff_pool`, `dense_mincut_pool`), and linear-complexity graph transformers (`SGFormer`, `LPFormer`, `Polynormer`).
|
|
36
|
+
- 🧭 **Knowledge Graph Embeddings**: Multi-relational link prediction with `TransE`, `RotatE`, `DistMult`, `ComplEx`, and framework-agnostic negative sampling loaders.
|
|
37
|
+
- 📦 **Data, Loaders & Transforms**: Full suite of graph data structures (`Data`, `HeteroData`, `Batch`), mini-batch samplers (`NeighborLoader`, `ClusterLoader`, `GraphSAINTSampler`), and 62+ graph and 3D point cloud transforms.
|
|
38
|
+
- ✅ **Rigorous Verification**: 700+ unit tests on every backend, training tests that check each layer's weights actually learn, compiled-vs-eager and cross-backend consistency tests, and numerical parity tests against PyTorch Geometric and reference checkpoints.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Installation
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# git should be installed
|
|
46
|
+
pip install git+https://github.com/anas-rz/k3-node/
|
|
47
|
+
|
|
48
|
+
# with the extra packages the example notebooks use (scikit-learn, rdflib, matplotlib)
|
|
49
|
+
pip install "k3-node[examples] @ git+https://github.com/anas-rz/k3-node"
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Selecting your Backend
|
|
53
|
+
Configure your preferred backend before importing `k3_node`:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
export KERAS_BACKEND="torch" # or "tensorflow" or "jax"
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Or programmatically in Python:
|
|
60
|
+
|
|
61
|
+
```python
|
|
62
|
+
import os
|
|
63
|
+
os.environ["KERAS_BACKEND"] = "torch" # Must be set before importing k3_node / keras
|
|
64
|
+
import k3_node
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Quickstart
|
|
70
|
+
|
|
71
|
+
### Building a Graph Convolutional Network
|
|
72
|
+
|
|
73
|
+
```python
|
|
74
|
+
import keras
|
|
75
|
+
from keras import ops
|
|
76
|
+
import k3_node.layers as gnn_layers
|
|
77
|
+
from k3_node.data import Data
|
|
78
|
+
|
|
79
|
+
class GCN(keras.Model):
|
|
80
|
+
def __init__(self, in_channels, hidden_channels, out_channels):
|
|
81
|
+
super().__init__()
|
|
82
|
+
self.conv1 = gnn_layers.GCNConv(in_channels, hidden_channels)
|
|
83
|
+
self.conv2 = gnn_layers.GCNConv(hidden_channels, out_channels)
|
|
84
|
+
|
|
85
|
+
def call(self, x, edge_index):
|
|
86
|
+
x = self.conv1(x, edge_index)
|
|
87
|
+
x = ops.relu(x)
|
|
88
|
+
x = self.conv2(x, edge_index)
|
|
89
|
+
return x
|
|
90
|
+
|
|
91
|
+
# Instantiate model
|
|
92
|
+
model = GCN(in_channels=16, hidden_channels=32, out_channels=7)
|
|
93
|
+
|
|
94
|
+
# Forward pass on graph data
|
|
95
|
+
x = ops.ones((10, 16))
|
|
96
|
+
edge_index = ops.convert_to_tensor([[0, 1, 2, 3], [1, 2, 3, 0]], dtype="int64")
|
|
97
|
+
|
|
98
|
+
out = model(x, edge_index)
|
|
99
|
+
print("Output shape:", out.shape) # (10, 7)
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Training in a Few Lines
|
|
103
|
+
|
|
104
|
+
The task estimators in `k3_node.tasks` pick the loss, readout and metrics for you:
|
|
105
|
+
|
|
106
|
+
```python
|
|
107
|
+
from k3_node.datasets import Planetoid
|
|
108
|
+
from k3_node.tasks import NodeClassifier
|
|
109
|
+
|
|
110
|
+
cora = Planetoid("data/Planetoid", name="Cora")[0]
|
|
111
|
+
|
|
112
|
+
classifier = NodeClassifier(backbone="gcn", hidden_channels=64, num_layers=2, dropout=0.5)
|
|
113
|
+
classifier.fit(cora, epochs=100, lr=0.01)
|
|
114
|
+
print(classifier.evaluate(cora, mask="test_mask"))
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
`GraphClassifier`, `GraphRegressor`, `NodeRegressor` and `LinkPredictor` work the same way.
|
|
118
|
+
|
|
119
|
+
### Example Notebooks
|
|
120
|
+
|
|
121
|
+
The [`examples/`](examples) folder has 90+ notebooks that follow the architectures of
|
|
122
|
+
[PyG's examples](https://github.com/pyg-team/pytorch_geometric/tree/master/examples), written with
|
|
123
|
+
`keras.Model.fit` and K3-Node's loaders. They cover node, link and graph classification,
|
|
124
|
+
knowledge graphs, molecules (including pre-trained DimeNet, DimeNet++ and SchNet on QM9), point
|
|
125
|
+
clouds, temporal graphs and large-graph mini-batching. Each notebook opens in Colab and runs on
|
|
126
|
+
any backend: change `KERAS_BACKEND` in its first cell. Browse them in the
|
|
127
|
+
[documentation](https://anas-rz.github.io/k3-node/examples/).
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Pre-trained Foundation Models
|
|
132
|
+
|
|
133
|
+
K3-Node provides ready-to-use architectures and automated checkpoint loading for state-of-the-art graph foundation models:
|
|
134
|
+
|
|
135
|
+
### 1. GraphMAE2 (Self-Supervised Masked Autoencoder)
|
|
136
|
+
```python
|
|
137
|
+
from k3_node.models import GraphMAE2
|
|
138
|
+
from k3_node.models.graphmae2 import load_graphmae2_weights
|
|
139
|
+
|
|
140
|
+
model = GraphMAE2(
|
|
141
|
+
in_dim=100,
|
|
142
|
+
num_hidden=512,
|
|
143
|
+
out_dim=100,
|
|
144
|
+
num_layers=4,
|
|
145
|
+
encoder_type="gat",
|
|
146
|
+
decoder_type="gat"
|
|
147
|
+
)
|
|
148
|
+
# Load reference pre-trained weights
|
|
149
|
+
load_graphmae2_weights(model, "checkpoints/graphmae2_ogbn_arxiv.pt")
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### 2. Graphormer (2D Molecular & 3D Structural Transformer)
|
|
153
|
+
```python
|
|
154
|
+
from k3_node.models import Graphormer, Graphormer3D
|
|
155
|
+
from k3_node.models.graphormer import load_graphormer_weights
|
|
156
|
+
|
|
157
|
+
# 2D Graphormer (PCQM4Mv2)
|
|
158
|
+
model_2d = Graphormer(num_layers=12, num_heads=32, embed_dim=768)
|
|
159
|
+
load_graphormer_weights(model_2d, "checkpoints/graphormer_pcqm4mv2.pt")
|
|
160
|
+
|
|
161
|
+
# 3D Graphormer (OC20 Catalyst Adsorption & Molecular Conformations)
|
|
162
|
+
model_3d = Graphormer3D(num_layers=12, num_heads=32, embed_dim=768)
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### 3. GraphGPS (Hybrid Local MPNN + Global Transformer)
|
|
166
|
+
```python
|
|
167
|
+
from k3_node.models import GPSModel
|
|
168
|
+
from k3_node.models.gps_model import load_gps_model_weights
|
|
169
|
+
|
|
170
|
+
model = GPSModel(
|
|
171
|
+
channels=64,
|
|
172
|
+
num_layers=5,
|
|
173
|
+
local_gnn_type="GINE",
|
|
174
|
+
global_model_type="Transformer"
|
|
175
|
+
)
|
|
176
|
+
load_gps_model_weights(model, "checkpoints/graphgps_zinc.pt")
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### 4. GROVER (Self-Supervised Message Passing Transformer)
|
|
180
|
+
```python
|
|
181
|
+
from k3_node.models import GROVER, GROVEREmbedding
|
|
182
|
+
from k3_node.models.grover import load_grover_weights
|
|
183
|
+
|
|
184
|
+
model = GROVER(hidden_size=128, num_layers=3, num_heads=4)
|
|
185
|
+
load_grover_weights(model, "checkpoints/grover_base.pt")
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### 5. Mole-BERT (Masked Chemical Graph Representation)
|
|
189
|
+
```python
|
|
190
|
+
from k3_node.models import MoleBERT
|
|
191
|
+
from k3_node.models.mole_bert import load_mole_bert_weights
|
|
192
|
+
|
|
193
|
+
model = MoleBERT(num_layer=5, emb_dim=300, drop_ratio=0.5)
|
|
194
|
+
load_mole_bert_weights(model, "checkpoints/Mole-BERT.pth")
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## What's Included
|
|
200
|
+
|
|
201
|
+
| Package | Status | Contents |
|
|
202
|
+
|---|---|---|
|
|
203
|
+
| [`k3_node.layers.conv`](https://anas-rz.github.io/k3-node/api/conv/) | ✅ 65/65 | `GCNConv`, `GATConv`, `GATv2Conv`, `SAGEConv`, `GINConv`, `GPSConv`, `TransformerConv`, `PNAConv`, `SchNet`, `DimeNetPlusPlus`, `ViSNet`, etc. |
|
|
204
|
+
| [`k3_node.layers.pool`](https://anas-rz.github.io/k3-node/api/pool/) | ✅ 31/31 | `global_add_pool`, `global_mean_pool`, `TopKPooling`, `SAGPooling`, `ASAPooling`, `EdgePooling`, `ClusterPooling`, `voxel_grid`, `fps`, `graclus`, etc. |
|
|
205
|
+
| [`k3_node.layers.aggr`](https://anas-rz.github.io/k3-node/api/aggr/) | ✅ 26/26 | `SumAggregation`, `MeanAggregation`, `SoftmaxAggregation`, `PowerMeanAggregation`, `MultiAggregation`, `SetTransformerAggregation`, `Set2Set`, etc. |
|
|
206
|
+
| [`k3_node.layers.norm`](https://anas-rz.github.io/k3-node/api/norm/) | ✅ 11/11 | `GraphNorm`, `PairNorm`, `DiffGroupNorm`, `MessageNorm`, `MeanSubtractionNorm`, `BatchNorm`, `LayerNorm`, `HeteroBatchNorm`, etc. |
|
|
207
|
+
| [`k3_node.layers.dense`](https://anas-rz.github.io/k3-node/api/dense/) | ✅ 11/11 | `DenseGCNConv`, `DenseGATConv`, `DenseGINConv`, `DenseSAGEConv`, `DMoNPooling`, `dense_diff_pool`, `dense_mincut_pool`, `Linear`, etc. |
|
|
208
|
+
| [`k3_node.layers.kge`](https://anas-rz.github.io/k3-node/api/kge/) | ✅ 5/5 | `KGEModel`, `TransE`, `RotatE`, `DistMult`, `ComplEx`, `KGTripletLoader`. |
|
|
209
|
+
| [`k3_node.models`](https://anas-rz.github.io/k3-node/api/models/) | ✅ 46/46 | `MLP`, `GAE`, `VGAE`, `DeepGraphInfomax`, `Node2Vec`, `LabelPropagation`, `LINKX`, `LightGCN`, `SGFormer`, `LPFormer`, `Polynormer`, etc. |
|
|
210
|
+
| **Foundation Models** | ✅ 5/5 | `GraphMAE2`, `Graphormer` (2D/3D), `GPSModel`, `GROVER`, `MoleBERT` with pre-trained weight conversion. |
|
|
211
|
+
| [`k3_node.data`](https://anas-rz.github.io/k3-node/api/data/) | ✅ 19/19 | `Data`, `HeteroData`, `Batch`, `TemporalData`, `HypergraphData`, `InMemoryDataset`, `FeatureStore`, `GraphStore`, etc. |
|
|
212
|
+
| [`k3_node.loader`](https://anas-rz.github.io/k3-node/api/loader/) | ✅ 26/26 | `DataLoader`, `NeighborLoader`, `LinkNeighborLoader`, `ClusterLoader`, `GraphSAINTSampler`, `ShaDowKHopSampler`, etc. |
|
|
213
|
+
| [`k3_node.transforms`](https://anas-rz.github.io/k3-node/api/transforms/) | ✅ 62/62 | Topology rewiring, positional encodings (`LapPE`, `RWPE`, `GPSE`), spectral diffusion (`GDC`), and 3D point cloud transforms. |
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
## Testing & Verification
|
|
219
|
+
|
|
220
|
+
Run the comprehensive test suite across backends:
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
# Run all unit tests
|
|
224
|
+
pytest k3_node/
|
|
225
|
+
|
|
226
|
+
# Run training tests (each layer's weights learn; slower, not run in CI)
|
|
227
|
+
pytest tests_training/
|
|
228
|
+
|
|
229
|
+
# Run reference parity check against PyTorch implementations
|
|
230
|
+
pytest tests_reference/
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## License
|
|
236
|
+
|
|
237
|
+
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"""
|
|
2
|
+
`k3_node` is a library for building multibackend graph neural networks.
|
|
3
|
+
Built upon Keras 3.0 the models can be trained using TensorFlow, PyTorch,
|
|
4
|
+
or JAX.
|
|
5
|
+
|
|
6
|
+
To install the package, run:
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
git clone https://github.com/anas-rz/k3-node.git # bash
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
```python
|
|
13
|
+
# in your code
|
|
14
|
+
import sys
|
|
15
|
+
sys.path.append('k3-node')
|
|
16
|
+
|
|
17
|
+
import os
|
|
18
|
+
os.environ['KERAS_BACKEND'] = 'tensorflow' # or 'torch' or 'jax'
|
|
19
|
+
|
|
20
|
+
from k3_node import ...
|
|
21
|
+
```
|
|
22
|
+
"""
|
|
23
|
+
__version__ = "1.0.0"
|
|
24
|
+
|
|
25
|
+
import warnings
|
|
26
|
+
|
|
27
|
+
# Index tensors are requested as int64; without `jax_enable_x64`, JAX stores them as int32
|
|
28
|
+
# (which is all graphs of this size need) and would warn on every conversion.
|
|
29
|
+
warnings.filterwarnings("ignore", message="Explicitly requested dtype int64", category=UserWarning)
|
|
30
|
+
|
|
31
|
+
from k3_node import data
|
|
32
|
+
from k3_node.data import Data, Batch
|
|
33
|
+
from k3_node import datasets
|
|
34
|
+
from k3_node import io
|
|
35
|
+
from k3_node import layers
|
|
36
|
+
from k3_node import loader
|
|
37
|
+
from k3_node import transforms
|
|
38
|
+
from k3_node import models
|
|
39
|
+
from k3_node import applications
|
|
40
|
+
|
|
41
|
+
from k3_node import metrics
|
|
42
|
+
from k3_node import tasks
|
|
43
|
+
from k3_node.tasks import (
|
|
44
|
+
NodeClassifier,
|
|
45
|
+
NodeRegressor,
|
|
46
|
+
GraphClassifier,
|
|
47
|
+
GraphRegressor,
|
|
48
|
+
LinkPredictor,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
from k3_node import etl
|
|
52
|
+
from k3_node.etl import (
|
|
53
|
+
TableToGraph,
|
|
54
|
+
TabularToGraph,
|
|
55
|
+
table_to_graph,
|
|
56
|
+
RelationalToGraph,
|
|
57
|
+
relational_to_graph,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
from k3_node import hub
|
|
61
|
+
from k3_node.hub import (
|
|
62
|
+
from_pretrained,
|
|
63
|
+
push_to_hub,
|
|
64
|
+
save_pretrained,
|
|
65
|
+
load_dataset_from_hub,
|
|
66
|
+
push_dataset_to_hub,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
from k3_node import export
|
|
70
|
+
from k3_node.export import (
|
|
71
|
+
export_onnx,
|
|
72
|
+
export_tflite,
|
|
73
|
+
export_tensorrt,
|
|
74
|
+
generate_triton_config,
|
|
75
|
+
ONNXModel,
|
|
76
|
+
TFLiteModel,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
from k3_node import rag
|
|
80
|
+
from k3_node.layers import kge
|
|
81
|
+
|
|
82
|
+
__all__ = [
|
|
83
|
+
"data",
|
|
84
|
+
"Data",
|
|
85
|
+
"Batch",
|
|
86
|
+
"datasets",
|
|
87
|
+
"io",
|
|
88
|
+
"layers",
|
|
89
|
+
"loader",
|
|
90
|
+
"transforms",
|
|
91
|
+
"models",
|
|
92
|
+
"applications",
|
|
93
|
+
"metrics",
|
|
94
|
+
"tasks",
|
|
95
|
+
"NodeClassifier",
|
|
96
|
+
"NodeRegressor",
|
|
97
|
+
"GraphClassifier",
|
|
98
|
+
"GraphRegressor",
|
|
99
|
+
"LinkPredictor",
|
|
100
|
+
"etl",
|
|
101
|
+
"TableToGraph",
|
|
102
|
+
"TabularToGraph",
|
|
103
|
+
"table_to_graph",
|
|
104
|
+
"RelationalToGraph",
|
|
105
|
+
"relational_to_graph",
|
|
106
|
+
"hub",
|
|
107
|
+
"from_pretrained",
|
|
108
|
+
"push_to_hub",
|
|
109
|
+
"save_pretrained",
|
|
110
|
+
"load_dataset_from_hub",
|
|
111
|
+
"push_dataset_to_hub",
|
|
112
|
+
"export",
|
|
113
|
+
"export_onnx",
|
|
114
|
+
"export_tflite",
|
|
115
|
+
"export_tensorrt",
|
|
116
|
+
"generate_triton_config",
|
|
117
|
+
"ONNXModel",
|
|
118
|
+
"TFLiteModel",
|
|
119
|
+
"rag",
|
|
120
|
+
"kge",
|
|
121
|
+
]
|
|
122
|
+
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""Domain-specific applications built on K3-Node.
|
|
2
|
+
|
|
3
|
+
Submodules:
|
|
4
|
+
- `chemistry`: Molecular graphs, quantum property prediction, SMILES processing, Uni-Mol, AttentiveFP, SchNet, DimeNet.
|
|
5
|
+
- `bio`: Macromolecular structures, protein-protein interactions, docking, UniMolDocking.
|
|
6
|
+
- `materials`: Crystal graph neural networks, periodic boundaries, CHGNet, M3GNet, MEGNet, TensorNet, SO3Net, QET.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from k3_node.applications import bio
|
|
10
|
+
from k3_node.applications import chemistry
|
|
11
|
+
from k3_node.applications import materials
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"bio",
|
|
15
|
+
"chemistry",
|
|
16
|
+
"materials",
|
|
17
|
+
]
|