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.
Files changed (465) hide show
  1. k3_node-1.0.0/LICENSE +21 -0
  2. k3_node-1.0.0/PKG-INFO +284 -0
  3. k3_node-1.0.0/README.md +237 -0
  4. k3_node-1.0.0/k3_node/__init__.py +122 -0
  5. k3_node-1.0.0/k3_node/applications/__init__.py +17 -0
  6. k3_node-1.0.0/k3_node/applications/bio/__init__.py +21 -0
  7. k3_node-1.0.0/k3_node/applications/chemistry/__init__.py +155 -0
  8. k3_node-1.0.0/k3_node/applications/materials/__init__.py +127 -0
  9. k3_node-1.0.0/k3_node/applications/materials/basis.py +449 -0
  10. k3_node-1.0.0/k3_node/applications/materials/chgnet.py +360 -0
  11. k3_node-1.0.0/k3_node/applications/materials/core.py +351 -0
  12. k3_node-1.0.0/k3_node/applications/materials/grace.py +246 -0
  13. k3_node-1.0.0/k3_node/applications/materials/io.py +230 -0
  14. k3_node-1.0.0/k3_node/applications/materials/m3gnet.py +462 -0
  15. k3_node-1.0.0/k3_node/applications/materials/megnet.py +395 -0
  16. k3_node-1.0.0/k3_node/applications/materials/qet.py +220 -0
  17. k3_node-1.0.0/k3_node/applications/materials/readout.py +235 -0
  18. k3_node-1.0.0/k3_node/applications/materials/so3net.py +234 -0
  19. k3_node-1.0.0/k3_node/applications/materials/tensornet.py +381 -0
  20. k3_node-1.0.0/k3_node/applications/materials/test_materials.py +167 -0
  21. k3_node-1.0.0/k3_node/applications/materials/wrappers.py +95 -0
  22. k3_node-1.0.0/k3_node/data/__init__.py +47 -0
  23. k3_node-1.0.0/k3_node/data/batch.py +102 -0
  24. k3_node-1.0.0/k3_node/data/collate.py +282 -0
  25. k3_node-1.0.0/k3_node/data/data.py +532 -0
  26. k3_node-1.0.0/k3_node/data/database.py +154 -0
  27. k3_node-1.0.0/k3_node/data/dataset.py +182 -0
  28. k3_node-1.0.0/k3_node/data/download.py +49 -0
  29. k3_node-1.0.0/k3_node/data/extract.py +45 -0
  30. k3_node-1.0.0/k3_node/data/feature_store.py +70 -0
  31. k3_node-1.0.0/k3_node/data/graph_store.py +92 -0
  32. k3_node-1.0.0/k3_node/data/hetero_data.py +374 -0
  33. k3_node-1.0.0/k3_node/data/hypergraph_data.py +59 -0
  34. k3_node-1.0.0/k3_node/data/in_memory_dataset.py +177 -0
  35. k3_node-1.0.0/k3_node/data/makedirs.py +7 -0
  36. k3_node-1.0.0/k3_node/data/on_disk_dataset.py +77 -0
  37. k3_node-1.0.0/k3_node/data/separate.py +115 -0
  38. k3_node-1.0.0/k3_node/data/storage.py +593 -0
  39. k3_node-1.0.0/k3_node/data/temporal.py +154 -0
  40. k3_node-1.0.0/k3_node/data/test_batch.py +67 -0
  41. k3_node-1.0.0/k3_node/data/test_data.py +68 -0
  42. k3_node-1.0.0/k3_node/data/test_dataset_and_stores.py +111 -0
  43. k3_node-1.0.0/k3_node/data/test_hetero_data.py +33 -0
  44. k3_node-1.0.0/k3_node/data/test_temporal_and_hyper.py +32 -0
  45. k3_node-1.0.0/k3_node/data/view.py +43 -0
  46. k3_node-1.0.0/k3_node/datasets/__init__.py +88 -0
  47. k3_node-1.0.0/k3_node/datasets/actor.py +101 -0
  48. k3_node-1.0.0/k3_node/datasets/airports.py +84 -0
  49. k3_node-1.0.0/k3_node/datasets/amazon.py +66 -0
  50. k3_node-1.0.0/k3_node/datasets/ba2motif_dataset.py +73 -0
  51. k3_node-1.0.0/k3_node/datasets/ba_shapes.py +81 -0
  52. k3_node-1.0.0/k3_node/datasets/bitcoin_otc.py +77 -0
  53. k3_node-1.0.0/k3_node/datasets/citation_full.py +81 -0
  54. k3_node-1.0.0/k3_node/datasets/coauthor.py +66 -0
  55. k3_node-1.0.0/k3_node/datasets/dblp.py +106 -0
  56. k3_node-1.0.0/k3_node/datasets/digits.py +63 -0
  57. k3_node-1.0.0/k3_node/datasets/email_eu_core.py +60 -0
  58. k3_node-1.0.0/k3_node/datasets/entities.py +158 -0
  59. k3_node-1.0.0/k3_node/datasets/explainer_dataset.py +101 -0
  60. k3_node-1.0.0/k3_node/datasets/facebook.py +51 -0
  61. k3_node-1.0.0/k3_node/datasets/fake.py +256 -0
  62. k3_node-1.0.0/k3_node/datasets/freebase.py +90 -0
  63. k3_node-1.0.0/k3_node/datasets/geometric_shapes.py +69 -0
  64. k3_node-1.0.0/k3_node/datasets/github.py +51 -0
  65. k3_node-1.0.0/k3_node/datasets/graph_generator/__init__.py +6 -0
  66. k3_node-1.0.0/k3_node/datasets/graph_generator/ba_graph.py +20 -0
  67. k3_node-1.0.0/k3_node/datasets/graph_generator/base.py +29 -0
  68. k3_node-1.0.0/k3_node/datasets/graph_generator/er_graph.py +21 -0
  69. k3_node-1.0.0/k3_node/datasets/icews.py +58 -0
  70. k3_node-1.0.0/k3_node/datasets/imdb.py +96 -0
  71. k3_node-1.0.0/k3_node/datasets/jodie.py +56 -0
  72. k3_node-1.0.0/k3_node/datasets/karate.py +56 -0
  73. k3_node-1.0.0/k3_node/datasets/lastfm_asia.py +51 -0
  74. k3_node-1.0.0/k3_node/datasets/mesh_correspondence.py +50 -0
  75. k3_node-1.0.0/k3_node/datasets/molecule_net.py +148 -0
  76. k3_node-1.0.0/k3_node/datasets/motif_generator/__init__.py +7 -0
  77. k3_node-1.0.0/k3_node/datasets/motif_generator/base.py +29 -0
  78. k3_node-1.0.0/k3_node/datasets/motif_generator/custom.py +17 -0
  79. k3_node-1.0.0/k3_node/datasets/motif_generator/cycle.py +25 -0
  80. k3_node-1.0.0/k3_node/datasets/motif_generator/house.py +27 -0
  81. k3_node-1.0.0/k3_node/datasets/movielens.py +55 -0
  82. k3_node-1.0.0/k3_node/datasets/planetoid.py +137 -0
  83. k3_node-1.0.0/k3_node/datasets/polblogs.py +63 -0
  84. k3_node-1.0.0/k3_node/datasets/ppi.py +189 -0
  85. k3_node-1.0.0/k3_node/datasets/qm7.py +65 -0
  86. k3_node-1.0.0/k3_node/datasets/qm9.py +132 -0
  87. k3_node-1.0.0/k3_node/datasets/reddit.py +121 -0
  88. k3_node-1.0.0/k3_node/datasets/sbm_dataset.py +165 -0
  89. k3_node-1.0.0/k3_node/datasets/seal.py +74 -0
  90. k3_node-1.0.0/k3_node/datasets/shape_scenes.py +92 -0
  91. k3_node-1.0.0/k3_node/datasets/test_datasets.py +322 -0
  92. k3_node-1.0.0/k3_node/datasets/tu_dataset.py +131 -0
  93. k3_node-1.0.0/k3_node/datasets/twitch.py +66 -0
  94. k3_node-1.0.0/k3_node/datasets/webkb.py +102 -0
  95. k3_node-1.0.0/k3_node/datasets/wikics.py +85 -0
  96. k3_node-1.0.0/k3_node/datasets/word_net.py +184 -0
  97. k3_node-1.0.0/k3_node/etl/__init__.py +37 -0
  98. k3_node-1.0.0/k3_node/etl/encoders.py +248 -0
  99. k3_node-1.0.0/k3_node/etl/graph_builders.py +270 -0
  100. k3_node-1.0.0/k3_node/etl/relational_to_graph.py +201 -0
  101. k3_node-1.0.0/k3_node/etl/table_to_graph.py +244 -0
  102. k3_node-1.0.0/k3_node/etl/test_etl.py +318 -0
  103. k3_node-1.0.0/k3_node/export/__init__.py +15 -0
  104. k3_node-1.0.0/k3_node/export/cross_backend.py +172 -0
  105. k3_node-1.0.0/k3_node/export/onnx_exporter.py +190 -0
  106. k3_node-1.0.0/k3_node/export/runtime.py +254 -0
  107. k3_node-1.0.0/k3_node/export/tensorrt_exporter.py +201 -0
  108. k3_node-1.0.0/k3_node/export/test_export.py +337 -0
  109. k3_node-1.0.0/k3_node/export/tflite_exporter.py +112 -0
  110. k3_node-1.0.0/k3_node/hub/__init__.py +29 -0
  111. k3_node-1.0.0/k3_node/hub/dataset_hub.py +242 -0
  112. k3_node-1.0.0/k3_node/hub/hub_mixin.py +599 -0
  113. k3_node-1.0.0/k3_node/hub/model_card.py +133 -0
  114. k3_node-1.0.0/k3_node/hub/test_hub.py +419 -0
  115. k3_node-1.0.0/k3_node/io/__init__.py +22 -0
  116. k3_node-1.0.0/k3_node/io/fs.py +117 -0
  117. k3_node-1.0.0/k3_node/io/npz.py +45 -0
  118. k3_node-1.0.0/k3_node/io/off.py +29 -0
  119. k3_node-1.0.0/k3_node/io/planetoid.py +98 -0
  120. k3_node-1.0.0/k3_node/io/tu.py +137 -0
  121. k3_node-1.0.0/k3_node/io/txt_array.py +58 -0
  122. k3_node-1.0.0/k3_node/layers/__init__.py +14 -0
  123. k3_node-1.0.0/k3_node/layers/aggr/__init__.py +70 -0
  124. k3_node-1.0.0/k3_node/layers/aggr/attention.py +77 -0
  125. k3_node-1.0.0/k3_node/layers/aggr/base.py +403 -0
  126. k3_node-1.0.0/k3_node/layers/aggr/basic.py +412 -0
  127. k3_node-1.0.0/k3_node/layers/aggr/deep_sets.py +65 -0
  128. k3_node-1.0.0/k3_node/layers/aggr/deepsets.py +29 -0
  129. k3_node-1.0.0/k3_node/layers/aggr/equilibrium.py +107 -0
  130. k3_node-1.0.0/k3_node/layers/aggr/fused.py +43 -0
  131. k3_node-1.0.0/k3_node/layers/aggr/gmt.py +89 -0
  132. k3_node-1.0.0/k3_node/layers/aggr/gru.py +58 -0
  133. k3_node-1.0.0/k3_node/layers/aggr/lcm.py +143 -0
  134. k3_node-1.0.0/k3_node/layers/aggr/lstm.py +58 -0
  135. k3_node-1.0.0/k3_node/layers/aggr/mlp.py +75 -0
  136. k3_node-1.0.0/k3_node/layers/aggr/multi.py +154 -0
  137. k3_node-1.0.0/k3_node/layers/aggr/patch_transformer.py +137 -0
  138. k3_node-1.0.0/k3_node/layers/aggr/quantile.py +125 -0
  139. k3_node-1.0.0/k3_node/layers/aggr/resolver.py +68 -0
  140. k3_node-1.0.0/k3_node/layers/aggr/scaler.py +133 -0
  141. k3_node-1.0.0/k3_node/layers/aggr/set2set.py +87 -0
  142. k3_node-1.0.0/k3_node/layers/aggr/set_transformer.py +107 -0
  143. k3_node-1.0.0/k3_node/layers/aggr/sort.py +68 -0
  144. k3_node-1.0.0/k3_node/layers/aggr/test_aggr.py +337 -0
  145. k3_node-1.0.0/k3_node/layers/aggr/utils.py +210 -0
  146. k3_node-1.0.0/k3_node/layers/aggr/variance_preserving.py +54 -0
  147. k3_node-1.0.0/k3_node/layers/attention/__init__.py +5 -0
  148. k3_node-1.0.0/k3_node/layers/attention/pair_attention.py +448 -0
  149. k3_node-1.0.0/k3_node/layers/attention/performer.py +187 -0
  150. k3_node-1.0.0/k3_node/layers/attention/polynormer.py +160 -0
  151. k3_node-1.0.0/k3_node/layers/attention/qformer.py +143 -0
  152. k3_node-1.0.0/k3_node/layers/attention/sgformer.py +106 -0
  153. k3_node-1.0.0/k3_node/layers/attention/test_attention.py +68 -0
  154. k3_node-1.0.0/k3_node/layers/attention/test_pair_attention.py +91 -0
  155. k3_node-1.0.0/k3_node/layers/conv/__init__.py +149 -0
  156. k3_node-1.0.0/k3_node/layers/conv/agnn_conv.py +120 -0
  157. k3_node-1.0.0/k3_node/layers/conv/antisymmetric_conv.py +94 -0
  158. k3_node-1.0.0/k3_node/layers/conv/appnp.py +105 -0
  159. k3_node-1.0.0/k3_node/layers/conv/appnp_conv.py +157 -0
  160. k3_node-1.0.0/k3_node/layers/conv/arma_conv.py +231 -0
  161. k3_node-1.0.0/k3_node/layers/conv/cg_conv.py +92 -0
  162. k3_node-1.0.0/k3_node/layers/conv/cheb_conv.py +137 -0
  163. k3_node-1.0.0/k3_node/layers/conv/cluster_gcn_conv.py +102 -0
  164. k3_node-1.0.0/k3_node/layers/conv/conv.py +100 -0
  165. k3_node-1.0.0/k3_node/layers/conv/crystal_conv.py +140 -0
  166. k3_node-1.0.0/k3_node/layers/conv/cugraph.py +84 -0
  167. k3_node-1.0.0/k3_node/layers/conv/diffusion_conv.py +144 -0
  168. k3_node-1.0.0/k3_node/layers/conv/dir_gnn_conv.py +93 -0
  169. k3_node-1.0.0/k3_node/layers/conv/dna_conv.py +192 -0
  170. k3_node-1.0.0/k3_node/layers/conv/edge_conv.py +107 -0
  171. k3_node-1.0.0/k3_node/layers/conv/eg_conv.py +155 -0
  172. k3_node-1.0.0/k3_node/layers/conv/fa_conv.py +107 -0
  173. k3_node-1.0.0/k3_node/layers/conv/feast_conv.py +126 -0
  174. k3_node-1.0.0/k3_node/layers/conv/film_conv.py +143 -0
  175. k3_node-1.0.0/k3_node/layers/conv/gat_conv.py +244 -0
  176. k3_node-1.0.0/k3_node/layers/conv/gated_graph_conv.py +136 -0
  177. k3_node-1.0.0/k3_node/layers/conv/gatv2_conv.py +205 -0
  178. k3_node-1.0.0/k3_node/layers/conv/gcn.py +144 -0
  179. k3_node-1.0.0/k3_node/layers/conv/gcn2_conv.py +126 -0
  180. k3_node-1.0.0/k3_node/layers/conv/gcn_conv.py +135 -0
  181. k3_node-1.0.0/k3_node/layers/conv/gen_conv.py +163 -0
  182. k3_node-1.0.0/k3_node/layers/conv/general_conv.py +218 -0
  183. k3_node-1.0.0/k3_node/layers/conv/gin_conv.py +218 -0
  184. k3_node-1.0.0/k3_node/layers/conv/gmm_conv.py +172 -0
  185. k3_node-1.0.0/k3_node/layers/conv/gps_conv.py +153 -0
  186. k3_node-1.0.0/k3_node/layers/conv/graph_attention.py +262 -0
  187. k3_node-1.0.0/k3_node/layers/conv/graph_conv.py +84 -0
  188. k3_node-1.0.0/k3_node/layers/conv/gravnet_conv.py +93 -0
  189. k3_node-1.0.0/k3_node/layers/conv/han_conv.py +175 -0
  190. k3_node-1.0.0/k3_node/layers/conv/heat_conv.py +131 -0
  191. k3_node-1.0.0/k3_node/layers/conv/hetero_conv.py +128 -0
  192. k3_node-1.0.0/k3_node/layers/conv/hgt_conv.py +218 -0
  193. k3_node-1.0.0/k3_node/layers/conv/hypergraph_conv.py +182 -0
  194. k3_node-1.0.0/k3_node/layers/conv/le_conv.py +81 -0
  195. k3_node-1.0.0/k3_node/layers/conv/lg_conv.py +58 -0
  196. k3_node-1.0.0/k3_node/layers/conv/meshcnn_conv.py +84 -0
  197. k3_node-1.0.0/k3_node/layers/conv/message_passing.py +451 -0
  198. k3_node-1.0.0/k3_node/layers/conv/mf_conv.py +95 -0
  199. k3_node-1.0.0/k3_node/layers/conv/mixhop_conv.py +108 -0
  200. k3_node-1.0.0/k3_node/layers/conv/nn_conv.py +110 -0
  201. k3_node-1.0.0/k3_node/layers/conv/pan_conv.py +100 -0
  202. k3_node-1.0.0/k3_node/layers/conv/pdn_conv.py +109 -0
  203. k3_node-1.0.0/k3_node/layers/conv/pna_conv.py +177 -0
  204. k3_node-1.0.0/k3_node/layers/conv/point_conv.py +101 -0
  205. k3_node-1.0.0/k3_node/layers/conv/point_gnn_conv.py +90 -0
  206. k3_node-1.0.0/k3_node/layers/conv/point_transformer_conv.py +132 -0
  207. k3_node-1.0.0/k3_node/layers/conv/ppf_conv.py +135 -0
  208. k3_node-1.0.0/k3_node/layers/conv/ppnp.py +89 -0
  209. k3_node-1.0.0/k3_node/layers/conv/res_gated_graph_conv.py +126 -0
  210. k3_node-1.0.0/k3_node/layers/conv/rgat_conv.py +251 -0
  211. k3_node-1.0.0/k3_node/layers/conv/rgcn_conv.py +321 -0
  212. k3_node-1.0.0/k3_node/layers/conv/sage_conv.py +154 -0
  213. k3_node-1.0.0/k3_node/layers/conv/sg_conv.py +96 -0
  214. k3_node-1.0.0/k3_node/layers/conv/signed_conv.py +100 -0
  215. k3_node-1.0.0/k3_node/layers/conv/simple_conv.py +75 -0
  216. k3_node-1.0.0/k3_node/layers/conv/spline_conv.py +182 -0
  217. k3_node-1.0.0/k3_node/layers/conv/ssg_conv.py +101 -0
  218. k3_node-1.0.0/k3_node/layers/conv/supergat_conv.py +195 -0
  219. k3_node-1.0.0/k3_node/layers/conv/tag_conv.py +98 -0
  220. k3_node-1.0.0/k3_node/layers/conv/test_backend_consistency.py +164 -0
  221. k3_node-1.0.0/k3_node/layers/conv/test_conv.py +176 -0
  222. k3_node-1.0.0/k3_node/layers/conv/test_conv_pyg.py +566 -0
  223. k3_node-1.0.0/k3_node/layers/conv/transformer_conv.py +168 -0
  224. k3_node-1.0.0/k3_node/layers/conv/utils.py +403 -0
  225. k3_node-1.0.0/k3_node/layers/conv/wl_conv.py +151 -0
  226. k3_node-1.0.0/k3_node/layers/conv/x_conv.py +187 -0
  227. k3_node-1.0.0/k3_node/layers/dense/__init__.py +40 -0
  228. k3_node-1.0.0/k3_node/layers/dense/dense_gat_conv.py +149 -0
  229. k3_node-1.0.0/k3_node/layers/dense/dense_gcn_conv.py +117 -0
  230. k3_node-1.0.0/k3_node/layers/dense/dense_gin_conv.py +88 -0
  231. k3_node-1.0.0/k3_node/layers/dense/dense_graph_conv.py +95 -0
  232. k3_node-1.0.0/k3_node/layers/dense/dense_sage_conv.py +85 -0
  233. k3_node-1.0.0/k3_node/layers/dense/diff_pool.py +76 -0
  234. k3_node-1.0.0/k3_node/layers/dense/dmon_pool.py +223 -0
  235. k3_node-1.0.0/k3_node/layers/dense/linear.py +327 -0
  236. k3_node-1.0.0/k3_node/layers/dense/mincut_pool.py +92 -0
  237. k3_node-1.0.0/k3_node/layers/dense/test_dense.py +377 -0
  238. k3_node-1.0.0/k3_node/layers/functional/__init__.py +13 -0
  239. k3_node-1.0.0/k3_node/layers/functional/bro.py +49 -0
  240. k3_node-1.0.0/k3_node/layers/functional/edge_dropout.py +55 -0
  241. k3_node-1.0.0/k3_node/layers/functional/gini.py +44 -0
  242. k3_node-1.0.0/k3_node/layers/functional/test_functional.py +34 -0
  243. k3_node-1.0.0/k3_node/layers/kge/__init__.py +17 -0
  244. k3_node-1.0.0/k3_node/layers/kge/base.py +255 -0
  245. k3_node-1.0.0/k3_node/layers/kge/complex.py +98 -0
  246. k3_node-1.0.0/k3_node/layers/kge/distmult.py +79 -0
  247. k3_node-1.0.0/k3_node/layers/kge/loader.py +50 -0
  248. k3_node-1.0.0/k3_node/layers/kge/rotate.py +103 -0
  249. k3_node-1.0.0/k3_node/layers/kge/test_kge.py +76 -0
  250. k3_node-1.0.0/k3_node/layers/kge/transe.py +96 -0
  251. k3_node-1.0.0/k3_node/layers/norm/__init__.py +23 -0
  252. k3_node-1.0.0/k3_node/layers/norm/batch_norm.py +328 -0
  253. k3_node-1.0.0/k3_node/layers/norm/diff_group_norm.py +141 -0
  254. k3_node-1.0.0/k3_node/layers/norm/graph_norm.py +105 -0
  255. k3_node-1.0.0/k3_node/layers/norm/graph_size_norm.py +57 -0
  256. k3_node-1.0.0/k3_node/layers/norm/instance_norm.py +163 -0
  257. k3_node-1.0.0/k3_node/layers/norm/layer_norm.py +245 -0
  258. k3_node-1.0.0/k3_node/layers/norm/mean_subtraction_norm.py +57 -0
  259. k3_node-1.0.0/k3_node/layers/norm/msg_norm.py +58 -0
  260. k3_node-1.0.0/k3_node/layers/norm/pair_norm.py +94 -0
  261. k3_node-1.0.0/k3_node/layers/norm/test_norm.py +275 -0
  262. k3_node-1.0.0/k3_node/layers/pool/__init__.py +83 -0
  263. k3_node-1.0.0/k3_node/layers/pool/approx_knn.py +101 -0
  264. k3_node-1.0.0/k3_node/layers/pool/asap.py +173 -0
  265. k3_node-1.0.0/k3_node/layers/pool/avg_pool.py +165 -0
  266. k3_node-1.0.0/k3_node/layers/pool/cluster_pool.py +168 -0
  267. k3_node-1.0.0/k3_node/layers/pool/connect/__init__.py +10 -0
  268. k3_node-1.0.0/k3_node/layers/pool/connect/base.py +103 -0
  269. k3_node-1.0.0/k3_node/layers/pool/connect/filter_edges.py +113 -0
  270. k3_node-1.0.0/k3_node/layers/pool/consecutive.py +30 -0
  271. k3_node-1.0.0/k3_node/layers/pool/decimation.py +48 -0
  272. k3_node-1.0.0/k3_node/layers/pool/edge_pool.py +189 -0
  273. k3_node-1.0.0/k3_node/layers/pool/glob.py +139 -0
  274. k3_node-1.0.0/k3_node/layers/pool/graclus.py +66 -0
  275. k3_node-1.0.0/k3_node/layers/pool/knn.py +253 -0
  276. k3_node-1.0.0/k3_node/layers/pool/max_pool.py +159 -0
  277. k3_node-1.0.0/k3_node/layers/pool/mem_pool.py +145 -0
  278. k3_node-1.0.0/k3_node/layers/pool/pan_pool.py +144 -0
  279. k3_node-1.0.0/k3_node/layers/pool/point_cloud.py +212 -0
  280. k3_node-1.0.0/k3_node/layers/pool/pool.py +119 -0
  281. k3_node-1.0.0/k3_node/layers/pool/sag_pool.py +174 -0
  282. k3_node-1.0.0/k3_node/layers/pool/select/__init__.py +10 -0
  283. k3_node-1.0.0/k3_node/layers/pool/select/base.py +112 -0
  284. k3_node-1.0.0/k3_node/layers/pool/select/topk.py +206 -0
  285. k3_node-1.0.0/k3_node/layers/pool/test_pool.py +456 -0
  286. k3_node-1.0.0/k3_node/layers/pool/topk_pool.py +103 -0
  287. k3_node-1.0.0/k3_node/layers/pool/voxel_grid.py +70 -0
  288. k3_node-1.0.0/k3_node/layers/unpool/__init__.py +9 -0
  289. k3_node-1.0.0/k3_node/layers/unpool/knn_interpolate.py +57 -0
  290. k3_node-1.0.0/k3_node/layers/unpool/test_unpool.py +31 -0
  291. k3_node-1.0.0/k3_node/loader/__init__.py +62 -0
  292. k3_node-1.0.0/k3_node/loader/base.py +69 -0
  293. k3_node-1.0.0/k3_node/loader/cache.py +68 -0
  294. k3_node-1.0.0/k3_node/loader/cluster.py +127 -0
  295. k3_node-1.0.0/k3_node/loader/data_list_loader.py +45 -0
  296. k3_node-1.0.0/k3_node/loader/dataloader.py +117 -0
  297. k3_node-1.0.0/k3_node/loader/dense_data_loader.py +62 -0
  298. k3_node-1.0.0/k3_node/loader/dynamic_batch_sampler.py +93 -0
  299. k3_node-1.0.0/k3_node/loader/graph_saint.py +188 -0
  300. k3_node-1.0.0/k3_node/loader/hgt_loader.py +90 -0
  301. k3_node-1.0.0/k3_node/loader/imbalanced_sampler.py +87 -0
  302. k3_node-1.0.0/k3_node/loader/keras_dataset.py +334 -0
  303. k3_node-1.0.0/k3_node/loader/link_loader.py +179 -0
  304. k3_node-1.0.0/k3_node/loader/link_neighbor_loader.py +202 -0
  305. k3_node-1.0.0/k3_node/loader/mixin.py +190 -0
  306. k3_node-1.0.0/k3_node/loader/neighbor_loader.py +159 -0
  307. k3_node-1.0.0/k3_node/loader/neighbor_sampler.py +167 -0
  308. k3_node-1.0.0/k3_node/loader/node_loader.py +185 -0
  309. k3_node-1.0.0/k3_node/loader/prefetch.py +115 -0
  310. k3_node-1.0.0/k3_node/loader/random_node_loader.py +89 -0
  311. k3_node-1.0.0/k3_node/loader/sampler_utils.py +499 -0
  312. k3_node-1.0.0/k3_node/loader/shadow.py +115 -0
  313. k3_node-1.0.0/k3_node/loader/temporal_dataloader.py +98 -0
  314. k3_node-1.0.0/k3_node/loader/test_dataloader.py +113 -0
  315. k3_node-1.0.0/k3_node/loader/test_keras_dataset.py +221 -0
  316. k3_node-1.0.0/k3_node/loader/test_neighbor_loader.py +122 -0
  317. k3_node-1.0.0/k3_node/loader/test_sampler_utils.py +82 -0
  318. k3_node-1.0.0/k3_node/loader/test_samplers.py +96 -0
  319. k3_node-1.0.0/k3_node/loader/test_subgraph_loaders.py +89 -0
  320. k3_node-1.0.0/k3_node/loader/utils.py +232 -0
  321. k3_node-1.0.0/k3_node/loader/zip_loader.py +88 -0
  322. k3_node-1.0.0/k3_node/metrics.py +94 -0
  323. k3_node-1.0.0/k3_node/models/__init__.py +424 -0
  324. k3_node-1.0.0/k3_node/models/attentive_fp.py +232 -0
  325. k3_node-1.0.0/k3_node/models/attract_repel.py +108 -0
  326. k3_node-1.0.0/k3_node/models/autoencoder.py +318 -0
  327. k3_node-1.0.0/k3_node/models/basic_gnn.py +443 -0
  328. k3_node-1.0.0/k3_node/models/bio/__init__.py +4 -0
  329. k3_node-1.0.0/k3_node/models/captum.py +52 -0
  330. k3_node-1.0.0/k3_node/models/chemistry/__init__.py +4 -0
  331. k3_node-1.0.0/k3_node/models/correct_and_smooth.py +146 -0
  332. k3_node-1.0.0/k3_node/models/deep_graph_infomax.py +113 -0
  333. k3_node-1.0.0/k3_node/models/deepgcn.py +121 -0
  334. k3_node-1.0.0/k3_node/models/dimenet.py +737 -0
  335. k3_node-1.0.0/k3_node/models/dimenet_utils.py +153 -0
  336. k3_node-1.0.0/k3_node/models/gnnff.py +263 -0
  337. k3_node-1.0.0/k3_node/models/gps_model.py +1122 -0
  338. k3_node-1.0.0/k3_node/models/gpse.py +638 -0
  339. k3_node-1.0.0/k3_node/models/graph_unet.py +199 -0
  340. k3_node-1.0.0/k3_node/models/graphmae2.py +954 -0
  341. k3_node-1.0.0/k3_node/models/graphormer.py +1258 -0
  342. k3_node-1.0.0/k3_node/models/graphormer_3d.py +868 -0
  343. k3_node-1.0.0/k3_node/models/grover.py +1066 -0
  344. k3_node-1.0.0/k3_node/models/jumping_knowledge.py +200 -0
  345. k3_node-1.0.0/k3_node/models/label_prop.py +110 -0
  346. k3_node-1.0.0/k3_node/models/lightgcn.py +171 -0
  347. k3_node-1.0.0/k3_node/models/linkx.py +181 -0
  348. k3_node-1.0.0/k3_node/models/lpformer.py +404 -0
  349. k3_node-1.0.0/k3_node/models/mask_label.py +114 -0
  350. k3_node-1.0.0/k3_node/models/materials/__init__.py +33 -0
  351. k3_node-1.0.0/k3_node/models/meta.py +133 -0
  352. k3_node-1.0.0/k3_node/models/metapath2vec.py +234 -0
  353. k3_node-1.0.0/k3_node/models/mlp.py +264 -0
  354. k3_node-1.0.0/k3_node/models/mole_bert.py +379 -0
  355. k3_node-1.0.0/k3_node/models/neural_fingerprint.py +95 -0
  356. k3_node-1.0.0/k3_node/models/node2vec.py +213 -0
  357. k3_node-1.0.0/k3_node/models/pmlp.py +157 -0
  358. k3_node-1.0.0/k3_node/models/polynormer.py +229 -0
  359. k3_node-1.0.0/k3_node/models/rect.py +93 -0
  360. k3_node-1.0.0/k3_node/models/renet.py +221 -0
  361. k3_node-1.0.0/k3_node/models/rev_gnn.py +128 -0
  362. k3_node-1.0.0/k3_node/models/schnet.py +484 -0
  363. k3_node-1.0.0/k3_node/models/sgformer.py +195 -0
  364. k3_node-1.0.0/k3_node/models/signed_gcn.py +185 -0
  365. k3_node-1.0.0/k3_node/models/test_attentive_fp.py +32 -0
  366. k3_node-1.0.0/k3_node/models/test_attract_repel.py +33 -0
  367. k3_node-1.0.0/k3_node/models/test_autoencoder.py +119 -0
  368. k3_node-1.0.0/k3_node/models/test_basic_gnn.py +102 -0
  369. k3_node-1.0.0/k3_node/models/test_correct_and_smooth.py +40 -0
  370. k3_node-1.0.0/k3_node/models/test_deep_graph_infomax.py +68 -0
  371. k3_node-1.0.0/k3_node/models/test_deepgcn.py +21 -0
  372. k3_node-1.0.0/k3_node/models/test_dimenet.py +86 -0
  373. k3_node-1.0.0/k3_node/models/test_domain_apis.py +138 -0
  374. k3_node-1.0.0/k3_node/models/test_gnnff.py +24 -0
  375. k3_node-1.0.0/k3_node/models/test_gps_model.py +271 -0
  376. k3_node-1.0.0/k3_node/models/test_gpse.py +34 -0
  377. k3_node-1.0.0/k3_node/models/test_graph_unet.py +26 -0
  378. k3_node-1.0.0/k3_node/models/test_graphmae2.py +226 -0
  379. k3_node-1.0.0/k3_node/models/test_graphormer.py +233 -0
  380. k3_node-1.0.0/k3_node/models/test_graphormer3d.py +163 -0
  381. k3_node-1.0.0/k3_node/models/test_grover.py +287 -0
  382. k3_node-1.0.0/k3_node/models/test_jumping_knowledge.py +129 -0
  383. k3_node-1.0.0/k3_node/models/test_label_prop.py +37 -0
  384. k3_node-1.0.0/k3_node/models/test_lightgcn.py +38 -0
  385. k3_node-1.0.0/k3_node/models/test_linkx.py +31 -0
  386. k3_node-1.0.0/k3_node/models/test_lpformer.py +22 -0
  387. k3_node-1.0.0/k3_node/models/test_mask_label.py +90 -0
  388. k3_node-1.0.0/k3_node/models/test_meta.py +159 -0
  389. k3_node-1.0.0/k3_node/models/test_metapath2vec.py +45 -0
  390. k3_node-1.0.0/k3_node/models/test_mlp.py +62 -0
  391. k3_node-1.0.0/k3_node/models/test_mole_bert.py +164 -0
  392. k3_node-1.0.0/k3_node/models/test_neural_fingerprint.py +13 -0
  393. k3_node-1.0.0/k3_node/models/test_node2vec.py +57 -0
  394. k3_node-1.0.0/k3_node/models/test_pmlp.py +81 -0
  395. k3_node-1.0.0/k3_node/models/test_polynormer.py +104 -0
  396. k3_node-1.0.0/k3_node/models/test_rect.py +23 -0
  397. k3_node-1.0.0/k3_node/models/test_renet.py +32 -0
  398. k3_node-1.0.0/k3_node/models/test_rev_gnn.py +24 -0
  399. k3_node-1.0.0/k3_node/models/test_schnet.py +43 -0
  400. k3_node-1.0.0/k3_node/models/test_sgformer.py +48 -0
  401. k3_node-1.0.0/k3_node/models/test_signed_gcn.py +28 -0
  402. k3_node-1.0.0/k3_node/models/test_tgn.py +77 -0
  403. k3_node-1.0.0/k3_node/models/test_unimol.py +179 -0
  404. k3_node-1.0.0/k3_node/models/test_unimol2.py +114 -0
  405. k3_node-1.0.0/k3_node/models/test_unimol_plus.py +131 -0
  406. k3_node-1.0.0/k3_node/models/test_visnet.py +44 -0
  407. k3_node-1.0.0/k3_node/models/tgn.py +382 -0
  408. k3_node-1.0.0/k3_node/models/unimol.py +1156 -0
  409. k3_node-1.0.0/k3_node/models/unimol2.py +616 -0
  410. k3_node-1.0.0/k3_node/models/unimol_docking_v2.py +301 -0
  411. k3_node-1.0.0/k3_node/models/unimol_plus.py +456 -0
  412. k3_node-1.0.0/k3_node/models/utils.py +97 -0
  413. k3_node-1.0.0/k3_node/models/visnet.py +759 -0
  414. k3_node-1.0.0/k3_node/ops/__init__.py +4 -0
  415. k3_node-1.0.0/k3_node/ops/conv.py +56 -0
  416. k3_node-1.0.0/k3_node/ops/creation.py +43 -0
  417. k3_node-1.0.0/k3_node/ops/graph.py +27 -0
  418. k3_node-1.0.0/k3_node/ops/host.py +41 -0
  419. k3_node-1.0.0/k3_node/ops/matmul.py +49 -0
  420. k3_node-1.0.0/k3_node/ops/numpy.py +24 -0
  421. k3_node-1.0.0/k3_node/ops/segment.py +54 -0
  422. k3_node-1.0.0/k3_node/ops/sparse.py +51 -0
  423. k3_node-1.0.0/k3_node/rag/__init__.py +49 -0
  424. k3_node-1.0.0/k3_node/rag/encoders.py +312 -0
  425. k3_node-1.0.0/k3_node/rag/pipeline.py +192 -0
  426. k3_node-1.0.0/k3_node/rag/projector.py +184 -0
  427. k3_node-1.0.0/k3_node/rag/subgraph.py +270 -0
  428. k3_node-1.0.0/k3_node/rag/test_rag.py +347 -0
  429. k3_node-1.0.0/k3_node/rag/verbalizer.py +162 -0
  430. k3_node-1.0.0/k3_node/tasks/__init__.py +19 -0
  431. k3_node-1.0.0/k3_node/tasks/backbone_resolver.py +125 -0
  432. k3_node-1.0.0/k3_node/tasks/base.py +67 -0
  433. k3_node-1.0.0/k3_node/tasks/graph_classification.py +270 -0
  434. k3_node-1.0.0/k3_node/tasks/graph_regression.py +228 -0
  435. k3_node-1.0.0/k3_node/tasks/link_prediction.py +306 -0
  436. k3_node-1.0.0/k3_node/tasks/node_classification.py +194 -0
  437. k3_node-1.0.0/k3_node/tasks/node_regression.py +138 -0
  438. k3_node-1.0.0/k3_node/tasks/test_tasks.py +319 -0
  439. k3_node-1.0.0/k3_node/test_docstring_examples.py +106 -0
  440. k3_node-1.0.0/k3_node/test_training_forwarding.py +116 -0
  441. k3_node-1.0.0/k3_node/training.py +115 -0
  442. k3_node-1.0.0/k3_node/transforms/__init__.py +166 -0
  443. k3_node-1.0.0/k3_node/transforms/base_transform.py +32 -0
  444. k3_node-1.0.0/k3_node/transforms/compose.py +58 -0
  445. k3_node-1.0.0/k3_node/transforms/general.py +676 -0
  446. k3_node-1.0.0/k3_node/transforms/graph.py +1070 -0
  447. k3_node-1.0.0/k3_node/transforms/spatial.py +797 -0
  448. k3_node-1.0.0/k3_node/transforms/test_random_link_split.py +45 -0
  449. k3_node-1.0.0/k3_node/transforms/test_spatial_transforms.py +65 -0
  450. k3_node-1.0.0/k3_node/transforms/test_transforms.py +253 -0
  451. k3_node-1.0.0/k3_node/transforms/utils.py +102 -0
  452. k3_node-1.0.0/k3_node/utils/__init__.py +5 -0
  453. k3_node-1.0.0/k3_node/utils/backend_import.py +12 -0
  454. k3_node-1.0.0/k3_node/utils/graph.py +286 -0
  455. k3_node-1.0.0/k3_node/utils/keras.py +94 -0
  456. k3_node-1.0.0/k3_node/utils/random.py +103 -0
  457. k3_node-1.0.0/k3_node/utils/smiles.py +235 -0
  458. k3_node-1.0.0/k3_node.egg-info/PKG-INFO +284 -0
  459. k3_node-1.0.0/k3_node.egg-info/SOURCES.txt +463 -0
  460. k3_node-1.0.0/k3_node.egg-info/dependency_links.txt +1 -0
  461. k3_node-1.0.0/k3_node.egg-info/requires.txt +39 -0
  462. k3_node-1.0.0/k3_node.egg-info/top_level.txt +1 -0
  463. k3_node-1.0.0/pyproject.toml +65 -0
  464. k3_node-1.0.0/setup.cfg +4 -0
  465. 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.
@@ -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
+ ]