k3-node 1.0.0__py3-none-any.whl

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