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,45 @@
1
+ import numpy as np
2
+ from keras import ops
3
+
4
+ from k3_node.data import Data
5
+ from k3_node.transforms import RandomLinkSplit
6
+
7
+
8
+ def _graph():
9
+ rng = np.random.default_rng(0)
10
+ edge_index = rng.integers(0, 60, size=(2, 200))
11
+ return Data(x=rng.random((60, 4)).astype("float32"), edge_index=edge_index, num_nodes=60)
12
+
13
+
14
+ def _np(x):
15
+ return np.asarray(ops.convert_to_numpy(x))
16
+
17
+
18
+ def test_edge_labels_include_negatives():
19
+ train, val, test = RandomLinkSplit(num_val=0.1, num_test=0.2)(_graph())
20
+ for split, n_pos in ((train, 140), (val, 20), (test, 40)):
21
+ label = _np(split.edge_label)
22
+ assert label.dtype == np.float32
23
+ assert label.sum() == n_pos and (label == 0).sum() == n_pos # one negative per positive
24
+ assert _np(split.edge_label_index).shape == (2, 2 * n_pos)
25
+ # message passing edges: training edges for train/val, plus validation edges for test
26
+ assert _np(train.edge_index).shape[1] == 140 and _np(test.edge_index).shape[1] == 160
27
+
28
+
29
+ def test_no_train_negatives_and_ratio():
30
+ train, val, _ = RandomLinkSplit(num_val=0.1, num_test=0.2, add_negative_train_samples=False,
31
+ neg_sampling_ratio=2.0)(_graph())
32
+ assert (_np(train.edge_label) == 0).sum() == 0
33
+ assert (_np(val.edge_label) == 0).sum() == 40
34
+
35
+
36
+ def test_split_labels_and_undirected():
37
+ edge_index = _np(_graph().edge_index)
38
+ edge_index = np.unique(np.sort(edge_index, axis=0), axis=1)
39
+ edge_index = edge_index[:, edge_index[0] != edge_index[1]]
40
+ data = Data(edge_index=np.concatenate([edge_index, edge_index[::-1]], axis=1), num_nodes=60)
41
+ train, val, test = RandomLinkSplit(num_val=0.1, num_test=0.2, is_undirected=True, split_labels=True)(data)
42
+ n = edge_index.shape[1]
43
+ assert _np(val.pos_edge_label_index).shape[1] == int(0.1 * n)
44
+ assert _np(val.neg_edge_label_index).shape[1] == int(0.1 * n)
45
+ assert _np(train.edge_index).shape[1] == 2 * _np(train.pos_edge_label_index).shape[1]
@@ -0,0 +1,65 @@
1
+ """Spatial transforms on every backend: inputs may be NumPy arrays or backend tensors."""
2
+ import numpy as np
3
+ import pytest
4
+ from keras import ops
5
+
6
+ import k3_node.transforms as T
7
+ from k3_node.data import Data
8
+
9
+
10
+ def _data(as_tensor):
11
+ conv = ops.convert_to_tensor if as_tensor else np.asarray
12
+ pos = conv(np.array([[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0]], dtype="float32"))
13
+ edge_index = conv(np.array([[0, 1, 1, 2], [1, 0, 2, 1]], dtype="int64"))
14
+ face = conv(np.array([[0], [1], [2]], dtype="int64"))
15
+ return Data(pos=pos, edge_index=edge_index, face=face, num_nodes=3)
16
+
17
+
18
+ @pytest.mark.parametrize("as_tensor", [False, True])
19
+ def test_spatial_transforms_all_backends(as_tensor):
20
+ data = _data(as_tensor)
21
+ np_ = ops.convert_to_numpy
22
+
23
+ assert tuple(T.Distance(norm=False)(data).edge_attr.shape) == (4, 1)
24
+ cart = T.Cartesian(norm=False)(data).edge_attr
25
+ assert tuple(cart.shape) == (4, 3)
26
+ np.testing.assert_allclose(np_(cart)[0], [-1.0, 0.0, 0.0])
27
+ assert str(np_(cart).dtype) == "float32"
28
+ assert tuple(T.Cartesian()(T.Distance()(data)).edge_attr.shape) == (4, 4) # cat=True appends
29
+ assert tuple(T.LocalCartesian()(data).edge_attr.shape) == (4, 3)
30
+
31
+ data_2d = Data(pos=data.pos[:, :2], edge_index=data.edge_index)
32
+ assert tuple(T.Polar()(data_2d).edge_attr.shape) == (4, 2)
33
+ assert tuple(T.Spherical()(data).edge_attr.shape) == (4, 3)
34
+
35
+ np.testing.assert_allclose(np_(T.Center()(data).pos).mean(0), np.zeros(3), atol=1e-6)
36
+ assert np.abs(np_(T.NormalizeScale()(data).pos)).max() <= 1.0
37
+ assert tuple(T.NormalizeRotation(sort=True)(data).pos.shape) == (3, 3)
38
+
39
+ assert tuple(T.RandomJitter(0.1)(data).pos.shape) == (3, 3)
40
+ np.testing.assert_allclose(np_(T.RandomFlip(axis=0, p=1.0)(data).pos)[:, 0], -np_(data.pos)[:, 0])
41
+ np.testing.assert_allclose(np_(T.RandomScale((1.5, 1.5))(data).pos), np_(data.pos) * 1.5)
42
+ rot = T.RandomRotate(degrees=(90, 90), axis=2)(data).pos
43
+ np.testing.assert_allclose(np.linalg.norm(np_(rot), axis=1), np.linalg.norm(np_(data.pos), axis=1), atol=1e-6)
44
+ assert tuple(T.RandomShear(0.1)(data).pos.shape) == (3, 3)
45
+
46
+ f2e = T.FaceToEdge()(data)
47
+ assert f2e.face is None and tuple(f2e.edge_index.shape) == (2, 6)
48
+
49
+ mesh = T.GenerateMeshNormals()(data)
50
+ np.testing.assert_allclose(np.abs(np_(mesh.norm)[:, 2]), np.ones(3), atol=1e-6)
51
+ ppf = T.PointPairFeatures()(Data(pos=data.pos, norm=mesh.norm, edge_index=data.edge_index))
52
+ assert tuple(ppf.edge_attr.shape) == (4, 4)
53
+
54
+ sampled = T.SamplePoints(16, include_normals=True)(data)
55
+ assert tuple(sampled.pos.shape) == (16, 3) and tuple(sampled.normal.shape) == (16, 3)
56
+ assert np.all(np.abs(np_(sampled.pos)[:, 2]) < 1e-6) # all samples lie on the triangle's plane
57
+
58
+ fixed = T.FixedPoints(2)(data)
59
+ assert tuple(fixed.pos.shape) == (2, 3) and fixed.num_nodes == 2
60
+
61
+ grid = T.GridSampling(size=0.5)(Data(pos=data.pos))
62
+ assert grid.num_nodes == 3
63
+
64
+ square = Data(pos=np.array([[0.0, 0.0], [1.0, 0.0], [0.0, 1.0], [1.0, 1.0]], dtype="float32"))
65
+ assert tuple(T.Delaunay()(square).face.shape) == (3, 2)
@@ -0,0 +1,253 @@
1
+ import math
2
+ import numpy as np
3
+ import pytest
4
+
5
+ try:
6
+ import torch
7
+ except ImportError:
8
+ torch = None
9
+
10
+ if torch is None:
11
+ pytest.skip("PyTorch is required for transforms unit tests", allow_module_level=True)
12
+
13
+ import k3_node.transforms as T
14
+ from k3_node.data import Data, HeteroData
15
+
16
+
17
+ def test_compose():
18
+ data = Data(x=torch.ones((4, 2)), edge_index=torch.tensor([[0, 1], [1, 2]]))
19
+ transform = T.Compose([
20
+ T.Constant(value=2.0, cat=False),
21
+ T.AddSelfLoops(),
22
+ ])
23
+ out = transform(data)
24
+ assert out.x.shape == (4, 1)
25
+ assert out.x[0, 0].item() == 2.0
26
+ assert out.edge_index.shape[1] == 2 + 4
27
+
28
+
29
+ def test_compose_filters():
30
+ data1 = Data(num_nodes=5)
31
+ data2 = Data(num_nodes=2)
32
+ filt = T.ComposeFilters([lambda d: d.num_nodes > 3])
33
+ assert filt(data1) is True
34
+ assert filt(data2) is False
35
+
36
+
37
+ def test_general_transforms():
38
+ x = torch.tensor([[1.0, 2.0], [3.0, 4.0]], dtype=torch.float32)
39
+ edge_index = torch.tensor([[0, 1], [1, 0]], dtype=torch.long)
40
+ data = Data(x=x, edge_index=edge_index)
41
+
42
+ # Constant
43
+ d_const = T.Constant(value=5.0, cat=True)(data)
44
+ assert d_const.x.shape == (2, 3)
45
+
46
+ # NormalizeFeatures
47
+ d_norm = T.NormalizeFeatures()(data)
48
+ assert torch.allclose(d_norm.x.sum(dim=-1), torch.tensor([1.0, 1.0]))
49
+
50
+ # SVDFeatureReduction
51
+ d_svd = T.SVDFeatureReduction(out_channels=1)(data)
52
+ assert d_svd.x.shape == (2, 1)
53
+
54
+ # IndexToMask & MaskToIndex
55
+ data_idx = Data(num_nodes=4, train_index=torch.tensor([0, 2]))
56
+ d_mask = T.IndexToMask(attrs='train_index')(data_idx)
57
+ assert hasattr(d_mask, 'train_mask')
58
+ assert d_mask.train_mask.tolist() == [True, False, True, False]
59
+ d_idx2 = T.MaskToIndex(attrs='train_mask')(d_mask)
60
+ assert hasattr(d_idx2, 'train_index')
61
+ assert d_idx2.train_index.tolist() == [0, 2]
62
+
63
+ # Pad
64
+ d_pad = T.Pad(max_num_nodes=5)(data)
65
+ assert d_pad.x.shape == (5, 2)
66
+ assert d_pad.num_nodes == 5
67
+
68
+ # RandomNodeSplit
69
+ data_nodes = Data(num_nodes=10, y=torch.tensor([0, 1] * 5))
70
+ d_split = T.RandomNodeSplit(split='train_rest', num_val=2, num_test=2)(data_nodes)
71
+ assert d_split.train_mask.sum() == 6
72
+ assert d_split.val_mask.sum() == 2
73
+ assert d_split.test_mask.sum() == 2
74
+
75
+ # RemoveTrainingClasses
76
+ data_cls = Data(y=torch.tensor([0, 1, 2, 0, 1, 2]))
77
+ d_rem = T.RemoveTrainingClasses(classes=[0])(data_cls)
78
+ assert (d_rem.y == 0).sum() == 0
79
+
80
+ # ToSparseTensor
81
+ d_adj = T.ToSparseTensor()(data)
82
+ assert hasattr(d_adj, 'adj_t')
83
+
84
+
85
+ def test_graph_transforms():
86
+ edge_index = torch.tensor([[0, 1, 1], [1, 0, 2]], dtype=torch.long)
87
+ x = torch.randn(3, 4)
88
+ data = Data(x=x, edge_index=edge_index, num_nodes=3)
89
+
90
+ # ToUndirected
91
+ d_undir = T.ToUndirected()(data)
92
+ assert d_undir.is_undirected()
93
+
94
+ # OneHotDegree
95
+ d_ohd = T.OneHotDegree(max_degree=3)(data)
96
+ assert d_ohd.x.shape[0] == 3
97
+
98
+ # TargetIndegree
99
+ d_tid = T.TargetIndegree()(data)
100
+ assert d_tid.edge_attr is not None
101
+
102
+ # LocalDegreeProfile
103
+ d_ldp = T.LocalDegreeProfile()(data)
104
+ assert d_ldp.x.shape == (3, 4 + 5)
105
+
106
+ # AddSelfLoops & RemoveSelfLoops
107
+ d_sl = T.AddSelfLoops()(data)
108
+ assert d_sl.edge_index.shape[1] == 3 + 3
109
+ d_rem_sl = T.RemoveSelfLoops()(d_sl)
110
+ assert d_rem_sl.edge_index.shape[1] == 3
111
+
112
+ # RemoveIsolatedNodes
113
+ data_iso = Data(edge_index=torch.tensor([[0], [1]]), num_nodes=3, x=torch.randn(3, 2))
114
+ d_no_iso = T.RemoveIsolatedNodes()(data_iso)
115
+ assert d_no_iso.num_nodes == 2
116
+
117
+ # RemoveDuplicatedEdges
118
+ data_dup = Data(edge_index=torch.tensor([[0, 0], [1, 1]]), num_nodes=2)
119
+ d_no_dup = T.RemoveDuplicatedEdges()(data_dup)
120
+ assert d_no_dup.edge_index.shape[1] == 1
121
+
122
+ # KNNGraph & RadiusGraph
123
+ data_pos = Data(pos=torch.tensor([[0.0, 0.0], [0.1, 0.0], [2.0, 2.0]]))
124
+ d_knn = T.KNNGraph(k=1)(data_pos)
125
+ assert d_knn.edge_index is not None
126
+ d_rad = T.RadiusGraph(r=0.5)(data_pos)
127
+ assert d_rad.edge_index is not None
128
+
129
+ # TwoHop
130
+ d_2hop = T.TwoHop()(data)
131
+ assert d_2hop.edge_index.shape[1] >= 3
132
+
133
+ # LineGraph
134
+ d_line = T.LineGraph()(data)
135
+ assert d_line.num_nodes == 3
136
+
137
+ # LaplacianLambdaMax
138
+ d_lap = T.LaplacianLambdaMax()(data)
139
+ assert hasattr(d_lap, 'lambda_max')
140
+
141
+ # GDC
142
+ d_gdc = T.GDC(self_loop_weight=1.0, normalization_in='sym', normalization_out='sym',
143
+ diffusion_kwargs=dict(method='ppr', alpha=0.15))(data)
144
+ assert d_gdc.edge_index is not None
145
+
146
+ # SIGN
147
+ d_sign = T.SIGN(K=2)(data)
148
+ assert hasattr(d_sign, 'x1') and hasattr(d_sign, 'x2')
149
+
150
+ # GCNNorm
151
+ d_gcn = T.GCNNorm()(data)
152
+ assert d_gcn.edge_weight is not None
153
+
154
+ # VirtualNode
155
+ d_vn = T.VirtualNode()(data)
156
+ assert d_vn.num_nodes == 4
157
+
158
+ # AddLaplacianEigenvectorPE
159
+ d_lpe = T.AddLaplacianEigenvectorPE(k=2)(data)
160
+ assert hasattr(d_lpe, 'laplacian_eigenvector_pe')
161
+
162
+ # AddRandomWalkPE
163
+ d_rwpe = T.AddRandomWalkPE(walk_length=4)(data)
164
+ assert hasattr(d_rwpe, 'random_walk_pe')
165
+
166
+ # FeaturePropagation
167
+ d_fp = T.FeaturePropagation(missing_mask=torch.tensor([True, False, False]), num_iterations=5)(data)
168
+ assert d_fp.x.shape == (3, 4)
169
+
170
+ # HalfHop
171
+ d_hh = T.HalfHop(alpha=0.5)(data)
172
+ assert d_hh.num_nodes > 3
173
+
174
+
175
+ def test_spatial_transforms():
176
+ pos = torch.tensor([[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0]], dtype=torch.float32)
177
+ edge_index = torch.tensor([[0, 1, 1, 2], [1, 0, 2, 1]], dtype=torch.long)
178
+ face = torch.tensor([[0], [1], [2]], dtype=torch.long)
179
+ data = Data(pos=pos, edge_index=edge_index, face=face, num_nodes=3)
180
+
181
+ # Distance
182
+ d_dist = T.Distance(norm=False)(data)
183
+ assert d_dist.edge_attr.shape == (4, 1)
184
+
185
+ # Cartesian & LocalCartesian
186
+ d_cart = T.Cartesian(norm=False)(data)
187
+ assert d_cart.edge_attr.shape == (4, 3)
188
+ d_lcart = T.LocalCartesian(norm=False)(data)
189
+ assert d_lcart.edge_attr.shape == (4, 3)
190
+
191
+ # Polar & Spherical
192
+ data_2d = Data(pos=pos[:, :2], edge_index=edge_index)
193
+ d_pol = T.Polar(norm=False)(data_2d)
194
+ assert d_pol.edge_attr.shape == (4, 2)
195
+ d_sph = T.Spherical(norm=False)(data)
196
+ assert d_sph.edge_attr.shape == (4, 3)
197
+
198
+ # Center, NormalizeScale, NormalizeRotation
199
+ d_cen = T.Center()(data)
200
+ assert torch.allclose(d_cen.pos.mean(dim=0), torch.zeros(3), atol=1e-5)
201
+
202
+ d_nscale = T.NormalizeScale()(data)
203
+ assert d_nscale.pos.abs().max() <= 1.0
204
+
205
+ d_nrot = T.NormalizeRotation()(data)
206
+ assert d_nrot.pos.shape == (3, 3)
207
+
208
+ # RandomJitter, RandomFlip, RandomScale, RandomRotate, RandomShear
209
+ d_jit = T.RandomJitter(translate=0.1)(data)
210
+ assert d_jit.pos.shape == (3, 3)
211
+
212
+ d_flip = T.RandomFlip(axis=0, p=1.0)(data)
213
+ assert torch.allclose(d_flip.pos[:, 0], -data.pos[:, 0])
214
+
215
+ d_scale = T.RandomScale(scales=(1.5, 1.5))(data)
216
+ assert torch.allclose(d_scale.pos, data.pos * 1.5)
217
+
218
+ d_rot = T.RandomRotate(degrees=90, axis=0)(data)
219
+ assert d_rot.pos.shape == (3, 3)
220
+
221
+ d_shear = T.RandomShear(shear=0.1)(data)
222
+ assert d_shear.pos.shape == (3, 3)
223
+
224
+ # FaceToEdge
225
+ d_f2e = T.FaceToEdge(remove_faces=True)(data)
226
+ assert d_f2e.face is None
227
+ assert d_f2e.edge_index is not None
228
+
229
+ # GenerateMeshNormals
230
+ d_mesh = T.GenerateMeshNormals()(data)
231
+ assert hasattr(d_mesh, 'norm')
232
+ assert d_mesh.norm.shape == (3, 3)
233
+
234
+ # PointPairFeatures
235
+ data_ppf = Data(pos=pos, norm=d_mesh.norm, edge_index=edge_index)
236
+ d_ppf = T.PointPairFeatures()(data_ppf)
237
+ assert d_ppf.edge_attr.shape == (4, 4)
238
+
239
+ # Delaunay
240
+ data_pts = Data(pos=torch.tensor([[0.0, 0.0], [1.0, 0.0], [0.0, 1.0], [1.0, 1.0]]))
241
+ d_del = T.Delaunay()(data_pts)
242
+ assert hasattr(d_del, 'face')
243
+
244
+ # FixedPoints
245
+ d_fixed = T.FixedPoints(num=2)(data)
246
+ assert d_fixed.pos.shape[0] == 2
247
+ assert d_fixed.num_nodes == 2
248
+
249
+ # GridSampling
250
+ data_cloud = Data(pos=pos)
251
+ d_grid = T.GridSampling(size=0.5)(data_cloud)
252
+ assert d_grid.pos is not None
253
+ assert d_grid.num_nodes > 0
@@ -0,0 +1,102 @@
1
+ import numpy as np
2
+ from keras import ops
3
+ from typing import Any, List, Optional, Tuple, Union
4
+
5
+ try:
6
+ import torch
7
+ _HAS_TORCH = True
8
+ except ImportError:
9
+ _HAS_TORCH = False
10
+
11
+
12
+ def is_torch_tensor(x: Any) -> bool:
13
+ return _HAS_TORCH and isinstance(x, torch.Tensor)
14
+
15
+
16
+ def to_numpy(x: Any) -> np.ndarray:
17
+ if x is None:
18
+ return None
19
+ if isinstance(x, np.ndarray):
20
+ return x
21
+ from k3_node.ops.host import to_numpy as host_to_numpy
22
+
23
+ if is_torch_tensor(x) and x.device.type != "meta":
24
+ return x.detach().cpu().numpy()
25
+ return host_to_numpy(x)
26
+
27
+
28
+ def as_tensor(x: Any, dtype: Optional[Any] = None, like: Optional[Any] = None) -> Any:
29
+ if x is None:
30
+ return None
31
+ if like is not None and is_torch_tensor(like):
32
+ if isinstance(dtype, str):
33
+ dtype_map = {
34
+ "float32": torch.float32,
35
+ "float64": torch.float64,
36
+ "float16": torch.float16,
37
+ "int64": torch.int64,
38
+ "int32": torch.int32,
39
+ "int16": torch.int16,
40
+ "int8": torch.int8,
41
+ "uint8": torch.uint8,
42
+ "bool": torch.bool,
43
+ }
44
+ target_dtype = dtype_map.get(dtype, getattr(torch, dtype, None))
45
+ else:
46
+ target_dtype = dtype or like.dtype
47
+ target_device = like.device
48
+ if is_torch_tensor(x):
49
+ return x.to(device=target_device, dtype=target_dtype)
50
+ np_arr = to_numpy(x)
51
+ return torch.as_tensor(np_arr, dtype=target_dtype, device=target_device)
52
+ if is_torch_tensor(x):
53
+ if dtype is not None:
54
+ if isinstance(dtype, str):
55
+ target_dtype = getattr(torch, dtype, None) or getattr(torch, dtype.replace("torch.", ""), None)
56
+ else:
57
+ target_dtype = dtype
58
+ return x.to(dtype=target_dtype)
59
+ return x
60
+ if isinstance(x, np.ndarray) and like is not None and isinstance(like, np.ndarray):
61
+ return np.asarray(x, dtype=dtype or like.dtype)
62
+ return ops.convert_to_tensor(x, dtype=dtype)
63
+
64
+
65
+ def match_tensor(new_val: Any, reference: Any, dtype: Optional[Any] = None) -> Any:
66
+ if reference is None:
67
+ if is_torch_tensor(new_val):
68
+ return new_val
69
+ return ops.convert_to_tensor(new_val, dtype=dtype)
70
+ return as_tensor(new_val, dtype=dtype, like=reference)
71
+
72
+
73
+ def to_undirected(
74
+ edge_index: Any,
75
+ edge_attr: Optional[Any] = None,
76
+ num_nodes: Optional[int] = None,
77
+ reduce: str = "add",
78
+ ) -> Union[Any, Tuple[Any, Any]]:
79
+ from k3_node.utils.graph import coalesce
80
+
81
+ ei_np = to_numpy(edge_index)
82
+ if ei_np.shape[1] == 0:
83
+ if edge_attr is None:
84
+ return edge_index
85
+ return edge_index, edge_attr
86
+
87
+ row, col = ei_np[0], ei_np[1]
88
+ rev_row = np.concatenate([row, col], axis=0)
89
+ rev_col = np.concatenate([col, row], axis=0)
90
+ rev_edge_index = np.stack([rev_row, rev_col], axis=0)
91
+
92
+ if edge_attr is not None:
93
+ attr_np = to_numpy(edge_attr)
94
+ if attr_np.ndim == 1:
95
+ rev_attr = np.concatenate([attr_np, attr_np], axis=0)
96
+ else:
97
+ rev_attr = np.concatenate([attr_np, attr_np], axis=0)
98
+ out_ei, out_attr = coalesce(rev_edge_index, rev_attr, num_nodes=num_nodes, reduce=reduce)
99
+ return match_tensor(out_ei, edge_index), match_tensor(out_attr, edge_attr)
100
+ else:
101
+ out_ei, _ = coalesce(rev_edge_index, None, num_nodes=num_nodes, reduce=reduce)
102
+ return match_tensor(out_ei, edge_index)
@@ -0,0 +1,5 @@
1
+ from .keras import *
2
+ from .backend_import import * # noqa
3
+ from .graph import *
4
+ from .random import *
5
+ from .smiles import *
@@ -0,0 +1,12 @@
1
+ from keras import backend
2
+
3
+ if backend.backend() == "tensorflow":
4
+ import tensorflow as tf
5
+ elif backend.backend() == "torch":
6
+ import torch
7
+ elif backend.backend() == "jax":
8
+ import jax.numpy as jnp
9
+ elif backend.backend() == "numpy":
10
+ import numpy as np
11
+ else:
12
+ raise NotImplementedError