From 435ce7964167343e53301ea3b41a92c3c90c5100 Mon Sep 17 00:00:00 2001 From: wangqc <1160619743@qq.com> Date: Tue, 3 Jun 2025 13:36:00 +0800 Subject: [PATCH 01/17] fix README --- MindChemistry/applications/crystalflow/README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/MindChemistry/applications/crystalflow/README.md b/MindChemistry/applications/crystalflow/README.md index bead72bb0..afdea75c1 100644 --- a/MindChemistry/applications/crystalflow/README.md +++ b/MindChemistry/applications/crystalflow/README.md @@ -15,7 +15,7 @@ ## 快速入门 > 1. 将Mindchemistry/mindchemistry文件包下载到当前目录 -> 2. 在[数据集链接](https://download-mindspore.osinfra.cn/mindscience/mindchemistry/diffcsp/)下载相应的数据集 +> 2. 在[数据集链接](https://download-mindspore.osinfra.cn/mindscience/mindchemistry/diffcsp/dataset/)下载相应的数据集 > 3. 安装依赖包:`pip install -r requirement.txt` > 4. 训练命令: `python train.py` > 5. 预测命令: `python evaluate.py` @@ -54,7 +54,7 @@ applications ## 下载数据集 -在[数据集链接](https://download-mindspore.osinfra.cn/mindscience/mindchemistry/diffcsp/)中下载相应的数据集文件夹和dataset_prop.txt数据集属性文件放置于当前路径的dataset文件夹下(如果没有需要自己手动创建),文件路径参考: +在[数据集链接](https://download-mindspore.osinfra.cn/mindscience/mindchemistry/diffcsp/dataset/)中下载相应的数据集文件夹和dataset_prop.txt数据集属性文件放置于当前路径的dataset文件夹下(如果没有需要自己手动创建),文件路径参考: ```txt crystalflow @@ -87,8 +87,6 @@ python train.py ### 推理 -将权重的path写入config文件的checkpoint.last_path中。预训练模型可以从[预训练模型链接](https://download-mindspore.osinfra.cn/mindscience/mindchemistry/diffcsp/pre-train)中获取。 - 更改config文件中的test字段来更改推理参数,特别是test.num_eval,它**决定了对于每个组分生成多少个样本**,对于后续的评估阶段很重要。 ```bash -- Gitee From 721c557fd269bea55928d258e5824fa0ec544cec Mon Sep 17 00:00:00 2001 From: wangqc <1160619743@qq.com> Date: Thu, 12 Jun 2025 14:09:54 +0800 Subject: [PATCH 02/17] feat: add the link of ckpt in test --- .../applications/crystalflow/test_crystalflow.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/MindChemistry/applications/crystalflow/test_crystalflow.py b/MindChemistry/applications/crystalflow/test_crystalflow.py index ffce4881f..0f9531b13 100644 --- a/MindChemistry/applications/crystalflow/test_crystalflow.py +++ b/MindChemistry/applications/crystalflow/test_crystalflow.py @@ -1,6 +1,7 @@ """model test""" import math import os +import urllib.request import mindspore as ms import mindspore.numpy as mnp @@ -33,6 +34,10 @@ class SinusoidalTimeEmbeddings(nn.Cell): (ops.Sin()(embeddings), ops.Cos()(embeddings))) return embeddings +def download_file(url, filename): + urllib.request.urlretrieve(url, filename) + print(f"File downloaded successfully: {filename}") + def test_cspnet(): """test cspnet.py""" ms.set_seed(1234) @@ -153,7 +158,8 @@ def test_loss(): cspnet = CSPNet(num_layers=6, hidden_dim=512, num_freqs=256) cspflow = CSPFlow(cspnet) - mindspore_ckpt = load_checkpoint("./torch2ms_ckpt/ms_flow.ckpt") + download_file('https://download-mindspore.osinfra.cn/mindscience/mindchemistry/crystalflow/ms_flow.ckpt', 'ms_flow.ckpt') + mindspore_ckpt = load_checkpoint("ms_flow.ckpt") load_param_into_net(cspflow, mindspore_ckpt) loss_func_mse = L2LossMask(reduction='mean') -- Gitee From 5adc891e1c0b31b1a46580c973889c950d57360f Mon Sep 17 00:00:00 2001 From: wangbo Date: Thu, 19 Jun 2025 16:02:50 +0800 Subject: [PATCH 03/17] ufold_debug --- MindSPONGE/src/mindsponge/pipeline/models/ufold/ufold.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MindSPONGE/src/mindsponge/pipeline/models/ufold/ufold.py b/MindSPONGE/src/mindsponge/pipeline/models/ufold/ufold.py index 5e45acd64..742e61dbf 100644 --- a/MindSPONGE/src/mindsponge/pipeline/models/ufold/ufold.py +++ b/MindSPONGE/src/mindsponge/pipeline/models/ufold/ufold.py @@ -143,7 +143,7 @@ class UFold(Model): seq_embedding_batch = Tensor(ops.Cast()(seq_embeddings, mstype.float32)) pred_contacts = self.network(seq_embedding_batch) contact_masks = ops.ZerosLike()(pred_contacts) - contact_masks[:, :seq_lens.item(0), :seq_lens.item(0)] = 1 + contact_masks[:, :seq_lens[0].item(), :seq_lens[0].item()] = 1 contact_masks = contact_masks.astype(ms.float32) feat = [seq_embedding_batch, contact_masks, contacts_batch] feat = mutable(feat) -- Gitee From 47c582852a5a4f142446a3a9a0660329d323514c Mon Sep 17 00:00:00 2001 From: wangbo Date: Thu, 19 Jun 2025 15:51:15 +0800 Subject: [PATCH 04/17] esmif1_debug --- .../src/mindsponge/pipeline/models/esm_if1/module/features.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MindSPONGE/src/mindsponge/pipeline/models/esm_if1/module/features.py b/MindSPONGE/src/mindsponge/pipeline/models/esm_if1/module/features.py index a164be032..9fb79ddd1 100644 --- a/MindSPONGE/src/mindsponge/pipeline/models/esm_if1/module/features.py +++ b/MindSPONGE/src/mindsponge/pipeline/models/esm_if1/module/features.py @@ -147,7 +147,7 @@ class GVPInputFeaturizer(nn.Cell): d_neighbors, e_idx = ops.Sort(axis=-1, descending=True)(d_adjust) else: d_neighbors, e_idx = ops.TopK(sorted=True)(d_adjust, d_adjust.shape[-1]) - d_neighbors, e_idx = d_neighbors[..., ::-1], e_idx[..., ::-1] + d_neighbors, e_idx = ms.mint.flip(d_neighbors, [-1]), ms.mint.flip(e_idx, [-1]) d_neighbors, e_idx = d_neighbors[:, :, 0:int(min(top_k_neighbors, x.shape[1]))], \ e_idx[:, :, 0:int(min(top_k_neighbors, x.shape[1]))] d_neighbors = ms.Tensor(d_neighbors, ms.float32)*1e4 -- Gitee From 1a48820c47e30dd4949c8d9d7be24ed6dcb93101 Mon Sep 17 00:00:00 2001 From: l30062829 Date: Thu, 12 Jun 2025 15:12:24 +0800 Subject: [PATCH 05/17] add GTEAM trainpart --- .../applications/earthquake/G-TEAM/README.md | 18 +- .../earthquake/G-TEAM/README_CN.md | 19 +- .../earthquake/G-TEAM/config/GTEAM.yaml | 40 +- .../earthquake/G-TEAM/images/train_loss.png | Bin 0 -> 43090 bytes .../applications/earthquake/G-TEAM/main.py | 22 +- .../earthquake/G-TEAM/src/data.py | 842 +++++++++--------- .../earthquake/G-TEAM/src/forcast.py | 380 +++++++- .../earthquake/G-TEAM/src/models.py | 95 +- .../earthquake/G-TEAM/src/utils.py | 89 +- .../earthquake/G-TEAM/src/visual.py | 1 - 10 files changed, 1005 insertions(+), 501 deletions(-) create mode 100644 MindEarth/applications/earthquake/G-TEAM/images/train_loss.png diff --git a/MindEarth/applications/earthquake/G-TEAM/README.md b/MindEarth/applications/earthquake/G-TEAM/README.md index fde491dff..fc37db4f3 100644 --- a/MindEarth/applications/earthquake/G-TEAM/README.md +++ b/MindEarth/applications/earthquake/G-TEAM/README.md @@ -32,7 +32,7 @@ The model is trained using the [Diting Dataset 2.0 - Multifunctional Large AI Tr - Only retains initial P-wave and S-wave phases - Includes events recorded by ≥3 stations for reliability -The inference module has been open-sourced and supports prediction using provided checkpoint files (.ckpt). +This model has fully open-sourced both the inference and training modules. For the inference part, the provided [ckpt](https://download-mindspore.osinfra.cn/mindscience/mindearth/dataset/G-TEAM/) is used for inference, while the training part utilizes the provided [hdf5](https://download-mindspore.osinfra.cn/mindscience/mindearth/dataset/G-TEAM/) and [pkl](https://download-mindspore.osinfra.cn/mindscience/mindearth/dataset/G-TEAM/) files for training. ## Quick Start @@ -41,6 +41,9 @@ You can download the required data and ckpt files for training and inference at ### Execution Run via command line using the `main` script: +It is necessary to configure the istraining parameter in the config.yaml file in advance to set up inference or training: +istraining: false -- Inference +istraining: true -- Training ```python python main.py --cfg_path ./config/config.yaml --device_id 0 --device_target Ascend @@ -52,13 +55,15 @@ Parameters: --device_target: Hardware type (default: Ascend) --device_id: Device ID (default: 0) +### Inference + ### Visualization ![](./images/pga.png) Scatter plot compares predicted vs actual PGA values (x-axis vs y-axis). Closer alignment to y=x line indicates higher accuracy. -### 结果展示 +### Results Presentation | Parameter | NPU | |:----------------------:|:--------------------------:| @@ -73,8 +78,15 @@ Scatter plot compares predicted vs actual PGA values (x-axis vs y-axis). Closer | Inference Resource | 1NPU | | Inference Speed(ms/step) | 556 | +### Training + +### Results Presentation + +![](./images/train_loss.png) +Under normal circumstances, the Average Training Loss should continue to converge. + ## Contributors -gitee id: chengjie, longjundong, xujiabao, dinghongyang, funfunplus +gitee id: xujiabao, longjundong, dinghongyang, chengjie email: funniless@163.com \ No newline at end of file diff --git a/MindEarth/applications/earthquake/G-TEAM/README_CN.md b/MindEarth/applications/earthquake/G-TEAM/README_CN.md index 5bb7eff96..3475aa849 100644 --- a/MindEarth/applications/earthquake/G-TEAM/README_CN.md +++ b/MindEarth/applications/earthquake/G-TEAM/README_CN.md @@ -15,7 +15,7 @@ 本模型的训练数据来源于[谛听数据集2.0 -中国地震台网多功能大型人工智能训练数据集](http://www.esdc.ac.cn/article/137),该数据集汇集了中国大陆及其邻近地区(15°-50°N,65°-140°E)1177 个中国地震台网固定台站的波形记录,覆盖时间范围为 2020 年 3 月至 2023 年 2 月。数据集包含研究区域内所有震级大于 0 的地方震事件,共计 264,298 个。我们在训练过程中仅选取了初至 P 波和 S 波震相,并且只保留至少被三个台站记录到的地震事件,以确保数据的可靠性和稳定性。 -目前本模型已开源推理部分,可使用提供的[ckpt](https://download-mindspore.osinfra.cn/mindscience/mindearth/dataset/G-TEAM/)进行推理。 +本模型已全部开源推理和训练模块,其中推理部分使用提供的[ckpt](https://download-mindspore.osinfra.cn/mindscience/mindearth/dataset/G-TEAM/)进行推理,训练部分使用提供的[hdf5](https://download-mindspore.osinfra.cn/mindscience/mindearth/dataset/G-TEAM/)和[pkl](https://download-mindspore.osinfra.cn/mindscience/mindearth/dataset/G-TEAM/)进行训练。 ## 快速开始 @@ -23,7 +23,9 @@ ### 运行方式: 在命令行调用`main`脚本 -### 推理 +需提前在config.yaml中配置istraining参数设定推理/训练 +istraining: false -- 推理 +istraining: true -- 训练 ```python @@ -33,7 +35,9 @@ python main.py --cfg_path ./config/config.yaml --device_id 0 --device_target Asc 其中, --cfg_path表示配置文件路径,默认值"./config/config.yaml" --device_target 表示设备类型,默认Ascend。 --device_id 表示运行设备的编号,默认值0。 -### 结果可视化 +### 推理 + +### 可视化结果 ![](./images/pga.png) @@ -54,8 +58,15 @@ python main.py --cfg_path ./config/config.yaml --device_id 0 --device_target Asc | 推理资源 | 1NPU | | 推理速度(ms/step) | 556 | +### 训练 + +### 结果展示 + +![](./images/train_loss.png) +正常情况Average Training Loss会持续收敛。 + ## 贡献者 -gitee id: chengjie, longjundong, xujiabao, dinghongyang, funfunplus +gitee id: xujiabao, longjundong, dinghongyang, chengjie email: funniless@163.com \ No newline at end of file diff --git a/MindEarth/applications/earthquake/G-TEAM/config/GTEAM.yaml b/MindEarth/applications/earthquake/G-TEAM/config/GTEAM.yaml index 68c066929..0faf89c09 100644 --- a/MindEarth/applications/earthquake/G-TEAM/config/GTEAM.yaml +++ b/MindEarth/applications/earthquake/G-TEAM/config/GTEAM.yaml @@ -1,4 +1,6 @@ -model: +model: + istraining: false + use_mlp: False hidden_dim: 1000 hidden_dropout: 0.0 n_heads: 10 @@ -13,6 +15,7 @@ model: pga: true mode: test no_event_token : False + max_stations: 5 data: root_dir: "./dataset" batch_size: 64 @@ -35,6 +38,39 @@ data: waveform_shape: [3000, 3] overwrite_sampling_rate: None noise_seconds: 5 +training_params: + seed: 42 + clipnorm: 1.0 + data_path: ./diting2_2020-2022_sc_abridged.hdf5 + ensemble_rotation: true + epochs_full_model: 100 + epochs_single_station: 5 + filter_single_station_by_pick: true + generator_params: + - batch_size: 1 + cutout_end: 25 + cutout_start: -1 + disable_station_foreshadowing: true + key: Mag + magnitude_resampling: 1.5 + min_upsample_magnitude: 4 + pga_from_inactive: true + pga_key: pga + pga_selection_skew: 1000 + pos_offset: [30,102] + scale_metadata: false + selection_skew: 1000 + shuffle_train_dev: true + transform_target_only: false + translate: false + trigger_based: true + upsample_high_station_events: 10 + loss_weights: + location: 1 + magnitude: 0.3 + pga: 1 + lr: 1e-5 + workers: 1 summary: summary_dir: "./summary" - ckpt_path: "./dataset/ckpt/g_team.ckpt" + ckpt_path: "./dataset/ckpt/g_team.ckpt" \ No newline at end of file diff --git a/MindEarth/applications/earthquake/G-TEAM/images/train_loss.png b/MindEarth/applications/earthquake/G-TEAM/images/train_loss.png new file mode 100644 index 0000000000000000000000000000000000000000..77ee77fa11f4db7eec0504a01a2e0acbac987697 GIT binary patch literal 43090 zcmeFa2UwHYwlEwO8v;s4q-cZyp-7h^FiJx2N$5!L9U>|SC<>U+dlQjPLhk_tL_j){ zP^4EWp*dmzrT&?@B0C0l*12~=lC<4w?-TXU?8IbB^*7CFS|^lngW%sV*@yu&^*QFfp;R zb91s@xz5JKbXDN$br269nC~*Dps*mXFgGtB?=MJBoIQJ%@*E{SB_%yCD-$d4Km9p= z1E4*3^3tiJQzw9cle8yJ(VjSN1F(~aN*?T~Uw-}eA&>GD#krFw&Xd80mjEYDQk*

az?-_3mFGkyJ(2gG#AM#_ zDzCUMrf1c{#VszO=p7WBJ@+$<_1n)-+ng*iW|m+2{iD-g`aXH$6a^U~N_*m$%af9kB_p4+oM`) zX82>aQeT}h`28lzfJx!Z#G?}BZl}kW&40ggB)S z#28Ctxnkp*$RM94*vr0!+g?D+wkL$00j~Ac8qwk8M-%iimd?YvdZK=Qhbyxq?Y-dvwI921FsTU-NeTL8D>k})l>Q~I7 zXlXqra@nr>{gq4^Uip;c3*Eo6;;@m?rH?w~NK z`Gro|oq6&QsDAM)QXDPw#->UjIx{twv~SnwO@$%CtSQ$?B_?mn@{d%q%va8|{>Ab^ z6c{8|)l3>#q>Ny;Y#_^;6*;~hKx>lEY;*6jc;w4s-&{o6nRR}h{(Ca#g$2B9x%e2= zo+rSIAQ}#Ff06JXut+T7#P15(5;i9vZv&E_p-45&@N4wS`6?u+n+A zT(&E)Z{tk*LTo58)5&kKkL?ftH!S%7JH^!h`Kb9a(%p16j^cRzpDN`I%EC%s#A_O=G0bWxbJO#*zcS7RP#ot71NY zlQtZfN(t10z&$gkTp`}_iOBdi#I2-Ms5%i?PUnJZ)Ut6r0D)g|LXk5BO`ldQj9brm z&|dOBh5?{-ecqI7$uF3JDYRPX1B4-;UXDZ2d5v+65xxohaH z*S31Af_$Pzdza(#I)Ly_D@d@UD_TNpTicR&w>h56)d`krTs89LV|Rq*n%f9>h#mVH z)g>&LXB68I&?e$f(TO&ZozABOLq;Mb&sk}a3}X!Jk6@{~Y+d$77Q`W1rD;W!H%O7v zs$7vu1&i99eSBZtdJFASYLVnkFu7+q|CX;8nTa;`uNM(8Ht(Z82586uUsn}(OXyEM zdD?aFd@`5YHMEpIH8qzZ((2i_q#X1Df8sV~m>8R{>a;3l9ddpkM1U{LfkmwE}zDk5&f>orz zHAuUGWkU*K!Ph`3zA&<8`rN7nL)1W}OChCFSsP{=H%AF#DVaW6SmFl{Ved*5IL140 zw=3MXQ)U~jvPhz|3|DJzmyI!S9J$etzHynPZk(cR3(6cT2C1jBB?&8@RAv~>8Y40> znx)FWkyGZ3NA%D?PiO>3QH1;4W}~-8(eHP$@{nZmA?bn=O{N<8vJT-+gjo`bLWHQE zPIN8v?FFCmRw<{LmWOxzQ?i3zxqaBKL1&no}Q%{2G zntAgZeWiVdxv>&K+$wfWgh)Qr&dS@em7^kfKhjf%kNrF;n1QmO+?PetKgPv;CGX7J z!m3wy#Z!y#z{iS>wN=Yo_-L(7Wy_#&tpmANK5P72&kPXf1>NeseYW!2qPJ_p=oD{o zy68Z#IDc$d<+^-O5U+JG@QEHTLIkR{s5q;h`^7iC3m(vI>NO$lEsDflhp1$R@FwUo z(jr7Ab~0R$PV+qeoD-GVD6*X->WSDnWcW$CR^9)SGox{__s+6D-jyg*3m-fN7~E)3 z*OdKv|6|&{(Op9=$vgd#UxfVCFm@= zD)td(x1y5VXWN<^1VLlt7!mSOKJQ0tdClV)-!4^jYij1wDY7iRjazC3ISJ5x-cw8N z{nScdM~d2ZHb0!Yd4PT-GY~>gOyyNT;^E&igj3U(q*7lt8mDcI9UGU2&@<`v_E zA2ss(5`;{(Y_(F@bS<8vgwAE5JT+i!!uxRQP~|CkpK7ye$>sb`r;_Wc9x|?UIhWcR zXn`Tz2nb?l;ou^t_HJUSS<(3FBAKT4RPQxm*2E=6(!3@^n5wX5`iyUebZ6AZN+&ZQJ$2d*Q^hUjq|p{PE8&^%ChO zL!`*uLMjeB{CFx~`J2*+tcez-phBg1^RR&Ko-604h3u#!diz0%&1qX8%!;HG7^$H03OeYUr61zY%{i%+s?Nc}FdJxisTR!-i2pA*^T6%e- z>pp25vtOg|<&D=_b5ct4jQQtN4P;92rp8N91U=QTq?e+lC7NJ0jGLV=yQ{S2VY~0iy~&XQ9>QmJGC< z%6a~<00z|Vdb<$JZ11F|ajQ&-%=En7^$1IJrc!>preRIXHR});;bXuy=XGf%;D zZK#-B@@9tzz(N6oJS`os=a&ene84kWl~Z>k&vSo$%9B$Xlo zR%G&W7iwZxYVXWIdp4Tqk*?4rt;jyZVqmPnA?V}L$EeTY{YUV)`4qwxM>T9&x8)6r z9gv99D?jr?sOgk7M|ZX_RiM}%w?xkA!PY(Yq^zbm$6XSNFdIV;PJ5uoSDY24%EYn3 zYtiN8BB{bAOMx8BHz!SH6xzN!J6edmlyUV(Qg+3`K5KBS#h+w z%&G>bTWA^O&<$GrVq56CMBk!%GuF#2>p{GrBEvvGP5M2CKweqhVWzGsZncyvHSriv z@iaN^l{|3tN*e|}7m422&{nQq<`BWa(A@Te{etvkra;-0Zx-W|zH(&5P!su!osbIY# zLw$vuorW6%GQ3oaBwtSR3Hve;slez0T#l-!K;TW>D)Ys|+j@to?%xa)^Hfq#tJ6DmD#gh{$(Xql)$)@XhcLSZ@Vj8Edgk(OHr>y6D*9Xbcu zLgyyis#fK|ih=7b3IxrluWd1RG6tqd27{)BC8gjfV_U(9J3d`vHf@Dq7qdMnp;3eN zaok~tXziGy#rSUag%;N8f+3^UYlRM`>KUTEO-YYL=TVj#2xgWt#k2UK;kbZ_L3%db zgO{H^y<%_8gXJY^tBz%?)%y_Q>wKo*-S9- zr%Ax6M*OPRc z({VhId$rNY`TS7I&>YsUGYtO-6q!B!?ItqnR?WlPu=nq{PYAvOB>dj; zFE1!)qB(s0Bh2qbUJwjlglgB`*1fQ#oSSN^Rf#_|PKUUaa7qVV_E1-ud&)4VDOe8X z@sS^p=gk>1({s|qGJHevO*jy23Pu>hl(;rc85x$MMiVk<9y&M~ht4mOTjVX1i;XQ#2IXN8AATWv(JC6ltzJA39UH5;YK zr*I73QO-6jm@G8zr3hPLD0mxyDCS1y(KGou6l%L4C$#-85+W6SD$Dno7*&AB07iLV zOFdPl;=3=(ElTWblgXB%uSQ^R=#Wnz#%P;mX{=C`#Hdv)uTjS@d9ECRvU*Ac7Rjx? z9DM4V*t~o87_jc1d}jGoy;nP4g0y^E<%L=bH#3!wBDcXYpm%y|oC-*iDzQ^7pajt*n-Gv(F1Du{ZFLofiS5 z71r193MKk-+474<LOGR_2U~~>Jn?r(j=;qx!b9< z_;lJ?iFeRAvKLjmE+-!kRySC2djF`1k3@EUHhr^w==>RyJqVi7^Em4e@B_z2N^^<5 zj{G`nB@~-VWxCA03#f7)pFWl>gsJ?n_6X7~MMkEexx#gvJzd*ClsL%9#F$P&8ND)> zQ^=YH#%`F(4+uBMW)Ra2b~uj#QtC4af?aT%r6eVrO=ll1E~v~S(JVv%8w5NA1#6TP z>fgw({ia~ZERpXGXP;!4E|_-KhEfE)g!ftv27A0cm*5wpo-T)U)oZ+FaTLms{IV*D z&r>ChDKsb8fB}DZUDxwdi{$Q;w+@n(XXWT84X#H>%}9FlRXx`exb}q6f`EdJV`D6< zwvg1@rFV`F-nTvIn~L?)~gangg!Gq_dK}-j9UjIRq_6F zKM~Kw!3y@O_y5=$Y*7 zI%ly=q39Tq(F)*ZN1dlAJH3Ru58KT; z23);$e|T&9$pZvYV?7Nlxxoeno5CDb%CS7-7&?%`n?0o#WT^}GdO@0mQ)Q}p$_i@_ z$t!n(M(Xy(a`}a2XZu$TdF4jR%r+hs?hJi5Y2VFX9$eaJ_b^1j821qYhxtPSsa-bx ziuz?-b#zxlOmXz}EV{ywqn~{L!mW|t$C>oq{|Qs$PV<7;XV(+NrYnN7fJ54S?qjxY zMTXp1vF|~HY0kv}OApGMCyoIR&JG@4KQty=tM@gJ0lsxJ4ww7oXiXyAW&4q-AG<1Z zdfX)@+el%#l3cA6h7J247a9w2nf2>u|{aPajpDN7B;Qkwq8kLm*!>VNYSR zE^sM4V)gD}NFYAb`Xsd6cOhUsunBoLUFKH3TUcc3YOwm69#>hAhUYz$jwLIU4r|Gv z(lm7HCO&k?UPYnxpuqbmOul@hc_KG3c|)H^c~|a6R@&R}qm&gaf=Z_9WjXkUDoIyC z8VJ{(FR)(cK$RLJ)*t~#VJoSU_k~=>(w!j2!dV-pbP|XofYqMaUSFMpYt(^ezDl#s z&e`3iz;7H{G4;HS{LI5{nOfPtc5Y_MqVWD|5Ie6yorfVF_BFGhkvv$i8QnO8KK#9^ zo+X>plD1*|%P4jM`PlZL-F&Zt%i4e8mB^!4u4GSSjns2Cl)_{R9~NcDQTSWIAG|BS zQ;@7kS6Z&+sgN1A$M*#o@)RwghB*cZxbGYTrcZo2(w)gAl}_m?yu04xri#A*anXAv zt0Y*>)H%qH9-ms0x+hh?sUG`sHB4+YGIwGq>NbOAmxQ|U zmV^Z`J5-Vutm&UKg49q~gArCwRq3glJ88u5)SeM_1Ztst{nQF0RT4_n>Q1=>S)_yo z0kIqKO+^V~&r|iS%cA8Z@BH2r8o96J5gviYM*{Ja`+1P=VY-~Rsn~Kz%n+ijKv+YU z>6}fDQ}S%a3oGpBuKOl_?DG0y5Bskh(anZZT{BFA(kkfXy^&w8P*CJGFY6@pKHJ4V zJ29NM$NTa`Ya9jb-h!pjDLNZ()%k+U zfm!}iah$Vfw6`pa2?hN^r;FgDWvXReBqw4UUDeNqpIcR793e>b=Eu!ZbIUs+<;n_uzC^dR}Ws)z6ilz^?xZ;QfLJ_kv8 zBJhTp?Xcrn9#W-f1U|TA zsahqZmR(O{OzcqLV`7Z2RFx-+>0GP;?Df*Hvs0A!=(cnJv^66w3r-b=SyLG7iC|VH z-ll7%Z2dMh0ki9+S$s&+AXMTvgr@WBRB0SN=EolmwO>cUh>mlUF+x-6GY{LANQwkS zX&Sy_;||FTNpZ9d9hhz|P6AfX9mG4xCQoX+=)PrFB4;0^iE557k^0cHNA>PdDu&}{GC9^QNvFmwH2#ouE3O_Cc4reDje(?(oK ztkmP3hd;6JN3)5H@QT+1Dp7EHLoqy^JKeCO=2pquX!;mu~!KO)WTjrN?x8FXy(RirxyPk)O=~3^s#(yu;$%)j7!{Eu?qq9*z+^TgUAizJmo`Hy zm8>upWM;bv91cIio#@rwafB(|Ed%>eistSMYgUzexd9A3j}BhQV;zqHyX3G8t(Nm3v(iofRsy3|zH-jJ z5V6?1&-yDtR31r`LY>*rPtYB9zf3i1wegk1bjhlTLb)VK7hQEybVrbY6Q+g{zPbPA z+u#;@Z-gv}r@9WrWs^P*ZyQhSq|7XdHp(DjW_3dF5|c7DpGsRrA?F8qibA~l3@waI z+z>dtbpoaM%Gu|jdZssjk~*Qdab+QeqFEhiN1tFh5e_cDZ@qhB;-|lKSpIlOW!Ao( z<`%Gw2@s=qu-fGO#SM}pyFm$BE1LVZpQd;F8mz@#mWT!0muakxys}92AR+{X&by>Y zm-oJkl!{DukgYT`(_Gy{o~e|hS~fHGa_9)>3khn;X|M{dlglqAxMmvFbC~qIu1==% z*PEc?@I$UKZ(DN(E%rn|oJ07O`W^$sIPk^q1C5wn(~YoVDWz)%0Q6IrFJ1N zrHZ+++z`I3WRMikv|8F4XO6S}-iu8{A!6+dt0EOFuCOm5D+Zhu@JM)JvhiKj5)-%D zS}yYW9-+b6i~r|#t&p5C64jhD+j*imFp1%kOY3;p%rSua@b-RUWo8hR`^%_4J9i3D znvYV5zmnJ+?0LlEdh)T@dI`_PlunxBlFwF`_MLMgnp#FAAzU7V3NooBr ztji~CXd5hdX%Mg9)wR}edMujsI=?s_t@IsCGwR=(;4V_)!F2n|cd+bl?cW$txP1qI zZ~p_`e}Q%xjlKfao4dNVFyblK4pdO|iIs9}o|Zd#7buUaH8d7wUtN&Mer~57iQS<% z22{M9X9y15Qlun@VKR4GH`xjwMtFz1$j^1xCV!BkWEi353%9ArzZpMPl#I0PPNE4H z&R>;_z4^U`&u?FOTybuyY(Eq{ZEZR?aS`WLyd=?ovh(_P@b4HeT#fh+X8*1ItU%Cz zKe`8#ow3B%Bb&CjB_X5w=N3C?gxe|C;qaYI{=ef$@4eEWe4LkcwPMCK=meWkMWlfv zR*$ykp>hYLqT~1{?$=HP@7jtaHPhWVIpCXSr#sK17k1~+tdTz$`G*krRUrQJ60dzy z!Kh|=(>G~BM51?DX|9Uit|oOvs{9>%IM^!Gy;g}g?$c=Dw2j-}Xs1nceP_QWMJXOc zAu^@!I$BzbPiXk{P`fZ3(V`2xhU)>Brm(kC6jXtv!kg6P z)|7t2W0P(tz}D+pQN%>Qq*5+9?66Z59SaW}T$0fG{8i`|3qp%TKNPQ?j@5$_ZPHa3{Fo>p}}lP z`a(RC?Z!lFcP)n<*+fnMTskX7ip4k~h7c~pz)DeZLYQ*%*9^rV_@cgdYA%rgZ^-Ry z*3Z;)tQsAyO+v)2*uPH~m9mNyq(bO1sL+a#H(=`p@5GKBtk}Iz-a8k|&Y*hHUNw{o z5h!^MFETL`!VNeJuDr~Z6rU);e2+JE$T5~p%#ibaVsr-;4mk@65!Y^%Z)>4mDlY%L zIypRInf&0L%Tc()jj_Co#PEq*vCUISlx-Op82ih~OB00Y?t;NIxoBK>hS25c!_hn` z_G&q7`vNIrtUt}zc|U)3f|H}T&&-b6#Cl=4uCVBBr&RrQr@wo6Qu4R%EQV|3mBsHTw{N_&atXiZwNl@KW-g~-F#H% z*{kZUYY7cKr;9)^acL&cHe*y_YE%hP1c^d_t^43%?Dn^aYax7H!%N+Gl>}V{c^1#j zy9>q?CZY`Jo=inL;M=Ni=L(u;NFK38EQ#roh3=Y&cNub4F;O*;_qi9>THO?iifscz z1_CYIzk0+9X@AT6l7$#t>AV*q{q`8(=Tc1$>O{`qHgY#0gCEvtjMFqs29G8HC)$U8 zS5g0?7b3$mMf<<{`J-v{>}GrKf7OlbD8!=V+{HX+EJihYBuY7Jax>z zZ>WN^&Fw*hS>2JEnpRKZpCc^tq$3&ONt7-qZYLCqB?h zB?zfWSQ#G+eB@nxSgoR zn=o&1U}l7EFUb?Q()O}lYX0H9?tluBpTU!u5yKHB`O_u|GCcxMDO_!=XAyOrSD+Y&W<;QUin70(Lb8~O0ORT`N1JS*22HZj{kfuJTR(zvf#keP0mwP zjyx|3*UK8kxrT5-wLUprR$CtNZ}`RkTGvEHmiXIGG?Q~}BHOTAX&$4G&+7pGBk%Ey z(owLXvO10%NQC8QX|+xO6|y-Gs6A&3#A6S`LLw~*aq^~m3)*$ClcbH=Dvhk|&jwV% zcXC$O{6!Po`_Y=B#w(2lEgQ#xjc#+N!@^@g`@!%=x_KP9(6Prz$oMCebQOQN&?1j7 zbf-OpKPr$UL3&4x3AYuu23;0h1YK&q`1NpY_hr{$@!ShoROxDDqP65QaqqgK7h&7i z%*i^LyF8Me3oUdIIMzDBB$ao5hvQIW-zoe2jmsLU#mkDhRH{c8c5Y1m% zp@O|aTlK|`$W_?9!#P5tcdf7)tzWOL$Rx;gW3?XjYjoADIN_v4HY)=1Be$nN*G_M|xh0U^`Dg@|7-x|Vv~s-7b^#6MuzoKRkvs7}?s9h+ z$X9O6kj=9WD;Eua?=|_UU(GYn2eNq?aU6@Y3<7aJ%p{6-l}?osy)n!-3`)IL zq=IR%Da~ApEPEVKWnRTVc{Gf2w!!b`RFxjP;!R{b znsm00`U!14Ia-M(1{WQTv-J$Jzp74nY4cd#t` zF75E^n!2k-l+OzaFz6d)5u=}Qk;RMEUF?zj&sV2SOrt?{)%j)VR|<7k2bbCk88ktl zG{>;Rnf0TpTO`?Zwx;#^9tTV{QZqK&)FOSiCv0M`x#P54({H`0uILNWe2Af_4|c;y zbGOCxAfCMDr%>Hc$&5#5wCHTG#<*6?%Lh)x6Pz36Im`!jXuL&jdmzY)!h5Whi5Dth z^+*)$T+n@G3cai_&Su6VZeOaS$&f(3xYV%tn&D@2vr2Fp}%mtSUBqFS3eV zh4f1$zNT&X?d`6Ae_d~5a(G>K^LpV!S1)Djrg@p##1CBL@cQ4qGdaBe9sIrhPvmI* zZzPHN-u{wHQ#CNtm%QBIsWy1?XNz6qNVhbFIKlRfI_Q zu`~>**lFNfm09qX8h+*QQO^mV$#f4AvxmvZK1Zpcahuvw{5G9w9!%~QJuo&6!DM_p zC@X&%#2+$A9&A*3exN%;kmM;Kqf&8ME1iY~ z8-Tn7wytbo`{{2~x%2wRaio!M7p6!@G={Q>p+n>?Hg--khN~K?-N<~h=DYJvR@;B; zv_G+-t&WL$qQ9tB@$O&Itov5=WM$x$9wU-?=W^*m7DSKqvHfUIaXsu9kWrHOy^HUD zzED!CN1C2sHw4*}mvju^w>JnW6>D-f5GBCL=}4ZiF9v%I#rv5FcWqp=LnIM=exOQ^ zRIzL34Tm}VgL@oizl9Jg%$!^sOhOnigjKQmVBrvnTv?U5LtU;a_zjH7#)HF!ugXEr zV+u@FY?~7$s+syzg#2QCTe3a2bU`}pd0yUm(qaz(nb@rR^Qh3kafiHVxT8oBy>%dk z;|vvinU|a)lc!0Pc%igfe4v}+@Pz3~$}^oDoi1zl?)--O715afR?LH?a$zbSmnmExODU&y)7Eud~R+=Q9B ztnE2wYD1CVlpNm*`OASq zZRc9pC=zv{3&7JPk97a|GmyusuLW! zPf;`QI`R=Nt#>fU<~hk)19n=&W7907laymvGl?-~PXa5{@WntG)DIAv!ZJ$5^S4A~ zfk>iQO33A^UCCQtQ=3SeuDF^`ujnFA@neA3EyM>;ZW#kL7s7?^}uxbLn^elqflN8)3ecQczguRYBu9x0N6>(y=w36t(!T1 zS6cPX=|i=^#TEU?b>Ci`KNaaNDdjBQH1ICVF@TQPJ)Ao3EU#5viw0Vp#b^~&7i_=8 zNPzA=#H*x)?pTL5UUca~MdYB~1AZ~D{(C=XXepjk5F>)@vC?JD+~ZF)5dP zT`?&M=$(NHePtC7X^(+KOnNi&bm*h4)RNAyWM!%EsbL$aobSeiJxK1NC3_LvZX5(- zF`o($wiCHbaNyEWYVhZfDm`M<&~Pp~^}@&iF-*N6I?_CfUxeFL8mvzetjWjy)m36y zX5lHMSS|##qrnmXCgS%kqC}MugB91aJ7o(eSnGMc_g-ou!YeFwSIYP@&v zth(>j;Dz{Dv3}&zJLD7N37if2>0BiK_?qoh(;XqaKikk4-Tf9iSCzO=P*GA(J%Z_c zRZm^VtAN3Cmg$)cDof@&)*7@v>l3@j00wAf>4wtIm;G;y@1iPiNzP_Kipq*B*WewO z-X}z&XVGDlhv=|s%Cj%6oTZW+l9PJ@r&#}<8vn{CEPFE}!Q|j$J~{aKBvO z$Ir-O@9}srr*6|i#%W+7m1`c9BBi_~Mji_XKO5FzWb2+)zO=opXUUg zTq&HCCB*gE*+-Uod{WaEOnFJ(+xgyb;X5$#C))bP)<(WtHFgia0~ezy+`fND<~QI& zn-l;4BYgN(AF-0h)n0%fu>zf^8w6QpbPOf|Sn?$k?#jHr2TFJs&fXh($3>GxfbZrf zG)rC^x;cO)j;9Cb%KG$SN#Q`F)t;4V>f(e$c5s#X*dCvVFm&G&vfmIH?K><d&k;*gJ%>|yUpS2-@TEp%C~D1vTm=b3F_yDGzD4tSrYE9#C`g7 zWSFn?u&C{DkG7C=E1d7%-{S7M)E4tL<_?B|znYPm0k-FP@Bi|t``^!8KSua(QsRHr zivPcAQqBgy5W4D0al@|r#heHs5?-A|xiR*PpFu56cn6d4hqf7I`BO})RN&E?JyY(i<5t006FaX~B13PX631EVUbS-=+|IBgPN|1FstSXG;fXzE|l>jDA+nnt|ocD+q@%w$!{Y@QM(&VgwOlNy0!S~p`ZO^;+ls`DV+6cs=FU`Rod_yc=0F${qBV^Cb98P zMb+A!j*BRic%feG$`t+v!2Rl9X)64V>qKP9;rC6-(d5-nBmTc;kFKkcXO43^M!?VO zliT#YnGw*Sp`xgZp3J0|jZhmRQjSqWp8?w9Ifi~w?^=uS|0dO(C+c*RFE}xjqG2y7 zfxfS2AS_V8#66CBl|0|r+0;w(WRUUXdL2f9SW^U7F>aRzHHG9$x(L4yVuY$1ss|%1 z5CE-Bf8#}D?2>W9d3RG|LAP^u>iQz0N%Elaa|Pv!BG>m+(ZD?6U102p_N#aC zYSeh6EVXj`vEi?2>Yi-LtGe<}TK%~pXqFN3DIyetk$&S7InCuxty*4xh^A6rd(LR) zpb8Hz$W)yMoIG1NRUQ}JBP{yOA&%Di6gsdqW1y}C21XCpFO$dPUlFkmySuMyH>rPp8If(iCSFHy z7UQnPz~)Ibhg_KL}N2X{@aatBMQDN-6$AC&iVue?4Keat z8+9h`W|qW{T;u`(_4FT=zinA-eML~_Np3hZ(qsxP=ijDtfJDP>Z%@gntrJ=g3;aHR zW#pjNw!2QhTVda!?PM=JcIq?GrIwDnKaN!yY{SP!%Y#(Gp!rU2m1yQk#`h=PDAK=+ z?Q!N79@}|`TZd>jABafn$2mW+B#fZn*=C*b?Jm|R9K0UC#|cH)Grzje=SL7f`mjpQ zUafpR5H{i{X2kDMWd}F`{+%fQk_)Ooa-u;nrPnJfIH|ZXh7DhHg^z~fRREOUY z-^I2?%OsA&3oKi| z6#`c9i5=J0QGKHP7gyVff+gubi-1il3ENW`4A{6Yte$rs0a3Yju#&W{U9GcZVA_3} zC%eaX5m?n<)g9p>;cxJu{}DajI#MdpW|YL}v8THbS}x38yd4z)=f8OYeH!nAt69^z zsT^ygw0c%pJ1#e?Tv3z)(#}j}xnt!XsjF2yDAfNVS*Dhwrl2xcm*);~(2!tL6^R@b zzdERi#@(iyL*ZBHohp{^#4l;scjMcwUT#Y3av7HN(!ot+YZeavHV4Q4gWh0P4%$^z zTBZBWZH9a2qua{%q&yIiSlo>%^iehcy|B=Ggop9HkI5+!hPeA?JSiHT>{fGA$d|Ta zSIKE7BSP#SRF`0)XTJlz$mR)7_J%2T*%+EL#n-uC9DQ&)b7X^ZV zpO-`RQl<-ofIP3p{XArG*MosUDJp1|I0iVT7Y^S#-?kvwYk%RVzh_{P!XI4y%PRk| zkbf0y|F6rgu82~9dy{`F`8OhlYIA*sTF2;_3d!iGC0Ab4Y!F6S1{>IMw29vT)6r4k z9*;WH8VAJJkL`D}U|>&GsH)R;PF>H*8v&8ALM*fCGZwiMaIiX$01;_y4T=o>(CI=j z#evpaiHej!Xr&#YjJxzs7&KQW4Kj|>u-0;CFm~q4dCv8=+#egA1>$J}(Ed4Dl=Y9$ z{^NhpQaJIli5TZ3&ax!d&RG$`UW1Y)%}#`V)_{Gx-0k|2ENA$$KCC6*U5iZY}d+Wt|rHhqT}(+ z%DVy?k>F2NI*OiQ4)Syyt2rYfWW2Vx2KV!|>9)Dz=`F&o`69#R(mwq}?d#8l-RX03 ztkto5QEKrxnKTJGwr?>HJp56==niHXrpS#~s~vGpF>lMEl#nn6xs|Z$i^S*@s|x3A z`Nzaz!2^YzpEZn7V*5Y0;UJ+~GTU}fMfEGIoJBJj90koQQ65QAUL7YlAp3(BL}>HG zi-Vk1O}_=|#|qIpnEcoY=mvMh8hDPP*QRfu~akz9`* zn*~bp%U8 zARB%v4@h#3O5;j?^ogh>NBCIRDk&{xLdj!3_G1U|a#JLud7ny>+j~oSjEhFiY{K1a zEuXEdVf~u{FReQ0G3wvC_6Dh7N8sm3!2PJL8}!XbM1Xi-b=T^d~Trk zm-q46#oTKD<0th7BagsdSbA_N{lcJE~oUT~hf{^KX zD*mW|HnB(n-@x1y(bUasb;J3=0h>9CC%}EAU-$vP>*c7FuQB~RABUe_J1z6sH5|p5 z>Yc(l_HyY?&d`2YsMS%mLJ|KkrRE(?a%}dD*usFTP7DoQ9(GreF3|4Ak^kz-a*dVA z@Buyq2k`taCJ+8i@t_<3zIad$ZcGC+F|0%f47%K(+81;39X2{g_ouQvDeFo`F@{y@ zF33tr0wnWRUKh?#JO*@ma1L$lko8nqmDviKRe(;Oi=19?I}dv~npoT;wC0DL(RPGk zzp&nEY4C;9=Ah{G1SL%E{JBvE7l%W)#^Aj1*!UHDxMR3kUkE!zq~8M&BznFu1e`u$ z@GTy2`GV4TrgqgzWj@|94%BN4lv;?$sYdfAnu4)dOf|e1TeCBlv;U&`@gHR#t||?i z_<0cg`_11t6*uA><(F^FlJ`)5Jp4hBe~=kS&WQ-d?Q0Wu@mN0tdTy+GI$zZ#D3uwp znx0Lhl@mAk)Y-A9t(9D+o$l>;QE~pxP<{fXAS>h>OXqzeYj^O~G@8!xu}Y3(z`V9` zLI%5PRn1PTbo^MQKNW&8zlAE<`tC=lq0h$H`VlDcUL4fZ&{G#V&G&^znaHHk*^K8h z1PU0-51UFZpzh|YIqK$U<-Jd!lt{UOUwQi+b#WB4V_6Q{W?w=+GHUy@b!1vz7;Ybx zHuU!#ekZ@(Pt8^^oSF}F<&kan2k!*EN4z*LW8n=A7|oadYQH8u2W6L=o~-x#;*ZW* zgl%(~sHR`uO8(mFTfR*Hv;N;>^c|ALRPLI+JkscPHRkMhRMoE z-OyMCAHB(&d1@(<6guUQXMB{_;cD3Ds2vR0u_dhB7n*0beHKZC@3jL9#!bbttPLE8 zm!W(H6e*NexYo#CPszuB$|3w$)gq$k-loYgb6#;0rITYX(+IWk`mhlqL=r2{9dqk8 za($KHAr{QYUF7L|^OAq6`V<|{7jxYB)7*P@<)~>nZl*!hi+6;jQb!5dhbB|*>>BrU zgX|CHggARuX~`A!&+jOf2bPwtY=L?*K&C{I9Iw1PF|Bm>!C)&iPj`|$q)Y6T%A!WF zMI_@UicuIYqL(jMPO@nrMY&d)a^oQHoFV(yAqOh~$AH6VqL|F*sBg-HgFD{OiQ09z zv#9Kp8&}jlMqKD~G&FgwpLjyGM;>Y`(9Hg42JwFgJAtkX_&%?$8k#-ZDQ*EPDlG}BFgXU*oaYT9Ej~BO789gnCrJEwv7{I- z@oyK2x^;%l5?AppOgGBuxSxHxnA-KIt5sRYS80>G9c;sbC07-+z@S|uP|&R;2$=Y8I1W}bKEH#5JVg|T7)BhnRyyIhX~ zWHM@TcP+Lzu*!`gT4mp3=WC!s)X`F~pO^wr8%IU3WAgbJwC<+U>t4!>It2rZgda_m ztr^z+L_1mk)n3Mb#yG>fPW&@yT1oTIm=l#v=qE1v3-CLC^)G`|;Q6l@{tYMoPnyl+ zeeShzIb-&fn@?Y$Bw*$-of`UAt7$&Q7Vhyk-_6=Zx2E0AsP8Z64Q6&>);%g@752*K zefOO~ME~J~R|&ZTDS8EcFfteZUgkdE<-OyVP-jIyTtGGGZE=n+x8AidoaLmRg1Wc&Kx#_1n$(B0zgXe5 z*{Cm-PTfq&HU4{>uaCg!)z}VTIk8AWLrRQqH<+2K{KR)JUS#}JOTjC=gij-*Ra2BI zs|o@b>cBQZ$i3+&ARX@K!W2XJcT&Lz%3n!?ib?HkBRjZ@aF}bN|SJoYM%TYOav6(Rpj)GThDKR=2M&~mRFA*l zgyX7Q520A`j3m7Lli7p^9nC-uvFvMEwblEV!6_$fumWR;W5I-nKnNFXV!-hLCT-CV zWq(0Ehmpy)r4+A^zP~WA(P4K50z1?xY)wsJoiBQ`pa$rQUq)yEMHQdJ+M6y!1oSFup;Cj(w>e5A)-yvxqBiMK$Al_1}JDKHaI5>D@-n8 zi*bEq`?ghPHu`FpPOS*@DB9}cVzyY>uKn%Aq;2I7DF58x3ErB303+MhPNi7HC3__9 z;Oxjwz6IMij$zbBwSMo~_qrm<8Kxb#-_i?aDzjkE@nanF1xi?KPuKvbbO;3jMYnk0 zdtr_Et3FP%*jxLdDQX>}id|>;5+2ZjEXTsVr&vmjU;^9N+6kwHA+awm&T$-iuyM za*wKp4waQ~!lRLQV&THmGLICFN9mv|}~^4-2z3LkjAFCHkR! z!%&%t=sXPjdPhV`9{p_V@`?4jPV??X>q%ukrA}qViaZX{nMPXZ(Bg-)VCkiWgn3SLGhGa z?H~n+9HMx?ToZ+v{VsWO{2vgLfZEV=>1>xFN0I_AL9+*>6Aznir33ax_^Tx`Ferb3 z&`s5nNX7R}%zihcMgE}EZ3prC|l~-9Rfhy3{ zfuuIsqGUBrP*?Nm4w<)I#$zwU6uyYe5qRXifpNncx_g&R6|<@ge)%U((?!FfE9}`x zH;Ds|w*qUp1ZE#$JE2Jcr(H+cA2b@wBD*-uxwthoYwHqokryW58dqS5+oVg(%DEpj z)A}2NRK9ph^Uq$#N=6jb2LHi;DlUVM-r{{E;G37RA#C6qq1FjV<7%i>s(SBs<%voO zT=F<7L*!s0@+`uf_>!&Z+#d=IVoYo_Vsq8}8J^F=35``u9rHoo(F z+9{>8>$)NKKWOwNs|xWC5>&h@LY1URxAMr2zJd3#&~!F`$(K2dKWI!z^Fha23qct! z7wzRVjK3E2YX@xuw9AjRl0V9j4VoL|Yc#_rf6y3eCt8dnc?Kfo7>EjZtMA3-7?6yIOFBgD(Wiu|HxtjoNJZ}U}{`^|6q@< za-2Gie4YRlu24NKCpuXHjdoqE6-t2z9T5hkP?C3@+g+}f5|M4pI ze`Of(Z_21h^oFx9V%V=~FShIOL5rjO1t~O2PV1a7KGC%P{QBgU$@CMToOkuRsuj{) zt&-17x2tAlhmnwa>&pDnQRE3egVsG&N&mJS@BM6>ib!jm{m%Es>hlG{+uffb73qJFPU4- zNgBjVjcA)5-s?@uUFQ2i<8-NC<8W{y>|KsfT-b1&*|&-jF<|srCH~X%g{`tYMZ)WE zp+K2KHpjk@(c55?2EyD|yFkQnc5B7RWQ&gFx!s;0G%h9wp+@d!%$*tmPFstI*+Q7f zcA;c)(Gy`N9kO|%;G?vX#Cs|PIoZX7x9b6?0yWPrk9jlB*9u>B=+m(NeC$}rF^1YC z>i4chZh!80`);*cjC3yp9V;g2MpdQ@?qf_k$ceS9C#$ajS(CTpbF!J7y!2vKVCQO} zzuzjd?&ekb@X6wTttb5=_{(YlRFP(~PBm9XrnzZ>Y$kJ^ zS4fcACkiwyxW29BQ%AK{nMLx{v_!`jowkKbJ01?=PbS^gVJMZwawi@CH_GmB@;$R! zJUuvdIg?W_&UGbkdUQE-vIR_{_XL#tygCR@lat$;qus<@C)#g<$ZXkw;dIH+DbuFU zN2WG`j2mZ4-h&~VuKB5-+|$H-5ra_^*s_q5?fBbzD%OCy`t6@OAe zDUx5sqv*j$6#v|3!e2b;rVBikI1J25+m4;$i2j_YIt?R)-FK3XU?{WQR@bWjQWjB+ ztg4ed&M?OHdfA-Pk8?GE> z&DuR+Iv%G*^IN;?6xZ>-Ow8srO!T=^HCH0f1{PjjxS?9GJ3n`%c@vMqN*7%*5E&NP zen=@6Ahg}oJ7T*m&O3T!q+WO zYUb+SKW!ZgmRMGk zm}@adp%+FEd&d@GDC9C!kpPaou`_n=exlRhA%FX9!i~A3OSc@Y`rZ{+5-WYj#ZdAe zQnrVaHistJ){Fw>mWOg$H2v;(=-#7`xv5*wasXxniC>4m5%%C{e_l-8<|mX>c%;s< zMXkW_xr}FB+qm}cg9FJA&6R)981D!URF0p#CdIWWlwyOK4pVyiEIssnNTS1MVaasB z+_N0}`sKEkcec&E$9W5WO2gw=i@G%d^3e!&<|sgEvzjwwo!iWystR1!Z{#W>i%qV= zS0RPl?^x*a(xGOz!t62?+)dR_1QYPJ_w}-E!~Mj^UDq^R20T~|v(?#_Nv9JD>TJ^$ zd`ch0@+v(K5#Pf4jBD;0?YI{v*=S!+<7VFzk8zHUnu|RBd^zqzchbJNr8w@2cbXNUZJ9;l=5`m1|5ULUr^WiLJ70{nOI9o8 zGR5V~)p2BZ2~lCj#g+1jiuUh6Xw3dxEgYwrX+4gfNW1935?TgGxS@Ea!+}9ZyjrGU z5CX;Y?ODiAC6Yf?amV|;gSXtH0rlG29dp^QOYO3j=Ex)+>Q+ljR)67&JA)_w@9Vt$ zQlVLVJ-gtw;Fj)#T&*^!!zSWznf5~{Tk7=t9r8f3tx0+CCe5EIMe|A3TQ2s)cszN` z!5e7FWETak?XojXWFd{%*4RYvhdlq2-I1%$x|K0yxfWPL?;#*s1jbGJ=4vD2F71$& zV;IEe$}iCTnc_XSFL?;ko4xg4oh`mI3#!NUQFW#$?R1FZaJ^3dtDH3dZ=|G72N!hA ze<;M=sv``w(swNZS8DYOXmx49wE>kvaFwt>xzE3^&(i$jrj1;!tWOa?SJ93m+e;F` zbkrO)Rj%>9#o$kMC+S>3u)RfSqbn7yoT|#^iX4PeSx-zCNE}ASENGrrGwiwgEr_y* z=%!bdVl6W=)b-)N!&Q|s^GG9))sq=Yt}r7`{Z{XA{zy51#vAq*D8*b2$lc1b7CZ>w zAV}5B?I8Xg^AaOJS}B}LvBDbD5w}XF7@(Emng%(NN?zWE{RUY_nMBZ!>BCwA%n8Wscui1zHSNUHwy@8Mm=E#6yJVYC15C=d2;uP9jc~E zxS3-+!BMP?t4ONYK+ef9O{VX@!RXx{v-o}#0Dj;?B_EL3+MM!#{cHHmu9rk~(_2bR zu^)DVu{#Uod9NbYF$yq?9uCyG7$)fVlDCV z51Jd}4>2^v)wLm#R&5G=NexEW(G=FR!?g zwPHKj0&{-gG=s3L`-_?MsBRe>lVz9Gz~~01x*q~LJg$y}bHqbIokmp6NG-bcLqG)Ew<~tb zbkIWsr1^??^=b<^)OcOqgS{Ky82JeIEl^|IaExt*$e!C#v|$Nl&99{F??ibGaVu>E z#;U0+RIilcAZsfMr-n`EQE*A^B<9x37Y}}V_uCr$N-y4s=T#262Pq&wG(VR|4=g^W z2@;G*G7~lHavr~M`U`(M&{B>-?fy0>^oG?_uPafFcks>i4&&mf0kr5DlJuZ-$VUEM zqxWeTsj0d+ZY3!~e5gI$g9_R%5Fc5cXH#dwWl#ufKPhYRFZrImlEZbvm+IdR~ z^jpHI3DWj4Zxf}J&i(KbR>2`Wif8A6hL;%lNKe=Cvmx)zY#F{G90*0HE@KOeG$)4Y zvyhk%+2{i*!ov&@lc)P%jh(E0obAgc z*^%j5tnIVv*5K<}MY#X4DsLp#zLin*9OEIJQB);t=+58$3zV7kWGU$k37w z-ounfP&wdk4!mdtsE=4P8d-s2EU^-B&;+VNR-gm=RC9DW6$v0UyOcgF>Dm7(1jOJJ z(s}QN4V;r=pNE@zL8&6f5Q)Rz5BPXx-qvK!_@5dYR#NSyh}V9dmBTlNjdm#{Usy!( z_k=TBaZ5b*5I!nUeq48@uaG=iH-FPQ1jHBG9Z%unG-p>S#Ab|=QtjZyS&`$Yv|AUmUs6;=A7`E>w| zcW>mh!?23ZjycaLhI`1_clmP&!b2DYn~*jnXhqN9?92jbpll^GT*l&xdPg-YMDyKbtg53W4}#JheJ713=@0a zhn^s&r?5$Y6UVK624WE~(xvsbOoVj<%UuN;<$G1uoj$%n4(3U2Ogy?olPfyKZ#@=| zL?^vOyNhWJ)au(;l+k+|5h3mQzJ4I2y)WLf##vG?&9lFty9n$gpnI|zJP^_MVQ-vG!pRJ&IIzCE^4P3fdSO!Nu&7sXN@Rv zt~bU^sTcWzH^`%Qk2OIbFN=EVqC%_7@gY3lxJRB(@OBqiGXmi*Z=ZFQ%BOJcvGW;- zN-gDril(1p0|YuiuP@?Hnn~Qw*kqURmbGNei)JCypJ!~t2DqCp9ETQuMl*L-?Rj)gf9^?_5B@G6QS3acx7ldrln+edAlZS_g`c1;8=fXz$1q0E(|(>SdTbtT0}4B4ADML8y-fnU2;67dt$tvbDBjlWA7o< z+v*{}LXO|aCYGx%;RMlKf*1-m7D{93nET}f?dl9&!o37>4gch}0s%{NFWm>T=LXwZ z*%2s4AYgt&=y!P?Ulm=8XX`n@Y;8O3;^F7`y0FX#HrQFw>)-@FVLJ7Ta_!SiUQ-W{ zO{_cK#&tH$Ys^kCH~*U%J*hIydfc1GZhZKDYqZ-SFnK>ozWDo?A)i-BrqaR)ghmzngnz>kAJXb6#xDr(G7 zEK%uO@JCF+P|b>%+bA82PXeI7R3T%&?QM$Wz1m3EMOjOta(M0rnQh8H{!G|oFoeC< zaf*lI!V>i%sbWtRjmhc0B=^e~@2Q#S;F{v;FD0BM%@?Q(p3Hkn1p@YZT%FwKXhY&O zZXzH|2#u=Ay|RRNS|&=hyKx4T%_1F>k|L?X%>v`A=@fi#TJ5=~mAm=cgeJw>><7Q4 zQ5N2%yO6cJ$*-F3<|w<7N)36KGnMUinO#xq(0ak?$mhQv}2R>q&@&g+&jMNw8=9fVW zwr#cjZw!&Rm6|`=(RgdkaLnG-A(C%qECJvNCVr9~OPN5#D^J>qYMf45)SxNc8)D)y zrYNoXWvV7|7Nj7R|2pw~)OrLHt$NQdzq+*CUq%<8OcbD=qu25}_00ke0H5^sC8 zU*KliAo1G9ms!jRX$^A~N5<4zzWD@RCGwBr6fgo`QoPYrS!R&-A`B{i^z>Icq6JQ@Eoo@0u?W* zH%;Vb2uYoxYP>(BQkals@aWAdk0HXvapnjoMLVFoD{4B!K&?2;_qUFf=F6}ZS$^Rf zj(!2Elrtg86*;Y&TnupSWOhzm2C5|h1LYD~CadU~Y|AOT<7JX1W2L%7OG^DAFT^eE z)AYh`ddz}e!mowd9q6Jv2n5`xpYHtzT*vDbPwfP{ITy4mErLsyIwj#$?&vUE4NC?S zdXsf287`K?(wLG}zNnH+6X){ktjPg%Um}JNATVmlVq;Y_gE@~mqfX+F60_6HN%Sj==FPvU$W_~zBgxx6F&#m$&4 zA%0_I2Gl13*j3z!UGV8ok+i-Q?rv_xuiH)$1=iz4>Rhvlzb!b=S{PSabVX^xu#A?M zkK%J}o<6+uGjcTlDjjE5o%27kC;x5Q)T~U=#JktooM8P`^uPbcQ9-vp%RCjXSvdeH z8sOsNybL927z+*a)B|r+Uy$RkFEv`(9xq+HF)0!5dzqlQ;4AgQG)1zNmH+n08gn=E zgsb$b=+ejn2zHOeT^W*@1isMILQoi}AW*`Kc3FFhtmUTB>X@8!{$WtGB zTlfCj_CppSmyy-ceZR9QjI0$6VFIN}6L*T^wok+h!bPglpl+Yl8e@7#$oDSG`fx+i zK_WjyUq%4eQ{HAVWtXm(0U@cm*L1R-Y7Hg)w(R3TaWqGedhniWtNjQ}W8? z`tnH_ec7)MSAPBP!rgz*h>gsho`atjZGTz&{V&shg!r$3Br5+$E#!E{cuc42Zt8qQ z$Cor92UyI$Te}?P4IiH5R`kye2s+ysWwjWX^CdmQY$wj{b4p!5-=p?%rMNf7b2k&d z@~jH~;ipl2?@gu~>5%b3;Ol5S@C_~3~DS65K2M`bp9uYb$-nqGH)IKs= zzr1Z^3HIt_%$Hh#fk?FActY71kzf7cAC>iVbhH+?3l}!`Zzu@vXGl5JCt6>a4?ybY z>4fJfxH)It3U};8u`+8w`5`7vQ%^XUdkiNq&&C}U^9B)Rpk+)|x(LeWy{XA1upn7n zlttoDZ{%0k_(w;RFX?h@$Q@U>g@0M9ouKMEP$FGakAz~}gxA8$@==XA1%?3IT`JqE z%s6~^AZjSTu|@|?oV-rS1czhCg&YR7b2|lEX>~Fr2!wUgWO#7oKjL%AbXSGL;?b~H z-)YCKICWe!Ft98y-0ha(5{c6$!|h_nQIL^subufxD&@OcsiBkJ3S&@uBPV1rwxc`x zii8$zpUN$Ir6&Kqg@CwUrj+a^zB?elf_WvlIlo6&l&&O-7&(8w{ZJcu5;Zn%gl`8T zRPz|S(3X$`-Ik;v%(4e4HgIpd>Wh-fsf@KS(+D{Q9 z&~mwO(_HI<4fx62$A6`f+^{1X)N&CeSyd*cW37MkBBtg-t95f4uGt`*&Pu ztZpQx$65}cuC`e=BslP#?_jkuXV(k#+Jene61-$dl{DAQ6VZxe6UayqiAyJMK0DRszP~@ z^5s6rlVw9q+Yr`$w7n7(5uOHyQe4@_zxU?y 4) * np.random.randn(y.shape[0]).reshape(y.shape) * (y - 4) * 0.05 + + return (ms.tensor(x, dtype=ms.float32), + ms.tensor(np.expand_dims(np.expand_dims(y, axis=1), axis=2), dtype=ms.float32)) + class EarthquakeDataset(Dataset): """ Dataset class for loading and processing seismic event data. @@ -105,7 +204,7 @@ class EarthquakeDataset(Dataset): **kwargs, ): - super(EarthquakeDataset, self).__init__() + super().__init__() self.data_path = data_path self.event_key = event_key @@ -199,421 +298,343 @@ class EarthquakeDataset(Dataset): if self.shuffle: np.random.shuffle(self.indexes) - -class DataProcessor: +class PreloadedEventGenerator(Dataset): """ - A data processor for seismic event analysis that handles waveform preprocessing, - station selection, and target preparation for machine learning models. - Key functionalities: - Batch processing of seismic waveforms and metadata - Station selection strategies for efficient processing - Multiple preprocessing techniques (cutout, integration, etc.) - Coordinate transformations and target preparations - PGA (Peak Ground Acceleration) target handling - Data augmentation techniques (label smoothing, station blinding) + A custom dataset generator for preloading seismic events. """ + def __init__(self, data_path, event_key, data, event_metadata, waveform_shape=(3000, 6), key='MA', batch_size=32, + cutout=None, sliding_window=False, windowlen=3000, shuffle=True, coords_target=True, oversample=1, + pos_offset=(-21, -69), label_smoothing=False, station_blinding=False, magnitude_resampling=3, + pga_targets=None, adjust_mean=True, transform_target_only=False, max_stations=None, trigger_based=None, + min_upsample_magnitude=2, disable_station_foreshadowing=False, selection_skew=None, + pga_from_inactive=False, integrate=False, differentiate=False, sampling_rate=100., select_first=False, + fake_borehole=False, scale_metadata=True, pga_key='pga', pga_mode=False, p_pick_limit=5000, + coord_keys=None, upsample_high_station_events=None, no_event_token=False, pga_selection_skew=None, + **kwargs): + ''' + Initializes the PreloadedEventGenerator. - def __init__( - self, - waveform_shape=(3000, 6), - max_stations=None, - cutout=None, - sliding_window=False, - windowlen=3000, - coords_target=True, - pos_offset=(-21, -69), - label_smoothing=False, - station_blinding=False, - pga_targets=None, - adjust_mean=True, - transform_target_only=False, - trigger_based=None, - disable_station_foreshadowing=False, - selection_skew=None, - pga_from_inactive=False, - integrate=False, - sampling_rate=100.0, - select_first=False, - scale_metadata=True, - p_pick_limit=5000, - pga_mode=False, - no_event_token=False, - pga_selection_skew=None, - **kwargs, - ): + Args: + data_path: Path to the HDF5 file containing waveform data. + event_key: The key in the event metadata DataFrame identifying each event. + data: Dictionary containing 'coords' and 'pga' keys for metadata and PGA values. + event_metadata: Pandas DataFrame with event metadata. + waveform_shape: Shape of each waveform (number of samples, number of channels). + key: The key in event metadata to use for magnitude. + batch_size: Number of events per batch. + cutout: Tuple specifying the range for random cutout in the waveform. + sliding_window: Whether to use a sliding window for cutout. + windowlen: Length of the sliding window. + shuffle: Whether to shuffle the events at the end of each epoch. + coords_target: Whether to include event coordinates as targets. + oversample: Factor by which to oversample the events. + pos_offset: Offset to apply to event coordinates. + label_smoothing: Whether to apply label smoothing to magnitudes. + station_blinding: Whether to randomly blind stations in the waveforms. + magnitude_resampling: Factor by which to resample events based on their magnitude. + pga_targets: Number of PGA targets to sample per event. + adjust_mean: Whether to adjust the mean of the waveforms. + transform_target_only: Whether to apply transformations only to the target coordinates. + max_stations: Maximum number of stations to include per event. + trigger_based: Whether to zero out waveforms before the P-wave trigger. + min_upsample_magnitude: Minimum magnitude for upsampling. + disable_station_foreshadowing: Whether to disable station foreshadowing. + selection_skew: Skew parameter for selecting stations when max_stations is reached. + pga_from_inactive: Whether to sample PGA from inactive stations. + integrate: Whether to integrate the waveforms. + differentiate: Whether to differentiate the waveforms. + sampling_rate: Sampling rate of the waveforms. + select_first: Whether to select the first stations when max_stations is reached. + fake_borehole: Whether to add fake borehole channels to the waveforms. + scale_metadata: Whether to scale the metadata coordinates. + pga_key: Key in the data dictionary for PGA values. + pga_mode: Whether to operate in PGA mode. + p_pick_limit: Limit for P-wave picks. + coord_keys: Keys in the event metadata for coordinates. + upsample_high_station_events: Whether to upsample events with high station counts. + no_event_token: Whether to include an event token in the outputs. + pga_selection_skew: Skew parameter for selecting PGA targets. + **kwargs: + ''' + super().__init__() + if kwargs: + print(f'Unused parameters: {", ".join(kwargs.keys())}') + self.data_path = data_path + self.event_key = event_key + self.batch_size = batch_size + self.shuffle = shuffle self.waveform_shape = waveform_shape - self.max_stations = max_stations + self.metadata = data['coords'] + self.event_metadata = event_metadata + self.pga = data[pga_key] + self.key = key self.cutout = cutout self.sliding_window = sliding_window self.windowlen = windowlen self.coords_target = coords_target + self.oversample = oversample self.pos_offset = pos_offset self.label_smoothing = label_smoothing self.station_blinding = station_blinding + self.magnitude_resampling = magnitude_resampling self.pga_targets = pga_targets self.adjust_mean = adjust_mean self.transform_target_only = transform_target_only + self.max_stations = max_stations self.trigger_based = trigger_based self.disable_station_foreshadowing = disable_station_foreshadowing self.selection_skew = selection_skew self.pga_from_inactive = pga_from_inactive + self.pga_selection_skew = pga_selection_skew self.integrate = integrate + self.differentiate = differentiate self.sampling_rate = sampling_rate self.select_first = select_first + self.fake_borehole = fake_borehole self.scale_metadata = scale_metadata - self.p_pick_limit = p_pick_limit - self.pga_mode = pga_mode + self.upsample_high_station_events = upsample_high_station_events self.no_event_token = no_event_token - self.pga_selection_skew = pga_selection_skew - self.key = kwargs["key"] - - def process_batch(self, batch_data): - """Main method to process a batch of data, now decomposed into smaller functions.""" - ( - indexes, - waveforms_list, - metadata_list, - pga_list, - p_picks_list, - event_info_list, - pga_indexes, - ) = self._extract_batch_data(batch_data) + self.triggers = data['p_picks'] + self.pga_mode = pga_mode + self.p_pick_limit = p_pick_limit + self.base_indexes = np.arange(self.event_metadata.shape[0]) + self.reverse_index = None + if magnitude_resampling > 1: + magnitude = self.event_metadata[key].values + for i in np.arange(min_upsample_magnitude, 9): + ind = np.where(np.logical_and(i < magnitude, magnitude <= i + 1))[0] + self.base_indexes = np.concatenate( + (self.base_indexes, np.repeat(ind, int(magnitude_resampling ** (i - 1) - 1)))) + if pga_mode: + new_base_indexes = [] + self.reverse_index = [] + c = 0 + for idx in self.base_indexes: + num_samples = (len(self.pga[idx]) - 1) // pga_targets + 1 + new_base_indexes += [(idx, i) for i in range(num_samples)] + self.reverse_index += [c] + c += num_samples + self.reverse_index += [c] + self.base_indexes = new_base_indexes + self.indexes = np.arange(len(self.event_metadata)) + if coord_keys is None: + self.coord_keys = detect_location_keys(event_metadata.columns) + else: + self.coord_keys = coord_keys + self.on_epoch_end() - true_batch_size = len(indexes) - true_max_stations_in_batch = self._get_max_stations_in_batch(metadata_list) - waveforms, metadata, pga, full_p_picks, p_picks, reverse_selections = ( - self._initialize_arrays( - true_batch_size, true_max_stations_in_batch, metadata_list - ) - ) - waveforms, metadata, pga, p_picks, full_p_picks, reverse_selections = ( - self._process_stations( - waveforms_list, - metadata_list, - pga_list, - p_picks_list, - waveforms, - metadata, - pga, - p_picks, - full_p_picks, - ) - ) - magnitude, target = self._process_magnitude_and_targets(event_info_list) - org_waveform_length = waveforms.shape[2] - waveforms, _ = self._process_waveforms(waveforms, org_waveform_length, p_picks) - metadata, target = self._transform_locations(metadata, target) - magnitude = self._apply_label_smoothing(magnitude) - metadata, pga = self._adjust_metadata_and_pga(metadata, pga) - pga_values, pga_targets_data = self._process_pga_targets( - true_batch_size, - pga, - metadata, - pga_indexes, - reverse_selections, - full_p_picks, - indexes, - ) - waveforms, metadata = self._apply_station_blinding(waveforms, metadata) - waveforms, metadata = self._handle_stations_without_trigger(waveforms, metadata) - waveforms, metadata = self._ensure_no_empty_arrays(waveforms, metadata) - inputs, outputs = self._prepare_model_io( - waveforms, metadata, magnitude, target, pga_targets_data, pga_values - ) + def __len__(self): + """ + Returns the number of batches in the dataset. + """ + return int(np.ceil(len(self.indexes) / self.batch_size)) - return inputs, outputs + def __getitem__(self, index): + """ + Retrieves a batch of events from the dataset. + """ + indexes = self.indexes[index * self.batch_size:(index + 1) * self.batch_size] + true_batch_size = len(indexes) + if self.pga_mode: + self.pga_indexes = [x[1] for x in indexes] + indexes = [x[0] for x in indexes] - def _extract_batch_data(self, batch_data): - """Extract data from the batch dictionary.""" - indexes = batch_data["indexes"] - waveforms_list = batch_data["waveforms"] - metadata_list = batch_data["metadata"] - pga_list = batch_data["pga"] - p_picks_list = batch_data["p_picks"] - event_info_list = batch_data["event_info"] - pga_indexes = batch_data.get("pga_indexes", None) - - return ( - indexes, - waveforms_list, - metadata_list, - pga_list, - p_picks_list, - event_info_list, - pga_indexes, - ) - - def _get_max_stations_in_batch(self, metadata_list): - """Calculate the maximum number of stations in the batch.""" - return max( - [len(m) for m in metadata_list if m is not None] + [self.max_stations] - ) - - def _initialize_arrays( - self, true_batch_size, true_max_stations_in_batch, metadata_list - ): - """Initialize arrays for batch processing.""" waveforms = np.zeros([true_batch_size, self.max_stations] + self.waveform_shape) - metadata = np.zeros( - (true_batch_size, true_max_stations_in_batch) + metadata_list[0].shape[1:] - ) + true_max_stations_in_batch = max(max([self.metadata[idx].shape[0] for idx in indexes]), self.max_stations) + metadata = np.zeros((true_batch_size, true_max_stations_in_batch) + self.metadata[0].shape[1:]) pga = np.zeros((true_batch_size, true_max_stations_in_batch)) full_p_picks = np.zeros((true_batch_size, true_max_stations_in_batch)) p_picks = np.zeros((true_batch_size, self.max_stations)) reverse_selections = [] - return waveforms, metadata, pga, full_p_picks, p_picks, reverse_selections + waveforms, metadata, pga, p_picks, reverse_selections, full_p_picks = ( + self.htpyfile_process(indexes, waveforms, metadata, pga, + p_picks, reverse_selections, full_p_picks)) - def _process_stations( - self, - waveforms_list, - metadata_list, - pga_list, - p_picks_list, - waveforms, - metadata, - pga, - p_picks, - full_p_picks, - ): - """Process stations and waveforms for each item in the batch.""" - reverse_selections = [] + magnitude = self.event_metadata.iloc[indexes][self.key].values.copy() + magnitude = magnitude.astype(np.float32) - for i, (waveform_data, meta, pga_data, p_pick_data) in enumerate( - zip(waveforms_list, metadata_list, pga_list, p_picks_list) - ): - if waveform_data is None: - continue - - num_stations = waveform_data.shape[0] - - if num_stations <= self.max_stations: - waveforms[i, :num_stations] = waveform_data - metadata[i, : len(meta)] = meta - pga[i, : len(pga_data)] = pga_data - p_picks[i, : len(p_pick_data)] = p_pick_data - reverse_selections += [[]] - else: - selection = self._select_stations(num_stations, p_pick_data) + target, waveforms, magnitude, metadata, pga_values, pga_targets = ( + self.data_preprocessing(indexes, waveforms, p_picks, magnitude, metadata, + pga, true_batch_size, reverse_selections, full_p_picks)) - metadata[i, : len(selection)] = meta[selection] - pga[i, : len(selection)] = pga_data[selection] - full_p_picks[i, : len(selection)] = p_pick_data[selection] + waveforms, metadata = self.data_processing(waveforms, metadata) - tmp_reverse_selection = [0 for _ in selection] - for j, s in enumerate(selection): - tmp_reverse_selection[s] = j - reverse_selections += [tmp_reverse_selection] + return self.get_result(waveforms, metadata, magnitude, target, pga_targets, pga_values) - selection = selection[: self.max_stations] - waveforms[i] = waveform_data[selection] - p_picks[i] = p_pick_data[selection] - - return waveforms, metadata, pga, p_picks, full_p_picks, reverse_selections - - def _select_stations(self, num_stations, p_pick_data): - """Select stations based on configured strategy.""" - if self.selection_skew is None: - selection = np.arange(0, num_stations) - np.random.shuffle(selection) + def htpyfile_process(self, indexes, waveforms, metadata, pga, + p_picks, reverse_selections, full_p_picks): + """ + Processes the HDF5 file to retrieve waveform data for a batch of events. + """ + with h5py.File(self.data_path, 'r') as f: + for i, idx in enumerate(indexes): + event = self.event_metadata.iloc[idx] + event_name = str(event[self.event_key]) + if event_name not in f['data']: + continue + g_event = f['data'][event_name] + waveform_data = g_event['waveforms'][:, :, :] + + num_stations = waveform_data.shape[0] + + if num_stations <= self.max_stations: + waveforms[i, :num_stations] = waveform_data + metadata[i, :len(self.metadata[idx])] = self.metadata[idx] + pga[i, :len(self.pga[idx])] = self.pga[idx] + p_picks[i, :len(self.triggers[idx])] = self.triggers[idx] + reverse_selections += [[]] + else: + if self.selection_skew is None: + selection = np.arange(0, num_stations) + np.random.shuffle(selection) + else: + tmp_p_picks = self.triggers[idx].copy() + mask = np.logical_and(tmp_p_picks <= 0, tmp_p_picks > self.p_pick_limit) + tmp_p_picks[mask] = min(np.max(tmp_p_picks), self.p_pick_limit) + coeffs = np.exp(-tmp_p_picks / self.selection_skew) + coeffs *= np.random.random(coeffs.shape) + coeffs[self.triggers[idx] == 0] = 0 + coeffs[self.triggers[idx] > self.waveform_shape[0]] = 0 + selection = np.argsort(-coeffs) + + if self.select_first: + selection = np.argsort(self.triggers[idx]) + + metadata[i, :len(selection)] = self.metadata[idx][selection] + pga[i, :len(selection)] = self.pga[idx][selection] + full_p_picks[i, :len(selection)] = self.triggers[idx][selection] + + tmp_reverse_selection = [0 for _ in selection] + for j, s in enumerate(selection): + tmp_reverse_selection[s] = j + reverse_selections += [tmp_reverse_selection] + + selection = selection[:self.max_stations] + waveforms[i] = waveform_data[selection] + p_picks[i] = self.triggers[idx][selection] + return waveforms, metadata, pga, p_picks, reverse_selections, full_p_picks + + def pga_mode_process(self, waveforms, reverse_selections, metadata, + pga_values, pga_targets, pga, indexes, full_p_picks): + """ + Processes the data in PGA mode. + """ + if self.pga_mode: + for i in range(waveforms.shape[0]): + pga_index = self.pga_indexes[i] + if reverse_selections[i]: + sorted_pga = pga[i, reverse_selections[i]] + sorted_metadata = metadata[i, reverse_selections[i]] + else: + sorted_pga = pga[i] + sorted_metadata = metadata[i] + pga_values_pre = sorted_pga[pga_index * self.pga_targets:(pga_index + 1) * self.pga_targets] + pga_values[i, :len(pga_values_pre)] = pga_values_pre + pga_targets_pre = sorted_metadata[pga_index * self.pga_targets:(pga_index + 1) * self.pga_targets, :] + if pga_targets_pre.shape[-1] == 4: + pga_targets_pre = pga_targets_pre[:, (0, 1, 3)] + pga_targets[i, :len(pga_targets_pre), :] = pga_targets_pre else: - tmp_p_picks = p_pick_data.copy() - mask = np.logical_and(tmp_p_picks <= 0, tmp_p_picks > self.p_pick_limit) - tmp_p_picks[mask] = min(np.max(tmp_p_picks), self.p_pick_limit) - coeffs = np.exp(-tmp_p_picks / self.selection_skew) - coeffs *= np.random.random(coeffs.shape) - coeffs[p_pick_data == 0] = 0 - coeffs[p_pick_data > self.waveform_shape[0]] = 0 - selection = np.argsort(-coeffs) - - if self.select_first: - selection = np.argsort(p_pick_data) - - return selection - - def _process_magnitude_and_targets(self, event_info_list): - """Process magnitude and coordinate targets.""" - magnitude = np.array([e[self.key] for e in event_info_list], dtype=np.float32) + pga[np.logical_or(np.isnan(pga), np.isinf(pga))] = 0 + for i in range(waveforms.shape[0]): + active = np.where(pga[i] != 0)[0] + l = len(active) + if l == 0: + raise ValueError(f'Found event without PGA idx={indexes[i]}') + while len(active) < self.pga_targets: + active = np.repeat(active, 2) + if self.pga_selection_skew is not None: + active_p_picks = full_p_picks[i, active] + mask = np.logical_and(active_p_picks <= 0, active_p_picks > self.p_pick_limit) + active_p_picks[mask] = min(np.max(active_p_picks), self.p_pick_limit) + coeffs = np.exp(-active_p_picks / self.pga_selection_skew) + coeffs *= np.random.random(coeffs.shape) + active = active[np.argsort(-coeffs)] + else: + np.random.shuffle(active) + + samples = active[:self.pga_targets] + if metadata.shape[-1] == 3: + pga_targets[i] = metadata[i, samples, :] + else: + full_targets = metadata[i, samples] + pga_targets[i] = full_targets[:, (0, 1, 3)] + pga_values[i] = pga[i, samples] + return pga_values, pga_targets + + def data_preprocessing(self, indexes, waveforms, p_picks, magnitude, metadata, + pga, true_batch_size, reverse_selections, full_p_picks): + """ + Data preprocessing. + """ target = None - if self.coords_target: - coord_keys = detect_location_keys( - [col for e in event_info_list for col in e.index] - ) - target = np.array( - [[e[k] for k in coord_keys] for e in event_info_list], dtype=np.float32 - ) - - magnitude = np.expand_dims(np.expand_dims(magnitude, axis=-1), axis=-1) - return magnitude, target - - def _process_waveforms(self, waveforms, org_waveform_length, p_picks): - """Apply cutout, sliding window, trigger-based, and integration transformations to waveforms.""" - cutout = org_waveform_length - + target = self.event_metadata.iloc[indexes][self.coord_keys].values + target = target.astype(np.float32) + org_waveform_length = waveforms.shape[2] if self.cutout: if self.sliding_window: windowlen = self.windowlen - window_end = np.random.randint( - max(windowlen, self.cutout[0]), - min(waveforms.shape[2], self.cutout[1]) + 1, - ) - waveforms = waveforms[:, :, window_end - windowlen : window_end] - + window_end = np.random.randint(max(windowlen, self.cutout[0]), + min(waveforms.shape[2], self.cutout[1]) + 1) + waveforms = waveforms[:, :, window_end - windowlen: window_end] cutout = window_end if self.adjust_mean: waveforms -= np.mean(waveforms, axis=2, keepdims=True) else: cutout = np.random.randint(*self.cutout) if self.adjust_mean: - waveforms -= np.mean( - waveforms[:, :, : cutout + 1], axis=2, keepdims=True - ) + waveforms -= np.mean(waveforms[:, :, :cutout + 1], axis=2, keepdims=True) waveforms[:, :, cutout:] = 0 + else: + cutout = waveforms.shape[2] if self.trigger_based: p_picks[p_picks <= 0] = org_waveform_length waveforms[cutout < p_picks, :, :] = 0 - if self.integrate: waveforms = np.cumsum(waveforms, axis=2) / self.sampling_rate + if self.differentiate: + waveforms = np.diff(waveforms, axis=2) - return waveforms, cutout - - def _transform_locations(self, metadata, target): - """Transform locations using the location_transformation method.""" + magnitude = np.expand_dims(np.expand_dims(magnitude, axis=-1), axis=-1) if self.coords_target: metadata, target = self.location_transformation(metadata, target) else: metadata = self.location_transformation(metadata) - return metadata, target - def _apply_label_smoothing(self, magnitude): - """Apply label smoothing to magnitude if enabled.""" if self.label_smoothing: - magnitude += ( - (magnitude > 4) - * np.random.randn(magnitude.shape[0]).reshape(magnitude.shape) - * (magnitude - 4) - * 0.05 - ) - return magnitude - - def _adjust_metadata_and_pga(self, metadata, pga): - """Adjust metadata and PGA arrays based on configuration.""" + magnitude += (magnitude > 4) * np.random.randn(magnitude.shape[0]).reshape(magnitude.shape) * ( + magnitude - 4) * 0.05 if not self.pga_from_inactive and not self.pga_mode: - metadata = metadata[:, : self.max_stations] - pga = pga[:, : self.max_stations] - return metadata, pga - - def _process_pga_targets( - self, - true_batch_size, - pga, - metadata, - pga_indexes, - reverse_selections, - full_p_picks, - indexes, - ): - """Process PGA targets if enabled.""" - pga_values = None - pga_targets_data = None - + metadata = metadata[:, :self.max_stations] + pga = pga[:, :self.max_stations] + pga_values = () + pga_targets = () if self.pga_targets: pga_values = np.zeros((true_batch_size, self.pga_targets)) - pga_targets_data = np.zeros((true_batch_size, self.pga_targets, 3)) - - if self.pga_mode and pga_indexes is not None: - self._process_pga_mode( - pga_values, - pga_targets_data, - pga, - metadata, - pga_indexes, - reverse_selections, - ) - else: - self._process_pga_normal( - pga_values, pga_targets_data, pga, metadata, full_p_picks, indexes - ) + pga_targets = np.zeros((true_batch_size, self.pga_targets, 3)) + + pga_values, pga_targets = self.pga_mode_process(waveforms, reverse_selections, metadata, + pga_values, pga_targets, pga, indexes, full_p_picks) pga_values = pga_values.reshape((true_batch_size, self.pga_targets, 1, 1)) - return pga_values, pga_targets_data + return target, waveforms, magnitude, metadata, pga_values, pga_targets - def _process_pga_mode( - self, - pga_values, - pga_targets_data, - pga, - metadata, - pga_indexes, - reverse_selections, - ): - """Process PGA in PGA mode.""" - for i in range(len(pga_values)): - pga_index = pga_indexes[i] - if reverse_selections[i]: - sorted_pga = pga[i, reverse_selections[i]] - sorted_metadata = metadata[i, reverse_selections[i]] - else: - sorted_pga = pga[i] - sorted_metadata = metadata[i] - pga_values_pre = sorted_pga[ - pga_index * self.pga_targets : (pga_index + 1) * self.pga_targets - ] - pga_values[i, : len(pga_values_pre)] = pga_values_pre - pga_targets_pre = sorted_metadata[ - pga_index * self.pga_targets : (pga_index + 1) * self.pga_targets, - :, - ] - if pga_targets_pre.shape[-1] == 4: - pga_targets_pre = pga_targets_pre[:, (0, 1, 3)] - pga_targets_data[i, : len(pga_targets_pre), :] = pga_targets_pre - - def _process_pga_normal( - self, pga_values, pga_targets_data, pga, metadata, full_p_picks, indexes - ): - """Process PGA in normal mode.""" - pga[np.logical_or(np.isnan(pga), np.isinf(pga))] = 0 - for i in range(pga_values.shape[0]): - active = np.where(pga[i] != 0)[0] - if not active: - raise ValueError(f"Found event without PGA idx={indexes[i]}") - while len(active) < self.pga_targets: - active = np.repeat(active, 2) - - if self.pga_selection_skew is not None: - active = self._select_pga_with_skew(active, full_p_picks[i]) - else: - np.random.shuffle(active) - - samples = active[: self.pga_targets] - if metadata.shape[-1] == 3: - pga_targets_data[i] = metadata[i, samples, :] - else: - full_targets = metadata[i, samples] - pga_targets_data[i] = full_targets[:, (0, 1, 3)] - pga_values[i] = pga[i, samples] - - def _select_pga_with_skew(self, active, full_p_picks): - """Select PGA with skew-based selection.""" - active_p_picks = full_p_picks[active] - mask = np.logical_and(active_p_picks <= 0, active_p_picks > self.p_pick_limit) - active_p_picks[mask] = min(np.max(active_p_picks), self.p_pick_limit) - coeffs = np.exp(-active_p_picks / self.pga_selection_skew) - coeffs *= np.random.random(coeffs.shape) - return active[np.argsort(-coeffs)] - - def _apply_station_blinding(self, waveforms, metadata): - """Apply station blinding if enabled.""" + def data_processing(self, waveforms, metadata): + """ + Data process. + """ + metadata = metadata[:, :self.max_stations] if self.station_blinding: mask = np.zeros(waveforms.shape[:2], dtype=bool) for i in range(waveforms.shape[0]): active = np.where((waveforms[i] != 0).any(axis=(1, 2)))[0] - if not active == 0: + l = len(active) + if l == 0: active = np.zeros(1, dtype=int) blind_length = np.random.randint(0, len(active)) np.random.shuffle(active) @@ -623,58 +644,48 @@ class DataProcessor: waveforms[mask] = 0 metadata[mask] = 0 - return waveforms, metadata - - def _handle_stations_without_trigger(self, waveforms, metadata): - """Handle stations without trigger signal.""" - stations_without_trigger = (metadata != 0).any(axis=2) & (waveforms == 0).all( - axis=(2, 3) - ) - + stations_without_trigger = (metadata != 0).any(axis=2) & (waveforms == 0).all(axis=(2, 3)) if self.disable_station_foreshadowing: metadata[stations_without_trigger] = 0 else: waveforms[stations_without_trigger, 0, 0] += 1e-9 - return waveforms, metadata - - def _ensure_no_empty_arrays(self, waveforms, metadata): - """Ensure there are no empty arrays in the batch.""" - mask = np.logical_and( - (metadata == 0).all(axis=(1, 2)), (waveforms == 0).all(axis=(1, 2, 3)) - ) + mask = np.logical_and((metadata == 0).all(axis=(1, 2)), (waveforms == 0).all(axis=(1, 2, 3))) waveforms[mask, 0, 0, 0] = 1e-9 metadata[mask, 0, 0] = 1e-9 return waveforms, metadata - def _prepare_model_io( - self, waveforms, metadata, magnitude, target, pga_targets_data, pga_values - ): - """Prepare model inputs and outputs.""" - inputs = [ - mindspore.tensor(waveforms, dtype=mindspore.float32), - mindspore.tensor(metadata, dtype=mindspore.float32), - ] + def get_result(self, waveforms, metadata, magnitude, target, pga_targets, pga_values): + """ + get result. + """ + inputs = [ms.tensor(waveforms, dtype=ms.float32), ms.tensor(metadata, dtype=ms.float32)] outputs = [] - if not self.no_event_token: - outputs += [mindspore.tensor(magnitude, dtype=mindspore.float32)] + outputs += [ms.tensor(magnitude, dtype=ms.float32)] if self.coords_target: target = np.expand_dims(target, axis=-1) - outputs += [mindspore.tensor(target, dtype=mindspore.float32)] + outputs += [ms.tensor(target, dtype=ms.float32)] - if self.pga_targets and pga_values is not None and pga_targets_data is not None: - inputs += [mindspore.tensor(pga_targets_data, dtype=mindspore.float32)] - outputs += [mindspore.tensor(pga_values, dtype=mindspore.float32)] + if self.pga_targets: + inputs += [ms.tensor(pga_targets, dtype=ms.float32)] + outputs += [ms.tensor(pga_values, dtype=ms.float32)] return inputs, outputs + def on_epoch_end(self): + """ + Resets the indexes for a new epoch, optionally with oversampling and shuffling. + """ + self.indexes = np.repeat(self.base_indexes.copy(), self.oversample, axis=0) + if self.shuffle: + np.random.shuffle(self.indexes) + def location_transformation(self, metadata, target=None): """ - Apply transformations to the metadata and optionally to the target. - Adjusts positions based on a positional offset and scales the data if required. + Transforms the event coordinates and optionally the target coordinates. """ transform_target_only = self.transform_target_only metadata = metadata.copy() @@ -682,86 +693,32 @@ class DataProcessor: metadata_old = metadata metadata = metadata.copy() mask = (metadata == 0).all(axis=2) - if target is not None: target[:, 0] -= self.pos_offset[0] target[:, 1] -= self.pos_offset[1] - metadata[:, :, 0] -= self.pos_offset[0] metadata[:, :, 1] -= self.pos_offset[1] + + # Coordinates to kilometers (assuming a flat earth, which is okay close to equator) if self.scale_metadata: metadata[:, :, :2] *= D2KM if target is not None: target[:, :2] *= D2KM + metadata[mask] = 0 + if self.scale_metadata: metadata /= 100 if target is not None: target /= 100 + if transform_target_only: metadata = metadata_old + if target is None: return metadata - return metadata, target - - -class PreloadedEventGenerator(Dataset): - """ - A custom PyTorch Dataset class designed to generate preloaded event data for training or evaluation. - This class wraps an `EarthquakeDataset` and a `DataProcessor` to provide processed input-output pairs. - Attributes: - dataset (EarthquakeDataset): An instance of the EarthquakeDataset class, responsible for loading - raw earthquake-related data. - processor (DataProcessor): An instance of the DataProcessor class, responsible for processing - the raw data into model-ready inputs and outputs. - """ - - def __init__(self, data_path, event_key, data, event_metadata, **kwargs): - """ - Initializes the PreloadedEventGenerator. - Args: - data_path (str): The file path or directory where the dataset is stored. - event_key (str): A key used to identify specific events within the dataset. - data (dict or array-like): Raw data associated with the events. - event_metadata (dict or DataFrame): Metadata describing the events in the dataset. - **kwargs: Additional keyword arguments passed to both EarthquakeDataset and DataProcessor. - """ - super(PreloadedEventGenerator, self).__init__() - self.dataset = EarthquakeDataset( - data_path=data_path, - event_key=event_key, - data=data, - event_metadata=event_metadata, - **kwargs, - ) - self.processor = DataProcessor(**kwargs) - - def __len__(self): - """ - Returns the total number of samples in the dataset. - - Returns: - int: The length of the underlying EarthquakeDataset. - """ - return len(self.dataset) - - def __getitem__(self, index): - """ - Retrieves and processes a single batch of data at the given index. - - Args: - index (int): The index of the data sample to retrieve. - - Returns: - tuple: A tuple containing two elements: - inputs: Processed input data ready for model consumption. - outputs: Corresponding target outputs for the model. - """ - batch_data = self.dataset[index] - inputs, outputs = self.processor.process_batch(batch_data) - - return inputs, outputs + return metadata, target def generator_from_config( config, @@ -796,4 +753,5 @@ def generator_from_config( pga_mode=pga, **generator_params, ) + return generator diff --git a/MindEarth/applications/earthquake/G-TEAM/src/forcast.py b/MindEarth/applications/earthquake/G-TEAM/src/forcast.py index 2c67ab33b..b1752b8e4 100644 --- a/MindEarth/applications/earthquake/G-TEAM/src/forcast.py +++ b/MindEarth/applications/earthquake/G-TEAM/src/forcast.py @@ -12,19 +12,73 @@ # See the License for the specific language governing permissions and # limitations under the License. # ============================================================================== -"GTeam inference" +"GTeam forcast" +import os +from tqdm import tqdm import numpy as np +import mindspore as ms +import mindspore.nn as nn +import mindspore.ops as ops + from src.utils import ( predict_at_time, calc_mag_stats, calc_loc_stats, calc_pga_stats, ) -from src.data import load_data +from src.data import DataGenerator, PreloadedEventGenerator, load_pickle_data, load_data +from src.models import SingleStationModel +from src.utils import evaluation, seed_np_tf from src.visual import generate_true_pred_plot +class CustomWithLossCell(nn.Cell): + """ + A neural network cell that wraps a main network and loss function together, + allowing the entire forward pass including loss computation to be treated as a single cell. + + This class combines a neural network model and a loss function into a single computation unit, + which is useful for training loops and model encapsulation in deep learning frameworks. + + Attributes: + net (nn.Cell): The main neural network model whose output will be used in loss computation. + loss_fn (nn.Cell): The loss function cell that computes the difference between predictions + and true labels. + """ + + def __init__(self, net, loss_fn): + """ + Initializes the CustomWithLossCell with a network model and loss function. + + Args: + net (nn.Cell): The neural network model whose output will be used for loss calculation. + loss_fn (nn.Cell): The loss computation function that takes (true_labels, predictions) + and returns a scalar loss value. + """ + super().__init__() + self.net = net + self.loss_fn = loss_fn + + def construct(self, x, y): + ''' + Computes the loss by first passing input data through the network and then applying the loss function. + + Args: + X (Tensor): Input data tensor containing features. + y (Tensor): Ground truth labels tensor. + + Returns: + Tensor: Computed loss value. + + Note: + The input labels 'y' are squeezed along dimension 2 to match the output shape from the network. + This ensures the loss function receives inputs of the expected shape. + ''' + outputs = self.net(x) + return self.loss_fn(y.squeeze(2), outputs) + + class GTeamInference: """ Initialize the GTeamInference class. @@ -143,3 +197,325 @@ class GTeamInference: ) self._save_results() print("Inference completed and results saved") + +class GTeamTrain: + """ + A class to handle the training of a full model for earthquake detection and localization. + It manages data loading, training of single-station models, and full-model training. + """ + def __init__(self, model_ins, cfg, output_dir, logger): + """ + Initialize the GTeamTrain class with model, configuration, output directory, and logger. + Args: + model_ins (nn.Cell): The full model instance to be trained. + cfg (dict): Configuration dictionary containing training parameters and paths. + output_dir (str): Directory to save checkpoints and outputs. + logger (logging.Logger): Logger instance for logging messages. + """ + self.full_model = model_ins + self.cfg = cfg + self.output_dir = output_dir + self.logger = logger + self.waveform_shape = [3000, 3] + self.training_params = self.cfg['training_params'] + self.generator_params = self.training_params.get('generator_params', [self.training_params.copy()]) + self.file_basename = os.path.basename(self.training_params['data_path']).split('.')[0] + + def load_train_data(self): + """ + Load training data from a pickle file. + Returns: + Data structure: The loaded training data. + """ + data_path = self.cfg['data']["root_dir"] + filename_train = os.path.join(data_path, f"{self.file_basename}_train.pkl") + return load_pickle_data(filename_train) + + def load_val_data(self): + """ + Load validation data from a pickle file. + Returns: + Data structure: The loaded validation data. + """ + data_path = self.cfg['data']["root_dir"] + filename_val = os.path.join(data_path, f"{self.file_basename}_val.pkl") + return load_pickle_data(filename_val) + + def init_single_generator(self, sampling_rate, event_metadata_index_train, event_key_train, + event_metadata_index_val, event_key_val, decimate_train): + """ + Initialize the single-station model and its data generators for training and validation. + Args: + sampling_rate (float): Sampling rate of the seismic data. + event_metadata_index_train (list): Indices for training events in the metadata. + event_key_train (str): Key for selecting the training event data. + event_metadata_index_val (list): Indices for validation events in the metadata. + event_key_val (str): Key for selecting the validation event data. + decimate_train (bool): Whether to decimate the training data. + """ + self.single_station_model = SingleStationModel(output_mlp_dims=self.cfg['model']['output_mlp_dims'], + use_mlp=self.cfg['model']['use_mlp']) + noise_seconds = self.generator_params[0].get('noise_seconds', 5) + cutout = (sampling_rate * (noise_seconds + self.generator_params[0]['cutout_start']), + sampling_rate * (noise_seconds + self.generator_params[0]['cutout_end'])) + self.single_train_generator = DataGenerator(self.training_params['data_path'], + event_metadata_index_train, event_key_train, + mag_key=self.generator_params[0]['key'], + batch_size=self.generator_params[0]['batch_size'], + cutout=cutout, + label_smoothing=True, + sliding_window=self.generator_params[0].get('sliding_window', + False), + decimate=decimate_train) + self.single_validation_generator = DataGenerator(self.training_params['data_path'], + event_metadata_index_val, event_key_val, + mag_key=self.generator_params[0]['key'], + batch_size=self.generator_params[0]['batch_size'], + cutout=cutout, + label_smoothing=True, + sliding_window=self.generator_params[0].get('sliding_window', + False), + decimate=decimate_train) + optimizer_single = nn.Adam(self.single_station_model.trainable_params(), learning_rate=1e-4) + self.criterion_single_mse = nn.MSELoss() + + loss_net = CustomWithLossCell(self.single_station_model, self.criterion_single_mse) + self.single_train_network = nn.TrainOneStepCell(loss_net, optimizer_single) + + self.single_station_model.set_train(True) + + def single_station_train(self, sampling_rate, event_metadata_index_train, event_key_train, + event_metadata_index_val, event_key_val, decimate_train): + """ + Train the single-station model. Loads a pre-trained model if specified, otherwise + initializes the generator and trains from scratch. + Args: + sampling_rate (float): Sampling rate of the seismic data. + event_metadata_index_train (list): Indices for training events in the metadata. + event_key_train (str): Key for selecting the training event data. + event_metadata_index_val (list): Indices for validation events in the metadata. + event_key_val (str): Key for selecting the validation event data. + decimate_train (bool): Whether to decimate the training data. + """ + if 'single_station_model_path' in self.training_params: + print('Loading single station model') + param_dict = ms.load_checkpoint(self.training_params['single_station_model_path']) + ms.load_param_into_net(self.single_station_model, param_dict) + elif 'transfer_model_path' not in self.training_params: + self.init_single_generator(sampling_rate, event_metadata_index_train, event_key_train, + event_metadata_index_val, event_key_val, decimate_train) + + for epoch in tqdm(range(self.training_params['epochs_single_station']), + desc='training single station model'): + train_loss = 0.0 + + for i in range(len(self.single_train_generator)): + x, y = self.single_train_generator[i] + loss = self.single_train_network(x, y) + train_loss += loss.asnumpy() + + train_loss /= len(self.single_train_generator) + + val_loss = 0.0 + for i in range(len(self.single_validation_generator)): + x, y = self.single_validation_generator[i] + outputs = self.single_station_model(x) + loss = self.criterion_single_mse(y.squeeze(2), outputs) + val_loss += loss.item() + + val_loss /= len(self.single_validation_generator) + + print(f'Epoch {epoch + 1}/{self.training_params["epochs_single_station"]}, ' + f'Training Loss: {train_loss}, Validation Loss: {val_loss}') + + ms.save_checkpoint(self.single_station_model, + os.path.join(self.output_dir, f'single-station-{epoch + 1}')) + + def init_full_generator(self, sampling_rate, event_key_train, data_train, event_metadata_train, + max_stations, event_key_val, data_val, event_metadata_val): + """ + Initialize the full model's data generators and optimizer. + Args: + sampling_rate (float): Sampling rate of the seismic data. + event_key_train (str): Key for selecting the training event data. + data_train: Training data. + event_metadata_train: Metadata for training events. + max_stations (int): Maximum number of stations to consider. + event_key_val (str): Key for selecting the validation event data. + data_val: Validation data. + event_metadata_val: Metadata for validation events. + """ + if 'load_model_path' in self.training_params: + print('Loading full model') + param_dict = ms.load_checkpoint(self.training_params['load_model_path']) + ms.load_param_into_net(self.full_model, param_dict) + + n_pga_targets = self.cfg['model'].get('n_pga_targets', 0) + no_event_token = self.cfg['model'].get('no_event_token', False) + + self.optimizer_full = nn.Adam(self.full_model.trainable_params(), learning_rate=1e-4) + self.losses_full_mse = {'magnitude': nn.MSELoss(), 'location': nn.MSELoss(), 'pga': nn.MSELoss()} + + generator_param_set = self.generator_params[0] + noise_seconds = generator_param_set.get('noise_seconds', 5) + cutout = (sampling_rate * (noise_seconds + generator_param_set['cutout_start']), + sampling_rate * (noise_seconds + generator_param_set['cutout_end'])) + + generator_param_set['transform_target_only'] = generator_param_set.get('transform_target_only', True) + + if 'data_path' in generator_param_set: + del generator_param_set['data_path'] + + self.full_train_generator = PreloadedEventGenerator(self.training_params['data_path'], + event_key_train, + data_train, + event_metadata_train, + waveform_shape=self.waveform_shape, + coords_target=True, + label_smoothing=True, + station_blinding=True, + cutout=cutout, + pga_targets=n_pga_targets, + max_stations=max_stations, + sampling_rate=sampling_rate, + no_event_token=no_event_token, + **generator_param_set) + + old_oversample = generator_param_set.get('oversample', 1) + generator_param_set['oversample'] = 4 + + self.full_validation_generator = PreloadedEventGenerator(self.training_params['data_path'], + event_key_val, + data_val, + event_metadata_val, + waveform_shape=self.waveform_shape, + coords_target=True, + station_blinding=True, + cutout=cutout, + pga_targets=n_pga_targets, + max_stations=max_stations, + sampling_rate=sampling_rate, + no_event_token=no_event_token, + **generator_param_set) + + generator_param_set['oversample'] = old_oversample + print('len(full_train_generator)', len(self.full_train_generator)) + + self.loss_weights = self.training_params['loss_weights'] + print(f'The total number of parameters: {sum(p.numel() for p in self.full_model.trainable_params())}') + + def full_station_train(self, sampling_rate, event_key_train, data_train, event_metadata_train, + max_stations, event_key_val, data_val, event_metadata_val): + """ + Train the full station model using the initialized generators and optimizer. + + Args: + sampling_rate (float): Sampling rate of the seismic data + event_key_train (str): Key for selecting training event data + data_train: Training data + event_metadata_train: Training event metadata + max_stations (int): Maximum number of stations to consider + event_key_val (str): Key for selecting validation event data + data_val: Validation data + event_metadata_val: Validation event metadata + """ + self.init_full_generator(sampling_rate, event_key_train, data_train, event_metadata_train, + max_stations, event_key_val, data_val, event_metadata_val) + def calculate_total_loss(network, x, y): + train_mag_loss = 0 + train_loc_loss = 0 + train_pga_loss = 0 + outputs = network(x[0], x[1], x[2]) + total_loss = 0 + for k, loss_fn in self.losses_full_mse.items(): + if k == 'magnitude': + mag_pre = outputs[0] + mag_target = y[0] + mag_loss = loss_fn(mag_target.squeeze(2), mag_pre) * self.loss_weights[k] + train_mag_loss += mag_loss + total_loss += mag_loss + elif k == 'location': + loc_pre = outputs[1] + loc_target = y[1] + loc_loss = loss_fn(loc_target.squeeze(2), loc_pre) * self.loss_weights[k] + train_loc_loss += loc_loss + total_loss += loc_loss + elif k == 'pga': + pga_pre = outputs[2] + if 'italy' in self.file_basename: + pga_target = y[2] + else: + pga_target = ops.log(ops.abs(y[2])) + pga_loss = loss_fn(pga_target.squeeze(3), pga_pre) * self.loss_weights[k] + train_pga_loss += pga_loss + total_loss += pga_loss + return total_loss + + self.full_model.set_train() + grad_fn = ms.value_and_grad( + fn=calculate_total_loss, + grad_position=None, + weights=self.full_model.trainable_params(), + has_aux=False + ) + for epoch in tqdm(range(self.training_params['epochs_full_model']), desc='training full model'): + train_loss = 0 + + for i in range(len(self.full_train_generator)): + x, y = self.full_train_generator[i] + + total_loss, grads = grad_fn(self.full_model, x, y) + self.optimizer_full(grads) + + train_loss += total_loss.item() + avg_train_loss = train_loss / len(self.full_train_generator) + + avg_val_loss = evaluation(self.full_model, self.full_validation_generator, + self.losses_full_mse, self.loss_weights) + + print(f'Epoch {epoch + 1}/{self.training_params["epochs_full_model"]}', + f'Average Training Loss: {avg_train_loss}', f'Average val Loss: {avg_val_loss}') + + ms.save_checkpoint(self.full_model, os.path.join(self.output_dir, f'event-{epoch + 1}')) + + print('Training complete, and loss history saved.') + + def train(self): + """ + Train the full model for earthquake detection and localization. + + This method orchestrates the training process by: + 1. Setting the random seed for reproducibility. + 2. Loading training and validation datasets. + 3. Extracting key parameters like sampling rate and event metadata. + 4. Training single-station models for each station in the dataset. + 5. Training the full multi-station model using the pre-trained single-station models. + + Steps: + - Initialize random seed from configuration (default: 42) + - Load training data and extract metadata + - Load validation data + - Extract sampling rate and remove 'max_stations' from model config + - Train single-station models using training and validation data + - Train full model using combined data from all stations + + Note: This method assumes that the `single_station_train` and `full_station_train` methods are implemented. + """ + seed_np_tf(self.cfg['training_params'].get('seed', 42)) + + print('Loading data') + (event_metadata_index_train, event_metadata_train, metadata_train, + data_train, event_key_train, decimate_train) = self.load_train_data() + (event_metadata_index_val, event_metadata_val, _, + data_val, event_key_val, _) = self.load_val_data() + + sampling_rate = metadata_train['sampling_rate'] + max_stations = self.cfg['model']['max_stations'] + del self.cfg['model']['max_stations'] + + print('training') + self.single_station_train(sampling_rate, event_metadata_index_train, event_key_train, + event_metadata_index_val, event_key_val, decimate_train) + + self.full_station_train(sampling_rate, event_key_train, data_train, event_metadata_train, + max_stations, event_key_val, data_val, event_metadata_val) diff --git a/MindEarth/applications/earthquake/G-TEAM/src/models.py b/MindEarth/applications/earthquake/G-TEAM/src/models.py index d7a650c9d..1c91673a6 100644 --- a/MindEarth/applications/earthquake/G-TEAM/src/models.py +++ b/MindEarth/applications/earthquake/G-TEAM/src/models.py @@ -29,20 +29,31 @@ class MLP(nn.Cell): final_activation: The activation function for the final layer. Default is nn.ReLU. """ - def __init__(self, input_shape, dims=(100, 50), final_activation=nn.ReLU()): + def __init__(self, input_shape, dims=(100, 50), final_activation=nn.ReLU(), is_mlp=False): super().__init__() layers = [] in_dim = input_shape[0] - - for dim in dims[:-1]: - layers.append(nn.Dense(in_dim, dim)) - layers.append(nn.ReLU()) - in_dim = dim - layers.append(nn.Dense(in_dim, dims[-1])) - - if final_activation: - layers.append(final_activation) - self.model = nn.SequentialCell(*layers) + if is_mlp: + for dim in dims[:-1]: + layers.append(nn.Dense(in_dim, dim)) + layers.append(nn.LayerNorm((dim,))) + layers.append(nn.ReLU()) + in_dim = dim + layers.append(nn.Dense(in_dim, dims[-1])) + + if final_activation: + layers.append(final_activation) + self.model = nn.SequentialCell(*layers) + else: + for dim in dims[:-1]: + layers.append(nn.Dense(in_dim, dim)) + layers.append(nn.ReLU()) + in_dim = dim + layers.append(nn.Dense(in_dim, dims[-1])) + + if final_activation: + layers.append(final_activation) + self.model = nn.SequentialCell(*layers) def construct(self, x): """ @@ -61,7 +72,7 @@ class NormalizedScaleEmbedding(nn.Cell): convolutional and pooling layers, and processes the features through a multi-layer perceptron (MLP). """ - def __init__(self, downsample=5, mlp_dims=(500, 300, 200, 150), eps=1e-8): + def __init__(self, downsample=5, mlp_dims=(500, 300, 200, 150), eps=1e-8, use_mlp=False): """ Initialize the module with given parameters. Parameters: @@ -98,8 +109,20 @@ class NormalizedScaleEmbedding(nn.Cell): self.conv1d_5 = nn.Conv1d(32, 16, kernel_size=4, has_bias=True, pad_mode="pad") self.flatten = nn.Flatten() - self.mlp = MLP((865,), dims=self.mlp_dims) + self.mlp = MLP((865,), dims=self.mlp_dims, is_mlp=use_mlp) self.leaky_relu = nn.LeakyReLU(alpha=0.01) + self._initialize_weights() + + def _initialize_weights(self): + self.conv2d_1.bias.set_data(ms.numpy.zeros_like(self.conv2d_1.bias)) + self.conv2d_2.bias.set_data(ms.numpy.zeros_like(self.conv2d_2.bias)) + + # For Conv1d layers + self.conv1d_1.bias.set_data(ms.numpy.zeros_like(self.conv1d_1.bias)) + self.conv1d_2.bias.set_data(ms.numpy.zeros_like(self.conv1d_2.bias)) + self.conv1d_3.bias.set_data(ms.numpy.zeros_like(self.conv1d_3.bias)) + self.conv1d_4.bias.set_data(ms.numpy.zeros_like(self.conv1d_4.bias)) + self.conv1d_5.bias.set_data(ms.numpy.zeros_like(self.conv1d_5.bias)) def construct(self, x): """ @@ -213,6 +236,7 @@ class PositionEmbedding(nn.Cell): min_lat, max_lat = wavelengths[0] min_lon, max_lon = wavelengths[1] min_depth, max_depth = wavelengths[2] + assert emb_dim % 10 == 0 lat_dim = emb_dim // 5 lon_dim = emb_dim // 5 depth_dim = emb_dim // 10 @@ -307,7 +331,43 @@ class AddEventToken(nn.Cell): return x +class SingleStationModel(nn.Cell): + """ + A neural network model for processing seismic waveforms from a single station. + This class implements a two-stage processing pipeline: waveform embedding followed by feature extraction. + """ + def __init__(self, waveform_model_dims=(500, 500, 500), + output_mlp_dims=(150, 100, 50, 30, 10), downsample=5, use_mlp=False): + """ + Initialize the SingleStationModel. + + Args: + waveform_model_dims (tuple): Dimensions of the MLP in the waveform embedding module. + Format: (input_dim, hidden_dim1, hidden_dim2, ...) + output_mlp_dims (tuple): Dimensions of the final MLP for feature extraction. + Format: (input_dim, hidden_dim1, hidden_dim2, ...) + downsample (int): Factor by which to downsample the input waveform data. + """ + super().__init__() + + self.waveform_model = NormalizedScaleEmbedding(downsample=downsample, mlp_dims=waveform_model_dims, + use_mlp=use_mlp) + self.mlp_mag_single_station = MLP((self.waveform_model.mlp_dims[-1],), output_mlp_dims) + + def construct(self, x): + """ + Forward pass of the SingleStationModel. + + Args: + x (Tensor): Input waveform data with shape (batch_size, time_steps, features) + + Returns: + Tensor: Extracted features with shape (batch_size, output_features) + """ + emb = self.waveform_model(x) + emb_mlp = self.mlp_mag_single_station(emb) + return emb_mlp def _init_pad_mask(waveforms, pga_targets): """ _init_pad_mask function, used to initialize the padding mask. @@ -344,10 +404,11 @@ class WaveformFullmodel(nn.Cell): hidden_dropout=0.0, n_pga_targets=0, downsample=5, + use_mlp=False ): super().__init__() self.waveform_model = NormalizedScaleEmbedding( - downsample=downsample, mlp_dims=waveform_model_dims + downsample=downsample, mlp_dims=waveform_model_dims, use_mlp=use_mlp ) self.transformer = TransformerEncoder( d_model=waveform_model_dims[-1], @@ -357,12 +418,12 @@ class WaveformFullmodel(nn.Cell): dropout=hidden_dropout, ) - self.mlp_mag = MLP((waveform_model_dims[-1],), output_mlp_dims) + self.mlp_mag = MLP((waveform_model_dims[-1],), output_mlp_dims, is_mlp=use_mlp) self.mlp_loc = MLP( - (waveform_model_dims[-1],), output_location_dims, final_activation=None + (waveform_model_dims[-1],), output_location_dims, final_activation=None, is_mlp=use_mlp ) self.mlp_pga = MLP( - (waveform_model_dims[-1],), output_mlp_dims, final_activation=None + (waveform_model_dims[-1],), output_mlp_dims, final_activation=None, is_mlp=use_mlp ) self.position_embedding = PositionEmbedding( diff --git a/MindEarth/applications/earthquake/G-TEAM/src/utils.py b/MindEarth/applications/earthquake/G-TEAM/src/utils.py index f1a4ae250..f8ae9cabf 100644 --- a/MindEarth/applications/earthquake/G-TEAM/src/utils.py +++ b/MindEarth/applications/earthquake/G-TEAM/src/utils.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # ============================================================================== -"GTeam util" +"""GTeam util""" import os import copy import numpy as np @@ -21,12 +21,11 @@ from geopy.distance import geodesic import mindspore as ms import mindspore.ops as ops +from mindearth import create_logger from src import data from src.data import generator_from_config, D2KM from src.models import WaveformFullmodel -from mindearth.utils import create_logger - def predict_at_time( model, @@ -71,32 +70,23 @@ def predict_at_time( loc_pred_filter = [] pga_pred_filter = [] - for i, (start, end) in enumerate( - zip(generator.dataset.reverse_index[:-1], generator.dataset.reverse_index[1:]) - ): - sample_mag_pred = predictions[0][start:end].reshape( - (-1,) + predictions[0].shape[-1:] - ) - sample_mag_pred = sample_mag_pred[: len(generator.dataset.pga[i])] + for i, (start, end) in enumerate(zip(generator.reverse_index[:-1], generator.reverse_index[1:])): + sample_mag_pred = predictions[0][start:end].reshape((-1,) + predictions[0].shape[-1:]) + sample_mag_pred = sample_mag_pred[:len(generator.pga[i])] mag_pred_filter += [sample_mag_pred] - sample_loc_pred = predictions[1][start:end].reshape( - (-1,) + predictions[1].shape[-1:] - ) - sample_loc_pred = sample_loc_pred[: len(generator.dataset.pga[i])] + sample_loc_pred = predictions[1][start:end].reshape((-1,) + predictions[1].shape[-1:]) + sample_loc_pred = sample_loc_pred[:len(generator.pga[i])] loc_pred_filter += [sample_loc_pred] - sample_pga_pred = predictions[2][start:end].reshape( - (-1,) + predictions[2].shape[-1:] - ) - sample_pga_pred = sample_pga_pred[: len(generator.dataset.pga[i])] + sample_pga_pred = predictions[2][start:end].reshape((-1,) + predictions[2].shape[-1:]) + sample_pga_pred = sample_pga_pred[:len(generator.pga[i])] pga_pred_filter += [sample_pga_pred] preds = [mag_pred_filter, loc_pred_filter, pga_pred_filter] return preds - def calc_mag_stats(mag_pred, event_metadata, key): """Calculate statistical information for magnitude predictions""" mean_mag = mag_pred @@ -109,7 +99,6 @@ def calc_mag_stats(mag_pred, event_metadata, key): mae = metrics.mean_absolute_error(true_mag, mean_mag) return r2, rmse, mae - def calc_pga_stats(pga_pred, pga_true, suffix=""): """Calculate statistical information for PGA predictions""" if suffix: @@ -123,7 +112,6 @@ def calc_pga_stats(pga_pred, pga_true, suffix=""): return [r2, rmse, mae] - def calc_loc_stats(loc_pred, event_metadata, pos_offset): """Calculate statistical information for location predictions""" coord_keys = data.detect_location_keys(event_metadata.columns) @@ -153,19 +141,70 @@ def calc_loc_stats(loc_pred, event_metadata, pos_offset): return rmse_hypo, mae_hypo, rmse_epi, mae_epi +def seed_np_tf(seed): + '''Set the random seed for numpy and manual seed for mindspore.''' + np.random.seed(seed) + ms.manual_seed(seed) + + +def evaluation(full_model, val_generator, losses, loss_weights): + """ + Evaluates the performance of the full_model on the validation data provided by val_generator. + Calculates the average validation loss by accumulating losses from different components (magnitude, location, pga) + using the specified loss functions and weights. + Args: + full_model (nn.Cell): The complete model to be evaluated in inference mode. + val_generator (generator): A generator that yields batches of validation data (x, y). + Each x is expected to be a tuple of three input tensors, and y is a tuple of three target tensors. + losses (dict): A dictionary mapping loss names to their respective loss functions. + Supported keys: 'magnitude', 'location', 'pga'. + loss_weights (dict): A dictionary mapping loss names to their corresponding weights. + Returns: + float: The average validation loss over the entire validation dataset. + """ + full_model.set_train(False) + epoch_val_loss = 0 + for i in range(len(val_generator)): + x, y = val_generator[i] + outputs = full_model(x[0], x[1], x[2]) + total_val_loss = ms.Tensor(0) + + for k, loss_fn in losses.items(): + if k == 'magnitude': + mag_pre = outputs[0] + mag_target = y[0] + mag_loss = loss_fn(mag_target.squeeze(2), mag_pre) * loss_weights[k] + total_val_loss += mag_loss + elif k == 'location': + loc_pre = outputs[1] + loc_target = y[1] + loc_loss = loss_fn(loc_target.squeeze(2), loc_pre) * loss_weights[k] + total_val_loss += loc_loss + elif k == 'pga': + pga_pre = outputs[2] + pga_target = ops.log(ops.abs(y[2])) + pga_loss = loss_fn(pga_target.squeeze(3), pga_pre) * loss_weights[k] + total_val_loss += pga_loss + epoch_val_loss += total_val_loss.item() + avg_val_loss = epoch_val_loss / len(val_generator) + return avg_val_loss def init_model(arg): """set model""" tmpcfg = copy.deepcopy(arg["model"]) + tmpcfg.pop("istraining") tmpcfg.pop("no_event_token") tmpcfg.pop("run_with_less_data") tmpcfg.pop("pga") tmpcfg.pop("mode") tmpcfg.pop("times") + tmpcfg.pop("max_stations") model = WaveformFullmodel(**tmpcfg) - param_dict = ms.load_checkpoint(arg["summary"].get("ckpt_path")) - # Load parameters into the network - ms.load_param_into_net(model, param_dict) - model.set_train(False) + if arg['model']['istraining']: + model.set_train(True) + else: + param_dict = ms.load_checkpoint(arg["summary"].get("ckpt_path")) + ms.load_param_into_net(model, param_dict) + model.set_train(False) return model diff --git a/MindEarth/applications/earthquake/G-TEAM/src/visual.py b/MindEarth/applications/earthquake/G-TEAM/src/visual.py index ef3dc1195..78354a6f8 100644 --- a/MindEarth/applications/earthquake/G-TEAM/src/visual.py +++ b/MindEarth/applications/earthquake/G-TEAM/src/visual.py @@ -18,7 +18,6 @@ import matplotlib.pyplot as plt import numpy as np import sklearn.metrics as metrics - def generate_true_pred_plot(pred_values, true_values, time, path, suffix=""): """ Generate a plot comparing true values and predicted values, and calculate -- Gitee From 86394ff989c4f8d01e8347bacdbed703abe72886 Mon Sep 17 00:00:00 2001 From: goto Date: Mon, 30 Jun 2025 11:14:29 +0800 Subject: [PATCH 06/17] fix-mindflow-AdaHessian --- tests/st/mindflow/cell/test_optimizers.py | 79 ++++++++++++++++++----- 1 file changed, 63 insertions(+), 16 deletions(-) diff --git a/tests/st/mindflow/cell/test_optimizers.py b/tests/st/mindflow/cell/test_optimizers.py index 1882e36df..eaa34f1fc 100644 --- a/tests/st/mindflow/cell/test_optimizers.py +++ b/tests/st/mindflow/cell/test_optimizers.py @@ -24,7 +24,7 @@ import numpy as np import mindspore as ms from mindspore import ops, set_seed, nn from mindspore import dtype as mstype -from mindflow import UNet2D, TransformerBlock, AdaHessian +from mindflow import UNet2D, TransformerBlock, MultiHeadAttention, AdaHessian from mindflow.cell.attention import FeedForward from mindflow.cell.unet2d import Down @@ -75,16 +75,62 @@ class TestUNet2D(UNet2D): class TestAttentionBlock(TransformerBlock): ''' Child class for testing optimizing Attention with AdaHessian ''' - def __init__(self, in_channels, num_heads, drop_mode="dropout", dropout_rate=0.0, compute_dtype=mstype.float16): - super().__init__( - in_channels, num_heads, drop_mode=drop_mode, dropout_rate=dropout_rate, compute_dtype=compute_dtype) + def __init__(self, + in_channels: int, + num_heads: int, + enable_flash_attn: bool = False, + fa_dtype: mstype = mstype.bfloat16, + drop_mode: str = "dropout", + dropout_rate: float = 0.0, + compute_dtype: mstype = mstype.float32, + ): + super().__init__(in_channels=in_channels, + num_heads=num_heads, + enable_flash_attn=enable_flash_attn, + fa_dtype=fa_dtype, + drop_mode=drop_mode, + dropout_rate=dropout_rate, + compute_dtype=compute_dtype, + ) class TestMlp(FeedForward): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.act_fn = nn.ReLU() # replace `gelu` with `relu` to avoid `vjp` problem - self.ffn = TestMlp(in_channels=in_channels, dropout_rate=dropout_rate, compute_dtype=compute_dtype) + class TestMultiHeadAttention(MultiHeadAttention): + ''' MultiHeadAttention modified to avoid vjp bug ''' + def get_qkv(self, x: ms.Tensor) -> tuple[ms.Tensor]: + ''' use masks to select out q, k, v, instead of tensor reshaping & indexing ''' + b, n, c = x.shape + + # use matmul with masks to select out q, k, v to avoid vjp problem + q_mask = ms.Tensor(np.vstack([np.eye(c), np.zeros([2 * c, c])]), dtype=self.compute_dtype) + k_mask = ms.Tensor(np.vstack([np.zeros([c, c]), np.eye(c), np.zeros([c, c])]), dtype=self.compute_dtype) + v_mask = ms.Tensor(np.vstack([np.zeros([2 * c, c]), np.eye(c)]), dtype=self.compute_dtype) + + qkv = self.qkv(x) + + q = ops.swapaxes(ops.matmul(qkv, q_mask).reshape(b, n, self.num_heads, -1), 1, 2) + k = ops.swapaxes(ops.matmul(qkv, k_mask).reshape(b, n, self.num_heads, -1), 1, 2) + v = ops.swapaxes(ops.matmul(qkv, v_mask).reshape(b, n, self.num_heads, -1), 1, 2) + + return q, k, v + + self.ffn = TestMlp( + in_channels=in_channels, + dropout_rate=dropout_rate, + compute_dtype=compute_dtype, + ) + self.attention = TestMultiHeadAttention( + in_channels=in_channels, + num_heads=num_heads, + enable_flash_attn=enable_flash_attn, + fa_dtype=fa_dtype, + drop_mode=drop_mode, + dropout_rate=dropout_rate, + compute_dtype=compute_dtype, + ) @pytest.mark.level0 @@ -133,7 +179,7 @@ def test_adahessian_accuracy(mode): @pytest.mark.platform_arm_ascend910b_training @pytest.mark.env_onecard @pytest.mark.parametrize('mode', [ms.GRAPH_MODE, ms.PYNATIVE_MODE]) -@pytest.mark.parametrize('model_option', ['unet']) +@pytest.mark.parametrize('model_option', ['unet', 'attention']) def test_adahessian_st(mode, model_option): """ Feature: AdaHessian ST test @@ -146,7 +192,7 @@ def test_adahessian_st(mode, model_option): # default test with Attention network net = TestAttentionBlock(in_channels=256, num_heads=4) - inputs = ms.Tensor(np.sin(np.reshape(range(102400), [4, 100, 256])), dtype=ms.float32) + inputs = ms.Tensor(np.random.rand(4, 100, 256), dtype=ms.float32) # test with UNet network if model_option.lower() == 'unet': @@ -159,9 +205,9 @@ def test_adahessian_st(mode, model_option): stride=2, activation='relu', data_format="NCHW", - enable_bn=True, + enable_bn=False, # bn leads to bug in PYNATIVE_MODE for MS2.5.0 ) - inputs = ms.Tensor(np.sin(np.reshape(range(16384), [2, 2, 64, 64])), dtype=ms.float32) + inputs = ms.Tensor(np.random.rand(2, 2, 64, 64), dtype=ms.float32) def forward(a): return ops.mean(net(a)**2)**.5 @@ -173,16 +219,17 @@ def test_adahessian_st(mode, model_option): learning_rate=0.1, beta1=0.9, beta2=0.999, eps=1e-8, weight_decay=0.) for _ in range(4): - loss = forward(inputs) optimizer(grad_fn, inputs) + loss = forward(inputs) assert ops.isfinite(loss) -@pytest.mark.level1 +@pytest.mark.level0 @pytest.mark.platform_arm_ascend910b_training @pytest.mark.env_onecard -def test_adahessian_compare(): +@pytest.mark.parametrize('mode', [ms.PYNATIVE_MODE]) +def test_adahessian_compare(mode): """ Feature: AdaHessian compare with Adam Description: Compare the algorithm results of the AdaHessian optimizer with Adam. @@ -190,12 +237,12 @@ def test_adahessian_compare(): The optimization runs 100 rounds to demonstrate an essential loss decrease. Expectation: The loss of AdaHessian outperforms Adam by 20% under the same configuration on an Attention network. """ - ms.set_context(mode=ms.PYNATIVE_MODE) + ms.set_context(mode=mode) def get_loss(optimizer_option): ''' compare Adam and AdaHessian ''' net = TestAttentionBlock(in_channels=256, num_heads=4) - inputs = ms.Tensor(np.sin(np.reshape(range(102400), [4, 100, 256])), dtype=ms.float32) + inputs = ms.Tensor(np.random.rand(4, 100, 256), dtype=ms.float32) def forward(a): return ops.mean(net(a)**2)**.5 @@ -211,13 +258,13 @@ def test_adahessian_compare(): net.trainable_params(), learning_rate=0.01, beta1=0.9, beta2=0.999, eps=1e-8, weight_decay=0.) - for _ in range(100): - loss = forward(inputs) + for _ in range(20): if optimizer_option.lower() == 'adam': optimizer(grad_fn(inputs)) else: optimizer(grad_fn, inputs) + loss = forward(inputs) return loss loss_adam = get_loss('adam') -- Gitee From d96f225736ec3d5d5729b1d2781473c26520b17e Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 1 Jul 2025 19:00:49 +0800 Subject: [PATCH 07/17] update --- ...y.cell.orb.AttentionInteractionNetwork.rst | 32 +++++++++++++++++ .../mindchemistry.cell.orb.EnergyHead.rst | 28 +++++++++++++++ .../cell/mindchemistry.cell.orb.GraphHead.rst | 25 +++++++++++++ .../mindchemistry.cell.orb.MoleculeGNS.rst | 34 ++++++++++++++++++ .../cell/mindchemistry.cell.orb.NodeHead.rst | 26 ++++++++++++++ .../cell/mindchemistry.cell.orb.Orb.rst | 35 +++++++++++++++++++ .../mindchemistry/mindchemistry.cell.rst | 6 ++++ .../mindchemistry/mindchemistry.cell.rst | 6 ++++ 8 files changed, 192 insertions(+) create mode 100644 docs/api_python/mindchemistry/cell/mindchemistry.cell.orb.AttentionInteractionNetwork.rst create mode 100644 docs/api_python/mindchemistry/cell/mindchemistry.cell.orb.EnergyHead.rst create mode 100644 docs/api_python/mindchemistry/cell/mindchemistry.cell.orb.GraphHead.rst create mode 100644 docs/api_python/mindchemistry/cell/mindchemistry.cell.orb.MoleculeGNS.rst create mode 100644 docs/api_python/mindchemistry/cell/mindchemistry.cell.orb.NodeHead.rst create mode 100644 docs/api_python/mindchemistry/cell/mindchemistry.cell.orb.Orb.rst diff --git a/docs/api_python/mindchemistry/cell/mindchemistry.cell.orb.AttentionInteractionNetwork.rst b/docs/api_python/mindchemistry/cell/mindchemistry.cell.orb.AttentionInteractionNetwork.rst new file mode 100644 index 000000000..7778f3a53 --- /dev/null +++ b/docs/api_python/mindchemistry/cell/mindchemistry.cell.orb.AttentionInteractionNetwork.rst @@ -0,0 +1,32 @@ +mindchemistry.cell.orb.AttentionInteractionNetwork +================================================== + +.. py:class:: mindchemistry.cell.orb.AttentionInteractionNetwork(num_node_in: int, num_node_out: int, num_edge_in: int, num_edge_out: int, num_mlp_layers: int, mlp_hidden_dim: int, attention_gate: str = "sigmoid", distance_cutoff: bool = True, polynomial_order: int = 4, cutoff_rmax: float = 6.0) + + 注意力交互网络。实现基于注意力机制的消息传递神经网络层,用于分子图的边更新。 + + 参数: + - **num_node_in** (int) - 节点输入特征数量。 + - **num_node_out** (int) - 节点输出特征数量。 + - **num_edge_in** (int) - 边输入特征数量。 + - **num_edge_out** (int) - 边输出特征数量。 + - **num_mlp_layers** (int) - 节点和边更新MLP的隐藏层数量。 + - **mlp_hidden_dim** (int) - MLP的隐藏维度大小。 + - **attention_gate** (str,可选) - 注意力门类型, ``"sigmoid"`` 或 ``"softmax"``。默认值: ``"sigmoid"``。 + - **distance_cutoff** (bool,可选) - 是否使用基于距离的边截断。默认值: ``True``。 + - **polynomial_order** (int,可选) - 多项式截断函数的阶数。默认值: ``4``。 + - **cutoff_rmax** (float,可选) - 截断的最大距离。默认值: ``6.0``。 + + 输入: + - **graph_edges** (dict) - 边特征字典,必须包含键"feat",形状为 :math:`(n_{edges}, num\_edge\_in)`。 + - **graph_nodes** (dict) - 节点特征字典,必须包含键"feat",形状为 :math:`(n_{nodes}, num\_node\_in)`。 + - **senders** (Tensor) - 每条边的发送节点索引,形状为 :math:`(n_{edges},)`。 + - **receivers** (Tensor) - 每条边的接收节点索引,形状为 :math:`(n_{edges},)`。 + + 输出: + - **edges** (dict) - 更新的边特征字典,键"feat"的形状为 :math:`(n_{edges}, num\_edge\_out)`。 + - **nodes** (dict) - 更新的节点特征字典,键"feat"的形状为 :math:`(n_{nodes}, num\_node\_out)`。 + + 异常: + - **ValueError** - 如果 `attention_gate` 不是"sigmoid"或"softmax"。 + - **ValueError** - 如果边或节点特征不包含必需的"feat"键。 \ No newline at end of file diff --git a/docs/api_python/mindchemistry/cell/mindchemistry.cell.orb.EnergyHead.rst b/docs/api_python/mindchemistry/cell/mindchemistry.cell.orb.EnergyHead.rst new file mode 100644 index 000000000..ca1f06da2 --- /dev/null +++ b/docs/api_python/mindchemistry/cell/mindchemistry.cell.orb.EnergyHead.rst @@ -0,0 +1,28 @@ +mindchemistry.cell.orb.EnergyHead +================================== + +.. py:class:: mindchemistry.cell.orb.EnergyHead(latent_dim: int, num_mlp_layers: int, mlp_hidden_dim: int, target_property_dim: int, predict_atom_avg: bool = True, reference_energy_name: str = "mp-traj-d3", train_reference: bool = False, dropout: Optional[float] = None, node_aggregation: Optional[str] = None) + + 图级能量预测头。实现用于预测分子图总能量或原子平均能量的神经网络头。支持节点级聚合、参考能量偏移和灵活的输出模式。 + + 参数: + - **latent_dim** (int) - 每个节点的输入特征维度。 + - **num_mlp_layers** (int) - MLP中的隐藏层数量。 + - **mlp_hidden_dim** (int) - MLP的隐藏维度大小。 + - **target_property_dim** (int) - 能量属性的输出维度(通常为1)。 + - **predict_atom_avg** (bool,可选) - 是否预测每原子平均能量而不是总能量。默认值: ``True``。 + - **reference_energy_name** (str,可选) - 用于偏移的参考能量名称,例如 ``"vasp-shifted"``。默认值: ``"mp-traj-d3"``。 + - **train_reference** (bool,可选) - 是否将参考能量训练为可学习参数。默认值: ``False``。 + - **dropout** (Optional[float],可选) - MLP的dropout率。默认值: ``None``。 + - **node_aggregation** (str,可选) - 节点预测的聚合方法,例如 ``"mean"``或 ``"sum"``。默认值: ``None``。 + + 输入: + - **node_features** (dict) - 节点特征字典,必须包含键"feat",形状为 :math:`(n_{nodes}, latent\_dim)`。 + - **n_node** (Tensor) - 图中节点数量,形状为 :math:`(1,)`。 + + 输出: + - **output** (dict) - 包含键"graph_pred"的字典,值的形状为 :math:`(1, target\_property\_dim)`。 + + 异常: + - **ValueError** - 如果 `node_features` 中缺少必需的特征键。 + - **ValueError** - 如果 `node_aggregation` 不是支持的类型。 \ No newline at end of file diff --git a/docs/api_python/mindchemistry/cell/mindchemistry.cell.orb.GraphHead.rst b/docs/api_python/mindchemistry/cell/mindchemistry.cell.orb.GraphHead.rst new file mode 100644 index 000000000..75ae5ad7c --- /dev/null +++ b/docs/api_python/mindchemistry/cell/mindchemistry.cell.orb.GraphHead.rst @@ -0,0 +1,25 @@ +mindchemistry.cell.orb.GraphHead +================================= + +.. py:class:: mindchemistry.cell.orb.GraphHead(latent_dim: int, num_mlp_layers: int, mlp_hidden_dim: int, target_property_dim: int, node_aggregation: str = "mean", dropout: Optional[float] = None, compute_stress: Optional[bool] = False) + + 图级预测头。实现可以附加到基础模型的图级预测头,用于从节点特征预测图级属性(例如应力张量),使用聚合和MLP。 + + 参数: + - **latent_dim** (int) - 每个节点的输入特征维度。 + - **num_mlp_layers** (int) - MLP中的隐藏层数量。 + - **mlp_hidden_dim** (int) - MLP的隐藏维度大小。 + - **target_property_dim** (int) - 图级属性的输出维度。 + - **node_aggregation** (str,可选) - 节点预测的聚合方法,例如 ``"mean"`` 或 ``"sum"``。默认值: ``"mean"``。 + - **dropout** (Optional[float],可选) - MLP的dropout率。默认值: ``None``。 + - **compute_stress** (bool,可选) - 是否计算和输出应力张量。默认值: ``False``。 + + 输入: + - **node_features** (dict) - 节点特征字典,必须包含键"feat",形状为 :math:`(n_{nodes}, latent\_dim)`。 + - **n_node** (Tensor) - 图中节点数量,形状为 :math:`(1,)`。 + + 输出: + - **output** (dict) - 包含键"stress_pred"的字典,值的形状为 :math:`(1, target\_property\_dim)`。 + + 异常: + - **ValueError** - 如果 `node_features` 中缺少必需的特征键。 \ No newline at end of file diff --git a/docs/api_python/mindchemistry/cell/mindchemistry.cell.orb.MoleculeGNS.rst b/docs/api_python/mindchemistry/cell/mindchemistry.cell.orb.MoleculeGNS.rst new file mode 100644 index 000000000..c44551f32 --- /dev/null +++ b/docs/api_python/mindchemistry/cell/mindchemistry.cell.orb.MoleculeGNS.rst @@ -0,0 +1,34 @@ +mindchemistry.cell.orb.MoleculeGNS +=================================== + +.. py:class:: mindchemistry.cell.orb.MoleculeGNS(num_node_in_features: int, num_node_out_features: int, num_edge_in_features: int, latent_dim: int, num_message_passing_steps: int, num_mlp_layers: int, mlp_hidden_dim: int, node_feature_names: List[str], edge_feature_names: List[str], use_embedding: bool = True, interactions: str = "simple_attention", interaction_params: Optional[Dict[str, Any]] = None) + + 分子图神经网络。实现用于分子性质预测的灵活模块化图神经网络,基于注意力或其他交互机制的消息传递。支持节点和边嵌入、多个消息传递步骤,以及用于复杂分子图的可定制交互层。 + + 参数: + - **num_node_in_features** (int) - 每个节点的输入特征数量。 + - **num_node_out_features** (int) - 每个节点的输出特征数量。 + - **num_edge_in_features** (int) - 每条边的输入特征数量。 + - **latent_dim** (int) - 节点和边表示的潜在维度。 + - **num_message_passing_steps** (int) - 消息传递层的数量。 + - **num_mlp_layers** (int) - 节点和边更新MLP的隐藏层数量。 + - **mlp_hidden_dim** (int) - MLP的隐藏维度大小。 + - **node_feature_names** (List[str]) - 从输入字典中使用的节点特征键列表。 + - **edge_feature_names** (List[str]) - 从输入字典中使用的边特征键列表。 + - **use_embedding** (bool,可选) - 是否对节点使用原子序数嵌入。默认值: ``True``。 + - **interactions** (str,可选) - 要使用的交互层类型(例如, ``"simple_attention"``)。默认值: ``"simple_attention"``。 + - **interaction_params** (Optional[Dict[str, Any]],可选) - 交互层的参数,例如截断、多项式阶数、门类型。默认值: ``None``。 + + 输入: + - **edge_features** (dict) - 边特征字典,必须包含 `edge_feature_names` 中指定的键。 + - **node_features** (dict) - 节点特征字典,必须包含 `node_feature_names` 中指定的键。 + - **senders** (Tensor) - 每条边的发送节点索引,形状为 :math:`(n_{edges},)`。 + - **receivers** (Tensor) - 每条边的接收节点索引,形状为 :math:`(n_{edges},)`。 + + 输出: + - **edges** (dict) - 更新的边特征字典,键"feat"的形状为 :math:`(n_{edges}, latent\_dim)`。 + - **nodes** (dict) - 更新的节点特征字典,键"feat"的形状为 :math:`(n_{nodes}, latent\_dim)`。 + + 异常: + - **ValueError** - 如果 `edge_features` 或 `node_features` 中缺少必需的特征键。 + - **ValueError** - 如果 `interactions` 不是支持的类型。 \ No newline at end of file diff --git a/docs/api_python/mindchemistry/cell/mindchemistry.cell.orb.NodeHead.rst b/docs/api_python/mindchemistry/cell/mindchemistry.cell.orb.NodeHead.rst new file mode 100644 index 000000000..2e422d861 --- /dev/null +++ b/docs/api_python/mindchemistry/cell/mindchemistry.cell.orb.NodeHead.rst @@ -0,0 +1,26 @@ +mindchemistry.cell.orb.NodeHead +=============================== + +.. py:class:: mindchemistry.cell.orb.NodeHead(latent_dim: int, num_mlp_layers: int, mlp_hidden_dim: int, target_property_dim: int, dropout: Optional[float] = None, remove_mean: bool = True) + + 节点级预测头。 + + 实现用于从节点特征预测节点级属性的神经网络头。该头可以添加到基础模型中以在预训练期间启用辅助任务,或在微调步骤中添加。 + + 参数: + - **latent_dim** (int) - 每个节点的输入特征维度。 + - **num_mlp_layers** (int) - MLP中的隐藏层数量。 + - **mlp_hidden_dim** (int) - MLP的隐藏维度大小。 + - **target_property_dim** (int) - 节点级目标属性的输出维度。 + - **dropout** (Optional[float],可选) - MLP的dropout率。默认值: ``None``。 + - **remove_mean** (bool,可选) - 如果为True,从输出中移除均值,通常用于力预测。默认值: ``True``。 + + 输入: + - **node_features** (dict) - 节点特征字典,必须包含键 "feat",形状为 :math:`(n_{nodes}, latent\_dim)`。 + - **n_node** (Tensor) - 图中节点数量,形状为 :math:`(1,)`。 + + 输出: + - **output** (dict) - 包含键 "node_pred" 的字典,值的形状为 :math:`(n_{nodes}, target\_property\_dim)`。 + + 异常: + - **ValueError** - 如果 `node_features` 中缺少必需的特征键。 \ No newline at end of file diff --git a/docs/api_python/mindchemistry/cell/mindchemistry.cell.orb.Orb.rst b/docs/api_python/mindchemistry/cell/mindchemistry.cell.orb.Orb.rst new file mode 100644 index 000000000..fe1d53a26 --- /dev/null +++ b/docs/api_python/mindchemistry/cell/mindchemistry.cell.orb.Orb.rst @@ -0,0 +1,35 @@ +mindchemistry.cell.orb.Orb +=========================== + +.. py:class:: mindchemistry.cell.orb.Orb(model: MoleculeGNS, node_head: Optional[NodeHead] = None, graph_head: Optional[GraphHead] = None, stress_head: Optional[GraphHead] = None, model_requires_grad: bool = True, cutoff_layers: Optional[int] = None) + + Orb图回归器。将预训练的基础模型(如MoleculeGNS)与可选的节点、图和应力回归头结合,支持微调或特征提取工作流程。 + + 参数: + - **model** (MoleculeGNS) - 用于消息传递和特征提取的预训练或随机初始化基础模型。 + - **node_head** (NodeHead,可选) - 节点级属性预测的回归头。默认值: ``None``。 + - **graph_head** (GraphHead,可选) - 图级属性预测(例如能量)的回归头。默认值: ``None``。 + - **stress_head** (GraphHead,可选) - 应力预测的回归头。默认值: ``None``。 + - **model_requires_grad** (bool,可选) - 是否微调基础模型(True)或冻结其参数(False)。默认值: ``True``。 + - **cutoff_layers** (int,可选) - 如果提供,仅使用基础模型的前 ``"cutoff_layers"`` 个消息传递层。默认值: ``None``。 + + 输入: + - **edge_features** (dict) - 边特征字典(例如,`{"vectors": Tensor, "r": Tensor}`)。 + - **node_features** (dict) - 节点特征字典(例如,`{"atomic_numbers": Tensor, ...}`)。 + - **senders** (Tensor) - 每条边的发送节点索引。形状::math:`(n_{edges},)`。 + - **receivers** (Tensor) - 每条边的接收节点索引。形状::math:`(n_{edges},)`。 + - **n_node** (Tensor) - 批次中每个图的节点数量。形状::math:`(n_{graphs},)`。 + + 输出: + - **output** (dict) - 包含以下内容的字典: + + - **edges** (dict) - 消息传递后的边特征,例如 `{..., "feat": Tensor}`。 + - **nodes** (dict) - 消息传递后的节点特征,例如 `{..., "feat": Tensor}`。 + - **graph_pred** (Tensor) - 图级预测,例如能量。形状::math:`(n_{graphs}, target\_property\_dim)`。 + - **node_pred** (Tensor) - 节点级预测。形状::math:`(n_{nodes}, target\_property\_dim)`。 + - **stress_pred** (Tensor) - 应力预测(如果提供stress_head)。形状::math:`(n_{graphs}, 6)`。 + + 异常: + - **ValueError** - 如果既未提供node_head也未提供graph_head。 + - **ValueError** - 如果cutoff_layers超过基础模型中的消息传递步骤数。 + - **ValueError** - 如果graph_head需要时未提供atomic_numbers。 \ No newline at end of file diff --git a/docs/api_python/mindchemistry/mindchemistry.cell.rst b/docs/api_python/mindchemistry/mindchemistry.cell.rst index 3c509e9ec..d346532e4 100644 --- a/docs/api_python/mindchemistry/mindchemistry.cell.rst +++ b/docs/api_python/mindchemistry/mindchemistry.cell.rst @@ -10,3 +10,9 @@ mindchemistry.cell mindchemistry.cell.AutoEncoder mindchemistry.cell.FCNet mindchemistry.cell.MLPNet + mindchemistry.cell.orb.AttentionInteractionNetwork + mindchemistry.cell.orb.EnergyHead + mindchemistry.cell.orb.GraphHead + mindchemistry.cell.orb.MoleculeGNS + mindchemistry.cell.orb.NodeHead + mindchemistry.cell.orb.Orb \ No newline at end of file diff --git a/docs/api_python_en/mindchemistry/mindchemistry.cell.rst b/docs/api_python_en/mindchemistry/mindchemistry.cell.rst index a5c9d4143..78cd3bfff 100644 --- a/docs/api_python_en/mindchemistry/mindchemistry.cell.rst +++ b/docs/api_python_en/mindchemistry/mindchemistry.cell.rst @@ -10,3 +10,9 @@ mindchemistry.cell mindchemistry.cell.AutoEncoder mindchemistry.cell.FCNet mindchemistry.cell.MLPNet + mindchemistry.cell.orb.AttentionInteractionNetwork + mindchemistry.cell.orb.EnergyHead + mindchemistry.cell.orb.GraphHead + mindchemistry.cell.orb.MoleculeGNS + mindchemistry.cell.orb.NodeHead + mindchemistry.cell.orb.Orb \ No newline at end of file -- Gitee From ac52e6bef45062d5920b9fd52a19664927299738 Mon Sep 17 00:00:00 2001 From: Muvyy Date: Fri, 4 Jul 2025 15:53:33 +0800 Subject: [PATCH 08/17] add orb --- .../orb/Parallel_Implementation.md | 121 +++ MindChemistry/applications/orb/README.md | 171 ++++ .../applications/orb/configs/config.yaml | 39 + .../applications/orb/configs/config_eval.yaml | 40 + .../orb/configs/config_parallel.yaml | 39 + MindChemistry/applications/orb/docs/orb.png | Bin 0 -> 840093 bytes MindChemistry/applications/orb/evaluate.py | 102 +++ MindChemistry/applications/orb/finetune.py | 311 ++++++++ .../applications/orb/requirement.txt | 8 + MindChemistry/applications/orb/run.sh | 23 + .../applications/orb/run_parallel.sh | 26 + .../applications/orb/src/__init__.py | 16 + .../applications/orb/src/ase_dataset.py | 239 ++++++ .../applications/orb/src/atomic_system.py | 222 ++++++ MindChemistry/applications/orb/src/base.py | 486 ++++++++++++ .../orb/src/featurization_utilities.py | 438 +++++++++++ .../applications/orb/src/pretrained.py | 116 +++ .../orb/src/property_definitions.py | 239 ++++++ .../applications/orb/src/segment_ops.py | 202 +++++ MindChemistry/applications/orb/src/trainer.py | 329 ++++++++ MindChemistry/applications/orb/src/utils.py | 296 +++++++ MindChemistry/mindchemistry/cell/__init__.py | 2 + .../mindchemistry/cell/orb/__init__.py | 36 + MindChemistry/mindchemistry/cell/orb/gns.py | 690 ++++++++++++++++ MindChemistry/mindchemistry/cell/orb/orb.py | 698 +++++++++++++++++ MindChemistry/mindchemistry/cell/orb/utils.py | 737 ++++++++++++++++++ tests/st/mindchemistry/cell/test_orb/base.py | 119 +++ .../mindchemistry/cell/test_orb/test_orb.py | 451 +++++++++++ tests/st/mindchemistry/cell/test_orb/utils.py | 105 +++ 29 files changed, 6301 insertions(+) create mode 100644 MindChemistry/applications/orb/Parallel_Implementation.md create mode 100644 MindChemistry/applications/orb/README.md create mode 100644 MindChemistry/applications/orb/configs/config.yaml create mode 100644 MindChemistry/applications/orb/configs/config_eval.yaml create mode 100644 MindChemistry/applications/orb/configs/config_parallel.yaml create mode 100644 MindChemistry/applications/orb/docs/orb.png create mode 100644 MindChemistry/applications/orb/evaluate.py create mode 100644 MindChemistry/applications/orb/finetune.py create mode 100644 MindChemistry/applications/orb/requirement.txt create mode 100644 MindChemistry/applications/orb/run.sh create mode 100644 MindChemistry/applications/orb/run_parallel.sh create mode 100644 MindChemistry/applications/orb/src/__init__.py create mode 100644 MindChemistry/applications/orb/src/ase_dataset.py create mode 100644 MindChemistry/applications/orb/src/atomic_system.py create mode 100644 MindChemistry/applications/orb/src/base.py create mode 100644 MindChemistry/applications/orb/src/featurization_utilities.py create mode 100644 MindChemistry/applications/orb/src/pretrained.py create mode 100644 MindChemistry/applications/orb/src/property_definitions.py create mode 100644 MindChemistry/applications/orb/src/segment_ops.py create mode 100644 MindChemistry/applications/orb/src/trainer.py create mode 100644 MindChemistry/applications/orb/src/utils.py create mode 100644 MindChemistry/mindchemistry/cell/orb/__init__.py create mode 100644 MindChemistry/mindchemistry/cell/orb/gns.py create mode 100644 MindChemistry/mindchemistry/cell/orb/orb.py create mode 100644 MindChemistry/mindchemistry/cell/orb/utils.py create mode 100644 tests/st/mindchemistry/cell/test_orb/base.py create mode 100644 tests/st/mindchemistry/cell/test_orb/test_orb.py create mode 100644 tests/st/mindchemistry/cell/test_orb/utils.py diff --git a/MindChemistry/applications/orb/Parallel_Implementation.md b/MindChemistry/applications/orb/Parallel_Implementation.md new file mode 100644 index 000000000..285183f0f --- /dev/null +++ b/MindChemistry/applications/orb/Parallel_Implementation.md @@ -0,0 +1,121 @@ +# ORB模型并行训练说明文档 + +本文档说明了ORB模型从单卡训练到多卡并行训练的实现方案、启动方式以及性能提升结果。 + +## 一、并行实现 + +对比`finetune.py`和`finetune_parallel.py`,主要有以下几处改动: + +1、引入并行训练所需的mindspore通信模块: + +```python +from mindspore.communication import init +from mindspore.communication import get_rank, get_group_size +``` + +2、训练步骤中增加梯度聚合: + +```python +# 单卡版本 +grad_fn = ms.value_and_grad(model.loss, None, optimizer.parameters, has_aux=True) + +# 并行版本 +grad_fn = ms.value_and_grad(model.loss, None, optimizer.parameters, has_aux=True) +grad_reducer = nn.DistributedGradReducer(optimizer.parameters) # 新增梯度规约器 +``` + +3、数据加载时实现数据分片: + +```python +# 单卡版本 +dataloader = [base.batch_graphs([dataset[j] for j in range(i, min(i + batch_size, len(dataset)))]) + for i in range(0, len(dataset), batch_size)] + +# 并行版本 +rank_id = get_rank() +rank_size = get_group_size() +dataloader = [[dataset[j] for j in range(i, min(i + batch_size, len(dataset)))] + for i in range(0, len(dataset), batch_size)] +dataloader = [base.batch_graphs( + data[rank_id*len(data)//rank_size : (rank_id+1)*len(data)//rank_size] +) for data in dataloader] +``` + +4、初始化并行训练环境: + +```python +ms.set_auto_parallel_context(parallel_mode=ms.ParallelMode.DATA_PARALLEL, gradients_mean=True) +init() +``` + +## 二、启动方式 + +设置训练参数 + +> 1. 修改`configs/config_parallel.yaml`中的参数: +> a. 设置`data_path`字段指定训练和测试数据集 +> b. 设置`checkpoint_path`指定预训练模型权重路径 +> c. 根据需要调整其他训练参数 +> 2. 修改`run_parallel.sh`中的并行数: +> a. 通过`--worker_num=4 --local_worker_num=4`设置使用卡的数量 + +启动训练 + +```bash +pip install -r requirement.txt +bash run_parallel.sh +``` + +## 三、性能提升 + +单卡训练结果如下所示: + +```log +Loading datasets: dataset/train_mptrj_ase.dbTotal train dataset size: 800 samples +Loading datasets: dataset/val_mptrj_ase.dbTotal train dataset size: 200 samples +Model has 25213610 trainable parameters. +Epoch: 0/100, + train_metrics: {'data_time': 0.00010895108183224995, 'train_time': 386.58018293464556, 'energy_reference_mae': 5.598883946736653, 'energy_mae': 3.3611322244008384, 'energy_mae_raw': 103.14391835530598, 'stress_mae': 41.36046473185221, 'stress_mae_raw': 12.710869789123535, 'node_mae': 0.02808943825463454, 'node_mae_raw': 0.0228044210622708, 'node_cosine_sim': 0.7026202281316122, 'fwt_0.03': 0.23958333333333334, 'loss': 44.74968592325846} + val_metrics: {'energy_reference_mae': 5.316623687744141, 'energy_mae': 3.594848871231079, 'energy_mae_raw': 101.00129699707031, 'stress_mae': 30.630516052246094, 'stress_mae_raw': 9.707925796508789, 'node_mae': 0.017718862742185593, 'node_mae_raw': 0.014386476017534733, 'node_cosine_sim': 0.5506304502487183, 'fwt_0.03': 0.375, 'loss': 34.24308395385742} + +... + +Epoch: 99/100, + train_metrics: {'data_time': 7.802306208759546e-05, 'train_time': 59.67856075416785, 'energy_reference_mae': 5.5912095705668134, 'energy_mae': 0.007512244085470836, 'energy_mae_raw': 0.21813046435515085, 'stress_mae': 0.7020445863405863, 'stress_mae_raw': 2.222463607788086, 'node_mae': 0.04725319395462672, 'node_mae_raw': 0.042800972859064736, 'node_cosine_sim': 0.3720853428045909, 'fwt_0.03': 0.09895833333333333, 'loss': 0.7568100094795227} + val_metrics: {'energy_reference_mae': 5.308632850646973, 'energy_mae': 0.27756747603416443, 'energy_mae_raw': 3.251189708709717, 'stress_mae': 2.8720269203186035, 'stress_mae_raw': 9.094478607177734, 'node_mae': 0.05565642938017845, 'node_mae_raw': 0.05041291564702988, 'node_cosine_sim': 0.212838813662529, 'fwt_0.03': 0.19499999284744263, 'loss': 3.2052507400512695} +Checkpoint saved to orb_ckpts/ +Training time: 7333.08717 seconds + +``` + +四卡并行训练结果如下所示: + +```log +Loading datasets: dataset/train_mptrj_ase.dbTotal train dataset size: 800 samples +Loading datasets: dataset/train_mptrj_ase.dbTotal train dataset size: 800 samples +Loading datasets: dataset/train_mptrj_ase.dbTotal train dataset size: 800 samples +Loading datasets: dataset/train_mptrj_ase.dbTotal train dataset size: 800 samples +Loading datasets: dataset/val_mptrj_ase.dbTotal train dataset size: 200 samples +Loading datasets: dataset/val_mptrj_ase.dbTotal train dataset size: 200 samples +Loading datasets: dataset/val_mptrj_ase.dbTotal train dataset size: 200 samples +Loading datasets: dataset/val_mptrj_ase.dbTotal train dataset size: 200 samples +Model has 25213607 trainable parameters. +Model has 25213607 trainable parameters. +Model has 25213607 trainable parameters. +Model has 25213607 trainable parameters. + +... + +Training time: 2375.89474 seconds +Training time: 2377.02413 seconds +Training time: 2377.22778 seconds +Training time: 2376.63176 seconds + +``` + +在相同的训练配置下,并行训练相比单卡训练取得了显著的性能提升: + +- 单卡训练耗时:7293.28995 seconds +- 4卡并行训练耗时:2377.22778 seconds +- 性能提升:67.40% +- 加速比:3.07倍 diff --git a/MindChemistry/applications/orb/README.md b/MindChemistry/applications/orb/README.md new file mode 100644 index 000000000..afb66a864 --- /dev/null +++ b/MindChemistry/applications/orb/README.md @@ -0,0 +1,171 @@ + +# 模型名称 + +> Orb + +## 介绍 + +> 材料科学中,设计新型功能材料一直是新兴技术的关键部分。然而,传统的从头算计算方法在设计新型无机材料时速度慢且难以扩展到实际规模的系统。近年来,深度学习方法在多个领域展示了其强大的能力,能够通过并行架构高效运行。ORB模型的核心创新在于将这种深度学习方法应用于材料建模,通过可扩展的图神经网络架构学习原子间相互作用的复杂性。ORB模型是一个基于图神经网络(GNN)的机器学习力场(MLFF),设计为通用的原子间势能模型,适用于多种模拟任务(几何优化、蒙特卡洛模拟和分子动力学模拟)。该模型的输入是一个图结构,包含原子的位置、类型以及系统配置(如晶胞尺寸和边界条件);输出包括系统的总能量、每个原子的力向量以及单元格应力。与现有的开源神经网络势能模型(如MACE)相比,ORB模型在大系统规模下的速度提高了3-6倍。在Matbench Discovery基准测试中,ORB模型的误差比其他方法降低了31%,并且在发布时成为该基准测试的最新最佳模型。ORB模型在零样本评估中表现出色,即使在没有针对特定任务进行微调的情况下,也能在高温度非周期分子的分子动力学模拟中保持稳定。 + +![Orb模型预测自由能](docs/orb.png) + +> 上图中:(a) 通过Widom插入法在Mg-MOF-74中获得的MACE + D3(左)和Orb-D3(右)自由能表面。开放金属位点附近的蓝色区域代表最低自由能,表明这些是CO2的优势吸附位点。(b) CO2在Mg-MOF-74中的吸附位置,展示了通过Widom插入法获得的两个最有利的吸附位点,其吸附能分别为-54.5 kJ/mol和-54.4 kJ/mol。虽然Orb和MACE预测的能量极小值位置相似,但ORB的自由能最小值与实验测得的吸附热(-44 kJ/mol)数值更为接近。 + +## 环境要求 + +> 1. 安装`mindspore(2.5.0)` +> 2. 安装`mindchemistry` +> 3. 安装依赖包:`pip install -r requirement.txt` + +## 快速入门 + +> 1. 在[数据集链接](https://download-mindspore.osinfra.cn/mindscience/mindchemistry/orb/dataset/)下载相应的数据集并放在`dataset`目录下 +> 2. 在[模型链接](https://download-mindspore.osinfra.cn/mindscience/mindchemistry/orb/orb_ckpts/)下载orb预训练模型ckpt并放在`orb_ckpts`目录下 +> 3. 安装依赖包:`pip install -r requirement.txt` +> 4. 单卡训练命令: `bash run.sh` +> 5. 多卡训练命令: `bash run_parallel.sh` +> 6. 评估命令: `python evaluate.py` +> 7. 模型预测结果会存在`results`目录下 + +### 代码目录结构 + +```text +代码主要模块在src文件夹下,其中dataset文件夹下是数据集,orb_ckpts文件夹下是预训练模型和训练好的模型权重文件,configs文件夹下是各代码的参数配置文件。 + +orb_models # 模型名 +├── dataset + ├── train_mptrj_ase.db # 微调阶段训练数据集 + └── val_mptrj_ase.db # 微调阶段测试数据集 +├── orb_ckpts + └── orb-mptraj-only-v2.ckpt # 预训练模型checkpoint +├── configs + ├── config.yaml # 单卡训练参数配置文件 + ├── config_parallel.yaml # 多卡并行训练参数配置文件 + └── config_eval.yaml # 推理参数配置文件 +├── src + ├── __init__.py + ├── ase_dataset.py # 处理和加载数据集 + ├── atomic_system.py # 定义原子系统的数据结构 + ├── base.py # 基础类定义 + ├── featurization_utilities.py # 提供将原子系统转换为特征向量的工具 + ├── pretrained.py # 预训练模型相关函数 + ├── property_definitions.py # 定义原子系统中各种物理性质的计算方式和命名规则 + ├── trainer.py # 模型loss类定义 + ├── segment_ops.py # 提供对数据进行分段处理的工具 + └── utils.py # 工具模块 +├── finetune.py # 模型微调代码 +├── evaluate.py # 模型推理代码 +├── run.sh # 单卡训练启动脚本 +├── run_parallel.sh # 多卡并行训练启动脚本 +└── requirement.txt # 环境 +``` + +## 下载数据集 + +在[数据集链接](https://download-mindspore.osinfra.cn/mindscience/mindchemistry/orb/dataset/)下载训练和测试数据集放置于当前路径的dataset文件夹下(如果没有需要自己手动创建);在[模型链接](https://download-mindspore.osinfra.cn/mindscience/mindchemistry/orb/orb_ckpts/)下载orb预训练模型`orb-mptraj-only-v2.ckpt`放置于当前路径的orb_ckpts文件夹下(如果没有需要自己手动创建);文件路径参考[代码目录结构](#代码目录结构) + +## 训练过程 + +### 单卡训练 + +更改`configs/config.yaml`文件中训练参数: + +> 1. 设置微调阶段的训练和测试数据集,见`data_path`字段 +> 2. 设置训练加载的预训练模型权重文件,更改`checkpoint_path`路径字段 +> 3. 其它训练设置见Training Configuration部分 + +```bash +pip install -r requirement.txt +bash run.sh +``` + +代码运行结果如下所示: + +```log +============================================================================================================== +Please run the script as: +bash run.sh +============================================================================================================== +Loading datasets: dataset/train_mptrj_ase.dbTotal train dataset size: 800 samples +Loading datasets: dataset/val_mptrj_ase.dbTotal train dataset size: 200 samples +Model has 25213610 trainable parameters. +Epoch: 0/100, + train_metrics: {'data_time': 0.00010895108183224995, 'train_time': 386.58018293464556, 'energy_reference_mae': 5.598883946736653, 'energy_mae': 3.3611322244008384, 'energy_mae_raw': 103.14391835530598, 'stress_mae': 41.36046473185221, 'stress_mae_raw': 12.710869789123535, 'node_mae': 0.02808943825463454, 'node_mae_raw': 0.0228044210622708, 'node_cosine_sim': 0.7026202281316122, 'fwt_0.03': 0.23958333333333334, 'loss': 44.74968592325846} + val_metrics: {'energy_reference_mae': 5.316623687744141, 'energy_mae': 3.594848871231079, 'energy_mae_raw': 101.00129699707031, 'stress_mae': 30.630516052246094, 'stress_mae_raw': 9.707925796508789, 'node_mae': 0.017718862742185593, 'node_mae_raw': 0.014386476017534733, 'node_cosine_sim': 0.5506304502487183, 'fwt_0.03': 0.375, 'loss': 34.24308395385742} + +... + +Epoch: 99/100, + train_metrics: {'data_time': 7.802306208759546e-05, 'train_time': 59.67856075416785, 'energy_reference_mae': 5.5912095705668134, 'energy_mae': 0.007512244085470836, 'energy_mae_raw': 0.21813046435515085, 'stress_mae': 0.7020445863405863, 'stress_mae_raw': 2.222463607788086, 'node_mae': 0.04725319395462672, 'node_mae_raw': 0.042800972859064736, 'node_cosine_sim': 0.3720853428045909, 'fwt_0.03': 0.09895833333333333, 'loss': 0.7568100094795227} + val_metrics: {'energy_reference_mae': 5.308632850646973, 'energy_mae': 0.27756747603416443, 'energy_mae_raw': 3.251189708709717, 'stress_mae': 2.8720269203186035, 'stress_mae_raw': 9.094478607177734, 'node_mae': 0.05565642938017845, 'node_mae_raw': 0.05041291564702988, 'node_cosine_sim': 0.212838813662529, 'fwt_0.03': 0.19499999284744263, 'loss': 3.2052507400512695} +Checkpoint saved to orb_ckpts/ +Training time: 7333.08717 seconds +``` + +### 多卡并行训练 + +更改`configs/config_parallel.yaml`和`run_parallel.sh`文件中训练参数: + +> 1. 设置微调阶段的训练和测试数据集,见`data_path`字段 +> 2. 设置训练加载的预训练模型权重文件,更改`checkpoint_path`路径字段 +> 3. 其它训练设置见Training Configuration部分 +> 4. 修改`run_parallel.sh`文件中`--worker_num=4 --local_worker_num=4`来设置调用的卡的数量 + +```bash +pip install -r requirement.txt +bash run_parallel.sh +``` + +代码运行结果如下所示: + +```log +Loading datasets: dataset/train_mptrj_ase.dbTotal train dataset size: 800 samples +Loading datasets: dataset/train_mptrj_ase.dbTotal train dataset size: 800 samples +Loading datasets: dataset/train_mptrj_ase.dbTotal train dataset size: 800 samples +Loading datasets: dataset/train_mptrj_ase.dbTotal train dataset size: 800 samples +Loading datasets: dataset/val_mptrj_ase.dbTotal train dataset size: 200 samples +Loading datasets: dataset/val_mptrj_ase.dbTotal train dataset size: 200 samples +Loading datasets: dataset/val_mptrj_ase.dbTotal train dataset size: 200 samples +Loading datasets: dataset/val_mptrj_ase.dbTotal train dataset size: 200 samples +Model has 25213607 trainable parameters. +Model has 25213607 trainable parameters. +Model has 25213607 trainable parameters. +Model has 25213607 trainable parameters. + +... + +Training time: 2375.89474 seconds +Training time: 2377.02413 seconds +Training time: 2377.22778 seconds +Training time: 2376.63176 seconds +``` + +### 推理 + +更改`configs/config_eval.yaml`文件中推理参数: + +> 1. 设置测试数据集,见`val_data_path`字段 +> 2. 设置推理加载的预训练模型权重文件,更改`checkpoint_path`路径字段 +> 3. 其它训练设置见Evaluating Configuration部分 + +```bash +python evaluate.py +``` + +代码运行结果如下所示: + +```log +Loading datasets: dataset/val_mptrj_ase.dbTotal train dataset size: 200 samples +Model has 25213607 trainable parameters. +.Validation loss: 0.89507836 + energy_reference_mae: 5.3159098625183105 + energy_mae: 0.541229784488678 + energy_mae_raw: 4.244375228881836 + stress_mae: 0.22862032055854797 + stress_mae_raw: 10.575761795043945 + node_mae: 0.12522821128368378 + node_mae_raw: 0.04024107754230499 + node_cosine_sim: 0.38037967681884766 + fwt_0.03: 0.22499999403953552 + loss: 0.8950783610343933 +``` diff --git a/MindChemistry/applications/orb/configs/config.yaml b/MindChemistry/applications/orb/configs/config.yaml new file mode 100644 index 000000000..cbd4189a3 --- /dev/null +++ b/MindChemistry/applications/orb/configs/config.yaml @@ -0,0 +1,39 @@ +# Training Configuration +train_data_path: dataset/train_mptrj_ase.db +val_data_path: dataset/val_mptrj_ase.db +num_workers: 8 +batch_size: 64 +gradient_clip_val: 0.5 +max_epochs: 100 +checkpoint_path: orb_ckpts/ +lr: 3.0e-4 +random_seed: 1234 + +# Model Configuration +model: + # Energy Head Configuration + energy_head: + latent_dim: 256 + num_mlp_layers: 1 + mlp_hidden_dim: 256 + target: "energy" + node_aggregation: "mean" + reference_energy_name: "vasp-shifted" + train_reference: true + predict_atom_avg: true + + # Node Head Configuration + node_head: + latent_dim: 256 + num_mlp_layers: 1 + mlp_hidden_dim: 256 + target: "forces" + remove_mean: true + + # Stress Head Configuration + stress_head: + latent_dim: 256 + num_mlp_layers: 1 + mlp_hidden_dim: 256 + target: "stress" + compute_stress: true diff --git a/MindChemistry/applications/orb/configs/config_eval.yaml b/MindChemistry/applications/orb/configs/config_eval.yaml new file mode 100644 index 000000000..1e98c5f0b --- /dev/null +++ b/MindChemistry/applications/orb/configs/config_eval.yaml @@ -0,0 +1,40 @@ +# Evaluating Configuration +mode: "PYNATIVE" +device_target: "Ascend" +device_id: 0 +# Dataset config +val_data_path: dataset/val_mptrj_ase.db +num_workers: 8 +batch_size: 64 +checkpoint_path: orb_ckpts/orb-ft-checkpoint_epoch99.ckpt +random_seed: 1234 +output_dir: results/ + +# Model Configuration +model: + # Energy Head Configuration + energy_head: + latent_dim: 256 + num_mlp_layers: 1 + mlp_hidden_dim: 256 + target: "energy" + node_aggregation: "mean" + reference_energy_name: "vasp-shifted" + train_reference: true + predict_atom_avg: true + + # Node Head Configuration + node_head: + latent_dim: 256 + num_mlp_layers: 1 + mlp_hidden_dim: 256 + target: "forces" + remove_mean: true + + # Stress Head Configuration + stress_head: + latent_dim: 256 + num_mlp_layers: 1 + mlp_hidden_dim: 256 + target: "stress" + compute_stress: true diff --git a/MindChemistry/applications/orb/configs/config_parallel.yaml b/MindChemistry/applications/orb/configs/config_parallel.yaml new file mode 100644 index 000000000..c6a5e0857 --- /dev/null +++ b/MindChemistry/applications/orb/configs/config_parallel.yaml @@ -0,0 +1,39 @@ +# Training Configuration +train_data_path: dataset/train_mptrj_ase.db +val_data_path: dataset/val_mptrj_ase.db +num_workers: 8 +batch_size: 256 +gradient_clip_val: 0.5 +max_epochs: 100 +checkpoint_path: orb_ckpts/ +lr: 3.0e-4 +random_seed: 666 + +# Model Configuration +model: + # Energy Head Configuration + energy_head: + latent_dim: 256 + num_mlp_layers: 1 + mlp_hidden_dim: 256 + target: "energy" + node_aggregation: "mean" + reference_energy_name: "vasp-shifted" + train_reference: true + predict_atom_avg: true + + # Node Head Configuration + node_head: + latent_dim: 256 + num_mlp_layers: 1 + mlp_hidden_dim: 256 + target: "forces" + remove_mean: true + + # Stress Head Configuration + stress_head: + latent_dim: 256 + num_mlp_layers: 1 + mlp_hidden_dim: 256 + target: "stress" + compute_stress: true diff --git a/MindChemistry/applications/orb/docs/orb.png b/MindChemistry/applications/orb/docs/orb.png new file mode 100644 index 0000000000000000000000000000000000000000..6f9026b83e31dad2f48d626388e15262a831d02c GIT binary patch literal 840093 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

hoJ;(n-_}tgg(Jo-!Jp#^>A6Cxb3a% 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⁡TI#owLxle)Xz!Moca%7r2>U8=nG!jb_ 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 z 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%0A_*SZ za74NHECdJ-oP7i-OdLqkCs4P*290ow{W+1QxYD`GZgAe>BUWRXz< zU0rTBA|MkUeZ??=r89+IT$lh$b3{3S?W)pRthD5-IlEuMEW2@51?Ic}yJrO}m+j)R zwYmNyt%LdD3j+Xi$mCo}WCuR=IkJN-9?31t7n$u&CPA1D!Sk7t=-I-Dp!3Ss+qVBz z42&P8Pvzcl?YB&}9Sen>DJdVlTJ6&u0}<>y&v9^Oe;;?_8h9l%z;E-KSUES(X4&c7IKFBeTgqi!I8H%0^2j3%8nK%-E5LydD}3>^L<(W3-WwklmZsq` zbg_$zvkD1$jGx(RvBbTM>_%a?OJ5~9k6K@EQi~FnZZhYw_$}eX)Qc^S9vu z`THkL^y)*x3R77zhiS^}SZV}m1tJ?dV<7rFEkIykAJql`z1luYXbwXcOEI#$?IY4; zLSh^ME(;6eNQ;hSqS0eE1dn=`>YObA1u6+*0Hf)O8xVWL6-kgqf#wsn&0kAo5#)=CC_&V~h=v%~;1Xjru8A6B+>QSIe4^(0lFuY=NnEmN z+?P*qUxFfF06`H1kwuV27G-DlrMLV4RsHULyXM~Rp6;P%`ZnBp>Ur;5Z@pX9Irr3d zs*c`*%Z3BFxv%>PvEf_&25yW-5`Rm;c74ZW{RJj_dTIMq`V3yaO@z1!La?5!U0n-Y z1U9ZM{WM~X+Drz~YQs}SP-|rb5_Ll*CTFT{$|=seb?P^ErQRJ|LGzB#UdHfsdpw2M zyn+WrzR|_VleI2hOKq%j@u5d%09Z#qc}d;s2Mf z%E>36>SdfnsWKD$?DFR7$4$xV}E*lJRUDhUN`$B)mi1*C)L_+O6kt}DG@$9{=CKv z$eVZVVikjj_%omR%$b^QKu?0{lh>J|d2<$WjVVxb=u8 z9b&-~V=eHeWMqMul`N%z$@<(16Dtio5JoBD@GvEjUL{UKr3&yUA=)h-JRoEdB#Hw? zR02-!j0E%$L%DXPOm0HK@F9=K($ysh%>tLRG!arDVFgZNT-1^$@K6;}WfoP(ZHE$U zfsh0zz${TjkEyy{)AVN z+l=_muhgd7hM5Ikdr$KV&5;kAXOD1-@|9kbFfl!e^rw_Iz)h)&|@!Ylrp@+v2@N=I<>IAKF7g@sXmFwh**2OR|q4J z%PzYN+Ch)nJ)`YYmwqvQZHVyhzCMqG`@+!BIaEYd@jhJ~0pIrJ=s0*EtbrTOt2mOH z@W1=}`B)stStBD~=AWDo(wxdp{UkhvK*x;0D0d3Hvv4=c9e^Vlq(oIE`3zzONVv8=Up zXtk8D2IaS(Tsrz~;hR)*z> zq$*AH^R9z|Uk)KmFL1E3MuSaLmLW@GsmUXYr97Io{QA+@TGuEa`KpFZd(t8 z`FT6$dV?|jhTkO-+(uNQN}3qt88-`^Wi2!bqS;#GkA^rg|KpNHB1xdiqjE!o=1MlQ zRALqoDe;gJk%(g&;(9^$B#0Uifj<=LcG!X^DBSBx(JK-MQV=u{ z^CJIPttRcw0h42|0p*v0BFT}VqqVfL-WtNbrXqZ`TW$?_+gDch?$m?sYHnGUc-mG`L;~k&>{O4IgVG@;X zTi8M$YjqTpNl2!7k3ar+>YUP1uBn-tkc(f*$enuI50|&I%C#RVdG<}*eO>)1o7eXB#SF-I=_yxyKK7|R_-5b5>;dn8 zvCs{=e*OA3acL@U=@?rR^Xr2j{NS^n{p_h|mGH0 zqlQ0FeW#c1cqw2xLSb+<`4X2SE(bzraFFikCWblDR>B4k zreTZ7*oPsZJq=7Vjlx6?6r~U`!Zt46nj37%jYgF*7-N7=GRK6I;~)*3Zcds>2}z}_ z5plt0cr3P@K7R>^WWNAgIkX3C|LX+B3uoVv_tx~8B zKNZA;w{I}Rg9fWz*lJ=o3a2*36o7Z;ZrRi|Wkw?}Cyy-`G3ik2@+P%D!fS~9%YX#z zi*u_&@qfn~w0(W_W9j0jPd*^%C%zPf2N9)!k(6jsPAC+etA~=Nf}#_za!sT+^rx51X z%u)?p@UO}6gSxu@fG04mR;~7qJUz!Kl&=xYl2hZDe!c5mz`Ff`e(d6Q+ZnTbZ239tCYL$s-FJz>guagyGe}4rcY6x#d)_@>O8Tm#i!I; zm$=gNU6r{P6dj|&OgzH_sSDHvQ;Mv7>lk+i&g3Up=>a<0<`x$ z{nG+hCh~d)N!m-El{5`N7rkgtAm)Yv1ag{B&&yrO38wz(w~iGe%;S)FD@9*{xY!!t zrx*s?tyZ2gH>`LG$SN&{EJU=aIn;v4Pg5#G$z~Rm$O>&`mUt+aIj)@IzzAfK#9OYP zxyXV*_jU?dMMx6h5eYpYs#Qrz4_uKFMpl!!s;D3DA)u85o9^M8dfJ6)Esr;ryV8FXw-e-3tZde|)KTH8OGPbi$f~;Z(o3POJ36g$&!O;(Z&&x+ zkoPUhdET1j;s5+2Dn35HX!i&3+Fl0Nnk}`UmKm%`kCct z2NlOPv5)`66HlCEil2oUmcf4f;~!sl-E|xVKdn;pKjksSTp}BoCKALnA(p`=>cVkl z-4=FlKE+3=QF8a)cVBtsm1muG*4byD%|4!;yS5LF?Bc!9k-o0~-n5gwT&JuUSm3*p z6FHsfY}4-QjJF4K;8js!on;QV0Q@jGOpPiY+9Pc>LuD~$SD;|@`&SKWOb?bQO*G6kM z{ix!^gI|6x`NE48fAJT8G4o#WNgH-T@Y#%Y>$deT-#WT*^Oi0)cR9A4dmtQA0q93 ztFW}9ROo?09-S=VxPEdiu!4!b2$)u9cpFMk>x_aF3ni{dX)#m05kmo0Tt@H1oSSaQ z2rxyG2`Z|LIVWIaxro=t>L2AQ>j`ljG^(on$3f?|^>4_Z&i8H+H&VN11rPj)6Mbkv z2Z>zx734olK`lK-LmLbuT(rEHrsou-{@;e1sw0+?jly$O1t_zgtLDsJj^z5C*Hky2 zpO9D0<3*8l^*%o|bS>3URlJkc>EEZS>4aITfgPKwE5DI!zl^bLzB$hv896^cQF+n0 zt)}OEjfoDPf1+8cu<4n_RUBrK>o=FBC9coCpc)xWBh_zx>sw4BOix!6H-|SeQ{dB* zXE94zJca4wopDC}QOjeRTslvD4~8W!PWWN1%fN+B=LYt&4}%A@4NAWF_2+JhheUp2 zCEetTheuFoI0y;`k8F5B>z5;2u149&m3mgWwM!!TMU6Zyp62v31vxq}G-|9`xw2JX z^vX>hOJaufszl!Ro!VI;9>uXvGPmv@SMk0Ut zu~ja$quR<5HZ0l4TXSS1Jr{l{!B0Mw9OcO0$56}pHKu={e)HkF4|>ppQeG!?YM`ir zH0@KXop;`Oe3oLvh7FwP&>096)zggfN!L$*`qTgZ@Bhxs*y~>Ry7VxaAn^8;=F54 z_WQyA{9yCeyL%UmE;*!c-NC)f*3MtBvj3hNcV7PWji0z<+rsXyla}@^VWF$(kzM#T zI9j`M=kSMb-+Jj_?GeWu!-7`R{YH}2Rsx&V3b}oPCP%xvShl1aOs}2`$`^U}iKY95 zQnn1zEVBEJf5Cg+^B#`Pr1tI;C2RLWbXK|A{R-WC|LDE_{3}V#(|UTA=3e{HMn}I- zSGua6_{1kp($d^})6>-u=kRhY?{sBnk)KwOKr8sAKdaJrFnAa2EpK_(yWX`=o?^^* zu*-Yhx{>9pwskGsHq^g;dzS+qhBpj;h(0`lTx14oWpva=7HqM;1rkeK&||>jC@Tg< z&?5^CM6^i(IyOTbB;Q=A9$+BG5*NNZNJAE{oIpobL!k;JV$xCs?WXTI!X7tNDz@KYnnQ?rX{Kq>u@OPv?w(nW#Q%FKM>28c5t3s+SO#yOI`WNa^-*=+(7%unaZ#U-oN-k)bcIIed6 z`t|MQYsZ`WSq)rsMzw28T3dKtzBw6Pe=y&id}sR+k9b7;R0fXO$K(B~_VH>ep6D=p zxjy&DX^D#$jlcK3?=^j~Y$|%1d5%81A~ppMFnsZg*$|N);xtd3*u%;e>sv-}pRTk% zOP7u;TsqP{uhF>VhjJrPKCZP84`UG^5w-~6+(9%11{w=_NZO!~+tbA=S8TUpa-8R3 z>V_FnDS{|;RtXx79m`#`XS8(e@uJ~i0-Yw3u3BmN8|y4?g(0>x$;#GovYIBqCKlnTy3LJ;Szin2r&EzBXM9_ZpQ<2*_3 zHgG)*oglEu2_(n>BubG%82lg@GJ>O7isCSn6-vapWa?IUFi|f=wE6kc{di=xNyS_H;`WSkTGKWV}skPUwkLI`GR@# z+*5Jt@bHb)7vEt$`Q&{vmT&(`>3F!O8lX#a{`u#B{No>IS%rh+=3K{SPvx7*e7?!b zatO2hEIv*Chhk?EUwiuc*T2r*7Y2;eS`uJW(c;C6`S|N?x7|iRZLbT!m1RzEgBpa1;ltm1HTDW@qi=mTf&bdpja#Vv96*=L`2+G*$g@Z5Vg-@fJ{1CKs#$-xg_ zxb~<8%MO`0e|c~J!k)WtNC%=`@%4=#ymjj>Lj%uPKCo_HPj5W98{RYC+%!`A(bl2Q z+`0XSJ4YV;u!q0(t#3W_&_f&fv-W$-Ew_B`bDyJfjyvwS-}}Aan>9b$-mnLiU3=}d zGkAJ@+ZVbm9PF%ewZ&!Fr%rH^-fzG!9iAxruFWI zg_=c3Ye$<$i|7&;yN3VvZ~wOGC5stzj}QMIbWpWs&Cb3h+iDB9@9JTViV16@BcB-O zfG`|lrcM3}g`;0hLQ!`kUo;I!)3_5t3A-NoSdafml+SbcVvv8A#~YN(fGbXp3AlL~LRXf12nftr>3! za1bCOAW_xk${!XZDSxRP9z&EXq*R4wO$0+JJ`o;jWk3mo_RxSE;Oe&^|XRvs#62|qz0}&J*oX)U0n~%H|MWLM^Dd>2F@znSN)K^ zDhDI~&6_tPx*uLO-75zt6w=}0orz)n`t>Yv?ZdbGS;zX+r>d8~yt@4Iw8XV&QT?Do z-p^gOEJYr{e0-v-dt~9_;hw%|M|?1o=_5KG)PY3td^SVp8O{T{3=rw3MMDr-(DS1` zEper8RS|5tqFJcBk=&vM^jlo@a|`LJVUTqOS``$q`G{T)eT6KNTGEU(`fT|Do7$1Y zTEN2eWGEuhK&pWx1#SwmrN%7xSmXp!V6q_Es0BU5$+eookowi5LLfvKj3HYhX33@% zHIzIP;hM%(W7yJXiO7N&f)fU;1l`=yPjEu;gJ?@m#GwG?ktmeSB3L2NAwp>i5W@j- zxxJKv2%?8^cd7w}5nwRF9D2xANvT{BC0voYHrQ^wwPBVjSlZ7Zd}9i249A z*7F*dLPI)`V0RZM7N%ZYVo#g8h`1^uOlx3F?DBNL0ML31?P$q?)7uyegRXo~*qj5% zbw8+vwkJP5@|QX8f2CUUdDQJNn>+_<@P6qc{i`QG`N?1V+SgeBU?Tf|SqD=sG_zzc zdC5z7?`kTW-i|%?*ylXwIq!Y%doR53Lf(4kg{>)$vzR<&t&vj!`8*Y$jN0qN2HCmA zMkV%gft+^gseA)qUVlGJXl(0epV^b1^rQ_NHc+B*z2Z(_;pe~p>%Z9NbjxpUSo6@n zlmGm{2mj8JHAl=}w5qq8$7&<2IIRCkZ(iFszvq&#-19HDZM$UK(Bqf%AGfgY(7x{Z zY@?;CG+Mi3c=Y1!L+5T8JZH<`jicSi9C!R*{^ehC*EMv^=I;X^_&}zS>D9A%Ih%g8 zy=`WRIpO@T{_3wd{(-T>xVKH)7h+C2*jeS8lb3B;PXFrsbX*}<`b0XWc^m$h^4N@4 zWa@iwr)6=kne802{I=H`W=oKlM=(u~hrOt8e)F66;UkP$j{^@JUABB%*P?Bs^UIA~ zPEy;^V(0+^ zP=ZK-$tsBombH_zCk~32`IMoR2*vWt2_B|PS#g+KHJBCE1Y(3Pu~jyh%>tI171z*2 z=0Xs}O5@VvdB}pt#g-vNLUT!nND|m;(OXAD>KBKTEXxwgCqbGtV~*&cU8(S&B+TP# zrci{GIE_$5EUtzSCs?(ZFq##r@>EXUd1{J@*R+=lCLjS9TLL2oXiL|%WVA71 zXh(I^g~`8@so5MpO?~Ch3vq(Hln(6Fz^v2&f5z+oCs}?XFWTq-=jZde&kXN5wSQJz zn#d@Ff4&(&uKlHn*xHaD4l_r?i@p2&NNxI)ANyGK(wA0Swxne(&njH8qPAki$b!6= zE4NG|T|AEJbL*-1lPk_gbW)wehAKEM4$PqnB1Yr7YYTrM5};#RB|vWb1pVLTQY5B)$EO>f zP5GWrm^w&lajUWD6&ty!Ei58yL3H6^afpYLV z%)QY3cf#TNNXmXGo_lU#t-G~O3g0^H%_3>EcBCPM~dT_ppnp zk-v|9>|^)gaDMly>!jvl4e*tzkAC!{OkU5eBZ&5ARdaCP6<1urOHR}kVJZ`k^tk@) z&;E?PP(S&}PtG~#9KPd4^-krV2oKBBEJty~G&_yfuV23xC3PbgpAefrGJNu~{zoqC z>re)F?SFFoUoGuXPs(Ti;DYJHRJ^wUp&-}~Oj`rN$byEeRj^>00G z+1iIL7+A9V`$X9-_HC{Gt%bk$zt^pO_=594cKbIj-+A7)p@Zi2tnTSzIgGPWwhoWn zHd6cb;OMPGBRgwp4*-iLJd`+=a4NO27iFK82(N#=`qi)gqd)qiefZYbv>a+nX7)F; zqu~?L{xDUi;cHMg|Xjy>R*R z!T!ZNy5{d1?sa$*v(+FBdmMV?t6j$#6fsgG#;Al*o2y*#gTvrB4hA~;40{X?hrmIC z4Wu*?xzJU@f)+|J=Mq;5p=%-_;%bW#mx!jr0ofWbjlsb2E5BBpa40!8jw>uTa#1`3 zsx2FO0|yzGfx>7W1`q;JVqIO!k8CBGvNeTP9w<#FNJfY(C~#U?s+~xAlZjx4-jsz- zE{RvAN!z&0;Z-0iR93gqMlCT6E{X7$`kUM^iFjG?Fd^c-g>pivA6YJ6l%h$hbT6_X zmd-#|L+LX(0e?h7Rzz`6EUYhd?Z&}X_XZ6rNhU?St~o1ij5JF~WI{m*qh5z>6GAQ( zK*Vcn1qS}eCV{w2uoXjRL65b~!_g1MLJf!U}?X8+wkPC-D^{G$o^Cd3Jck#v5 zop)9T98h24TE4tS$8W*1?cIFhKD8Zofq=9oJF9_Rwfw!c0ltRxcOb{(Z=qaYxnCeGTTbh6v*98zF#z}hTlFSeF z#4Us6BNK-D!Fqe?@b*}FGhE+1c^}wB6mb6xl|3LQZ_fRd=2~Y$a zhYAC}#>9tL7tNi|4p4kfqb1P6bMk@X3VBlS*ypsg)_UtuIyDeA!0SYheB>i}gNHR0 zmUB2IuQQ7sl_SCd9)I_Df5#W9-u>=(pLEhmQ=H$UCi#vLizuv+QN1kfuwibG11>(t z#kp{tj!18lbtX1}@tLkBfA*N97tJTZe)X$g9lK!OE7vSMYJT1!Fk0I>I(pr%k+0vg z^IO+m^RfTD>5@w>`Op9S&%+NN`@}RWd0+hE7jgT#UtM$9u>((d-2)Eauz3E`9^U_) z$S4b4D<05){7Y9KzG2Db-`sfVX?I=q%N;-6oOUMAuyBTKSAVtQklu$KyK;DN0UW``xQz2;k*?OT$w~@1;~fI}83D!O76_4z zT#k%lOaz-axp+vxkZQGnc;_G=}~Cmte%hs5f>rXBpwlSC0Gyq3-gVEx^?TS*S)T; zE*!0@yYIf66yN2VL*dq+CudnPIGkcv)%hbMcV+J%{_uzA-wx>1z^v84UDsBlc@CdG z9!~taR{LrGGxN<oby7VLNza&P-2f0xSE191gd>x4SRQRcD@Az3pukpQm*f7jXIV z;l<0hb}!ymrB$xn|4Ekf1Gm~)8`xScVoP#7=Rw4yHGx^Ygb-;9f;o7SW;bs&I%XvE z{grZPdQqlnlDz8xHD#pV+}%oZ;wj|G@q{2iOP|D28%J-g-XPW`6H7x&LUR)c6bVXV zn>fHsVF)4tY2Hd=N@O1XCPt({;1_}rEWbn=JP^uH%!RCL2oX#KPJ;?=n+ifyf0Ahg zhy-)R%>maXb4znFOaeoX8jyv8w>k`j9(Yq(TGgs8bixp-z$uYcUFv}Weyo@U8+fT< zTq`i>70lGLQdW3mDOhULkS<|P4YD;^jHJx!M->6*wI~lsc*N;EaUIE3N;dU3V56Is zR(YjC$;(2lW{oXzrIoD|(?S=KcaYqyj|irWmMoGbA{%#8R4NpbE^*-_t6cDp8!V7n z;y^>#)ijV9g3&Zbkd7;KmmGIY{{Pn3x>z!;v3Nzz5UCI$NYqkRZ3nM!VKr~sbIWz# z_Wuthye-d@9Nnm(Z&Jm>n-k#x03ZNKL_t(l#ZLWrzhVD-)v-8NYJjzkAOHBruYdjP z*+s+($B{=KIqS<0?NfF1`q);*qS3l_>o`j=x>9@ekiOOlC!Fvv|MD+<1cVa^*(AzQ zfxNuMI!fB*#Iq_jN_0O`;1aN`#pk$K+2U(n?0I5w>zZq>VJq12#~+_QD46;8XcPui zu`Kta3ocku8#!h9qKD7#mCdyl4J;2T{B{nq@oN6tU~Wve#bGI+p+3ME_A_$213cNGg3;r8lVuZWGO=GA)J9ilG}wK|G1@4u!N}P zJ}ZN2bu#FdQDPVhB-k|SMy~uZgT~dRD_o!N2;KtWmELr_LdpDz)Ajr;BI3x><=eU! zZ>bjZHP-y-t+yfRiC(MN#YMZQxR2!$LiY(z8xc4NNuKItfkg8dZ2=4@Awm&BP0_sZ zm7erwLvFSp6KTO|;22n>{+P>68A(k92zMn16~d6sve3oUKkHt(Ajz+!BD3X$ev~ki zCj;R+EgZqp0-+Pj&Xq)9G@OBlMXClOt)Sv0sUvV3LiB4z1iCu00#3`S6i^BXA&4ol zdq7+bB^gRwn3CR#qdEK`*UN^uR}P;g3L%=6sN)68*tqIR2|?#UN;-Oo2BZRq0&c16 z*?am4W&|xYNYr*{(~Y>AlW5gXpv8wXOqhjEq731@N%TX3-((1CP9m@#62b+>U3YGQ zP=?si#Zek{daau;a#;e6TP!I_NxoGBnu{-7TOdgS5Zun&L`z)wPQ<~82kKInN^1ld(C9hZVuCjyI%jxvmdzR|hURpuV?$DkaU2 z5bZ-4vSS@YXtxyI2oqa>~Z*Mh}G zF3{7S_Ov$KK{2DnorW?84)1!`yI5*{;uD|9O*;+Y4(m+RKxdU}CTg*bb&;W4Y+V!_U|z-wx86Az82iBf=rhD9b1X z$S{Xx4#zu;fMR`11ZX5nH-vf^j89CjLmGmI^h1>m*4Ol2mOlgET3OWD|m5t89~= zxDr9fB5}Hb`-y9;0~n_TIi*!WHSH%C_?faZ-~hAyy9~*ErC8? zeU)oYeS2|p`jl98aO3^K^YY)5@9yr8Desm#><~INP}abfTT^N&-4Fhyd7~kaV=-p3 zHo<_vc40C8v{| zp3ga?A8;P#Je+*OljLFC1j*t7E+p4rTMa#e4|$Uf6Pyk`(!i?`+TpZ8E7?U43Yq-| zPiLxv8 zS-t217s?-+(WbY-LsbwU8l@wp^CV#)a%D9NE%b0_4WD=5juX(Vhu1`#gy7BUhxXPf~{c<22B{c_Oee zh!p~kiT=u0zVf~AeecpsFFot5vshDMt5$!1KQ+%P7gh*RSVhCo^Pm5G&XC-^c{5wP z*j#n)x##jZSQfgLEn5aZVcdc<>xdF|asBXzKfL{xo1e6}|D^{k9n{P%lq`S`~_ ze%N7${mGyF$*ixPaAjZk!WXi>OXauQG3n!8zWqaFy5q_#uVlu9LtkF?s#onFqa7@fC5)D|op?CRs)z~Rwu200NO_Avf|Hv*zDSPLQu_d<+tN_rCx z&$s~-j<`x&P&DW8r(D(woK0QiV%-Qoh%hK7OS_SknVBx3glRT}n0Lmc0VV~a=aQjW zX`w4A!7Ym_uE$Vfs0<~DC5|8gPBnz8M9o3{Do4;{BeVI}G6WR360XfGLuEgGsI zBGr1+gwa5dLcH{WEC546yuM_i>vPG;ZAw5nStSAvvgXneo}(&uEx3v~PH$I?#YEw}L$?O)o?P08MJ3d~JWt6fYPtBS)( z615XLH886+uxoQNpAIg`_ov4dw&%^sgav`)P3$ktYPC(zxDK;Qw?9_7_>9D=RVmV+ zT)DEga^=o}Woe14ws`Zd{_We-Qz&2Rbip%HhtPSX(|zU$03K0f2_e#;fzup-^9%D9jfm}q^&(xKOc_N%kxVY+D0>N|w?akgoHP|VZMQA;-*R7$9$lkN$3+?{BRBzE z1m_HakSuxNBnxOauQdxw$pdpVqR=CN8>t$C<%eST00cn|1&-z*YF!4z;SquuQ@RKe zu~JsF&U=vx-h_q{5Ud!)Ng|?@3Wd0NC)kTk_)Bywh1fbPh=8BW04?2m%A`porxtcnxX&I13ISe>Ju2xhibE~0Dp+f1o z0du4mm)5j|AQD9yH&C-8)dS0@Q@}t%%)&u0@5<80&;x_w78F4dpg7P%k7XrAu5a-d zsc_+N!YPt2lM{+$0iZE&u1~*JL8Nq-tdMuoN~%3>^j=(`7u@v`9{}kUh|r# zJmo3ppMO3Z=J;Y32N=>TV`+*mB`nl6p&TQIO2jHQ|#_uTWli~HWNcG1J~=eQ=iO!NtkUo`JeRxSAFJMQ4n zLLL`CyX@kJJ#+Ds-nw?-%6&Ms&W^4}zi`#AZ6n|Qn_qwU!yjhj)RUk5WQsYFpZkZ- zS(NN!Th6;#sUaQVk~LNG{&AzNtni7-fBxrx{@Krd_TKltm-WB4^6mcP%s%`p-hV2w zolDBOAs!vVI}iAI6`k4K4DWS&vrh|4^Miig1>^0ES$}Fzy`;3|n>M9+(3wBLitSnh zoJCZnv%hG$7c8jtax@KRyY~)_uv0tDPy>xI01VH$+75VvBH{>+ECwb>5rQq>CiNkZ zc$4fzNthjXq0PFM$V==GxQb zdpVMW(ZO7jXnfEaoC?bSh(wI)6PGiHfhbibq3kiBlUN2zuJxd!HYnknxoQ9+ND!8Y zY$a?mszpUYJosV8y187!R)&%jJp7Rkzt<_;)|^DOAu?`&uGF{;+}z$YvZ0U=L~!VM z9uACaBG|?)nsu&bI7y-tg{4J^GC&*)`C8<=vZOZQ%qucEG$xd>-~r(u?aT1 z{1gdD!?=BWy%WJR96FHb!@mjg7>5Fn;x-@ALYl>Mo^}RCd7^Z-e36_Y(vYHuMsQ^- z;dI!5=>;Ym9$OGRAVh0I*^*E$Oo@~{t%4}A3M?K<)BuDMG1#CRD6kGl0n(;Q$@BPi zHt5Qt8AP1C(hxjaugerapb)<>8N( znwYhvemem$5SpZv9T$e%ai774LXsjds1yIG@G?M&l7ed#hF0sk4V|b66v{{>3DGX4 z%Ar^Zs^a37Gln`-y0JTsyWBB(S<7A=%Ux-43wqwa)sqqaMY*D~tlo{QSVyP~oDzoD z;d|J(k7vo$rsiNk#9%cD(QF+=(wc@yz}tqaAh4umu3X0S8dfSA=M`d@=x|O1+$)%5 z(m!b2(&ex#lV;E*}+Oi&%EySj~UqT+O;bVO*_mckeC_rz@nbxUw*)?SM9j)v%g?R z7srZlw(7n%I=SoAHp`0CAv@ccUgmT@ddriG+~;#yH@)`SYk_P!yw4Z5Z40=2C$eqb z>^Qc!HNY|3M8Z(+dft$GZ%vKC-s+xtIoc|e(o1F@q&=r;#w|0up*^KxhR-+Pk}+e! z^O2Pw8VpW!9T*tx;e_}65#y2cQ7$5bGGaOCE1iVS=wqTb7y7uljE)eTR#270pAw?q zB!zHT1Sb&_0i^(4;tD!E!PdajY8FFPAa@F|i0D_}qE23u2S?yBvCvq*L47)4aErlM6&pkwdS#j~kxH@IY1|mbSrMyOfhoYg1 z+@_#2p)f2WVrWG&y^&4A$qu>e`pIR9i>ZN}+hR0Ne82-ko<~SZa#TqwQyKMwr#(v<1;Zf~R(*YqXn~8HDJLXrd+Ky)vhEIlzdvF4x@(AXgF_Nz{-_#C--c$xv%0TP}$*AZ`F@Eq*;O|7ax~ zh6V*GBFgdB3mPRw8_ba;m!XKnQf&*)&5?UFNQ8kt8xhBamP}@HaWeu*f;xjJf>cw)1Uey#0M(qFhnf2#Ihp#j+1rHUREium zN*y|uDu$a555>$mURx1FL=H5r7z_G!>@kz zt1Q4=lLPCK1p9JqykiD$c-OAg-L
U;XKg^yh{Z$&SMEl(+Mq~Y<4`hI!mj>QM` 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
  • M_I! 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 PIq;>>1|!4{ z3mwN!ojPHg#oi>yQ^rp}{O|+xGk6)W*IaW=%z=5MB6YzIOKI6dcEC?%|AcJ@3?uPI z7^eVT;OK11;I#RZ0mV*@JaD*g(+t#?TYLVzy^ zO6G0%M#<& zt~mv+ze`-Jik!P#9%e(EZpyZq54Bs`r<;#VH`h07L{9Pt3})d4CFwWx6I}U&YK+$s(i?8%awGO))b@vm~q&oA?Kw$CSo?{Yzz>);}DP9 zFTM2AN*9|L5wcG)tSsyy!P~gY63d>dO32uUrt zUOrI#>C&YOA}83RfW@_MSkW8tSrk$*5zj!-oJg52@Xhi3{iQRJu1piZrC9rU6oBlgTq>@OiF;)=kvv{{J%PofEweOc9(Xex9Sk0fB4{6yN>DC;y(LuwY*lu4HgE_$ z9?V|6XGpcBWO7E%i_8N2zJLGzAoon{Z@&5F|Ni$sW$abjyafKo`uN5hZ@@Ld+QA61 zIuiusRj0;isop32h0e6i$BZ*s(ZP`s0s3jOu9ZVVZWNrX8qhxOS>#G9lW) zLOjpw-RSWw_jne1JpcN1&)L_I(2>V|=v{Z+6~Iv8SD7+lPU1Qon17U|K1PbbQ~=)a zQRv>?fB*e=-gzfegwd{m3(#?7RmdV?icki^HyY&xuUc5?j}WhhJFd zr&l*E-RydCOW_uWYwjLLfu`e##bQY_%dHZ7clTO{V|rnUWoyA9cKyOS_MBSQgY9Op zE>gbB^ZCvqkHrGA-kPY5DVyM4ke(rsVH%0IPG`b8iFcIu#0FIz%`*;lXwEEu*Mpcs|q_m5mm!D-fFQt>+^q2 zc&%o~h+561%~Qj+QZW{rtyBq=`uqD5kvc$#yR25MXP)qSbG_bQ-R{{Q&wRIgj@zvw zsXL1VkRC_q3DEPoE?fvh05NJ01~-7}H0w0IibfTk30KXo7~L`U zhZv5qt0aaHy^Y2S$N>qv8C0tK_U(&rlh7N5EjgJH3muhY5)hhJcKPM- z?(V-|hA1a^5`CpmE{8+fbtzbjy(Ndr3ChJ`I5~8?=|Pj#s#&elOQA`V-ml#*6OZ%7 z8V4v>r%v*y(u6m{M;>_uk%2N!XKg!E*YPKLuC62d@YiB1OD4<~a*#)>lfB*!mRx^3jKS(raD;gat)kH8L#>ZMss_B8m_W<&YH*B_J3JZbs&1o{O z6(1+@Mff;j@ai8Js%d-TDG#U-`?HnPZyjtQagFmS>Yh0upy;te7VLHvPu1*R1ChBXKq z5&9N;5fD4p3m7~U#oz%H;>8M%wg=z=ZKSawQiZ+?R@7vMn+oxfgk{UobwC|94445` zh;k*2ngmt^tB--*!w)~K*f45FX$c08sA(tZI_!Ip_lrlbEwC$Y_m?ggY~CKHlMN1X zy>rh!_sJ)pG^~`^P*5zJh`4Tfpc5%S##=~caRrY;)dwGZz$OK;IKVRu-o+PRjG2pK zJNd%-y!jf@&%>M%wh#�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 C(I|wOqVUoS3(?RIzugTbee`<3n1w$Zv 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 ds.GeneratorDataset: + """Builds the dataloader from a config file. + + Args: + dataset_path: Dataset path. + num_workers: The number of workers for each dataset. + batch_size: The batch_size config for each dataset. + augmentation: If rotation augmentation is used. + target_config: The target config. + shuffle: If the dataset should be shuffled. + parallel_mode: The parallel mode to use, e.g., "DATA_PARALLEL" or "NONE". + + Returns: + The Dataloader. + """ + log_loading = f"Loading datasets: {dataset_path} with {num_workers} workers. " + dataset = AseSqliteDataset( + dataset_path, target_config=target_config, augmentation=augmentation, **kwargs + ) + + log_loading += f"Total dataset size: {len(dataset)} samples" + logging.info(log_loading) + + dataset = BufferData(dataset, shuffle=shuffle) + if parallel_mode == "DATA_PARALLEL": + rank_id = get_rank() + rank_size = get_group_size() + dataloader = [ + [dataset[j] for j in range(i, min(i + batch_size, len(dataset)))] \ + for i in range(0, len(dataset), batch_size) + ] + dataloader = [ + base.batch_graphs( + data[rank_id*len(data)//rank_size : (rank_id+1)*len(data)//rank_size] + ) for data in dataloader + ] + else: + dataloader = [ + base.batch_graphs( + [dataset[j] for j in range(i, min(i + batch_size, len(dataset)))] + ) for i in range(0, len(dataset), batch_size) + ] + + return dataloader + + +def run(args, parallel_mode="NONE"): + """Training Loop. + + Args: + config (DictConfig): Config for training loop. + parallel_mode (str): The parallel mode to use, e.g., "DATA_PARALLEL" or "NONE". + """ + utils.seed_everything(args.random_seed) + + # Load dataset + train_loader = build_loader( + dataset_path=args.train_data_path, + num_workers=args.num_workers, + batch_size=args.batch_size, + target_config={"graph": ["energy", "stress"], "node": ["forces"]}, + augmentation=True, + ) + val_loader = build_loader( + dataset_path=args.val_data_path, + num_workers=args.num_workers, + batch_size=1000, + target_config={"graph": ["energy", "stress"], "node": ["forces"]}, + augmentation=False, + shuffle=False, + ) + num_steps = len(train_loader) + + # Instantiate model + pretrained_weights_path = os.path.join(args.checkpoint_path, "orb-mptraj-only-v2.ckpt") + model = pretrained.orb_mptraj_only_v2(pretrained_weights_path) + loss_fn = OrbLoss(model) + model_params = sum(p.size for p in model.trainable_params() if p.requires_grad) + logging.info("Model has %d trainable parameters.", model_params) + + total_steps = args.max_epochs * num_steps + optimizer, lr_scheduler = utils.get_optim(args.lr, total_steps, model) + + # Fine-tuning loop + start_epoch = 0 + train_time = timeit.default_timer() + for epoch in range(start_epoch, args.max_epochs): + train_metrics, val_metrics = finetune( + model=model, + loss_fn=loss_fn, + optimizer=optimizer, + train_dataloader=train_loader, + val_dataloader=val_loader, + lr_scheduler=lr_scheduler, + clip_grad=args.gradient_clip_val, + parallel_mode=parallel_mode, + ) + print(f'Epoch: {epoch}/{args.max_epochs}, \n train_metrics: {train_metrics}\n val_metrics: {val_metrics}') + + # Save checkpoint from last epoch + if epoch == args.max_epochs - 1: + # create ckpts folder if it does not exist + if not os.path.exists(args.checkpoint_path): + os.makedirs(args.checkpoint_path) + if parallel_mode == "DATA_PARALLEL": + rank_id = get_rank() + rank_size = get_group_size() + ms.save_checkpoint( + model, + os.path.join( + args.checkpoint_path, + f"orb-ft-parallel[{rank_id}-{rank_size}]-checkpoint_epoch{epoch}.ckpt" + ), + ) + else: + ms.save_checkpoint( + model, + os.path.join(args.checkpoint_path, f"orb-ft-checkpoint_epoch{epoch}.ckpt"), + ) + logging.info("Checkpoint saved to %s", args.checkpoint_path) + logging.info("Training time: %.5f seconds", timeit.default_timer() - train_time) + + +def main(): + """Main.""" + parser = argparse.ArgumentParser( + description="Finetune orb model", + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + ) + parser.add_argument( + "--config", type=str, default="configs/config.yaml", help="Path to config file" + ) + parser.add_argument( + "--device_target", + type=str, + default="Ascend", + help="The target device to run, support 'Ascend'" + ) + parser.add_argument( + "--device_id", default=0, type=int, help="device index to use." + ) + parser.add_argument( + "--parallel_mode", + type=str, + default="NONE", + choices=["DATA_PARALLEL", "NONE"], + help="Parallel mode, support 'DATA_PARALLEL', 'NONE'" + ) + args = parser.parse_args() + + if args.parallel_mode.upper() == "DATA_PARALLEL": + ms.set_context( + mode=context.PYNATIVE_MODE, + device_target=args.device_target, + pynative_synchronize=True, + ) + # Set parallel context + ms.set_auto_parallel_context(parallel_mode=ms.ParallelMode.DATA_PARALLEL, gradients_mean=True) + init() + ms.set_seed(1) + else: + ms.set_context( + mode=context.PYNATIVE_MODE, + device_target=args.device_target, + device_id=args.device_id, + pynative_synchronize=True, + ) + configs = utils.load_cfg(args.config) + warnings.filterwarnings("ignore") + + run(configs, args.parallel_mode) + + +if __name__ == "__main__": + main() diff --git a/MindChemistry/applications/orb/requirement.txt b/MindChemistry/applications/orb/requirement.txt new file mode 100644 index 000000000..e3f1a95c7 --- /dev/null +++ b/MindChemistry/applications/orb/requirement.txt @@ -0,0 +1,8 @@ +python>=3.10 +cached_path>=1.6.7 +ase>=3.24.0 +numpy>=1.26.4 +scipy>=1.15.1 +dm-tree==0.1.8 +tqdm>=4.66.5 +mindspore==2.5.0 \ No newline at end of file diff --git a/MindChemistry/applications/orb/run.sh b/MindChemistry/applications/orb/run.sh new file mode 100644 index 000000000..e21df131a --- /dev/null +++ b/MindChemistry/applications/orb/run.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# Copyright 2025 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +export GLOG_v=3 +echo "==============================================================================================================" +echo "Please run the script as: " +echo "bash run.sh" +echo "==============================================================================================================" + +python finetune.py --device_target Ascend --device_id 7 diff --git a/MindChemistry/applications/orb/run_parallel.sh b/MindChemistry/applications/orb/run_parallel.sh new file mode 100644 index 000000000..e49c6ab71 --- /dev/null +++ b/MindChemistry/applications/orb/run_parallel.sh @@ -0,0 +1,26 @@ +#!/bin/bash +# Copyright 2025 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +rm -rf msrun_log +mkdir msrun_log + +export GLOG_v=3 +echo "==============================================================================================================" +echo "Please run the script as: " +echo "bash run_parallel.sh" +echo "==============================================================================================================" + +msrun --worker_num=4 --local_worker_num=4 --master_port=8118 --log_dir=msrun_log --join=True --cluster_time_out=300 finetune.py --config configs/config_parallel.yaml --parallel_mode DATA_PARALLEL \ No newline at end of file diff --git a/MindChemistry/applications/orb/src/__init__.py b/MindChemistry/applications/orb/src/__init__.py new file mode 100644 index 000000000..328a08a65 --- /dev/null +++ b/MindChemistry/applications/orb/src/__init__.py @@ -0,0 +1,16 @@ +# ============================================================================ +# Copyright 2025 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +"""init""" diff --git a/MindChemistry/applications/orb/src/ase_dataset.py b/MindChemistry/applications/orb/src/ase_dataset.py new file mode 100644 index 000000000..f61b95aa3 --- /dev/null +++ b/MindChemistry/applications/orb/src/ase_dataset.py @@ -0,0 +1,239 @@ +# ============================================================================ +# Copyright 2025 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +"""ASE dataset""" + +import os +from typing import Dict, Optional, Tuple, Union + +import ase +import ase.db +import ase.db.row +import ase.stress +import numpy as np +import mindspore as ms +from mindspore import Tensor + +from src import atomic_system, property_definitions +from src.base import AtomGraphs +from src.utils import rand_matrix + + +class AseSqliteDataset: + """AseSqliteDataset. + + A MindSpore Dataset for reading ASE Sqlite serialized Atoms objects. + + Args: + dataset_path: Local path to read. + system_config: A config for controlling how an atomic system is represented. + target_config: A config for regression/classification targets. + augmentation: If random rotation augmentation is used. + + Returns: + An AseSqliteDataset. + """ + + def __init__( + self, + dataset_path: Union[str, os.PathLike], + system_config: Optional[atomic_system.SystemConfig] = None, + target_config: Optional[Dict] = None, + augmentation: Optional[bool] = True, + ): + super().__init__() + self.augmentation = augmentation + self.path = dataset_path + self.db = ase.db.connect(str(self.path), serial=True, type="db") + + self.feature_config = system_config + if target_config is None: + target_config = { + "graph": ["energy", "stress"], + "node": ["forces"], + "edge": [], + } + self.target_config = target_config + + def __getitem__(self, idx) -> AtomGraphs: + """Fetch an item from the db. + + Args: + idx: An index to fetch from the db file and convert to an AtomGraphs. + + Returns: + A AtomGraphs object containing everything the model needs as input, + positions and atom types and other auxiliary information, such as + fine tuning targets, or global graph features. + """ + # Sqlite db is 1 indexed. + row = self.db.get(idx + 1) + atoms = row.toatoms() + node_properties = property_definitions.get_property_from_row( + self.target_config["node"], row + ) + graph_property_dict = {} + for target_property in self.target_config["graph"]: + system_properties = property_definitions.get_property_from_row( + target_property, row + ) + # transform stress to voigt6 representation + if target_property == "stress" and len(system_properties.reshape(-1)) == 9: + system_properties = Tensor( + ase.stress.full_3x3_to_voigt_6_stress(system_properties.reshape(3, 3)), + dtype=ms.float32, + ).reshape(1, -1) + graph_property_dict[target_property] = system_properties + extra_targets = { + "node": {"forces": node_properties}, + "edge": {}, + "graph": graph_property_dict, + } + if self.augmentation: + atoms, extra_targets = random_rotations_with_properties(atoms, extra_targets) + + atom_graph = atomic_system.ase_atoms_to_atom_graphs( + atoms, + system_id=idx, + brute_force_knn=False, + ) + atom_graph = self._add_extra_targets(atom_graph, extra_targets) + + return atom_graph + + def get_atom(self, idx: int) -> ase.Atoms: + """Return the Atoms object for the dataset index.""" + row = self.db.get(idx + 1) + return row.toatoms() + + def get_atom_and_metadata(self, idx: int) -> Tuple[ase.Atoms, Dict]: + """Return the Atoms object plus a dict of metadata for the dataset index.""" + row = self.db.get(idx + 1) + return row.toatoms(), row.data + + def __len__(self) -> int: + """Return the dataset length.""" + return len(self.db) + + def __repr__(self) -> str: + """String representation of class.""" + return f"AseSqliteDataset(path={self.path})" + + def _add_extra_targets( + self, + atom_graph: AtomGraphs, + extra_targets: Dict[str, Dict], + ): + """Add extra features and targets to the AtomGraphs object. + + Args: + atom_graph: AtomGraphs object to add extra features and targets to. + extra_targets: Dictionary of extra targets to add. + """ + node_targets = ( + atom_graph.node_targets if atom_graph.node_targets is not None else {} + ) + node_targets = {**node_targets, **extra_targets["node"]} + + edge_targets = ( + atom_graph.edge_targets if atom_graph.edge_targets is not None else {} + ) + edge_targets = {**edge_targets, **extra_targets["edge"]} + + system_targets = ( + atom_graph.system_targets if atom_graph.system_targets is not None else {} + ) + system_targets = {**system_targets, **extra_targets["graph"]} + + return atom_graph._replace( + node_targets=node_targets if node_targets != {} else None, + edge_targets=edge_targets if edge_targets != {} else None, + system_targets=system_targets if system_targets != {} else None, + ) + + +def random_rotations_with_properties( + atoms: ase.Atoms, properties: dict +) -> Tuple[ase.Atoms, dict]: + """Randomly rotate atoms in ase.Atoms object. + + This exists to handle the case where we also need to rotate properties. + Currently we only ever do this for random rotations, but it could be extended. + + Args: + atoms (ase.Atoms): Atoms object to rotate. + properties (dict): Dictionary of properties to rotate. + """ + rand_rotation = rand_matrix(1)[0] + atoms.positions = atoms.positions @ rand_rotation + if atoms.cell is not None: + atoms.set_cell(atoms.cell.array @ rand_rotation) + + new_node_properties = {} + for key, v in properties["node"].items(): + if tuple(v.shape) == tuple(atoms.positions.shape): + new_node_properties[key] = v @ rand_rotation + else: + new_node_properties[key] = v + properties["node"] = new_node_properties + + if "stress" in properties["graph"]: + # Transformation rule of stress tensor + stress = properties["graph"]["stress"] + full_stress = ase.stress.voigt_6_to_full_3x3_stress(stress) + + if full_stress.shape != (3, 3): + full_stress = full_stress.reshape(3, 3) + + transformed = np.dot(np.dot(rand_rotation, full_stress), rand_rotation.T) + # Back to voigt notation, and shape (1, 6) for consistency with batching + properties["graph"]["stress"] = Tensor( + [ + transformed[0, 0], + transformed[1, 1], + transformed[2, 2], + transformed[1, 2], + transformed[0, 2], + transformed[0, 1], + ], + dtype=ms.float32, + ).unsqueeze(0) + + return atoms, properties + +class BufferData: + """Wrapper for a dataset. Loads all data into memory.""" + + def __init__(self, dataset, shuffle: bool = True): + """BufferData. + Args: + dataset: The dataset to wrap. + shuffle: If True, shuffle the data. + """ + self.data_objects = [dataset[i] for i in range(len(dataset))] + if shuffle: + self.shuffle() + + def __len__(self): + return len(self.data_objects) + + def __getitem__(self, index): + return self.data_objects[index] + + def shuffle(self): + """Shuffle the data.""" + indices = np.arange(len(self.data_objects)) + np.random.shuffle(indices) + self.data_objects = [self.data_objects[i] for i in indices] diff --git a/MindChemistry/applications/orb/src/atomic_system.py b/MindChemistry/applications/orb/src/atomic_system.py new file mode 100644 index 000000000..b9895e9bd --- /dev/null +++ b/MindChemistry/applications/orb/src/atomic_system.py @@ -0,0 +1,222 @@ +# ============================================================================ +# Copyright 2025 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +"""atomic system""" + +from dataclasses import dataclass +from typing import List, Optional + +import ase +from ase import constraints +from ase.calculators.singlepoint import SinglePointCalculator + +import mindspore as ms +from mindspore import Tensor, mint + +from src import featurization_utilities +from src.base import AtomGraphs + + +@dataclass +class SystemConfig: + """Config controlling how to featurize a system of atoms. + + Args: + radius: radius for edge construction + max_num_neighbors: maximum number of neighbours each node can send messages to. + use_timestep_0: (unused - purely for compatibility with internal models) + """ + + radius: float + max_num_neighbors: int + use_timestep_0: bool = True + + +def atom_graphs_to_ase_atoms( + graphs: AtomGraphs, + energy: Optional[Tensor] = None, + forces: Optional[Tensor] = None, + stress: Optional[Tensor] = None, +) -> List[ase.Atoms]: + """Converts a list of graphs to a list of ase.Atoms.""" + if "atomic_numbers_embedding" in graphs.node_features: + atomic_numbers = mint.argmax( + graphs.node_features["atomic_numbers_embedding"], dim=-1 + ) + else: + atomic_numbers = graphs.node_features["atomic_numbers"] + atomic_numbers_split = mint.split(atomic_numbers, graphs.n_node.tolist()) + positions_split = mint.split(graphs.positions, graphs.n_node.tolist()) + assert graphs.tags is not None and graphs.system_features is not None + tags = mint.split(graphs.tags, graphs.n_node.tolist()) + + calculations = {} + if energy is not None: + energy_list = mint.unbind(energy.detach()) + assert len(energy_list) == len(atomic_numbers_split) + calculations["energy"] = energy_list + if forces is not None: + forces_list = mint.split(forces.detach(), graphs.n_node.tolist()) + assert len(forces_list) == len(atomic_numbers_split) + calculations["forces"] = forces_list + if stress is not None: + stress_list = mint.unbind(stress.detach()) + assert len(stress_list) == len(atomic_numbers_split) + calculations["stress"] = stress_list + + atoms_list = [] + for index, (n, p, c, t) in enumerate( + zip(atomic_numbers_split, positions_split, graphs.cell, tags) + ): + atoms = ase.Atoms( + numbers=n.detach(), + positions=p.detach(), + cell=c.detach(), + tags=t.detach(), + pbc=mint.any(c != 0), + ) + if calculations != {}: + spc = SinglePointCalculator( + atoms=atoms, + **{ + key: ( + val[index].item() + if val[index].nelement() == 1 + else val[index].numpy() + ) + for key, val in calculations.items() + }, + ) + atoms.calc = spc + atoms_list.append(atoms) + + return atoms_list + + +def ase_atoms_to_atom_graphs( + atoms: ase.Atoms, + system_config: SystemConfig = SystemConfig( + radius=10.0, max_num_neighbors=20, use_timestep_0=True + ), + system_id: Optional[int] = None, + brute_force_knn: Optional[bool] = None, +) -> AtomGraphs: + """Generate AtomGraphs from an ase.Atoms object. + + Args: + atoms: ase.Atoms object + system_config: SystemConfig object + system_id: Optional system_id + brute_force_knn: whether to use a 'brute force' knn approach with torch.cdist for kdtree construction. + Defaults to None, in which case brute_force is used if we a GPU is available (2-6x faster), + but not on CPU (1.5x faster - 4x slower). For very large systems, brute_force may OOM on GPU, + so it is recommended to set to False in that case. + device: device to put the tensors on. + + Returns: + AtomGraphs object + """ + atomic_numbers = ms.from_numpy(atoms.numbers).long() + atom_type_embedding = mint.nn.functional.one_hot( + atomic_numbers, num_classes=118 + ).type(ms.float32) + + node_feats = { + "atomic_numbers": atomic_numbers.to(ms.int64), + "atomic_numbers_embedding": atom_type_embedding.to(ms.float32), + "positions": ms.from_numpy(atoms.positions).to(ms.float32), + } + system_feats = {"cell": Tensor(atoms.cell.array[None, ...]).to(ms.float32)} + edge_feats, senders, receivers = _get_edge_feats( + node_feats["positions"], + system_feats["cell"][0], + system_config.radius, + system_config.max_num_neighbors, + brute_force=brute_force_knn, + ) + + num_atoms = len(node_feats["positions"]) + atom_graph = AtomGraphs( + senders=senders, + receivers=receivers, + n_node=Tensor([num_atoms]), + n_edge=Tensor([len(senders)]), + node_features=node_feats, + edge_features=edge_feats, + system_features=system_feats, + system_id=Tensor([system_id]) if system_id is not None else system_id, + fix_atoms=ase_fix_atoms_to_tensor(atoms), + tags=_get_ase_tags(atoms), + radius=system_config.radius, + max_num_neighbors=system_config.max_num_neighbors, + ) + return atom_graph + + +def _get_edge_feats( + positions: Tensor, + cell: Tensor, + radius: float, + max_num_neighbours: int, + brute_force: Optional[bool] = None, +): + """Get edge features. + + Args: + positions: (n_nodes, 3) positions tensor + cell: 3x3 tensor unit cell for a system + radius: radius for edge construction + max_num_neighbours: maximum number of neighbours each node can send messages to. + n_kdtree_workers: number of workers to use for kdtree construction. + brute_force: whether to use brute force for kdtree construction. + """ + # Construct a graph from a 3x3 supercell (as opposed to an infinite supercell). + ( + edge_index, + edge_vectors, + ) = featurization_utilities.compute_pbc_radius_graph( + positions=positions, + periodic_boundaries=cell, + radius=radius, + max_number_neighbors=max_num_neighbours, + brute_force=brute_force, + ) + edge_feats = { + "vectors": edge_vectors.to(ms.float32), + "r": edge_vectors.norm(dim=-1), + } + senders, receivers = edge_index[0], edge_index[1] + return edge_feats, senders, receivers + + +def _get_ase_tags(atoms: ase.Atoms) -> Tensor: + """Get tags from ase.Atoms object.""" + tags = atoms.get_tags() + if tags is not None: + tags = Tensor(tags) + else: + tags = mint.zeros(len(atoms)) + return tags + + +def ase_fix_atoms_to_tensor(atoms: ase.Atoms) -> Optional[Tensor]: + """Get fixed atoms from ase.Atoms object.""" + fixed_atoms = None + if atoms.constraints is not None and atoms.constraints: + constraint = atoms.constraints[0] + if isinstance(constraint, constraints.FixAtoms): + fixed_atoms = mint.zeros((len(atoms)), dtype=ms.bool_) + fixed_atoms[constraint.index] = True + return fixed_atoms diff --git a/MindChemistry/applications/orb/src/base.py b/MindChemistry/applications/orb/src/base.py new file mode 100644 index 000000000..046e5950f --- /dev/null +++ b/MindChemistry/applications/orb/src/base.py @@ -0,0 +1,486 @@ +# ============================================================================ +# Copyright 2025 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +"""Base Model class.""" + +from collections import defaultdict +from copy import deepcopy +from typing import Any, Dict, List, Mapping, NamedTuple, Optional, Sequence, Union +import tree + +import mindspore as ms +from mindspore import ops, Tensor, mint + +from src import featurization_utilities + +Metric = Union[Tensor, int, float] +TensorDict = Mapping[str, Optional[Tensor]] + + +class ModelOutput(NamedTuple): + """A model's output.""" + + loss: Tensor + log: Mapping[str, Metric] + + +class AtomGraphs(NamedTuple): + """A class representing the input to a model for a graph. + + Args: + senders (torch.Tensor): The integer source nodes for each edge. + receivers (torch.Tensor): The integer destination nodes for each edge. + n_node (torch.Tensor): A (batch_size, ) shaped tensor containing the number of nodes per graph. + n_edge (torch.Tensor): A (batch_size, ) shaped tensor containing the number of edges per graph. + node_features (Dict[str, torch.Tensor]): A dictionary containing node feature tensors. + It will always contain "atomic_numbers" and "positions" keys, representing the + atomic numbers of each node, and the 3d cartesian positions of them respectively. + edge_features (Dict[str, torch.Tensor]): A dictionary containing edge feature tensors. + system_features (Optional[TensorDict]): An optional dictionary containing system-level features. + node_targets (Optional[Dict[torch.Tensor]]): An optional dict of tensors containing targets + for individual nodes. This tensor is commonly expected to have shape (num_nodes, *). + edge_target (Optional[torch.Tensor]): An optional tensor containing targets for individual edges. + This tensor is commonly expected to have (num_edges, *). + system_targets (Optional[Dict[torch.Tensor]]): An optional dict of tensors containing targets for the + entire system. system_id (Optional[torch.Tensor]): An optional tensor containing the ID of the system. + fix_atoms (Optional[torch.Tensor]): An optional tensor containing information on fixed atoms in the system. + """ + + senders: Tensor + receivers: Tensor + n_node: Tensor + n_edge: Tensor + node_features: Dict[str, Tensor] + edge_features: Dict[str, Tensor] + system_features: Dict[str, Tensor] + node_targets: Optional[Dict[str, Tensor]] = None + edge_targets: Optional[Dict[str, Tensor]] = None + system_targets: Optional[Dict[str, Tensor]] = None + system_id: Optional[Tensor] = None + fix_atoms: Optional[Tensor] = None + tags: Optional[Tensor] = None + radius: Optional[float] = None + max_num_neighbors: Optional[int] = None + + @property + def positions(self): + """Get positions of atoms.""" + return self.node_features["positions"] + + @positions.setter + def positions(self, val: Tensor): + self.node_features["positions"] = val + + @property + def atomic_numbers(self): + """Get integer atomic numbers.""" + return self.node_features["atomic_numbers"] + + @atomic_numbers.setter + def atomic_numbers(self, val: Tensor): + self.node_features["atomic_numbers"] = val + + @property + def cell(self): + """Get unit cells.""" + assert self.system_features + return self.system_features.get("cell") + + @cell.setter + def cell(self, val: Tensor): + assert self.system_features + self.system_features["cell"] = val + + def clone(self) -> "AtomGraphs": + """Clone the AtomGraphs object. + + Note: this differs from deepcopy() because it preserves gradients. + """ + + def _clone(x): + if isinstance(x, Tensor): + return x.clone() + return x + + return tree.map_structure(_clone, self) + + def to(self, device: Any = None) -> "AtomGraphs": + """Move AtomGraphs child tensors to a device.""" + + print(f"Moving AtomGraphs to device: {device}") + def _to(x): + if hasattr(x, "to"): + return x + return x + + return tree.map_structure(_to, self) + + def tachdetach(self) -> "AtomGraphs": + """Detach all child tensors.""" + + def _detach(x): + if hasattr(x, "detach"): + return x.detach() + return x + + return tree.map_structure(_detach, self) + + def equals(self, graphs: "AtomGraphs") -> bool: + """Check two atomgraphs are equal.""" + + def _is_equal(x, y): + if isinstance(x, Tensor): + return mint.equal(x, y) + return x == y + + flat_results = tree.flatten(tree.map_structure(_is_equal, self, graphs)) + return all(flat_results) + + def allclose(self, graphs: "AtomGraphs", rtol=1e-5, atol=1e-8) -> bool: + """Check all tensors/scalars of two atomgraphs are close.""" + + def _is_close(x, y): + if isinstance(x, Tensor): + return mint.allclose(x, y, rtol=rtol, atol=atol) + if isinstance(x, (float, int)): + return mint.allclose( + Tensor(x), Tensor(y), rtol=rtol, atol=atol + ) + return x == y + + flat_results = tree.flatten(tree.map_structure(_is_close, self, graphs)) + return all(flat_results) + + def to_dict(self): + """Return a dictionary mapping each AtomGraph property to a corresponding tensor/scalar. + + Any nested attributes of the AtomGraphs are unpacked so the + returned dict has keys like "positions" and "atomic_numbers". + + Any None attributes are not included in the dictionary. + + Returns: + dict: A dictionary mapping attribute_name -> tensor/scalar + """ + ret = {} + for key, val in self._asdict().items(): + if val is None: + continue + if isinstance(val, dict): + for k, v in val.items(): + ret[k] = v + else: + ret[key] = val + + return ret + + def to_batch_dict(self) -> Dict[str, Any]: + """Return a single dictionary mapping each AtomGraph property to a corresponding list of tensors/scalars. + + Returns: + dict: A dict mapping attribute_name -> list of length batch_size containing tensors/scalars. + """ + batch_dict = defaultdict(list) + for graph in self.split(self): + for key, value in graph.to_dict().items(): + batch_dict[key].append(value) + return batch_dict + + def split(self, clone=True) -> List["AtomGraphs"]: + """Splits batched AtomGraphs into constituent system AtomGraphs. + + Args: + graphs (AtomGraphs): A batched AtomGraphs object. + clone (bool): Whether to clone the graphs before splitting. + Cloning removes risk of side-effects, but uses more memory. + """ + graphs = self.clone() if clone else self + + batch_nodes = graphs.n_node.tolist() + batch_edges = graphs.n_edge.tolist() + + if not batch_nodes: + raise ValueError("Cannot split empty batch") + if len(batch_nodes) == 1: + return [graphs] + + batch_systems = mint.ones(len(batch_nodes), dtype=ms.int32).tolist() + node_features = _split_features(graphs.node_features, batch_nodes) + node_targets = _split_features(graphs.node_targets, batch_nodes) + edge_features = _split_features(graphs.edge_features, batch_edges) + edge_targets = _split_features(graphs.edge_targets, batch_edges) + system_features = _split_features(graphs.system_features, batch_systems) + system_targets = _split_features(graphs.system_targets, batch_systems) + system_ids = _split_tensors(graphs.system_id, batch_systems) + fix_atoms = _split_tensors(graphs.fix_atoms, batch_nodes) + tags = _split_tensors(graphs.tags, batch_nodes) + batch_nodes = [Tensor([n]) for n in batch_nodes] + batch_edges = [Tensor([e]) for e in batch_edges] + + # calculate the new senders and receivers + senders = list(_split_tensors(graphs.senders, batch_edges)) + receivers = list(_split_tensors(graphs.receivers, batch_edges)) + n_graphs = graphs.n_node.shape[0] + offsets = mint.cumsum(graphs.n_node[:-1], 0) + offsets = mint.cat([Tensor([0]), offsets]) + unbatched_senders = [] + unbatched_recievers = [] + for graph_index in range(n_graphs): + s = senders[graph_index] - offsets[graph_index] + r = receivers[graph_index] - offsets[graph_index] + unbatched_senders.append(s) + unbatched_recievers.append(r) + + return [ + AtomGraphs(*args) + for args in zip( + unbatched_senders, + unbatched_recievers, + batch_nodes, + batch_edges, + node_features, + edge_features, + system_features, + node_targets, + edge_targets, + system_targets, + system_ids, + fix_atoms, + tags, + [graphs.radius for _ in range(len(batch_nodes))], + [graphs.max_num_neighbors for _ in range(len(batch_nodes))], + ) + ] + + +def batch_graphs(graphs: List[AtomGraphs]) -> AtomGraphs: + """Batch graphs together by concatenating their nodes, edges, and features. + + Args: + graphs (List[AtomGraphs]): A list of AtomGraphs to be batched together. + + Returns: + AtomGraphs: A new AtomGraphs object with the concatenated nodes, + edges, and features from the input graphs, along with concatenated target, + system ID, and other information. + """ + # Calculates offsets for sender and receiver arrays, caused by concatenating + # the nodes arrays. + offsets = mint.cumsum( + Tensor([0] + [mint.sum(g.n_node) for g in graphs[:-1]]), 0 + ) + radius = graphs[0].radius + assert {graph.radius for graph in graphs} == {radius} + max_num_neighbours = graphs[0].max_num_neighbors + assert {graph.max_num_neighbors for graph in graphs} == {max_num_neighbours} + + return AtomGraphs( + n_node=mint.concat([g.n_node for g in graphs], dim=0).to(ms.int64), + n_edge=mint.concat([g.n_edge for g in graphs], dim=0).to(ms.int64), + senders=mint.concat( + [g.senders + o for g, o in zip(graphs, offsets)], dim=0 + ).to(ms.int64), + receivers=mint.concat( + [g.receivers + o for g, o in zip(graphs, offsets)], dim=0 + ).to(ms.int64), + node_features=_map_concat([g.node_features for g in graphs]), + edge_features=_map_concat([g.edge_features for g in graphs]), + system_features=_map_concat([g.system_features for g in graphs]), + node_targets=_map_concat([g.node_targets for g in graphs]), + edge_targets=_map_concat([g.edge_targets for g in graphs]), + system_targets=_map_concat([g.system_targets for g in graphs]), + system_id=_concat([g.system_id for g in graphs]), + fix_atoms=_concat([g.fix_atoms for g in graphs]), + tags=_concat([g.tags for g in graphs]), + radius=radius, + max_num_neighbors=max_num_neighbours, + ) + + +def refeaturize_atomgraphs( + atoms: AtomGraphs, + positions: Tensor, + atomic_number_embeddings: Optional[Tensor] = None, + cell: Optional[Tensor] = None, + recompute_neighbors=True, + updates: Optional[Tensor] = None, + fixed_atom_pos: Optional[Tensor] = None, + fixed_atom_type_embedding: Optional[Tensor] = None, + differentiable: bool = False, +) -> AtomGraphs: + """Return a graph updated according to the new positions, and (if given) atomic numbers and unit cells. + + Note: if a unit cell is given, it will *both* be used to do the + pbc-remapping and be set on the returned AtomGraphs + + Args: + atoms (AtomGraphs): The original AtomGraphs object. + positions (torch.Tensor): The new positions of the atoms. + atomic_number_embeddings (Optional[torch.Tensor]): The new atomic number embeddings. + cell (Optional[torch.Tensor]): The new unit cell. + recompute_neighbors (bool): Whether to recompute the neighbor list. + updates (Optional[torch.Tensor]): The updates to the positions. + fixed_atom_pos (Optional[torch.Tensor]): The positions of atoms + which are fixed when diffusing on a fixed trajectory. + fixed_atom_type_embedding (Optional[torch.Tensor]): If using atom type diffusion + with a fixed trajectory, the unormalized vectors of the fixed atoms. Shape (n_atoms, 118). + differentiable (bool): Whether to make the graph inputs require_grad. This includes + the positions and atomic number embeddings, if passed. + exact_pbc_image_neighborhood: bool: If the exact pbc image neighborhood calculation (from torch nl) + which considers boundary crossing for more than cell is used. + + Returns: + AtomGraphs: A refeaturized AtomGraphs object. + """ + if cell is None: + cell = atoms.cell + + if atoms.fix_atoms is not None and fixed_atom_pos is not None: + positions[atoms.fix_atoms] = fixed_atom_pos[atoms.fix_atoms] + + if ( + atoms.fix_atoms is not None + and fixed_atom_type_embedding is not None + and atomic_number_embeddings is not None + ): + atomic_number_embeddings[atoms.fix_atoms] = fixed_atom_type_embedding[ + atoms.fix_atoms + ] + + num_atoms = atoms.n_node + positions = featurization_utilities.batch_map_to_pbc_cell( + positions, cell, num_atoms + ) + + if differentiable: + positions.requires_grad = True + if atomic_number_embeddings is not None: + atomic_number_embeddings.requires_grad = True + + if recompute_neighbors: + assert atoms.radius is not None and atoms.max_num_neighbors is not None + ( + edge_index, + edge_vectors, + batch_num_edges, + ) = featurization_utilities.batch_compute_pbc_radius_graph( + positions=positions, + periodic_boundaries=cell, + radius=atoms.radius, + image_idx=num_atoms, + max_number_neighbors=atoms.max_num_neighbors, + ) + new_senders = edge_index[0] + new_receivers = edge_index[1] + else: + assert updates is not None + new_senders = atoms.senders + new_receivers = atoms.receivers + edge_vectors = recompute_edge_vectors(atoms, updates) + batch_num_edges = atoms.n_edge + + edge_features = { + "vectors": edge_vectors.to(ms.float32), + } + + new_node_features = {} + if atoms.node_features is not None: + new_node_features = deepcopy(atoms.node_features) + new_node_features["positions"] = positions + if atomic_number_embeddings is not None: + new_node_features["atomic_numbers_embedding"] = atomic_number_embeddings + + new_system_features = {} + if atoms.system_features is not None: + new_system_features = deepcopy(atoms.system_features) + new_system_features["cell"] = cell + + new_atoms = AtomGraphs( + senders=new_senders, + receivers=new_receivers, + n_node=atoms.n_node, + n_edge=batch_num_edges, + node_features=new_node_features, + edge_features=edge_features, + system_features=new_system_features, + node_targets=atoms.node_targets, + system_targets=atoms.system_targets, + fix_atoms=atoms.fix_atoms, + tags=atoms.tags, + radius=atoms.radius, + max_num_neighbors=atoms.max_num_neighbors, + ) + + return new_atoms + + +def recompute_edge_vectors(atoms, updates): + """Recomputes edge vectors with per node updates.""" + updates = -updates + senders = atoms.senders + receivers = atoms.receivers + edge_translation = updates[senders] - updates[receivers] + return atoms.edge_features["vectors"] + edge_translation + + +def volume_atomgraphs(atoms: AtomGraphs): + """Returns the volume of the unit cell.""" + cell = atoms.cell + cross = ops.Cross(dim=1) + return (cell[:, 0] * cross(cell[:, 1], cell[:, 2])).sum(-1) + + +def _map_concat(nests): + concat = lambda *args: _concat(args) + return tree.map_structure(concat, *nests) + + +def _concat( + tensors: List[Optional[Tensor]], +) -> Optional[Tensor]: + """Splits tensors based on the intended split sizes.""" + if any([x is None for x in tensors]): + return None + return mint.concat(tensors, dim=0) + + +def _split_tensors( + features: Optional[Tensor], + split_sizes: List[int], +) -> Sequence[Optional[Tensor]]: + """Splits tensors based on the intended split sizes.""" + if features is None: + return [None] * len(split_sizes) + + return mint.split(features, split_sizes) + + +def _split_features( + features: Optional[TensorDict], + split_sizes: List[int], +) -> Sequence[Optional[TensorDict]]: + """Splits features based on the intended split sizes.""" + if features is None: + return [None] * len(split_sizes) + + split_dict = { + k: mint.split(v, split_sizes) if v is not None else [None] * len(split_sizes) + for k, v in features.items() + } + individual_tuples = zip(*[v for v in split_dict.values()]) + individual_dicts: List[Optional[TensorDict]] = list( + map(lambda k: dict(zip(split_dict.keys(), k)), individual_tuples) + ) + return individual_dicts diff --git a/MindChemistry/applications/orb/src/featurization_utilities.py b/MindChemistry/applications/orb/src/featurization_utilities.py new file mode 100644 index 000000000..dd68d4ad8 --- /dev/null +++ b/MindChemistry/applications/orb/src/featurization_utilities.py @@ -0,0 +1,438 @@ +# ============================================================================ +# Copyright 2025 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +"""Featurization utilities for molecular models.""" + +from typing import Callable, Optional, Tuple, Union +from pynanoflann import KDTree as NanoKDTree +from scipy.spatial import KDTree as SciKDTree + +import numpy as np +import mindspore as ms +from mindspore import ops, Tensor, mint + +DistanceFeaturizer = Callable[[Tensor], Tensor] + + + +def gaussian_basis_function( + scalars: Tensor, + num_bases: Union[Tensor, int], + radius: Union[Tensor, float], + scale: Union[Tensor, float] = 1.0, +) -> Tensor: + """Gaussian basis function applied to a tensor of scalars. + + Args: + scalars (Tensor): Scalars to compute the gbf on. Shape [num_scalars]. + num_bases (Tensor): The number of bases. An Int. + radius (Tensor): The largest centre of the bases. A Float. + scale (Tensor, optional): The width of the gaussians. Defaults to 1. + + Returns: + Tensor: A tensor of shape [num_scalars, num_bases]. + """ + assert len(scalars.shape) == 1 + gaussian_means = ops.arange( + 0, float(radius), float(radius) / num_bases + ) + return mint.exp( + -(scale**2) * (scalars.unsqueeze(1) - gaussian_means.unsqueeze(0)).abs() ** 2 + ) + + +def featurize_edges( + edge_vectors: Tensor, distance_featurization: DistanceFeaturizer +) -> Tensor: + """Featurizes edge features, provides concatenated unit vector along with featurized distances. + + Args: + edge_vectors (tensor): Edge vectors to featurize. Shape [num_edge, 3] + distance_featurization (DistanceFeaturization): A function that featurizes the distances of the vectors. + + Returns: + tensor: Edge features, shape [num_edge, num_edge_features]. + """ + edge_features = [] + edge_norms = mint.linalg.norm(edge_vectors, dim=1) + featurized_edge_norms = distance_featurization(edge_norms) + unit_vectors = edge_vectors / edge_norms.unsqueeze(1) + unit_vectors = mint.nan_to_num(unit_vectors, nan=0, posinf=0, neginf=0) + edge_features.append(featurized_edge_norms) + edge_features.append(unit_vectors) + return mint.cat(edge_features, dim=-1).to(ms.float32) + + +def compute_edge_vectors( + edge_index: Tensor, positions: Tensor +) -> Tensor: + """Computes edge vectors from positions. + + Args: + edge_index (tensor): The edge index. First position the senders, second + position the receivers. Shape [2, num_edge]. + positions (tensor): Positions of each node. Shape [num_nodes, 3] + + Returns: + tensor: The vectors of each edge. + """ + senders = edge_index[0] + receivers = edge_index[1] + return positions[receivers] - positions[senders] + + +# These are offsets applied to coordinates to create a 3x3x3 +# tiled periodic image of the input structure. +OFFSETS = np.array( + [ + [-1.0, 1.0, -1.0], + [0.0, 1.0, -1.0], + [1.0, 1.0, -1.0], + [-1.0, 0.0, -1.0], + [0.0, 0.0, -1.0], + [1.0, 0.0, -1.0], + [-1.0, -1.0, -1.0], + [0.0, -1.0, -1.0], + [1.0, -1.0, -1.0], + [-1.0, 1.0, 0.0], + [0.0, 1.0, 0.0], + [1.0, 1.0, 0.0], + [-1.0, 0.0, 0.0], + [0.0, 0.0, 0.0], + [1.0, 0.0, 0.0], + [-1.0, -1.0, 0.0], + [0.0, -1.0, 0.0], + [1.0, -1.0, 0.0], + [-1.0, 1.0, 1.0], + [0.0, 1.0, 1.0], + [1.0, 1.0, 1.0], + [-1.0, 0.0, 1.0], + [0.0, 0.0, 1.0], + [1.0, 0.0, 1.0], + [-1.0, -1.0, 1.0], + [0.0, -1.0, 1.0], + [1.0, -1.0, 1.0], + ] +) + +NUM_OFFSETS = len(OFFSETS) + + +def _compute_img_positions_torch( + positions: Tensor, periodic_boundaries: Tensor +) -> Tensor: + """Computes the positions of the periodic images of the input structure. + + Consider the following 2D periodic boundary image. + + --- + --- + --- + + | | | | + + --- + --- + --- + + | | x | | + + --- + --- + --- + + | | | | + + --- + --- + --- + + + Each tile in this has an associated translation to translate + 'x'. For example, the top left would by (-1, +1). These are + the 'OFFSETS', but OFFSETS are for a 3x3x3 grid. + + This is complicated by the fact that our periodic + boundaries are not orthogonal to each other, and so we form a new + translation by taking a linear combination of the unit cell axes. + + Args: + positions (Tensor): Positions of the atoms. Shape [num_atoms, 3]. + periodic_boundaries (Tensor): Periodic boundaries of the unit cell. + This can be 2 shapes - [3, 3] or [num_atoms, 3, 3]. If the shape is + [num_atoms, 3, 3], it is assumed that the PBC has been repeat_interleaved + for each atom, i.e this function is agnostic as to whether it is computing + with respect to a batch or not. + Returns: + Tensor: The positions of the periodic images. Shape [num_atoms, 27, 3]. + """ + num_positions = len(positions) + + has_unbatched_pbc = periodic_boundaries.shape == (3, 3) + if has_unbatched_pbc: + periodic_boundaries = periodic_boundaries.unsqueeze(0) + periodic_boundaries = periodic_boundaries.expand((num_positions, 3, 3)) + + assert periodic_boundaries.shape[0] == positions.shape[0] + offsets = Tensor(OFFSETS, dtype=positions.dtype) + offsets = mint.unsqueeze(offsets, 0) + repeated_offsets = offsets.expand((num_positions, NUM_OFFSETS, 3)) + repeated_offsets = mint.unsqueeze(repeated_offsets, 3) + periodic_boundaries = mint.unsqueeze(periodic_boundaries, 1) + translations = repeated_offsets * periodic_boundaries + translations = translations.sum(2) + + # Expand the positions so we can broadcast add the translations per PBC image. + expanded_positions = positions.unsqueeze(1) + translated_positions = expanded_positions + translations + return translated_positions + + +def brute_force_knn( + img_positions: Tensor, positions: Tensor, k: int +) -> Tuple[Tensor, Tensor]: + """Brute force k-nearest neighbors. + + Args: + img_positions (Tensor): The positions of the images. Shape [num_atoms * 27, 3]. + positions (Tensor): The positions of the query atoms. Shape [num_atoms, 3]. + k (int): The number of nearest neighbors to find. + + Returns: + return_types.topk: The indices of the nearest neighbors. Shape [num_atoms, k]. + """ + dist = mint.cdist(positions, img_positions) + return mint.topk(dist, k, largest=False, sorted=True) + + +def compute_pbc_radius_graph( + *, + positions: Tensor, + periodic_boundaries: Tensor, + radius: Union[float, Tensor], + max_number_neighbors: int = 20, + brute_force: Optional[bool] = None, + library: str = "pynanoflann", + n_workers: int = 1, +) -> Tuple[Tensor, Tensor]: + """Computes periodic condition radius graph from positions. + + Args: + positions (Tensor): 3D positions of particles. Shape [num_particles, 3]. + periodic_boundaries (Tensor): A 3x3 matrix where the periodic boundary axes are rows or columns. + radius (Union[float, tensor]): The radius within which to connect atoms. + max_number_neighbors (int, optional): The maximum number of neighbors for each particle. Defaults to 20. + brute_force (bool, optional): Whether to use brute force knn. Defaults to None, in which case brute_force + is used if GPU is available (2-6x faster), but not on CPU (1.5x faster - 4x slower, depending on + system size). + library (str, optional): The KDTree library to use. Currently, either 'scipy' or 'pynanoflann'. + n_workers (int, optional): The number of workers to use for KDTree construction. Defaults to 1. + + Returns: + Tuple[Tensor, Tensor]: A 2-Tuple. First, an edge_index tensor, where the first index are the + sender indices and the second are the receiver indices. Second, the vector displacements between edges. + """ + if brute_force is None: + brute_force = ms.get_context("device_target") == "GPU" + + if mint.any(periodic_boundaries != 0.0): + supercell_positions = _compute_img_positions_torch( + positions=positions, periodic_boundaries=periodic_boundaries + ) + # CRITICALLY IMPORTANT: We need to reshape the supercell_positions to be + # flat, so we can use them for the nearest neighbors. The *way* in which + # they are flattened is important, because we need to be able to map the + # indices returned from the nearest neighbors to the original positions. + # The easiest way to do this is to transpose, so that when we flatten, we + # have: + # [ + # img_0_atom_0, + # img_0_atom_1, + # ..., + # img_0_atom_N, + # img_1_atom_0, + # img_1_atom_1, + # ..., + # img_N_atom_N, + # etc + # ] + # This way, we can take the mod of the indices returned from the nearest + # neighbors to get the original indices. + # Shape (27, num_positions, 3) + supercell_positions = supercell_positions.transpose(0, 1) + supercell_positions = supercell_positions.reshape(-1, 3) + else: + supercell_positions = positions + + num_positions = positions.shape[0] + + if brute_force: + # Brute force + distance_values, nearest_img_neighbors = brute_force_knn( + supercell_positions, + positions, + min(max_number_neighbors + 1, len(supercell_positions)), + ) + + # remove distances greater than radius, and exclude self + within_radius = distance_values[:, 1:] < (radius + 1e-6) + + num_neighbors_per_position = within_radius.sum(-1) + # remove the self node which will be closest + index_array = nearest_img_neighbors[:, 1:] + + senders = mint.repeat_interleave( + mint.arange(num_positions), num_neighbors_per_position + ) + receivers_imgs = index_array[within_radius] + + receivers = receivers_imgs % num_positions + vectors = supercell_positions[receivers_imgs] - positions[senders] + stacked = mint.stack((senders, receivers), dim=0) + return stacked, vectors + + # Build a KDTree from the supercell positions. + # Query that KDTree just for the positions in the central cell. + tree_data = supercell_positions.clone().numpy() + tree_query = positions.clone().numpy() + distance_upper_bound = np.array(radius) + 1e-8 + if library == "scipy": + tree = SciKDTree(tree_data, leafsize=100) + _, nearest_img_neighbors = tree.query( + tree_query, + max_number_neighbors + 1, + distance_upper_bound=distance_upper_bound, + workers=n_workers, + p=2, + ) + # Remove the self-edge that will be closest + index_array = np.array(nearest_img_neighbors)[:, 1:] + # Remove any entry that equals len(supercell_positions), which are negative hits + receivers_imgs = index_array[index_array != len(supercell_positions)] + num_neighbors_per_position = (index_array != len(supercell_positions)).sum( + -1 + ) + elif library == "pynanoflann": + tree = NanoKDTree( + n_neighbors=min(max_number_neighbors + 1, len(supercell_positions)), + radius=radius, + leaf_size=100, + metric="l2", + ) + tree.fit(tree_data) + distance_values, nearest_img_neighbors = tree.kneighbors( + tree_query, n_jobs=n_workers + ) + nearest_img_neighbors = nearest_img_neighbors.astype(np.int32) + + # remove the self node which will be closest + index_array = nearest_img_neighbors[:, 1:] + # remove distances greater than radius + within_radius = distance_values[:, 1:] < (radius + 1e-6) + receivers_imgs = index_array[within_radius] + num_neighbors_per_position = within_radius.sum(-1) + + # We construct our senders and receiver indexes. + senders = np.repeat(np.arange(num_positions), list(num_neighbors_per_position)) + receivers_img_torch = Tensor(receivers_imgs, ms.int32) + # Map back to indexes on the central image. + receivers = receivers_img_torch % num_positions + senders_torch = Tensor(senders, ms.int32) + + # Finally compute the vector displacements between senders and receivers. + vectors = supercell_positions[receivers_img_torch] - positions[senders_torch] + return mint.stack((senders_torch, receivers), dim=0), vectors + + +def batch_map_to_pbc_cell( + positions: Tensor, + periodic_boundary_conditions: Tensor, + num_atoms: Tensor, +) -> Tensor: + """Maps positions to within a periodic boundary cell, for a batched system. + + Args: + positions (Tensor): The positions to be mapped. Shape [num_particles, 3] + periodic_boundary_conditions (Tensor): The periodic boundary conditions. Shape [num_batches, 3, 3] + num_atoms (LongTensor): The number of atoms in each batch. Shape [num_batches] + """ + dtype = positions.dtype + positions = positions.double() + periodic_boundary_conditions = periodic_boundary_conditions.double() + + pbc_nodes = mint.repeat_interleave(periodic_boundary_conditions, num_atoms, dim=0) + + # To use the stable linalg.solve, we need to mask batch elements which don't + # have periodic boundaries. We do this by adding the identity matrix as their PBC, + # because we need the PBCs to be non-singular. + null_pbc = pbc_nodes.abs().sum(dim=[1, 2]) == 0 + identity = mint.eye(3, dtype=ms.bool_) + # Broadcast the identity to the elements of the batch that have a null pbc. + null_pbc_identity_mask = null_pbc.view(-1, 1, 1) & identity.view(1, 3, 3) + pbc_nodes_masked = pbc_nodes + null_pbc_identity_mask.double() + + lattice_coords = ops.matrix_solve(pbc_nodes_masked.transpose(1, 2), positions) + frac_coords = lattice_coords % 1.0 + + cartesian = mint.einsum("bi,bij->bj", frac_coords, pbc_nodes) + return mint.where(null_pbc.unsqueeze(1), positions, cartesian).to(dtype) + + +def batch_compute_pbc_radius_graph( + *, + positions: Tensor, + periodic_boundaries: Tensor, + radius: Union[float, Tensor], + image_idx: Tensor, + max_number_neighbors: int = 20, + brute_force: Optional[bool] = None, + library: str = "scipy", +): + """Computes batched periodic boundary condition radius graph from positions. + + This function is optimised for computation on CPU, and work work on device. GPU implementations + are likely to be significantly slower because of the irregularly sized tensor computations and the + lack of extremely fast GPU knn routines. + + Args: + positions (Tensor): 3D positions of a batch of particles. Shape [num_particles, 3]. + periodic_boundaries (Tensor): A batch where each element 3x3 matrix where the periodic boundary axes + are rows or columns. + radius (Union[float, tensor]): The radius within which to connect atoms. + image_idx (Tensor): A vector where each element indicates the number of particles in each element of + the batch. Of size len(batch). + max_number_neighbors (int, optional): The maximum number of neighbors for each particle. Defaults to 20. + brute_force (bool, optional): Whether to use brute force knn. Defaults to None, in which case brute_force + is used if we are on GPU (2-6x faster), but not on CPU (1.5x faster - 4x slower). + library (str, optional): The KDTree library to use. Currently, either 'scipy' or 'pynanoflann'. + + Returns: + Tuple[Tensor, Tensor]: A 2-Tuple. First, an edge_index tensor, where the first index are the + sender indices and the second are the receiver indices. Second, the vector displacements between edges. + """ + idx = 0 + all_edges = [] + all_vectors = [] + num_edges = [] + + for p, pbc in zip( + ops.tensor_split(positions, mint.cumsum(image_idx, 0)[:-1]), + periodic_boundaries, + ): + edges, vectors = compute_pbc_radius_graph( + positions=p, + periodic_boundaries=pbc, + radius=radius, + max_number_neighbors=max_number_neighbors, + brute_force=brute_force, + library=library, + ) + if idx == 0: + offset = 0 + else: + offset += image_idx[idx - 1] + all_edges.append(edges + offset) + all_vectors.append(vectors) + num_edges.append(len(edges[0])) + idx += 1 + + all_edges = ms.numpy.concatenate(all_edges, 1) + all_vectors = ms.numpy.concatenate(all_vectors, 0) + num_edges = Tensor(num_edges, dtype=ms.int64) + return all_edges, all_vectors, num_edges diff --git a/MindChemistry/applications/orb/src/pretrained.py b/MindChemistry/applications/orb/src/pretrained.py new file mode 100644 index 000000000..cb66db19f --- /dev/null +++ b/MindChemistry/applications/orb/src/pretrained.py @@ -0,0 +1,116 @@ +# ============================================================================ +# Copyright 2025 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +"""pretrained.""" + +import os +from typing import Optional + +from mindspore import nn, load_checkpoint, load_param_into_net + +from mindchemistry.cell import ( + EnergyHead, + GraphHead, + Orb, + NodeHead, + MoleculeGNS, +) + + +def get_gns( + latent_dim: int = 256, + mlp_hidden_dim: int = 512, + num_message_passing_steps: int = 15, + num_edge_in_features: int = 23, + distance_cutoff: bool = True, + attention_gate: str = "sigmoid", +) -> MoleculeGNS: + """Define the base pretrained model architecture.""" + return MoleculeGNS( + num_node_in_features=256, + num_node_out_features=3, + num_edge_in_features=num_edge_in_features, + latent_dim=latent_dim, + interactions="simple_attention", + interaction_params={ + "distance_cutoff": distance_cutoff, + "polynomial_order": 4, + "cutoff_rmax": 6, + "attention_gate": attention_gate, + }, + num_message_passing_steps=num_message_passing_steps, + num_mlp_layers=2, + mlp_hidden_dim=mlp_hidden_dim, + use_embedding=True, + node_feature_names=["feat"], + edge_feature_names=["feat"], + ) + + +def load_model_for_inference(model: nn.Cell, weights_path: str) -> nn.Cell: + """ + Load a pretrained model in inference mode, using GPU if available. + """ + if not os.path.exists(weights_path): + raise FileNotFoundError(f"Checkpoint file {weights_path} not found.") + param_dict = load_checkpoint(weights_path) + load_param_into_net(model, param_dict) + model.set_train(False) + + return model + +def orb_v2( + weights_path: Optional[str] = None, +): + """Load ORB v2.""" + gns = get_gns() + + model = Orb( + graph_head=EnergyHead( + latent_dim=256, + num_mlp_layers=1, + mlp_hidden_dim=256, + target_property_dim=1, + node_aggregation="mean", + reference_energy_name="vasp-shifted", + train_reference=True, + predict_atom_avg=True, + ), + node_head=NodeHead( + latent_dim=256, + num_mlp_layers=1, + mlp_hidden_dim=256, + target_property_dim=3, + remove_mean=True, + ), + stress_head=GraphHead( + latent_dim=256, + num_mlp_layers=1, + mlp_hidden_dim=256, + target_property_dim=6, + compute_stress=True, + ), + model=gns, + ) + model = load_model_for_inference(model, weights_path) + return model + + +def orb_mptraj_only_v2( + weights_path: Optional[str] = None, +): + """Load ORB MPTraj Only v2.""" + + return orb_v2(weights_path,) diff --git a/MindChemistry/applications/orb/src/property_definitions.py b/MindChemistry/applications/orb/src/property_definitions.py new file mode 100644 index 000000000..3951c06c0 --- /dev/null +++ b/MindChemistry/applications/orb/src/property_definitions.py @@ -0,0 +1,239 @@ +# ============================================================================ +# Copyright 2025 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +"""Classes that define prediction targets.""" + +from dataclasses import dataclass +from typing import Any, Callable, Dict, List, Literal, Optional, Tuple, Union + +import ase.data +import ase.db +import ase.db.row +import ase.db.sqlite +import numpy as np + +import mindspore as ms +from mindspore import ops, Tensor, mint + +HARTREE_TO_EV = 27.211386245988 + + +def recursive_getattr(obj: object, attr: str) -> Any: + """Recursively access an object property using dot notation.""" + for sub_attr in attr.split("."): + obj = getattr(obj, sub_attr) + + return obj + + +def get_property_from_row( + name: Union[str, List[str]], + row: ase.db.row.AtomsRow, + conversion_factor: float = 1.0, +) -> Tensor: + """Retrieve arbitrary values from ase db data dict.""" + if isinstance(name, str): + names = [name] + else: + names = name + values = [] + for name_ in names: + attribute = recursive_getattr(row, name_) + target = np.array(attribute) + values.append(target) + + property_tensor = ms.from_numpy(np.hstack(values)).to(ms.float32) + + while len(property_tensor.shape) < 2: + property_tensor = property_tensor[None, ...] + + if "stress" in name and property_tensor.shape == (3, 3): + # convert stress tensor to voigt notation + property_tensor = Tensor( + [ + property_tensor[0, 0], + property_tensor[1, 1], + property_tensor[2, 2], + property_tensor[1, 2], + property_tensor[0, 2], + property_tensor[0, 1], + ], + dtype=ms.float32, + ).unsqueeze(0) + return property_tensor * conversion_factor + + +@dataclass +class PropertyDefinition: + """Defines how to extract and transform a quantative property from an ase db. + + Such properties have two primary use-cases: + - as features for the model to use / condition on. + - as target variables for regression tasks. + + Args: + name: The name of the property. + dim: The dimensionality of the property variable. + domain: Whether the variable is real, binary or categorical. If using + this variable as a regression target, then var_type determines + the loss function used e.g. MSE, BCE or cross-entropy loss. + row_to_property_fn: A function defining how a target can be + retrieved from an ase database row. + means: The mean to transform this by in the model. + stds: The std to scale this by in the model. + """ + + name: str + dim: int + domain: Literal["real", "binary", "categorical"] + row_to_property_fn: Optional[Callable] = None + means: Optional[Tensor] = None + stds: Optional[Tensor] = None + + +def energy_row_fn(row: ase.db.row.AtomsRow, dataset: str) -> float: + """Energy data in eV. + + - Some datasets use sums of energy values e.g. PBE + D3. + - For external datasets, we should explicitly register how + to extract the energy property by adding it to `extract_info'. + - Unregistered datasets default to using the `energy` attribute + and a conversion factor of 1, which is always correct for our + internally generated datasets. + """ + extract_info: Dict[str, List[Tuple]] = { + "mp-traj": [("energy", 1)], + "mp-traj-d3": [("energy", 1), ("data.d3.energy", 1)], + "alexandria-d3": [("energy", 1), ("data.d3.energy", 1)], + } + if dataset not in extract_info: + if not hasattr(row, "energy"): + raise ValueError( + f"db row {row.id} doesn't have an energy attribute directly " + ", but also doesn't define a method to extract energy info." + ) + return get_property_from_row("energy", row, 1) + + energy_ = 0.0 + for row_attribute, conversion_factor in extract_info[dataset]: + energy_ += get_property_from_row(row_attribute, row, conversion_factor) + return energy_ + + +def forces_row_fn(row: ase.db.row.AtomsRow, dataset: str): + """Force data in eV / Angstrom. + + - Some datasets use sums of energy values e.g. PBE + D3. + - For external datasets, we should explicitly register how + to extract the energy property by adding it to `extract_info'. + - Unregistered datasets default to using the `energy` attribute + and a conversion factor of 1, which is always correct for our + internally generated datasets. + """ + extract_info: Dict[str, List[Tuple]] = { + "mp-traj": [("forces", 1)], + "mp-traj-d3": [("forces", 1), ("data.d3.forces", 1)], + "alexandria-d3": [("forces", 1), ("data.d3.forces", 1)], + } + if dataset not in extract_info: + if not hasattr(row, "forces"): + raise ValueError( + f"db row {row.id} doesn't have a forces attribute directly, " + "but also doesn't define a method to extract forces info." + ) + return get_property_from_row("forces", row, 1) + + forces_ = 0.0 + for row_attribute, conversion_factor in extract_info[dataset]: + forces_ += get_property_from_row(row_attribute, row, conversion_factor) + return forces_ + + +def stress_row_fn(row: ase.db.row.AtomsRow, dataset: str) -> float: + """Extract stress data.""" + extract_info: Dict[str, List[Tuple]] = { + "mp-traj": [("stress", 1)], + "mp-traj-d3": [("stress", 1), ("data.d3.stress", 1)], + "alexandria-d3": [("stress", 1), ("data.d3.stress", 1)], + } + if dataset not in extract_info: + if not hasattr(row, "stress"): + raise ValueError( + f"db row {row.id} doesn't have an stress attribute directly " + ", but also doesn't define a method to extract stress info." + ) + return get_property_from_row("stress", row, 1) + + stress_ = 0.0 + for row_attribute, conversion_factor in extract_info[dataset]: + stress_ += get_property_from_row(row_attribute, row, conversion_factor) + return stress_ + + +def test_fixture_node_row_fn(row: ase.db.row.AtomsRow): + """Just return random noise.""" + + pos = ms.from_numpy(row.toatoms().positions) + return ops.rand_like(pos).to(ms.float32) + + +def test_fixture_graph_row_fn(): + """Just return random noise.""" + return mint.randn((1, 1)).to(ms.float32) + + +energy = PropertyDefinition( + name="energy", + dim=1, + domain="real", + row_to_property_fn=energy_row_fn, +) + +forces = PropertyDefinition( + name="forces", + dim=3, + domain="real", + row_to_property_fn=forces_row_fn, +) + +stress = PropertyDefinition( + name="stress", + dim=6, + domain="real", + row_to_property_fn=stress_row_fn, +) + +test_fixture = PropertyDefinition( + name="test-fixture", + dim=3, + domain="real", + row_to_property_fn=test_fixture_node_row_fn, +) + +test_graph_fixture = PropertyDefinition( + name="test-graph-fixture", + dim=1, + domain="real", + row_to_property_fn=test_fixture_graph_row_fn, +) + + +PROPERTIES = { + "energy": energy, + "forces": forces, + "stress": stress, + "test-fixture": test_fixture, + "test-graph-fixture": test_graph_fixture, +} diff --git a/MindChemistry/applications/orb/src/segment_ops.py b/MindChemistry/applications/orb/src/segment_ops.py new file mode 100644 index 000000000..d8b671e40 --- /dev/null +++ b/MindChemistry/applications/orb/src/segment_ops.py @@ -0,0 +1,202 @@ +# ============================================================================ +# Copyright 2025 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +"""Segment operations.""" + +from typing import Optional +import numpy as np +import mindspore as ms +from mindspore import ops, Tensor, mint + +MSINT = [ms.int64, ms.int32, ms.int16, ms.int8, ms.uint8] + + +def aggregate_nodes(tensor: Tensor, n_node: Tensor, reduction: str = "mean", deterministic: bool = False) -> Tensor: + """Aggregates over a tensor based on graph sizes.""" + count = len(n_node) + if deterministic: + ms.set_seed(1) + segments = ops.arange(count).repeat_interleave(n_node).astype(ms.int32) + if reduction == "sum": + return scatter_sum(tensor, segments, dim=0) + if reduction == "mean": + return scatter_mean(tensor, segments, dim=0) + if reduction == "max": + return scatter_max(tensor, segments, dim=0) + raise ValueError("Invalid reduction argument. Use sum, mean or max.") + + +def segment_sum(data: Tensor, segment_ids: Tensor, num_segments: int): + """Computes index based sum over segments of a tensor.""" + return scatter_sum(data, segment_ids, dim=0, dim_size=num_segments) + + +def segment_max(data: Tensor, segment_ids: Tensor, num_segments: int): + """Computes index based max over segments of a tensor.""" + assert segment_ids is not None, "segment_ids must not be None" + assert num_segments > 0, "num_segments must be greater than 0" + max_op = ops.ArgMaxWithValue(axis=0) + _, max_values = max_op(data) + return max_values + + +def segment_mean(data: Tensor, segment_ids: Tensor, num_segments: int): + """Computes index based mean over segments of a tensor.""" + sum_v = segment_sum(data, segment_ids, num_segments) + count = ops.scatter_add(ops.zeros( + (num_segments,), dtype=ms.int32), segment_ids, ops.ones_like(segment_ids)) + return sum_v / count.astype(sum_v.dtype) + + +def segment_softmax(data: Tensor, segment_ids: Tensor, num_segments: int, weights: Optional[Tensor] = None): + """Computes a softmax over segments of the tensor.""" + data_max = segment_max(data, segment_ids, num_segments) + data = data - data_max[segment_ids] + + unnormalised_probs = ops.exp(data) + if weights is not None: + unnormalised_probs = unnormalised_probs * weights + denominator = segment_sum(unnormalised_probs, segment_ids, num_segments) + + return safe_division(unnormalised_probs, denominator, segment_ids) + + +def safe_division(numerator: Tensor, denominator: Tensor, segment_ids: Tensor): + """Divides logits by denominator, setting 0 where the denominator is zero.""" + result = ops.where(denominator[segment_ids] == + 0, 0, numerator / denominator[segment_ids]) + return result + + +def _broadcast(src: Tensor, other: Tensor, dim: int): + """Broadcasts the source tensor to match the shape of the other tensor along the specified dimension.""" + if dim < 0: + dim = other.ndim + dim + if src.ndim == 1: + for _ in range(0, dim): + src = src.unsqueeze(0) + for _ in range(src.ndim, other.ndim): + src = src.unsqueeze(-1) + src = src.expand_as(other) + return src + + +def scatter_sum( + src: Tensor, index: Tensor, dim: int = -1, out: Optional[Tensor] = None, + dim_size: Optional[int] = None, reduce: str = "sum" +) -> Tensor: + """Applies a sum reduction of the orb_models tensor along the specified dimension.""" + assert reduce == "sum" + index = _broadcast(index, src, dim) + if out is None: + size = list(src.shape) + if dim_size is not None: + size[dim] = dim_size + elif index.numel() == 0: + size[dim] = 0 + else: + size[dim] = int(index.max()) + 1 + out = ops.zeros(size, dtype=src.dtype) + return mint.scatter_add(out, dim, index, src) + return mint.scatter_add(out, dim, index, src) + + +def scatter_std( + src: Tensor, index: Tensor, dim: int = -1, out: Optional[Tensor] = None, + dim_size: Optional[int] = None, unbiased: bool = True +) -> Tensor: + """Computes the standard deviation of the orb_models tensor along the specified dimension.""" + if out is not None: + dim_size = out.shape[dim] + + if dim < 0: + dim = src.ndim + dim + + count_dim = dim + if index.ndim <= dim: + count_dim = index.ndim - 1 + + ones = ops.ones(index.shape, dtype=src.dtype) + count = scatter_sum(ones, index, count_dim, dim_size=dim_size) + + index = _broadcast(index, src, dim) + tmp = scatter_sum(src, index, dim, dim_size=dim_size) + count = _broadcast(count, tmp, dim).clip(1) + mean = tmp / count + + var = src - mean.gather(dim, index) + var = var * var + out = scatter_sum(var, index, dim, out=out, dim_size=dim_size) + + if unbiased: + count = count - 1 + count = count.clip(1) + out = out / (count + 1e-6) + out = ops.sqrt(out) + return out + + +def scatter_mean( + src: Tensor, index: Tensor, dim: int = -1, out: Optional[Tensor] = None, + dim_size: Optional[int] = None +) -> Tensor: + """Computes the mean of the orb_models tensor along the specified dimension.""" + out = scatter_sum(src, index, dim, out=out, dim_size=dim_size) + dim_size = out.shape[dim] + + index_dim = dim + if index_dim < 0: + index_dim = index_dim + src.ndim + if index.ndim <= index_dim: + index_dim = index.ndim - 1 + + ones = ops.ones(index.shape, dtype=src.dtype) + count = scatter_sum(ones, index, index_dim, dim_size=dim_size) + count = count.clip(1) + count = _broadcast(count, out, dim) + out = out / count + return out + + +def scatter_max( + src: Tensor, index: Tensor, dim: int = -1, out: Optional[Tensor] = None, + dim_size: Optional[int] = None +) -> Tensor: + """Computes the maximum of the orb_models tensor for each group defined by index along the specified dimension.""" + if out is not None: + raise NotImplementedError( + "The 'out' argument is not supported for scatter_max") + + if src.dtype in MSINT: + init_value = np.iinfo(src.dtype).min + else: + init_value = np.finfo(src.dtype).min + + if dim < 0: + dim = src.ndim + dim + + if dim_size is None: + dim_size = int(index.max()) + 1 + + result = ops.ones( + (dim_size, *src.shape[:dim], *src.shape[dim + 1:]), dtype=src.dtype) + result = init_value * result + broadcasted_index = _broadcast(index, src, dim) + + scatter_result = ops.ZerosLike()(result) + index = ops.expand_dims(broadcasted_index, dim) + scatter_result = scatter_result.scatter_update(index, src) + result = ops.Maximum()(result, scatter_result) + return result diff --git a/MindChemistry/applications/orb/src/trainer.py b/MindChemistry/applications/orb/src/trainer.py new file mode 100644 index 000000000..5b1404f6b --- /dev/null +++ b/MindChemistry/applications/orb/src/trainer.py @@ -0,0 +1,329 @@ +# ============================================================================ +# Copyright 2025 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +"""Trainer.""" + +from typing import Dict, Optional, Tuple + +import mindspore as ms +from mindspore import ops, Tensor, mint + +from src import base, segment_ops + +class OrbLoss: + """Loss function for ORB models. + + This class is used to compute the loss for the ORB model. + It can be used to compute the loss for both node and graph predictions. + """ + + def __init__(self, model): + """Initializes the OrbLoss. + + Args: + target: either the name of a PropertyDefinition or a PropertyDefinition itself. + """ + self.model = model + + def loss_node(self, batch, out_batch=None): + """Apply mlp to compute loss and metrics.""" + batch_n_node = batch.n_node + assert batch.node_targets is not None + target = batch.node_targets['forces'].squeeze(-1) + pred = out_batch["node_pred"].squeeze(-1) + # make sure we remove fixed atoms before normalization + pred, target, batch_n_node = _remove_fixed_atoms( + pred, target, batch_n_node, batch.fix_atoms, self.model.training + ) + mae = mint.abs(pred - self.model.node_head.normalizer(target)) + raw_pred = self.model.node_head.normalizer.inverse(pred) + raw_mae = mint.abs(raw_pred - target) + + mae = mae.mean(dim=-1) + mae = segment_ops.aggregate_nodes( + mae, batch_n_node, reduction="mean" + ).mean() + raw_mae = raw_mae.mean(dim=-1) + raw_mae = segment_ops.aggregate_nodes( + raw_mae, batch_n_node, reduction="mean" + ).mean() + + metrics = { + "node_mae": mae.item(), + "node_mae_raw": raw_mae.item(), + "node_cosine_sim": ops.cosine_similarity(raw_pred, target, dim=-1).mean().item(), + "fwt_0.03": forces_within_threshold(raw_pred, target, batch_n_node), + } + return mae, base.ModelOutput(loss=mae, log=metrics) + + def loss_graph(self, batch, out_batch=None): + """Apply mlp to compute loss and metrics. + + Depending on whether the target is real/binary/categorical, we + use an MSE/cross-entropy loss. In the case of cross-entropy, the + preds are logits (not normalised) to take advantage of numerically + stable log-softmax. + """ + assert batch.system_targets is not None + target = batch.system_targets['stress'].squeeze(-1) + if self.model.stress_head.compute_stress: + pred = out_batch["stress_pred"].squeeze(-1) + else: + pred = out_batch["graph_pred"].squeeze(-1) + + normalized_target = self.model.stress_head.normalizer(target) + errors = normalized_target - pred + mae = mint.abs(errors).mean() + + raw_pred = self.model.stress_head.normalizer.inverse(pred) + raw_mae = mint.abs(raw_pred - target).mean() + metrics = {"stress_mae": mae.item(), "stress_mae_raw": raw_mae.item()} + return mae, base.ModelOutput(loss=mae, log=metrics) + + + def loss_energy(self, batch, out_batch=None): + """Apply mlp to compute loss and metrics.""" + assert batch.system_targets is not None + target = batch.system_targets['energy'].squeeze(-1) + pred = out_batch["graph_pred"].squeeze(-1) + + reference = self.model.graph_head.reference(batch.atomic_numbers, batch.n_node).squeeze(-1) + reference_target = target - reference + if self.model.graph_head.atom_avg: + reference_target = reference_target / batch.n_node + + normalized_reference = self.model.graph_head.normalizer(reference_target) + model_loss = normalized_reference - pred + + raw_pred = self.model.graph_head.normalizer.inverse(pred) + if self.model.graph_head.atom_avg: + raw_pred = raw_pred * batch.n_node + raw_mae = mint.abs((raw_pred + reference) - target).mean() + + reference_mae = mint.abs(reference_target).mean() + model_mae = mint.abs(model_loss).mean() + metrics = { + "energy_reference_mae": reference_mae.item(), + "energy_mae": model_mae.item(), + "energy_mae_raw": raw_mae.item(), + } + return model_mae, base.ModelOutput(loss=model_mae, log=metrics) + + def loss(self, batch, label=None): + """Loss function of Orb GraphRegressor.""" + assert label is None, "Orb GraphRegressor does not support labels." + + out = self.model( + batch.edge_features, + batch.node_features, + batch.senders, + batch.receivers, + batch.n_node, + ) + loss = Tensor(0.0, ms.float32) + metrics: Dict = {} + + loss1, graph_out = self.loss_energy(batch, out) + metrics.update(graph_out.log) + loss = loss.type_as(loss1) + loss1 + + loss2, stress_out = self.loss_graph(batch, out) + metrics.update(stress_out.log) + loss = loss.type_as(loss2) + loss2 + + loss3, node_out = self.loss_node(batch, out) + metrics.update(node_out.log) + loss = loss.type_as(loss3) + loss3 + + metrics["loss"] = loss.item() + return loss, metrics + + +def binary_accuracy( + pred: Tensor, target: Tensor, threshold: float = 0.5 +) -> float: + """Calculate binary accuracy between 2 tensors. + + Args: + pred: the prediction tensor. + target: the tensor of target values. + threshold: Binary classification threshold. Default 0.5. + + Returns: + mean accuracy. + """ + return ((pred > threshold) == target).to(ms.float32).mean().item() + + +def categorical_accuracy(pred: Tensor, target: Tensor) -> float: + """Calculate accuracy for K class classification. + + Args: + pred: the tensor of logits for K classes of shape (..., K) + target: tensor of integer target values of shape (...) + + Returns: + mean accuracy. + """ + pred_labels = mint.argmax(pred, dim=-1) + return (pred_labels == target).to(ms.float32).mean().item() + + +def error_within_threshold( + pred: Tensor, target: Tensor, threshold: float = 0.02 +) -> float: + """Calculate MAE between 2 tensors within a threshold. + + Args: + pred: the prediction tensor. + target: the tensor of target values. + threshold: margin threshold. Default 0.02 (derived from OCP metrics). + + Returns: + Mean predictions within threshold. + """ + error = mint.abs(pred - target) + within_threshold = error < threshold + return within_threshold.to(ms.float32).mean().item() + + +def forces_within_threshold( + pred: Tensor, + target: Tensor, + batch_num_nodes: Tensor, + threshold: float = 0.03, +) -> float: + """Calculate MAE between batched graph tensors within a threshold. + + The predictions for a graph are counted as being within the threshold + only if all nodes in the graph have predictions within the threshold. + + Args: + pred: the prediction tensor. + target: the tensor of target values. + batch_num_nodes: A tensor containing the number of nodes per + graph. + threshold: margin threshold. Default 0.03 (derived from OCP metrics). + + Returns: + Mean predictions within threshold. + """ + error = mint.abs(pred - target) + largest_dim_fwt = error.max(-1)[0] < threshold + + count_within_threshold = segment_ops.aggregate_nodes( + largest_dim_fwt.float(), batch_num_nodes, reduction="sum" + ) + # count equals batch_num_nodes if all nodes within threshold + return (count_within_threshold == batch_num_nodes).to(ms.float32).mean().item() + + +def energy_and_forces_within_threshold( + pred_energy: Tensor, + pred_forces: Tensor, + target_energy: Tensor, + target_forces: Tensor, + batch_num_nodes: Tensor, + fixed_atoms: Optional[Tensor] = None, + threshold: Tuple[float, float] = (0.02, 0.03), +) -> float: + """Calculate MAE between batched graph energies and forces within a threshold. + + The predictions for a graph are counted as being within the threshold + only if all nodes in the graph have predictions within the threshold AND + the energies are also within a threshold. A combo of the two above functions. + + Args: + pred_*: the prediction tensors. + target_*: the tensor of target values. + batch_num_nodes: A tensor containing the number of nodes per + graph. + fixed_atoms: A tensor of bools indicating which atoms are fixed. + threshold: margin threshold. Default (0.02, 0.03) (derived from OCP metrics). + Returns: + Mean predictions within threshold. + """ + energy_err = mint.abs(pred_energy - target_energy) + ewt = energy_err < threshold[0] + + forces_err = mint.abs(pred_forces - target_forces) + largest_dim_fwt = forces_err.max(-1).values < threshold[1] + + working_largest_dim_fwt = largest_dim_fwt + + if fixed_atoms is not None: + fixed_per_graph = segment_ops.aggregate_nodes( + fixed_atoms.int(), batch_num_nodes, reduction="sum" + ) + # remove the fixed atoms from the counts + batch_num_nodes = batch_num_nodes - fixed_per_graph + # remove the fixed atoms from the forces + working_largest_dim_fwt = largest_dim_fwt[not fixed_atoms] + + force_count_within_threshold = segment_ops.aggregate_nodes( + working_largest_dim_fwt.int(), batch_num_nodes, reduction="sum" + ) + fwt = force_count_within_threshold == batch_num_nodes + + # count equals batch_num_nodes if all nodes within threshold + return (fwt & ewt).to(ms.float32).mean().item() + + +def _remove_fixed_atoms( + pred_node: Tensor, + node_target: Tensor, + batch_n_node: Tensor, + fix_atoms: Optional[Tensor], + training: bool, +): + """We use inf targets on purpose to designate nodes for removal.""" + assert len(pred_node) == len(node_target) + if fix_atoms is not None and not training: + pred_node = pred_node[~fix_atoms] + node_target = node_target[~fix_atoms] + batch_n_node = segment_ops.aggregate_nodes( + (~fix_atoms).int(), batch_n_node, reduction="sum" + ) + return pred_node, node_target, batch_n_node + + +def bce_loss( + pred: Tensor, target: Tensor, metric_prefix: str = "" +) -> Tuple: + """Binary cross-entropy loss with accuracy metric.""" + loss = mint.nn.BCEWithLogitsLoss()(pred, target.float()) + accuracy = binary_accuracy(pred, target) + return ( + loss, + { + f"{metric_prefix}_accuracy": accuracy, + f"{metric_prefix}_loss": loss.item(), + }, + ) + + +def cross_entropy_loss( + pred: Tensor, target: Tensor, metric_prefix: str = "" +) -> Tuple: + """Cross-entropy loss with accuracy metric.""" + loss = mint.nn.CrossEntropyLoss()(pred, target.long()) + accuracy = categorical_accuracy(pred, target) + return ( + loss, + { + f"{metric_prefix}_accuracy": accuracy, + f"{metric_prefix}_loss": loss.item(), + }, + ) diff --git a/MindChemistry/applications/orb/src/utils.py b/MindChemistry/applications/orb/src/utils.py new file mode 100644 index 000000000..34bd4623f --- /dev/null +++ b/MindChemistry/applications/orb/src/utils.py @@ -0,0 +1,296 @@ +# ============================================================================ +# Copyright 2025 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +"""Experiment utilities.""" + +import math +import random +import re +from collections import defaultdict +from typing import Dict, List, Mapping, Optional, Tuple, TypeVar, Any + +import yaml +import numpy as np +import mindspore as ms +from mindspore import Tensor, mint + +from src import base + +T = TypeVar("T") + + +def load_cfg(filename): + """load_cfg + + Load configurations from yaml file and return a namespace object + """ + from argparse import Namespace + with open(filename, "r", encoding="utf-8") as f: + cfg = yaml.safe_load(f) + return Namespace(**cfg) + + +def ensure_detached(x: base.Metric) -> base.Metric: + """Ensure that the tensor is detached and on the CPU.""" + return x + + +def to_item(x: base.Metric) -> base.Metric: + """Convert a tensor to a python scalar.""" + if isinstance(x, Tensor): + return x.item() + return x + + +def prefix_keys( + dict_to_prefix: Dict[str, T], prefix: str, sep: str = "/" +) -> Dict[str, T]: + """Add a prefix to dictionary keys with a separator.""" + return {f"{prefix}{sep}{k}": v for k, v in dict_to_prefix.items()} + + +def seed_everything(seed: int, rank: int = 0) -> None: + """Set the seed for all pseudo random number generators.""" + random.seed(seed + rank) + np.random.seed(seed + rank) + ms.manual_seed(seed + rank) + + +class ScalarMetricTracker: + """Keep track of average scalar metric values.""" + + def __init__(self): + self.reset() + + def reset(self): + """Reset the AverageMetrics.""" + self.sums = defaultdict(float) + self.counts = defaultdict(int) + + def update(self, metrics: Mapping[str, base.Metric]) -> None: + """Update the metric counts with new values.""" + for k, v in metrics.items(): + if isinstance(v, Tensor) and v.nelement() > 1: + continue # only track scalar metrics + if isinstance(v, Tensor) and v.isnan().any(): + continue + self.sums[k] += ensure_detached(v) + self.counts[k] += 1 + + def get_metrics(self): + """Get the metric values, possibly reducing across gpu processes.""" + return {k: to_item(v) / self.counts[k] for k, v in self.sums.items()} + + +def gradient_clipping( + model: ms.nn.Cell, clip_value: float +) -> List[Any]: + """Add gradient clipping hooks to a model. + + This is the correct way to implement gradient clipping, because + gradients are clipped as gradients are computed, rather than after + all gradients are computed - this means expoding gradients are less likely, + because they are "caught" earlier. + + Args: + model: The model to add hooks to. + clip_value: The upper and lower threshold to clip the gradients to. + + Returns: + A list of handles to remove the hooks from the parameters. + """ + handles = [] + + def _clip(grad): + if grad is None: + return grad + return grad.clamp(min=-clip_value, max=clip_value) + + for parameter in model.trainable_params(): + if parameter.requires_grad: + h = parameter.register_hook(_clip) + handles.append(h) + + return handles + + +def get_optim( + lr: float, total_steps: int, model: ms.nn.Cell +) -> Tuple[ms.experimental.optim.Optimizer, Optional[ms.experimental.optim.lr_scheduler.LRScheduler]]: + """Configure optimizers, LR schedulers and EMA.""" + + # Initialize parameter groups + params = [] + + # Split parameters based on the regex + for param in model.trainable_params(): + name = param.name + if re.search(r"(.*bias|.*layer_norm.*|.*batch_norm.*)", name): + params.append({"params": param, "weight_decay": 0.0}) + else: + params.append({"params": param}) + + # Create the optimizer with the parameter groups + optimizer = ms.experimental.optim.Adam(params, lr=lr) + + # Create the learning rate scheduler + scheduler = ms.experimental.optim.lr_scheduler.CyclicLR( + optimizer, base_lr=1.0e-9, max_lr=lr, step_size_up=int(total_steps*0.04), step_size_down=total_steps + ) + + return optimizer, scheduler + + +def rand_angles(*shape, dtype=None): + r"""random rotation angles + + Parameters + ---------- + *shape : int + + Returns + ------- + alpha : `Tensor` + tensor of shape :math:`(\mathrm{shape})` + + beta : `Tensor` + tensor of shape :math:`(\mathrm{shape})` + + gamma : `Tensor` + tensor of shape :math:`(\mathrm{shape})` + """ + alpha, gamma = 2 * math.pi * mint.rand(2, *shape, dtype=dtype) + beta = mint.rand(shape, dtype=dtype).mul(2).sub(1).acos() + return alpha, beta, gamma + + +def matrix_x(angle: Tensor) -> Tensor: + r"""matrix of rotation around X axis + + Parameters + ---------- + angle : `Tensor` + tensor of any shape :math:`(...)` + + Returns + ------- + `Tensor` + matrices of shape :math:`(..., 3, 3)` + """ + c = angle.cos() + s = angle.sin() + o = mint.ones_like(angle) + z = mint.zeros_like(angle) + return mint.stack( + [ + mint.stack([o, z, z], dim=-1), + mint.stack([z, c, -s], dim=-1), + mint.stack([z, s, c], dim=-1), + ], + dim=-2, + ) + + +def matrix_y(angle: Tensor) -> Tensor: + r"""matrix of rotation around Y axis + + Parameters + ---------- + angle : `Tensor` + tensor of any shape :math:`(...)` + + Returns + ------- + `Tensor` + matrices of shape :math:`(..., 3, 3)` + """ + c = angle.cos() + s = angle.sin() + o = mint.ones_like(angle) + z = mint.zeros_like(angle) + return mint.stack( + [ + mint.stack([c, z, s], dim=-1), + mint.stack([z, o, z], dim=-1), + mint.stack([-s, z, c], dim=-1), + ], + dim=-2, + ) + + +def matrix_z(angle: Tensor) -> Tensor: + r"""matrix of rotation around Z axis + + Parameters + ---------- + angle : `Tensor` + tensor of any shape :math:`(...)` + + Returns + ------- + `Tensor` + matrices of shape :math:`(..., 3, 3)` + """ + c = angle.cos() + s = angle.sin() + o = mint.ones_like(angle) + z = mint.zeros_like(angle) + return mint.stack( + [ + mint.stack([c, -s, z], dim=-1), + mint.stack([s, c, z], dim=-1), + mint.stack([z, z, o], dim=-1), + ], + dim=-2, + ) + + +def angles_to_matrix(alpha, beta, gamma): + r"""conversion from angles to matrix + + Parameters + ---------- + alpha : `Tensor` + tensor of shape :math:`(...)` + + beta : `Tensor` + tensor of shape :math:`(...)` + + gamma : `Tensor` + tensor of shape :math:`(...)` + + Returns + ------- + `Tensor` + matrices of shape :math:`(..., 3, 3)` + """ + alpha, beta, gamma = ms.numpy.broadcast_arrays(alpha, beta, gamma) + return matrix_y(alpha) @ matrix_x(beta) @ matrix_y(gamma) + + +def rand_matrix(*shape, dtype=None): + r"""random rotation matrix + + Parameters + ---------- + *shape : int + + Returns + ------- + `Tensor` + tensor of shape :math:`(\mathrm{shape}, 3, 3)` + """ + rotation_matrix = angles_to_matrix(*rand_angles(*shape, dtype=dtype)) + return rotation_matrix diff --git a/MindChemistry/mindchemistry/cell/__init__.py b/MindChemistry/mindchemistry/cell/__init__.py index f92153c67..5660308bc 100644 --- a/MindChemistry/mindchemistry/cell/__init__.py +++ b/MindChemistry/mindchemistry/cell/__init__.py @@ -21,6 +21,7 @@ from .deephe3nn import * from .matformer import * from .dimenet import * from .gemnet import * +from .orb import * __all__ = [ "Nequip", 'AutoEncoder', 'FCNet', 'MLPNet', 'CSPNet' @@ -30,3 +31,4 @@ __all__.extend(matformer.__all__) __all__.extend(allegro.__all__) __all__.extend(dimenet.__all__) __all__.extend(gemnet.__all__) +__all__.extend(orb.__all__) diff --git a/MindChemistry/mindchemistry/cell/orb/__init__.py b/MindChemistry/mindchemistry/cell/orb/__init__.py new file mode 100644 index 000000000..709978030 --- /dev/null +++ b/MindChemistry/mindchemistry/cell/orb/__init__.py @@ -0,0 +1,36 @@ +# ============================================================================ +# Copyright 2025 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +"""init""" + +from .orb import ( + NodeHead, + GraphHead, + EnergyHead, + Orb, +) +from .gns import ( + AttentionInteractionNetwork, + MoleculeGNS, +) + +__all__ = [ + "AttentionInteractionNetwork", + "EnergyHead", + "GraphHead", + "MoleculeGNS", + "NodeHead", + "Orb", +] diff --git a/MindChemistry/mindchemistry/cell/orb/gns.py b/MindChemistry/mindchemistry/cell/orb/gns.py new file mode 100644 index 000000000..ab53083f8 --- /dev/null +++ b/MindChemistry/mindchemistry/cell/orb/gns.py @@ -0,0 +1,690 @@ +# ============================================================================ +# Copyright 2025 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +"""GNS Molecule.""" + + +from typing import List, Literal, Optional, Dict, Any, Union +from functools import partial + +import numpy as np +from mindspore import nn, ops, Tensor, mint +from mindspore.common.initializer import Uniform +import mindspore.ops.operations as P + +from mindchemistry.cell.orb.utils import build_mlp + +_KEY = "feat" + + +def mlp_and_layer_norm(in_dim: int, out_dim: int, hidden_dim: int, n_layers: int) -> nn.SequentialCell: + """Create an MLP followed by layer norm. + + Args: + in_dim (int): Input dimension. + out_dim (int): Output dimension. + hidden_dim (int): Hidden dimension. + n_layers (int): Number of hidden layers. + + Returns: + nn.SequentialCell: A sequential cell containing the MLP and layer norm. + """ + layers = build_mlp( + in_dim, + [hidden_dim for _ in range(n_layers)], + out_dim, + ) + layers.append(nn.LayerNorm((out_dim,))) + return layers + + +def get_cutoff(p: int, r: Tensor, r_max: float) -> Tensor: + """Get the cutoff function for attention. + + Args: + p (int): Polynomial order. + r (Tensor): Distance tensor. + r_max (float): Maximum distance for the cutoff. + + Returns: + Tensor: Cutoff tensor. + """ + envelope = 1.0 - ((p + 1.0) * (p + 2.0) / 2.0) * ops.pow(r / r_max, p) + \ + p * (p + 2.0) * ops.pow(r / r_max, p + 1) - \ + (p * (p + 1.0) / 2) * ops.pow(r / r_max, p + 2) + cutoff = ops.expand_dims( + ops.where(r < r_max, envelope, ops.zeros_like(envelope)), -1) + return cutoff + + +def gaussian_basis_function( + scalars: Tensor, + num_bases: Union[Tensor, int], + radius: Union[Tensor, float], + scale: Union[Tensor, float] = 1.0, +) -> Tensor: + """Gaussian basis function applied to a tensor of scalars. + + Args: + scalars (Tensor): Scalars to compute the gbf on. Shape [num_scalars]. + num_bases (Tensor): The number of bases. An Int. + radius (Tensor): The largest centre of the bases. A Float. + scale (Tensor, optional): The width of the gaussians. Defaults to 1. + + Returns: + Tensor: A tensor of shape [num_scalars, num_bases]. + """ + assert len(scalars.shape) == 1 + gaussian_means = ops.arange( + 0, float(radius), float(radius) / num_bases + ) + return mint.exp( + -(scale**2) * (scalars.unsqueeze(1) - gaussian_means.unsqueeze(0)).abs() ** 2 + ) + + +class AtomEmbedding(nn.Cell): + r""" + AtomEmbedding Layer. + + This layer initializes atom embeddings based on the atomic number of elements in the periodic table. + It uses an embedding table initialized with a uniform distribution over the range [-sqrt(3), sqrt(3)]. + + Args: + emb_size (int): Size of the embedding vector for each atom. + num_elements (int): Number of elements in the periodic table (typically 118 for known elements). + + Inputs: + - **x** (Tensor) - Input tensor of shape [..., num_atoms], where + each value represents the atomic number of an atom in the periodic table. + + Outputs: + - **h** (Tensor) - Output tensor of shape [..., num_atoms, emb_size], + where each atom's embedding is represented as a vector of size `emb_size`. + + Supported Platforms: + ``Ascend`` + """ + def __init__(self, emb_size, num_elements): + """init + """ + super().__init__() + self.emb_size = emb_size + self.embeddings = nn.Embedding( + num_elements + 1, emb_size, embedding_table=Uniform(np.sqrt(3))) + + def construct(self, x): + """construct + """ + h = self.embeddings(x) + return h + + +class Encoder(nn.Cell): + r""" + Encoder for Graph Network States (GNS). + + This encoder processes node and edge features using MLPs and layer normalization. + It concatenates the features of nodes and edges, applies MLPs to update their states, + and returns the updated features. + + Args: + num_node_in_features (int): Number of input features for nodes. + num_node_out_features (int): Number of output features for nodes. + num_edge_in_features (int): Number of input features for edges. + num_edge_out_features (int): Number of output features for edges. + num_mlp_layers (int): Number of MLP layers. + mlp_hidden_dim (int): Hidden dimension for the MLP. + node_feature_names (List[str]): List of node feature names. + edge_feature_names (List[str]): List of edge feature names. + + Inputs: + - **nodes** (Dict[str, Tensor]) - Dictionary of node features, where keys are feature names + and values are tensors of shape (num_nodes, num_node_in_features). + - **edges** (Dict[str, Tensor]) - Dictionary of edge features, where keys are feature names + and values are tensors of shape (num_edges, num_edge_in_features). + + Outputs: + - **edges** (Dict[str, Tensor]) - Updated edge features dictionary, where key "feat" contains + the updated edge features of shape (num_edges, num_edge_out_features). + - **nodes** (Dict[str, Tensor]) - Updated node features dictionary, where key "feat" contains + the updated node features of shape (num_nodes, num_node_out_features). + + Supported Platforms: + ``Ascend`` + """ + + def __init__(self, + num_node_in_features: int, + num_node_out_features: int, + num_edge_in_features: int, + num_edge_out_features: int, + num_mlp_layers: int, + mlp_hidden_dim: int, + node_feature_names: List[str], + edge_feature_names: List[str]): + """init + """ + super().__init__() + self.node_feature_names = node_feature_names + self.edge_feature_names = edge_feature_names + self._node_fn = mlp_and_layer_norm( + num_node_in_features, num_node_out_features, mlp_hidden_dim, num_mlp_layers) + self._edge_fn = mlp_and_layer_norm( + num_edge_in_features, num_edge_out_features, mlp_hidden_dim, num_mlp_layers) + + def construct(self, nodes, edges): + """construct + """ + edge_features = ops.cat([edges[k] for k in self.edge_feature_names], axis=-1) + node_features = ops.cat([nodes[k] for k in self.node_feature_names], axis=-1) + + edges.update({_KEY: self._edge_fn(edge_features)}) + nodes.update({_KEY: self._node_fn(node_features)}) + return edges, nodes + + +class InteractionNetwork(nn.Cell): + r""" + Interaction Network. + + Implements a message passing neural network layer that updates node and edge features based on interactions. + This layer combines node and edge features, applies MLPs to update their states, and returns the updated features. + + Args: + num_node_in (int): Number of input features for nodes. + num_node_out (int): Number of output features for nodes. + num_edge_in (int): Number of input features for edges. + num_edge_out (int): Number of output features for edges. + num_mlp_layers (int): Number of MLP layers. + mlp_hidden_dim (int): Hidden dimension for the MLP. + + Inputs: + - **graph_edges** (Dict[str, Tensor]) - Dictionary of edge features, where key "feat" contains + the edge features of shape (num_edges, num_edge_in). + - **graph_nodes** (Dict[str, Tensor]) - Dictionary of node features, where key "feat" contains + the node features of shape (num_nodes, num_node_in). + - **senders** (Tensor) - Indices of the sender nodes for each edge, shape (num_edges,). + - **receivers** (Tensor) - Indices of the receiver nodes for each edge, shape (num_edges,). + + Outputs: + - **edges** (Dict[str, Tensor]) - Updated edge features dictionary, where key "feat" contains + the updated edge features of shape (num_edges, num_edge_out). + - **nodes** (Dict[str, Tensor]) - Updated node features dictionary, where key "feat" contains + the updated node features of shape (num_nodes, num_node_out). + + Supported Platforms: + ``Ascend`` + """ + def __init__(self, + num_node_in: int, + num_node_out: int, + num_edge_in: int, + num_edge_out: int, + num_mlp_layers: int, + mlp_hidden_dim: int): + """init + """ + super().__init__() + self._node_mlp = mlp_and_layer_norm( + num_node_in + num_edge_out, num_node_out, mlp_hidden_dim, num_mlp_layers) + self._edge_mlp = mlp_and_layer_norm( + num_node_in + num_node_in + num_edge_in, num_edge_out, mlp_hidden_dim, num_mlp_layers) + + def construct(self, graph_edges, graph_nodes, senders, receivers): + """construct + """ + nodes = graph_nodes[_KEY] + edges = graph_edges[_KEY] + + sent_attributes = ops.gather(nodes, senders, 0) + received_attributes = ops.gather(nodes, receivers, 0) + + edge_features = ops.cat( + [edges, sent_attributes, received_attributes], axis=1) + updated_edges = self._edge_mlp(edge_features) + + received_attributes = ops.scatter_add( + ops.zeros_like(nodes), receivers, updated_edges) + + node_features = ops.cat([nodes, received_attributes], axis=1) + updated_nodes = self._node_mlp(node_features) + + nodes = graph_nodes[_KEY] + updated_nodes + edges = graph_edges[_KEY] + updated_edges + + node_features = {**graph_nodes, _KEY: nodes} + edge_features = {**graph_edges, _KEY: edges} + return edge_features, node_features + + +# pylint: disable=C0301 +class AttentionInteractionNetwork(nn.Cell): + r""" + Attention interaction network. + Implements attention-based message passing neural network layer for edge updates in molecular graphs. + + Args: + num_node_in (int): Number of input node features. + num_node_out (int): Number of output node features. + num_edge_in (int): Number of input edge features. + num_edge_out (int): Number of output edge features. + num_mlp_layers (int): Number of hidden layers in node and edge update MLPs. + mlp_hidden_dim (int): Hidden dimension size of MLPs. + attention_gate (str, optional): Attention gate type, ``"sigmoid"`` or ``"softmax"``. Default: ``"sigmoid"``. + distance_cutoff (bool, optional): Whether to use distance-based edge cutoff. Default: ``True``. + polynomial_order (int, optional): Order of polynomial cutoff function. Default: ``4``. + cutoff_rmax (float, optional): Maximum distance for cutoff. Default: ``6.0``. + + Inputs: + - **graph_edges** (dict) - Edge feature dictionary, must contain key "feat" with shape :math:`(n_{edges}, num\_edge\_in)`. + - **graph_nodes** (dict) - Node feature dictionary, must contain key "feat" with shape :math:`(n_{nodes}, num\_node\_in)`. + - **senders** (Tensor) - Sender node indices for each edge, shape :math:`(n_{edges},)`. + - **receivers** (Tensor) - Receiver node indices for each edge, shape :math:`(n_{edges},)`. + + Outputs: + - **edges** (dict) - Updated edge feature dictionary with key "feat" of shape :math:`(n_{edges}, num\_edge\_out)`. + - **nodes** (dict) - Updated node feature dictionary with key "feat" of shape :math:`(n_{nodes}, num\_node\_out)`. + + Raises: + ValueError: If `attention_gate` is not "sigmoid" or "softmax". + ValueError: If edge or node features do not contain the required "feat" key. + + Supported Platforms: + ``Ascend`` + + Examples: + >>> import numpy as np + >>> import mindspore + >>> from mindspore import Tensor + >>> from mindchemistry.cell.orb.gns import AttentionInteractionNetwork + >>> attn_net = AttentionInteractionNetwork( + ... num_node_in=256, + ... num_node_out=256, + ... num_edge_in=256, + ... num_edge_out=256, + ... num_mlp_layers=2, + ... mlp_hidden_dim=512, + ... ) + >>> n_atoms = 4 + >>> n_edges = 10 + >>> atomic_numbers = Tensor(np.random.randint(1, 119, size=(n_atoms,), dtype=np.int32)) + >>> atomic_numbers_embedding_np = np.zeros((n_atoms, 118), dtype=np.float32) + >>> for i, num in enumerate(atomic_numbers.asnumpy()): + ... atomic_numbers_embedding_np[i, num - 1] = 1.0 + >>> node_features = { + ... "atomic_numbers": atomic_numbers, + ... "atomic_numbers_embedding": Tensor(atomic_numbers_embedding_np), + ... "positions": Tensor(np.random.randn(n_atoms, 3).astype(np.float32)), + ... "feat": Tensor(np.random.randn(n_atoms, 256).astype(np.float32)) + ... } + >>> edge_features = { + ... "vectors": Tensor(np.random.randn(n_edges, 3).astype(np.float32)), + ... "r": Tensor(np.abs(np.random.randn(n_edges).astype(np.float32) * 10)), + ... "feat": Tensor(np.random.randn(n_edges, 256).astype(np.float32)) + ... } + >>> senders = Tensor(np.random.randint(0, n_atoms, size=(n_edges,), dtype=np.int32)) + >>> receivers = Tensor(np.random.randint(0, n_atoms, size=(n_edges,), dtype=np.int32)) + >>> edges, nodes = attn_net( + ... edge_features, + ... node_features, + ... senders, + ... receivers, + ... ) + >>> print(edges["feat"].shape, nodes["feat"].shape) + (10, 256) (4, 256) + """ + + def __init__(self, + num_node_in: int, + num_node_out: int, + num_edge_in: int, + num_edge_out: int, + num_mlp_layers: int, + mlp_hidden_dim: int, + attention_gate: Literal["sigmoid", "softmax"] = "sigmoid", + distance_cutoff: bool = True, + polynomial_order: Optional[int] = 4, + cutoff_rmax: Optional[float] = 6.0): + """init + """ + super().__init__() + self._num_node_in = num_node_in + self._num_node_out = num_node_out + self._num_edge_in = num_edge_in + self._num_edge_out = num_edge_out + self._num_mlp_layers = num_mlp_layers + self._mlp_hidden_dim = mlp_hidden_dim + self._node_mlp = mlp_and_layer_norm( + num_node_in + num_edge_out + num_edge_out, num_node_out, mlp_hidden_dim, num_mlp_layers) + self._edge_mlp = mlp_and_layer_norm( + num_node_in + num_node_in + num_edge_in, num_edge_out, mlp_hidden_dim, num_mlp_layers) + self._receive_attn = nn.Dense(num_edge_in, 1) + self._send_attn = nn.Dense(num_edge_in, 1) + self._distance_cutoff = distance_cutoff + self._r_max = cutoff_rmax + self._polynomial_order = polynomial_order + self._attention_gate = attention_gate + + self.scatter_add = P.TensorScatterAdd() + + def construct(self, graph_edges, graph_nodes, senders, receivers): + """construct + """ + nodes = graph_nodes[_KEY] + edges = graph_edges[_KEY] + + p = self._polynomial_order + r_max = self._r_max + r = graph_edges['r'] + cutoff = get_cutoff(p, r, r_max) + + sent_attributes = ops.gather(nodes, senders, 0) + received_attributes = ops.gather(nodes, receivers, 0) + + if self._attention_gate == "softmax": + receive_attn = ops.softmax(self._receive_attn(edges), axis=0) + send_attn = ops.softmax(self._send_attn(edges), axis=0) + else: + receive_attn = ops.sigmoid(self._receive_attn(edges)) + send_attn = ops.sigmoid(self._send_attn(edges)) + + if self._distance_cutoff: + receive_attn = receive_attn * cutoff + send_attn = send_attn * cutoff + + edge_features = ops.cat( + [edges, sent_attributes, received_attributes], axis=1) + updated_edges = self._edge_mlp(edge_features) + + if senders.ndim < 2: + senders = senders.unsqueeze(-1) + sent_attributes = self.scatter_add( + ops.zeros_like(nodes), senders, updated_edges * send_attn) + if receivers.ndim < 2: + receivers = receivers.unsqueeze(-1) + received_attributes = self.scatter_add( + ops.zeros_like(nodes), receivers, updated_edges * receive_attn) + + node_features = ops.cat( + [nodes, received_attributes, sent_attributes], axis=1) + updated_nodes = self._node_mlp(node_features) + + nodes = graph_nodes[_KEY] + updated_nodes + edges = graph_edges[_KEY] + updated_edges + + node_features = {**graph_nodes, _KEY: nodes} + edge_features = {**graph_edges, _KEY: edges} + return edge_features, node_features + +class Decoder(nn.Cell): + r""" + Decoder for Graph Network States (GNS). + + This decoder processes node features using an MLP to produce predictions. + It takes the node features as input and outputs updated node features with predictions. + + Args: + num_node_in (int): Number of input features for nodes. + num_node_out (int): Number of output features for nodes. + num_mlp_layers (int): Number of MLP layers. + mlp_hidden_dim (int): Hidden dimension for the MLP. + batch_norm (bool, optional): Whether to apply batch normalization. Defaults to False. + + Inputs: + - **graph_nodes** (Dict[str, Tensor]) - Dictionary of node features, where key "feat" contains + the node features of shape (num_nodes, num_node_in). + + Outputs: + - **graph_nodes** (Dict[str, Tensor]) - Updated node features dictionary, where key "pred" contains + the predicted node features of shape (num_nodes, num_node_out). + + Supported Platforms: + ``Ascend`` + """ + def __init__(self, + num_node_in: int, + num_node_out: int, + num_mlp_layers: int, + mlp_hidden_dim: int, + batch_norm: bool = False): + """Initialization. + Args: + num_node_in (int): Number of input features for nodes. + num_node_out (int): Number of output features for nodes. + num_mlp_layers (int): Number of MLP layers. + mlp_hidden_dim (int): Hidden dimension for the MLP. + batch_norm (bool, optional): Whether to apply batch normalization. Defaults to False. + """ + super().__init__() + seq = build_mlp( + num_node_in, + [mlp_hidden_dim for _ in range(num_mlp_layers)], + num_node_out, + ) + if batch_norm: + seq.append(nn.BatchNorm1d(num_node_out)) + self.node_fn = nn.SequentialCell(seq) + + def construct(self, graph_nodes): + """Forward pass of the decoder. + Args: + graph_nodes (Dict[str, Tensor]): Dictionary of node features. + Returns: + Dict[str, Tensor]: Updated node features with predictions. + """ + nodes = graph_nodes[_KEY] + updated = self.node_fn(nodes) + return {**graph_nodes, "pred": updated} + + +# pylint: disable=C0301 +class MoleculeGNS(nn.Cell): + r""" + Molecular graph neural network. + Implements flexible modular graph neural network for molecular property prediction based on message passing + with attention or other interaction mechanisms. Supports node and edge embeddings, multiple message passing + steps, and customizable interaction layers for complex molecular graphs. + + Args: + num_node_in_features (int): Number of input features per node. + num_node_out_features (int): Number of output features per node. + num_edge_in_features (int): Number of input features per edge. + latent_dim (int): Latent dimension for node and edge representations. + num_message_passing_steps (int): Number of message passing layers. + num_mlp_layers (int): Number of hidden layers in node and edge update MLPs. + mlp_hidden_dim (int): Hidden dimension size of MLPs. + node_feature_names (List[str]): List of node feature keys to use from input dictionary. + edge_feature_names (List[str]): List of edge feature keys to use from input dictionary. + use_embedding (bool, optional): Whether to use atomic number embedding for nodes. Default: ``True``. + interactions (str, optional): Type of interaction layer to use (e.g., ``"simple_attention"``). Default: ``"simple_attention"``. + interaction_params (Optional[Dict[str, Any]], optional): Parameters for interaction layer, e.g., cutoff, + polynomial order, gate type. Default: ``None``. + + Inputs: + - **edge_features** (dict) - Edge feature dictionary, must contain keys specified in `edge_feature_names`. + - **node_features** (dict) - Node feature dictionary, must contain keys specified in `node_feature_names`. + - **senders** (Tensor) - Sender node indices for each edge, shape :math:`(n_{edges},)`. + - **receivers** (Tensor) - Receiver node indices for each edge, shape :math:`(n_{edges},)`. + + Outputs: + - **edges** (dict) - Updated edge feature dictionary with key "feat" of shape :math:`(n_{edges}, latent\_dim)`. + - **nodes** (dict) - Updated node feature dictionary with key "feat" of shape :math:`(n_{nodes}, latent\_dim)`. + + Raises: + ValueError: If required feature keys are missing in `edge_features` or `node_features`. + ValueError: If `interactions` is not a supported type. + + Supported Platforms: + ``Ascend`` + + Examples: + >>> import numpy as np + >>> import mindspore + >>> from mindspore import Tensor + >>> from mindchemistry.cell.orb.gns import MoleculeGNS + >>> gns_model = MoleculeGNS( + ... num_node_in_features=256, + ... num_node_out_features=3, + ... num_edge_in_features=23, + ... latent_dim=256, + ... interactions="simple_attention", + ... interaction_params={ + ... "distance_cutoff": True, + ... "polynomial_order": 4, + ... "cutoff_rmax": 6, + ... "attention_gate": "sigmoid", + ... }, + ... num_message_passing_steps=15, + ... num_mlp_layers=2, + ... mlp_hidden_dim=512, + ... use_embedding=True, + ... node_feature_names=["feat"], + ... edge_feature_names=["feat"], + ... ) + >>> n_atoms = 4 + >>> n_edges = 10 + >>> atomic_numbers = Tensor(np.random.randint(1, 119, size=(n_atoms,), dtype=np.int32)) + >>> atomic_numbers_embedding_np = np.zeros((n_atoms, 118), dtype=np.float32) + >>> for i, num in enumerate(atomic_numbers.asnumpy()): + ... atomic_numbers_embedding_np[i, num - 1] = 1.0 + >>> node_features = { + ... "atomic_numbers": atomic_numbers, + ... "atomic_numbers_embedding": Tensor(atomic_numbers_embedding_np), + ... "positions": Tensor(np.random.randn(n_atoms, 3).astype(np.float32)), + ... "feat": Tensor(np.random.randn(n_atoms, 256).astype(np.float32)) + ... } + >>> edge_features = { + ... "vectors": Tensor(np.random.randn(n_edges, 3).astype(np.float32)), + ... "r": Tensor(np.abs(np.random.randn(n_edges).astype(np.float32) * 10)), + ... "feat": Tensor(np.random.randn(n_edges, 256).astype(np.float32)) + ... } + >>> senders = Tensor(np.random.randint(0, n_atoms, size=(n_edges,), dtype=np.int32)) + >>> receivers = Tensor(np.random.randint(0, n_atoms, size=(n_edges,), dtype=np.int32)) + >>> edges, nodes = gns_model( + ... edge_features, + ... node_features, + ... senders, + ... receivers, + ... ) + >>> print(edges["feat"].shape, nodes["feat"].shape) + (10, 256) (4, 256) + """ + + def __init__(self, + num_node_in_features: int, + num_node_out_features: int, + num_edge_in_features: int, + latent_dim: int, + num_message_passing_steps: int, + num_mlp_layers: int, + mlp_hidden_dim: int, + node_feature_names: List[str], + edge_feature_names: List[str], + use_embedding: bool = True, + interactions: Literal["default", + "simple_attention"] = "simple_attention", + interaction_params: Optional[Dict[str, Any]] = None): + """init + """ + super().__init__() + self._encoder = Encoder( + num_node_in_features=num_node_in_features, + num_node_out_features=latent_dim, + num_edge_in_features=num_edge_in_features, + num_edge_out_features=latent_dim, + num_mlp_layers=num_mlp_layers, + mlp_hidden_dim=mlp_hidden_dim, + node_feature_names=node_feature_names, + edge_feature_names=edge_feature_names + ) + if interactions == "default": + InteractionNetworkClass = InteractionNetwork + elif interactions == "simple_attention": + InteractionNetworkClass = AttentionInteractionNetwork + self.num_message_passing_steps = num_message_passing_steps + if interaction_params is None: + interaction_params = {} + self.gnn_stacks = nn.CellList([ + InteractionNetworkClass( + num_node_in=latent_dim, + num_node_out=latent_dim, + num_edge_in=latent_dim, + num_edge_out=latent_dim, + num_mlp_layers=num_mlp_layers, + mlp_hidden_dim=mlp_hidden_dim, + **interaction_params + ) for _ in range(self.num_message_passing_steps) + ]) + self._decoder = Decoder( + num_node_in=latent_dim, + num_node_out=num_node_out_features, + num_mlp_layers=num_mlp_layers, + mlp_hidden_dim=mlp_hidden_dim + ) + self.rbf = partial(gaussian_basis_function, num_bases=20, radius=10.0) + self.use_embedding = use_embedding + if self.use_embedding: + self.atom_emb = AtomEmbedding(latent_dim, 118) + + def construct(self, edge_features, node_features, senders, receivers): + """construct + """ + edge_features = self.featurize_edges(edge_features) + node_features = self.featurize_nodes(node_features) + edges, nodes = self._encoder(node_features, edge_features) + for gnn in self.gnn_stacks: + edges, nodes = gnn(edges, nodes, senders, receivers) + nodes = self._decoder(nodes) + return edges, nodes + + def featurize_nodes(self, node_features): + """Featurize the nodes of a graph. + + Args: + node_features (Dict[str, Tensor]): Dictionary of node features. + + Returns: + Dict[str, Tensor]: Updated node features with atomic embeddings. + """ + one_hot_atomic = ops.OneHot()( + node_features["atomic_numbers"], 118, Tensor(1.0), Tensor(0.0) + ) + if self.use_embedding: + atomic_embedding = self.atom_emb(node_features["atomic_numbers"]) + else: + atomic_embedding = one_hot_atomic + + node_features = {**node_features, **{_KEY: atomic_embedding}} + return node_features + + def featurize_edges(self, edge_features): + """Featurize the edges of a graph. + + Args: + edge_features (Dict[str, Tensor]): Dictionary of edge features. + + Returns: + Dict[str, Tensor]: Updated edge features with radial basis functions and unit vectors. + """ + lengths = ops.norm(edge_features['vectors'], dim=1) + non_zero_divisor = ops.where( + lengths == 0, ops.ones_like(lengths), lengths) + unit_vectors = edge_features['vectors'] / ops.expand_dims(non_zero_divisor, 1) + rbfs = self.rbf(lengths) + edges = ops.cat([rbfs, unit_vectors], axis=1) + + edge_features = {**edge_features, **{_KEY: edges}} + return edge_features diff --git a/MindChemistry/mindchemistry/cell/orb/orb.py b/MindChemistry/mindchemistry/cell/orb/orb.py new file mode 100644 index 000000000..8afc55dbf --- /dev/null +++ b/MindChemistry/mindchemistry/cell/orb/orb.py @@ -0,0 +1,698 @@ +# ============================================================================ +# Copyright 2025 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +"""Orb GraphRegressor.""" + +from typing import Literal, Optional, Union +import numpy + +import mindspore as ms +from mindspore import Parameter, ops, Tensor, mint + +from mindchemistry.cell.orb.gns import _KEY, MoleculeGNS +from mindchemistry.cell.orb.utils import ( + aggregate_nodes, + build_mlp, + REFERENCE_ENERGIES, +) + + +class LinearReferenceEnergy(ms.nn.Cell): + r""" + Linear reference energy (no bias term). + + This class implements a linear reference energy model that can be used + to compute the reference energy for a given set of atomic numbers. + + Args: + weight_init (numpy.ndarray, optional): Initial weights for the linear layer. + If not provided, the weights will be initialized randomly. + trainable (bool, optional): Whether the weights are trainable or not. + If not provided, the weights will be trainable by default. + + Inputs: + - **atom_types** (Tensor) - A tensor of atomic numbers of shape (n_atoms,). + - **n_node** (Tensor) - A tensor of shape (n_graphs,) containing the number of nodes in each graph. + + Outputs: + - **Tensor** - A tensor of shape (n_graphs, 1) containing the reference energy. + + Raises: + ValueError: If the input tensor shapes are not compatible with the expected shapes. + TypeError: If the input types are not compatible with the expected types. + + Supported Platforms: + ``Ascend`` + """ + def __init__( + self, + weight_init: Optional[numpy.ndarray] = None, + trainable: Optional[bool] = None, + ): + """init + """ + super().__init__() + + if trainable is None: + trainable = weight_init is None + + self.linear = ms.nn.Dense(118, 1, has_bias=False) + if weight_init is not None: + self.linear.weight.set_data(Tensor(weight_init, dtype=ms.float32).reshape(1, 118)) + if not trainable: + self.linear.weight.requires_grad = False + + def construct(self, atom_types: Tensor, n_node: Tensor): + """construct + """ + one_hot_atomic = ops.OneHot()(atom_types, 118, Tensor(1.0, ms.float32), Tensor(0.0, ms.float32)) + + reduced = aggregate_nodes(one_hot_atomic, n_node, reduction="sum") + return self.linear(reduced) + + +class ScalarNormalizer(ms.nn.Cell): + r""" + Scalar normalizer that learns mean and std from data. + + NOTE: Multi-dimensional tensors are flattened before updating + the running mean/std. This is desired behaviour for force targets. + + Args: + init_mean (Tensor or float, optional): Initial mean value for normalization. + If not provided, defaults to 0.0. + init_std (Tensor or float, optional): Initial standard deviation value for normalization. + If not provided, defaults to 1.0. + init_num_batches (int, optional): Initial number of batches for normalization. + If not provided, defaults to 1000. + + Inputs: + - **x** (Tensor) - A tensor of shape (n_samples, n_features) to normalize. + + Outputs: + - **Tensor** - A tensor of the same shape as x, normalized by the running mean and std. + + Raises: + ValueError: If the input tensor is not of the expected shape. + TypeError: If the input types are not compatible with the expected types. + + Supported Platforms: + ``Ascend`` + """ + def __init__( + self, + init_mean: Optional[Union[Tensor, float]] = None, + init_std: Optional[Union[Tensor, float]] = None, + init_num_batches: Optional[int] = 1000, + ): + """init + """ + super().__init__() + self.bn = mint.nn.BatchNorm1d(1, affine=False, momentum=None) + self.bn.running_mean = Parameter(Tensor([0], ms.float32)) + self.bn.running_var = Parameter(Tensor([1], ms.float32)) + self.bn.num_batches_tracked = Parameter(Tensor([1000], ms.float32)) + self.stastics = { + "running_mean": init_mean if init_mean is not None else 0.0, + "running_var": init_std**2 if init_std is not None else 1.0, + "num_batches_tracked": init_num_batches if init_num_batches is not None else 1000, + } + + def construct(self, x: Tensor): + """construct + """ + if self.training: + self.bn(x.view(-1, 1)) + if hasattr(self, "running_mean"): + return (x - self.running_mean) / mint.sqrt(self.running_var) + return (x - self.bn.running_mean) / mint.sqrt(self.bn.running_var) + + def inverse(self, x: Tensor): + """Reverse the construct normalization. + + Args: + x: A tensor of shape (n_samples, n_features) to inverse normalize. + + Returns: + A tensor of the same shape as x, inverse normalized by the running mean and std. + """ + if hasattr(self, "running_mean"): + return x * mint.sqrt(self.running_var) + self.running_mean + return x * mint.sqrt(self.bn.running_var) + self.bn.running_mean + + +# pylint: disable=C0301 +class NodeHead(ms.nn.Cell): + r""" + Node-level prediction head. + + Implements neural network head for predicting node-level properties from node features. This head can be + added to base models to enable auxiliary tasks during pretraining or added in fine-tuning steps. + + Args: + latent_dim (int): Input feature dimension for each node. + num_mlp_layers (int): Number of hidden layers in MLP. + mlp_hidden_dim (int): Hidden dimension size of MLP. + target_property_dim (int): Output dimension of node-level target property. + dropout (Optional[float], optional): Dropout rate for MLP. Default: ``None``. + remove_mean (bool, optional): If True, remove mean from output, typically used for force prediction. + Default: ``True``. + + Inputs: + - **node_features** (dict) - Node feature dictionary, must contain key "feat" with shape :math:`(n_{nodes}, latent\_dim)`. + - **n_node** (Tensor) - Number of nodes in graph, shape :math:`(1,)`. + + Outputs: + - **output** (dict) - Dictionary containing key "node_pred" with value of shape :math:`(n_{nodes}, target\_property\_dim)`. + + Raises: + ValueError: If required feature keys are missing in `node_features`. + + Supported Platforms: + ``Ascend`` + + Examples: + >>> import numpy as np + >>> import mindspore + >>> from mindspore import Tensor + >>> from mindchemistry.cell.orb.gns import NodeHead + >>> node_head = NodeHead( + ... latent_dim=256, + ... num_mlp_layers=1, + ... mlp_hidden_dim=256, + ... target_property_dim=3, + ... remove_mean=True, + ... ) + >>> n_atoms = 4 + >>> n_node = Tensor([n_atoms], mindspore.int32) + >>> atomic_numbers = Tensor(np.random.randint(1, 119, size=(n_atoms,), dtype=np.int32)) + >>> atomic_numbers_embedding_np = np.zeros((n_atoms, 118), dtype=np.float32) + >>> for i, num in enumerate(atomic_numbers.asnumpy()): + ... atomic_numbers_embedding_np[i, num - 1] = 1.0 + >>> node_features = { + ... "atomic_numbers": atomic_numbers, + ... "atomic_numbers_embedding": Tensor(atomic_numbers_embedding_np), + ... "positions": Tensor(np.random.randn(n_atoms, 3).astype(np.float32)), + ... "feat": Tensor(np.random.randn(n_atoms, 256).astype(np.float32)) + ... } + >>> output = node_head(node_features, n_node) + >>> print(output['node_pred'].shape) + (4, 3) + """ + def __init__( + self, + latent_dim: int, + num_mlp_layers: int, + mlp_hidden_dim: int, + target_property_dim: int, + dropout: Optional[float] = None, + remove_mean: bool = True, + ): + """init + """ + super().__init__() + self.target_property_dim = target_property_dim + self.normalizer = ScalarNormalizer() + + self.mlp = build_mlp( + input_size=latent_dim, + hidden_layer_sizes=[mlp_hidden_dim] * num_mlp_layers, + output_size=self.target_property_dim, + dropout=dropout, + ) + + self.remove_mean = remove_mean + + def construct(self, node_features, n_node): + """construct + """ + feat = node_features[_KEY] + pred = self.mlp(feat) + if self.remove_mean: + system_means = aggregate_nodes( + pred, n_node, reduction="mean" + ) + node_broadcasted_means = mint.repeat_interleave( + system_means, n_node, dim=0 + ) + pred = pred - node_broadcasted_means + res = {"node_pred": pred} + return res + + def predict(self, node_features, n_node): + """Predict node-level attributes. + + Args: + node_features: Node features tensor of shape (n_nodes, latent_dim). + n_node: Number of nodes in the graph. + + Returns: + node_pred: Node-level predictions of shape (n_nodes, target_property_dim). + """ + out = self(node_features, n_node) + pred = out["node_pred"] + return self.normalizer.inverse(pred) + + +# pylint: disable=C0301 +class GraphHead(ms.nn.Cell): + r""" + Graph-level prediction head. Implements graph-level prediction head that can be attached to base models + for predicting graph-level properties (e.g., stress tensor) from node features using aggregation and MLP. + + Args: + latent_dim (int): Input feature dimension for each node. + num_mlp_layers (int): Number of hidden layers in MLP. + mlp_hidden_dim (int): Hidden dimension size of MLP. + target_property_dim (int): Output dimension of graph-level property. + node_aggregation (str, optional): Aggregation method for node predictions, e.g., ``"mean"`` or ``"sum"``. Default: ``"mean"``. + dropout (Optional[float], optional): Dropout rate for MLP. Default: ``None``. + compute_stress (bool, optional): Whether to compute and output stress tensor. Default: ``False``. + + Inputs: + - **node_features** (dict) - Node feature dictionary, must contain key "feat" with shape :math:`(n_{nodes}, latent\_dim)`. + - **n_node** (Tensor) - Number of nodes in graph, shape :math:`(1,)`. + + Outputs: + - **output** (dict) - Dictionary containing key "stress_pred" with value of shape :math:`(1, target\_property\_dim)`. + + Raises: + ValueError: If required feature keys are missing in `node_features`. + + Supported Platforms: + ``Ascend`` + + Examples: + >>> import numpy as np + >>> import mindspore + >>> from mindspore import Tensor + >>> from mindchemistry.cell.orb.gns import GraphHead + >>> graph_head = GraphHead( + ... latent_dim=256, + ... num_mlp_layers=1, + ... mlp_hidden_dim=256, + ... target_property_dim=6, + ... compute_stress=True, + ... ) + >>> n_atoms = 4 + >>> n_node = Tensor([n_atoms], mindspore.int32) + >>> atomic_numbers = Tensor(np.random.randint(1, 119, size=(n_atoms,), dtype=np.int32)) + >>> atomic_numbers_embedding_np = np.zeros((n_atoms, 118), dtype=np.float32) + >>> for i, num in enumerate(atomic_numbers.asnumpy()): + ... atomic_numbers_embedding_np[i, num - 1] = 1.0 + >>> node_features = { + ... "atomic_numbers": atomic_numbers, + ... "atomic_numbers_embedding": Tensor(atomic_numbers_embedding_np), + ... "positions": Tensor(np.random.randn(n_atoms, 3).astype(np.float32)), + ... "feat": Tensor(np.random.randn(n_atoms, 256).astype(np.float32)) + ... } + >>> output = graph_head(node_features, n_node) + >>> print(output['stress_pred'].shape) + (1, 6) + """ + + def __init__( + self, + latent_dim: int, + num_mlp_layers: int, + mlp_hidden_dim: int, + target_property_dim: int, + node_aggregation: Literal["sum", "mean"] = "mean", + dropout: Optional[float] = None, + compute_stress: Optional[bool] = False, + ): + """init + """ + super().__init__() + self.target_property_dim = target_property_dim + self.normalizer = ScalarNormalizer() + + self.node_aggregation = node_aggregation + self.mlp = build_mlp( + input_size=latent_dim, + hidden_layer_sizes=[mlp_hidden_dim] * num_mlp_layers, + output_size=self.target_property_dim, + dropout=dropout, + ) + self.output_activation = ops.Identity() + self.compute_stress = compute_stress + + def construct(self, node_features, n_node): + """construct + """ + feat = node_features[_KEY] + + # aggregate to get a tensor of shape (num_graphs, latent_dim) + mlp_input = aggregate_nodes( + feat, + n_node, + reduction=self.node_aggregation, + ) + + pred = self.mlp(mlp_input) + if self.compute_stress: + # name the stress prediction differently + res = {"stress_pred": pred} + else: + res = {"graph_pred": pred} + return res + + def predict(self, node_features, n_node, atomic_numbers=None): + """Predict graph-level attributes. + + Args: + node_features: Node features tensor + n_node: Number of nodes + atomic_numbers: Optional atomic numbers for reference energy calculation + + Returns: + probs: Graph-level predictions of shape (n_graphs, target_property_dim). + If compute_stress is True, this will be the stress tensor. + If compute_stress is False, this will be the graph-level property (e.g., energy). + """ + pred = self(node_features, n_node) + if self.compute_stress: + logits = pred["stress_pred"].squeeze(-1) + else: + assert atomic_numbers is not None, "atomic_numbers must be provided for graph prediction" + logits = pred["graph_pred"].squeeze(-1) + probs = self.output_activation(logits) + probs = self.normalizer.inverse(probs) + return probs + + +# pylint: disable=C0301 +class EnergyHead(GraphHead): + r""" + Graph-level energy prediction head. + Implements neural network head for predicting total energy or per-atom average energy of molecular graphs. + Supports node-level aggregation, reference energy offset, and flexible output modes. + + Args: + latent_dim (int): Input feature dimension for each node. + num_mlp_layers (int): Number of hidden layers in MLP. + mlp_hidden_dim (int): Hidden dimension size of MLP. + target_property_dim (int): Output dimension of energy property (typically 1). + predict_atom_avg (bool, optional): Whether to predict per-atom average energy instead of total energy. Default: ``True``. + reference_energy_name (str, optional): Reference energy name for offset, e.g., ``"vasp-shifted"``. Default: ``"mp-traj-d3"``. + train_reference (bool, optional): Whether to train reference energy as learnable parameter. Default: ``False``. + dropout (Optional[float], optional): Dropout rate for MLP. Default: ``None``. + node_aggregation (str, optional): Aggregation method for node predictions, e.g., ``"mean"`` or ``"sum"``. Default: ``None``. + + Inputs: + - **node_features** (dict) - Node feature dictionary, must contain key "feat" with shape :math:`(n_{nodes}, latent\_dim)`. + - **n_node** (Tensor) - Number of nodes in graph, shape :math:`(1,)`. + + Outputs: + - **output** (dict) - Dictionary containing key "graph_pred" with value of shape :math:`(1, target\_property\_dim)`. + + Raises: + ValueError: If required feature keys are missing in `node_features`. + ValueError: If `node_aggregation` is not a supported type. + + Supported Platforms: + ``Ascend`` + + Examples: + >>> import numpy as np + >>> import mindspore + >>> from mindspore import Tensor + >>> from mindchemistry.cell.orb.gns import EnergyHead + >>> energy_head = EnergyHead( + ... latent_dim=256, + ... num_mlp_layers=1, + ... mlp_hidden_dim=256, + ... target_property_dim=1, + ... node_aggregation="mean", + ... reference_energy_name="vasp-shifted", + ... train_reference=True, + ... predict_atom_avg=True, + ... ) + >>> n_atoms = 4 + >>> n_node = Tensor([n_atoms], mindspore.int32) + >>> atomic_numbers = Tensor(np.random.randint(1, 119, size=(n_atoms,), dtype=np.int32)) + >>> atomic_numbers_embedding_np = np.zeros((n_atoms, 118), dtype=np.float32) + >>> for i, num in enumerate(atomic_numbers.asnumpy()): + ... atomic_numbers_embedding_np[i, num - 1] = 1.0 + >>> node_features = { + ... "atomic_numbers": atomic_numbers, + ... "atomic_numbers_embedding": Tensor(atomic_numbers_embedding_np), + ... "positions": Tensor(np.random.randn(n_atoms, 3).astype(np.float32)), + ... "feat": Tensor(np.random.randn(n_atoms, 256).astype(np.float32)) + ... } + >>> output = energy_head(node_features, n_node) + >>> print(output['graph_pred'].shape) + (1, 1) + """ + + def __init__( + self, + latent_dim: int, + num_mlp_layers: int, + mlp_hidden_dim: int, + target_property_dim: int, + predict_atom_avg: bool = True, + reference_energy_name: str = "mp-traj-d3", + train_reference: bool = False, + dropout: Optional[float] = None, + node_aggregation: Optional[str] = "mean", + ): + """init + """ + ref = REFERENCE_ENERGIES[reference_energy_name] + + super().__init__( + latent_dim=latent_dim, + num_mlp_layers=num_mlp_layers, + mlp_hidden_dim=mlp_hidden_dim, + target_property_dim=target_property_dim, + node_aggregation=node_aggregation, + dropout=dropout, + ) + self.reference = LinearReferenceEnergy( + weight_init=ref.coefficients, trainable=train_reference + ) + self.atom_avg = predict_atom_avg + + def predict(self, node_features, n_node, atomic_numbers=None): + """Predict energy. + + Args: + node_features: Node features tensor + n_node: Number of nodes + atomic_numbers: Optional atomic numbers for reference energy calculation + + Returns: + graph_pred: Energy prediction + """ + if atomic_numbers is None: + raise ValueError("atomic_numbers is required for energy prediction") + + pred = self(node_features, n_node)["graph_pred"] + pred = self.normalizer.inverse(pred).squeeze(-1) + if self.atom_avg: + pred = pred * n_node + pred = pred + self.reference(atomic_numbers, n_node) + return pred + + +# pylint: disable=C0301 +class Orb(ms.nn.Cell): + r""" + Orb graph regressor. + Combines a pretrained base model (e.g., MoleculeGNS) with optional node, graph, and stress regression heads, supporting + fine-tuning or feature extraction workflows. + + Args: + model (MoleculeGNS): Pretrained or randomly initialized base model for message passing and feature extraction. + node_head (NodeHead, optional): Regression head for node-level property prediction. Default: ``None``. + graph_head (GraphHead, optional): Regression head for graph-level property prediction (e.g., energy). Default: ``None``. + stress_head (GraphHead, optional): Regression head for stress prediction. Default: ``None``. + model_requires_grad (bool, optional): Whether to fine-tune the base model (True) or freeze its parameters (False). Default: ``True``. + cutoff_layers (int, optional): If provided, only use the first ``cutoff_layers`` message passing layers of the base model. + Default: ``None``. + + Inputs: + - **edge_features** (dict) - Edge feature dictionary (e.g., `{"vectors": Tensor, "r": Tensor}`). + - **node_features** (dict) - Node feature dictionary (e.g., `{"atomic_numbers": Tensor, ...}`). + - **senders** (Tensor) - Sender node indices for each edge. Shape: :math:`(n_{edges},)`. + - **receivers** (Tensor) - Receiver node indices for each edge. Shape: :math:`(n_{edges},)`. + - **n_node** (Tensor) - Number of nodes for each graph in the batch. Shape: :math:`(n_{graphs},)`. + + Outputs: + - **output** (dict) - Dictionary containing: + - **edges** (dict) - Edge features after message passing, e.g., `{..., "feat": Tensor}`. + - **nodes** (dict) - Node features after message passing, e.g., `{..., "feat": Tensor}`. + - **graph_pred** (Tensor) - Graph-level predictions, e.g., energy. Shape: :math:`(n_{graphs}, target\_property\_dim)`. + - **node_pred** (Tensor) - Node-level predictions. Shape: :math:`(n_{nodes}, target\_property\_dim)`. + - **stress_pred** (Tensor) - Stress predictions (if stress_head is provided). Shape: :math:`(n_{graphs}, 6)`. + + Raises: + ValueError: If neither node_head nor graph_head is provided. + ValueError: If cutoff_layers exceeds the number of message passing steps in the base model. + ValueError: If atomic_numbers is not provided when graph_head is required. + + Supported Platforms: + ``Ascend`` + + Examples: + >>> import numpy as np + >>> import mindspore + >>> from mindspore import Tensor + >>> from mindchemistry.cell.orb import Orb, MoleculeGNS, EnergyHead, NodeHead, GraphHead + >>> Orb = Orb( + ... model=MoleculeGNS( + ... num_node_in_features=256, + ... num_node_out_features=3, + ... num_edge_in_features=23, + ... latent_dim=256, + ... interactions="simple_attention", + ... interaction_params={ + ... "distance_cutoff": True, + ... "polynomial_order": 4, + ... "cutoff_rmax": 6, + ... "attention_gate": "sigmoid", + ... }, + ... num_message_passing_steps=15, + ... num_mlp_layers=2, + ... mlp_hidden_dim=512, + ... use_embedding=True, + ... node_feature_names=["feat"], + ... edge_feature_names=["feat"], + ... ), + ... graph_head=EnergyHead( + ... latent_dim=256, + ... num_mlp_layers=1, + ... mlp_hidden_dim=256, + ... target_property_dim=1, + ... node_aggregation="mean", + ... reference_energy_name="vasp-shifted", + ... train_reference=True, + ... predict_atom_avg=True, + ... ), + ... node_head=NodeHead( + ... latent_dim=256, + ... num_mlp_layers=1, + ... mlp_hidden_dim=256, + ... target_property_dim=3, + ... remove_mean=True, + ... ), + ... stress_head=GraphHead( + ... latent_dim=256, + ... num_mlp_layers=1, + ... mlp_hidden_dim=256, + ... target_property_dim=6, + ... compute_stress=True, + ... ), + ... ) + >>> n_atoms = 4 + >>> n_edges = 10 + >>> n_node = Tensor([n_atoms], mindspore.int32) + >>> atomic_numbers = Tensor(np.random.randint(1, 119, size=(n_atoms,), dtype=np.int32)) + >>> atomic_numbers_embedding_np = np.zeros((n_atoms, 118), dtype=np.float32) + >>> for i, num in enumerate(atomic_numbers.asnumpy()): + ... atomic_numbers_embedding_np[i, num - 1] = 1.0 + >>> node_features = { + ... "atomic_numbers": atomic_numbers, + ... "atomic_numbers_embedding": Tensor(atomic_numbers_embedding_np), + ... "positions": Tensor(np.random.randn(n_atoms, 3).astype(np.float32)) + ... } + >>> edge_features = { + ... "vectors": Tensor(np.random.randn(n_edges, 3).astype(np.float32)), + ... "r": Tensor(np.abs(np.random.randn(n_edges).astype(np.float32) * 10)) + ... } + >>> senders = Tensor(np.random.randint(0, n_atoms, size=(n_edges,), dtype=np.int32)) + >>> receivers = Tensor(np.random.randint(0, n_atoms, size=(n_edges,), dtype=np.int32)) + >>> output = Orb(edge_features, node_features, senders, receivers, n_node) + >>> print(output['graph_pred'].shape, output['node_pred'].shape, output['stress_pred'].shape) + (1, 1) (4, 3) (1, 6) + """ + + def __init__( + self, + model: MoleculeGNS, + node_head: Optional[NodeHead] = None, + graph_head: Optional[GraphHead] = None, + stress_head: Optional[GraphHead] = None, + model_requires_grad: bool = True, + cutoff_layers: Optional[int] = None, + ): + """init + """ + super().__init__() + + if (node_head is None) and (graph_head is None): + raise ValueError("Must provide at least one node/graph head.") + self.node_head = node_head + self.graph_head = graph_head + self.stress_head = stress_head + self.cutoff_layers = cutoff_layers + + self.model = model + + if self.cutoff_layers is not None: + if self.cutoff_layers > self.model.num_message_passing_steps: + raise ValueError( + f"cutoff_layers ({self.cutoff_layers}) must be less than or equal to" + f" the number of message passing steps ({self.model.num_message_passing_steps})" + ) + self.model.gnn_stacks = self.model.gnn_stacks[: self.cutoff_layers] + self.model.num_message_passing_steps = self.cutoff_layers + + self.model_requires_grad = model_requires_grad + + if not model_requires_grad: + for param in self.model.parameters(): + param.requires_grad = False + + + def predict(self, edge_features, node_features, senders, receivers, n_node, atomic_numbers): + """Predict node and/or graph level attributes. + + Args: + edge_features: A dictionary, e.g., `{"vectors": Tensor, "r": Tensor}`. + node_features: A dictionary, e.g., `{"atomic_numbers": Tensor, "positions": Tensor, + "atomic_numbers_embedding": Tensor}`. + senders: A tensor of shape (n_edges,) containing the sender node indices. + receivers: A tensor of shape (n_edges,) containing the receiver node indices. + n_node: A tensor of shape (1,) containing the number of nodes. + atomic_numbers: A tensor of atomic numbers for reference energy calculation. + + Returns: + ouput_dict: A dictionary containing the predictions: + - `graph_pred`: Graph-level predictions (e.g., energy) of shape (n_graphs, graph_property_dim). + - `stress_pred`: Stress predictions (if stress_head is provided) of shape (n_graphs, stress_dim). + - `node_pred`: Node-level predictions of shape (n_nodes, node_property_dim). + """ + _, nodes = self.model(edge_features, node_features, senders, receivers) + + output = {} + output["graph_pred"] = self.graph_head.predict(nodes, n_node, atomic_numbers) + output["stress_pred"] = self.stress_head.predict(nodes, n_node) + output["node_pred"] = self.node_head.predict(nodes, n_node) + + return output + + def construct(self, edge_features, node_features, senders, receivers, n_node): + """construct + """ + edges, nodes = self.model(edge_features, node_features, senders, receivers) + + res = {"edges": edges, "nodes": nodes} + res.update(self.graph_head(nodes, n_node)) + res.update(self.stress_head(nodes, n_node)) + res.update(self.node_head(nodes, n_node)) + + return res diff --git a/MindChemistry/mindchemistry/cell/orb/utils.py b/MindChemistry/mindchemistry/cell/orb/utils.py new file mode 100644 index 000000000..26797d9df --- /dev/null +++ b/MindChemistry/mindchemistry/cell/orb/utils.py @@ -0,0 +1,737 @@ +# ============================================================================ +# Copyright 2025 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +"""Utils.""" + +from typing import NamedTuple, List, Optional, Type + +import numpy as np +import mindspore as ms +from mindspore import nn, ops, Tensor, mint, context + +MSINT = [ms.int64, ms.int32, ms.int16, ms.int8, ms.uint8] + + +def aggregate_nodes(tensor: Tensor, n_node: Tensor, reduction: str = "mean", deterministic: bool = False) -> Tensor: + """Aggregates over a tensor based on graph sizes.""" + count = len(n_node) + if deterministic: + ms.set_seed(1) + segments = ops.arange(count).repeat_interleave(n_node).astype(ms.int32) + if reduction == "sum": + return scatter_sum(tensor, segments, dim=0) + if reduction == "mean": + return scatter_mean(tensor, segments, dim=0) + if reduction == "max": + return scatter_max(tensor, segments, dim=0) + raise ValueError("Invalid reduction argument. Use sum, mean or max.") + + +def segment_sum(data: Tensor, segment_ids: Tensor, num_segments: int): + """Computes index based sum over segments of a tensor.""" + return scatter_sum(data, segment_ids, dim=0, dim_size=num_segments) + + +def segment_max(data: Tensor, segment_ids: Tensor, num_segments: int): + """Computes index based max over segments of a tensor.""" + assert segment_ids is not None, "segment_ids must not be None" + assert num_segments > 0, "num_segments must be greater than 0" + max_op = ops.ArgMaxWithValue(axis=0) + _, max_values = max_op(data) + return max_values + + +def segment_mean(data: Tensor, segment_ids: Tensor, num_segments: int): + """Computes index based mean over segments of a tensor.""" + sum_v = segment_sum(data, segment_ids, num_segments) + count = ops.scatter_add(ops.zeros( + (num_segments,), dtype=ms.int32), segment_ids, ops.ones_like(segment_ids)) + return sum_v / count.astype(sum_v.dtype) + + +def segment_softmax(data: Tensor, segment_ids: Tensor, num_segments: int, weights: Optional[Tensor] = None): + """Computes a softmax over segments of the tensor.""" + data_max = segment_max(data, segment_ids, num_segments) + data = data - data_max[segment_ids] + + unnormalised_probs = ops.exp(data) + if weights is not None: + unnormalised_probs = unnormalised_probs * weights + denominator = segment_sum(unnormalised_probs, segment_ids, num_segments) + + return safe_division(unnormalised_probs, denominator, segment_ids) + + +def safe_division(numerator: Tensor, denominator: Tensor, segment_ids: Tensor): + """Divides logits by denominator, setting 0 where the denominator is zero.""" + result = ops.where(denominator[segment_ids] == + 0, 0, numerator / denominator[segment_ids]) + return result + + +def _broadcast(src: Tensor, other: Tensor, dim: int): + """Broadcasts the source tensor to match the shape of the other tensor along the specified dimension.""" + if dim < 0: + dim = other.ndim + dim + if src.ndim == 1: + for _ in range(0, dim): + src = src.unsqueeze(0) + for _ in range(src.ndim, other.ndim): + src = src.unsqueeze(-1) + src = src.expand_as(other) + return src + + +def scatter_sum( + src: Tensor, index: Tensor, dim: int = -1, out: Optional[Tensor] = None, + dim_size: Optional[int] = None, reduce: str = "sum" +) -> Tensor: + """Applies a sum reduction of the orb_models tensor along the specified dimension.""" + assert reduce == "sum" + index = _broadcast(index, src, dim) + if out is None: + size = list(src.shape) + if dim_size is not None: + size[dim] = dim_size + elif index.numel() == 0: + size[dim] = 0 + else: + size[dim] = int(index.max()) + 1 + out = ops.zeros(size, dtype=src.dtype) + return mint.scatter_add(out, dim, index, src) + return mint.scatter_add(out, dim, index, src) + + +def scatter_std( + src: Tensor, index: Tensor, dim: int = -1, out: Optional[Tensor] = None, + dim_size: Optional[int] = None, unbiased: bool = True +) -> Tensor: + """Computes the standard deviation of the orb_models tensor along the specified dimension.""" + if out is not None: + dim_size = out.shape[dim] + + if dim < 0: + dim = src.ndim + dim + + count_dim = dim + if index.ndim <= dim: + count_dim = index.ndim - 1 + + ones = ops.ones(index.shape, dtype=src.dtype) + count = scatter_sum(ones, index, count_dim, dim_size=dim_size) + + index = _broadcast(index, src, dim) + tmp = scatter_sum(src, index, dim, dim_size=dim_size) + count = _broadcast(count, tmp, dim).clip(1) + mean = tmp / count + + var = src - mean.gather(dim, index) + var = var * var + out = scatter_sum(var, index, dim, out=out, dim_size=dim_size) + + if unbiased: + count = count - 1 + count = count.clip(1) + out = out / (count + 1e-6) + out = ops.sqrt(out) + return out + + +def scatter_mean( + src: Tensor, index: Tensor, dim: int = -1, out: Optional[Tensor] = None, + dim_size: Optional[int] = None +) -> Tensor: + """Computes the mean of the orb_models tensor along the specified dimension.""" + out = scatter_sum(src, index, dim, out=out, dim_size=dim_size) + dim_size = out.shape[dim] + + index_dim = dim + if index_dim < 0: + index_dim = index_dim + src.ndim + if index.ndim <= index_dim: + index_dim = index.ndim - 1 + + ones = ops.ones(index.shape, dtype=src.dtype) + count = scatter_sum(ones, index, index_dim, dim_size=dim_size) + count = count.clip(1) + count = _broadcast(count, out, dim) + out = out / count + return out + + +def scatter_max( + src: Tensor, index: Tensor, dim: int = -1, out: Optional[Tensor] = None, + dim_size: Optional[int] = None +) -> Tensor: + """Computes the maximum of the orb_models tensor for each group defined by index along the specified dimension.""" + if out is not None: + raise NotImplementedError( + "The 'out' argument is not supported for scatter_max") + + if src.dtype in MSINT: + init_value = np.iinfo(src.dtype).min + else: + init_value = np.finfo(src.dtype).min + + if dim < 0: + dim = src.ndim + dim + + if dim_size is None: + dim_size = int(index.max()) + 1 + + result = ops.ones( + (dim_size, *src.shape[:dim], *src.shape[dim + 1:]), dtype=src.dtype) + result = init_value * result + broadcasted_index = _broadcast(index, src, dim) + + scatter_result = ops.ZerosLike()(result) + index = ops.expand_dims(broadcasted_index, dim) + scatter_result = scatter_result.scatter_update(index, src) + result = ops.Maximum()(result, scatter_result) + return result + + +class SSP(nn.Cell): + """Shifted Softplus activation function. + + This activation is twice differentiable so can be used when regressing + gradients for conservative force fields. + """ + + def __init__(self, beta: int = 1, threshold: int = 20): + super().__init__() + self.beta = beta + self.threshold = threshold + + def construct(self, input_x: Tensor) -> Tensor: + sp0 = ops.softplus(ops.zeros(1), self.beta, self.threshold) + return ops.softplus(input_x, self.beta, self.threshold) - sp0 + + +def build_mlp( + input_size: int, + hidden_layer_sizes: List[int], + output_size: Optional[int] = None, + output_activation: Type[nn.Cell] = nn.Identity, + activation: Type[nn.Cell] = SSP, + dropout: Optional[float] = None, +) -> nn.Cell: + """Build a MultiLayer Perceptron. + + Args: + input_size: Size of input layer. + hidden_layer_sizes: An array of input size for each hidden layer. + output_size: Size of the output layer. + output_activation: Activation function for the output layer. + activation: Activation function for the hidden layers. + dropout: Dropout rate for hidden layers. + checkpoint: Whether to use checkpointing. + + Returns: + mlp: An MLP sequential container. + """ + # Size of each layer + layer_sizes = [input_size] + hidden_layer_sizes + if output_size: + layer_sizes.append(output_size) + + # Number of layers + nlayers = len(layer_sizes) - 1 + + # Create a list of activation functions and + # set the last element to output activation function + act = [activation for _ in range(nlayers)] + act[-1] = output_activation + + # Create a list to hold layers + layers = [] + for i in range(nlayers): + if dropout is not None: + layers.append(nn.Dropout(keep_prob=1 - dropout)) + layers.append(nn.Dense(layer_sizes[i], layer_sizes[i + 1])) + layers.append(act[i]()) + + # Create a sequential container + mlp = nn.SequentialCell(layers) + return mlp + + +class CheckpointedSequential(nn.Cell): + """Sequential container with checkpointing.""" + + def __init__(self, *args, n_layers: int = 1): + super().__init__() + self.n_layers = n_layers + self.layers = nn.CellList(list(args)) + + def construct(self, input_x: Tensor) -> Tensor: + """Forward pass with checkpointing enabled in training mode.""" + if context.get_context("mode") == context.GRAPH_MODE: + # In graph mode, checkpointing is handled by MindSpore's graph optimization + for layer in self.layers: + input_x = layer(input_x) + else: + # In PyNative mode, we can manually checkpoint each layer + for i in range(self.n_layers): + input_x = self.layers[i](input_x) + return input_x + + +class ReferenceEnergies(NamedTuple): + """ + Reference energies for an atomic system. + + Our vasp reference energies are computed by running vasp + optimisations on a single atom of each atom-type. + + Other reference energies are fitted using least-squares. + + Doing so with mp-traj-d3 gives the following: + + ---------- LSTQ ---------- + Reference MAE: 13.35608855004781 + (energy - ref) mean: 1.3931169304958624 + (energy - ref) std: 22.45615276341948 + (energy - ref)/natoms mean: 0.16737045963056316 + (energy - ref)/natoms std: 0.8189314920219992 + CO2: Predicted vs DFT: -23.154158610392408 vs -22.97 + H2O: Predicted vs DFT: -11.020918107591324 vs - 14.23 + ---------- VASP ---------- + Reference MAE: 152.4722089438871 + (energy - ref) mean: -152.47090833346033 + (energy - ref) std: 153.89049784836962 + (energy - ref)/natoms mean: -4.734136414817941 + (energy - ref)/natoms std: 1.3603868419157275 + CO2: Predicted vs DFT: -4.35888857 vs -22.97 + H2O: Predicted vs DFT: -2.66521147 vs - 14.23 + ---------- Shifted VASP ---------- + Reference MAE: 28.95948216608197 + (energy - ref) mean: 0.7083632520428979 + (energy - ref) std: 48.61861182844561 + (energy - ref)/natoms mean: 0.17320099403091083 + (energy - ref)/natoms std: 1.3603868419157275 + CO2: Predicted vs DFT: -19.080900796546562 vs -22.97 + H2O: Predicted vs DFT: -12.479886287697706 vs - 14.23 + + Args: + coefficients: Coefficients for each atom in the periodic table. + Must be of length 118 with first entry equal to 0. + residual_mean: Mean of (pred - target) + residual_std: Standard deviation of (pred - target) + residual_mean_per_atom: Mean of (pred - target)/n_atoms. + residual_std_per_atom: Standard deviation of (pred - target)/n_atoms. + """ + + coefficients: np.ndarray + residual_mean: float + residual_std: float + residual_mean_per_atom: float + residual_std_per_atom: float + + +# We have only computed these for the first +# 88 elements, and padded the remainder with 0. +vasp_reference_energies = ReferenceEnergies( + coefficients=np.array( + [ + 0.0, # padding + -1.11725225e00, + 7.69290000e-04, + -3.22788480e-01, + -4.47021900e-02, + -2.90627280e-01, + -1.26297013e00, + -3.12415058e00, + -1.54795922e00, + -4.39757050e-01, + -1.25673900e-02, + -2.63927430e-01, + -1.92670300e-02, + -2.11267040e-01, + -8.24799500e-01, + -1.88734631e00, + -8.91048980e-01, + -2.58371430e-01, + -2.50008000e-02, + -2.71936150e-01, + -7.11147600e-02, + -2.06076796e00, + -2.42753196e00, + -3.57144559e00, + -5.45540047e00, + -5.15708214e00, + -3.31393675e00, + -1.84639284e00, + -6.32812480e-01, + -2.38017450e-01, + -1.41047600e-02, + -2.06349980e-01, + -7.77477960e-01, + -1.70160351e00, + -7.84231510e-01, + -2.27541260e-01, + -2.26104900e-02, + -2.79760570e-01, + -9.92851900e-02, + -2.18560872e00, + -2.26603086e00, + -3.14842282e00, + -4.61199158e00, + -3.34329762e00, + -2.48233722e00, + -1.27872811e00, + -1.47784242e00, + -2.04068960e-01, + -1.89639300e-02, + -1.88520140e-01, + -6.76700640e-01, + -1.42966694e00, + -6.57608340e-01, + -1.89308030e-01, + -1.20491300e-02, + -3.07991050e-01, + -1.58601400e-01, + -4.89728600e-01, + -1.35031403e00, + -3.31509450e-01, + -3.23660410e-01, + -3.15316610e-01, + -3.11184530e-01, + -8.44684689e00, + -1.04408371e01, + -2.30922790e-01, + -2.26295040e-01, + -2.92747580e-01, + -2.92191740e-01, + -2.91465170e-01, + -3.80611000e-02, + -2.87691040e-01, + -3.51528971e00, + -3.51343142e00, + -4.64232388e00, + -2.88816624e00, + -1.46089612e00, + -5.36042350e-01, + -1.87182020e-01, + -1.33549100e-02, + -1.68142250e-01, + -6.25378750e-01, + -1.32291753e00, + -3.26246040e-01, + -1.10239294e00, + -2.30839543e00, + -4.61968511e00, + -7.30638139e00, + -1.04613411e01, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + ] + ), + residual_mean=-152.47090833346033, + residual_std=153.89049784836962, + residual_mean_per_atom=-4.734136414817941, + residual_std_per_atom=1.3603868419157275, +) + +vasp_shifted_reference_energies = ReferenceEnergies( + coefficients=np.array( + [ + 0.0, # padding + -6.0245896588488534, + -4.9065681188488535, + -5.230125888848853, + -4.952039598848853, + -5.197964688848853, + -6.170307538848854, + -8.031487988848854, + -6.455296628848854, + -5.347094458848853, + -4.919904798848854, + -5.171264838848853, + -4.9266044388488535, + -5.118604448848854, + -5.732136908848854, + -6.794683718848853, + -5.798386388848853, + -5.165708838848854, + -4.932338208848853, + -5.179273558848854, + -4.978452168848854, + -6.968105368848853, + -7.334869368848853, + -8.478782998848853, + -10.362737878848854, + -10.064419548848853, + -8.221274158848853, + -6.7537302488488535, + -5.540149888848854, + -5.145354858848854, + -4.921442168848854, + -5.113687388848853, + -5.684815368848853, + -6.6089409188488535, + -5.691568918848853, + -5.134878668848853, + -4.929947898848853, + -5.187097978848853, + -5.006622598848853, + -7.092946128848853, + -7.173368268848853, + -8.055760228848854, + -9.519328988848853, + -8.250635028848853, + -7.389674628848853, + -6.186065518848854, + -6.3851798288488535, + -5.111406368848853, + -4.9263013388488535, + -5.095857548848853, + -5.5840380488488535, + -6.337004348848853, + -5.564945748848854, + -5.096645438848854, + -4.919386538848854, + -5.2153284588488535, + -5.065938808848854, + -5.397066008848854, + -6.257651438848853, + -5.238846858848854, + -5.230997818848854, + -5.2226540188488535, + -5.218521938848854, + -13.354184298848853, + -15.348174508848853, + -5.138260198848854, + -5.133632448848854, + -5.200084988848854, + -5.199529148848853, + -5.198802578848854, + -4.945398508848854, + -5.195028448848854, + -8.422627118848853, + -8.420768828848853, + -9.549661288848853, + -7.795503648848854, + -6.368233528848854, + -5.443379758848853, + -5.094519428848853, + -4.920692318848854, + -5.075479658848853, + -5.532716158848854, + -6.230254938848853, + -5.2335834488488535, + -6.009730348848853, + -7.2157328388488535, + -9.527022518848852, + -12.213718798848854, + -15.368678508848854, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + -4.9073374088488535, + ] + ), + residual_mean=0.7083632520428979, + residual_std=48.61861182844561, + residual_mean_per_atom=0.17320099403091083, + residual_std_per_atom=1.3603868419157275, +) + +mp_traj_d3_reference_energies = ReferenceEnergies( + coefficients=np.array( + [ + 0.0, # padding + -3.6818229500085327, + -1.3199148098871394, + -3.688797198716366, + -4.938608191337134, + -7.901604711660046, + -8.475968295226822, + -7.42601366967988, + -7.339095157582792, + -4.9239197309790725, + -0.061236726924086424, + -3.0526401941340806, + -3.0836199809602105, + -5.055909838526647, + -7.875649504560413, + -7.175538036602013, + -4.814514763424572, + -2.9198, + -0.13127266880110078, + -2.8792125576832865, + -5.635016298424046, + -8.164720105254204, + -10.712143655281858, + -9.00292017736733, + -9.619640942931085, + -8.610981088341331, + -7.3506162257219385, + -5.943664565392655, + -5.592846831852426, + -3.6868017794232077, + -1.579885044321145, + -3.744040760877656, + -4.945137332817033, + -4.2021571924020655, + -4.045303645442562, + -2.652667661940346, + 6.497305115069106, + -2.806819346028444, + -5.164089337915934, + -10.493037547114369, + -12.256967896681578, + -12.642602087796805, + -9.20874164629371, + -9.292405362859506, + -8.304141715175632, + -7.49355696426791, + -5.44150554776011, + -2.5621691409635474, + -0.9687174918829102, + -3.055905969721681, + -4.02975498585447, + -3.847125028451477, + -3.1016305514702203, + -1.8001556831915142, + 9.742275211909387, + -3.045410331644577, + -5.204088972093178, + -9.267561428901118, + -9.031458669303145, + -8.345252241333469, + -8.584977779192705, + -7.955970517402418, + -8.519743221802353, + -13.927799873369949, + -19.12242499580686, + -8.156787154342183, + -8.505944162624234, + -8.015433843487497, + -7.129355408977684, + -8.166165621829014, + -3.9995952334750644, + -7.884852034766514, + -13.281575162667238, + -14.598283494757041, + -9.729591400065184, + -11.798570715867179, + -9.878207068760076, + -7.891075131963705, + -5.964524120587406, + -2.9665634245721275, + -0.10530075207060852, + -2.649420791761001, + -4.00193074336809, + -3.7403644338639785, + -1.5543122344752192e-15, + -8.881784197001252e-16, + -8.881784197001252e-16, + 0.0, + 0.0, + -5.480602125607218, + -11.9439263006771, + -12.974770001312883, + -14.376719109855834, + -15.49262474740642, + -16.02533150334938, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + ] + ), + residual_mean=1.3931169304958624, + residual_std=22.45615276341948, + residual_mean_per_atom=0.16737045963056316, + residual_std_per_atom=0.8189314920219992, +) + +REFERENCE_ENERGIES = { + "vasp": vasp_reference_energies, + "vasp-shifted": vasp_shifted_reference_energies, + "mp-traj-d3": mp_traj_d3_reference_energies, +} diff --git a/tests/st/mindchemistry/cell/test_orb/base.py b/tests/st/mindchemistry/cell/test_orb/base.py new file mode 100644 index 000000000..12ebf5a21 --- /dev/null +++ b/tests/st/mindchemistry/cell/test_orb/base.py @@ -0,0 +1,119 @@ +# ============================================================================ +# Copyright 2025 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +"""Base data class.""" + +from typing import Dict, Mapping, NamedTuple, Optional, Union + +from mindspore import Tensor + + +Metric = Union[Tensor, int, float] +TensorDict = Mapping[str, Optional[Tensor]] + + +class ModelOutput(NamedTuple): + """A model's output.""" + + loss: Tensor + log: Mapping[str, Metric] + + +class AtomGraphs(NamedTuple): + """A class representing the input to a model for a graph. + + Args: + senders (ms.Tensor): The integer source nodes for each edge. + receivers (ms.Tensor): The integer destination nodes for each edge. + n_node (ms.Tensor): A (batch_size, ) shaped tensor containing the number of nodes per graph. + n_edge (ms.Tensor): A (batch_size, ) shaped tensor containing the number of edges per graph. + node_features (Dict[str, ms.Tensor]): A dictionary containing node feature tensors. + It will always contain "atomic_numbers" and "positions" keys, representing the + atomic numbers of each node, and the 3d cartesian positions of them respectively. + edge_features (Dict[str, ms.Tensor]): A dictionary containing edge feature tensors. + system_features (Optional[TensorDict]): An optional dictionary containing system-level features. + node_targets (Optional[Dict[ms.Tensor]]): An optional dict of tensors containing targets + for individual nodes. This tensor is commonly expected to have shape (num_nodes, *). + edge_target (Optional[ms.Tensor]): An optional tensor containing targets for individual edges. + This tensor is commonly expected to have (num_edges, *). + system_targets (Optional[Dict[ms.Tensor]]): An optional dict of tensors containing targets for the + entire system. system_id (Optional[ms.Tensor]): An optional tensor containing the ID of the system. + fix_atoms (Optional[ms.Tensor]): An optional tensor containing information on fixed atoms in the system. + """ + + senders: Tensor + receivers: Tensor + n_node: Tensor + n_edge: Tensor + node_features: Dict[str, Tensor] + edge_features: Dict[str, Tensor] + system_features: Dict[str, Tensor] + node_targets: Optional[Dict[str, Tensor]] = None + edge_targets: Optional[Dict[str, Tensor]] = None + system_targets: Optional[Dict[str, Tensor]] = None + system_id: Optional[Tensor] = None + fix_atoms: Optional[Tensor] = None + tags: Optional[Tensor] = None + radius: Optional[float] = None + max_num_neighbors: Optional[int] = None + + @property + def positions(self): + """Get positions of atoms.""" + return self.node_features["positions"] + + @positions.setter + def positions(self, val: Tensor): + self.node_features["positions"] = val + + @property + def atomic_numbers(self): + """Get integer atomic numbers.""" + return self.node_features["atomic_numbers"] + + @atomic_numbers.setter + def atomic_numbers(self, val: Tensor): + self.node_features["atomic_numbers"] = val + + @property + def cell(self): + """Get unit cells.""" + assert self.system_features + return self.system_features.get("cell") + + @cell.setter + def cell(self, val: Tensor): + assert self.system_features + self.system_features["cell"] = val + + def clone(self): + """Clone the AtomGraphs object.""" + return AtomGraphs( + senders=self.senders.clone(), + receivers=self.receivers.clone(), + n_node=self.n_node.clone(), + n_edge=self.n_edge.clone(), + node_features={k: v.clone() for k, v in self.node_features.items()}, + edge_features={k: v.clone() for k, v in self.edge_features.items()}, + system_features={k: v.clone() for k, v in self.system_features.items()}, + node_targets={k: v.clone() for k, v in (self.node_targets or {}).items()}, + edge_targets=self.edge_targets.clone() if self.edge_targets is not None else None, + system_targets={k: v.clone() for k, v in (self.system_targets or {}).items()}, + system_id=self.system_id.clone() if self.system_id is not None else None, + fix_atoms=self.fix_atoms.clone() if self.fix_atoms is not None else None, + tags=self.tags.clone() if self.tags is not None else None, + radius=self.radius, + max_num_neighbors=self.max_num_neighbors + ) diff --git a/tests/st/mindchemistry/cell/test_orb/test_orb.py b/tests/st/mindchemistry/cell/test_orb/test_orb.py new file mode 100644 index 000000000..cbb653408 --- /dev/null +++ b/tests/st/mindchemistry/cell/test_orb/test_orb.py @@ -0,0 +1,451 @@ +# ============================================================================ +# Copyright 2025 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +"""test mindchemistry ORB""" + +import os +import sys +from typing import Optional +import pickle + +import requests +import pytest +import numpy as np +import mindspore +from mindspore import nn, Tensor, load_checkpoint, load_param_into_net + +from mindchemistry.cell import ( + AttentionInteractionNetwork, + MoleculeGNS, + NodeHead, + GraphHead, + EnergyHead, + Orb, +) +import base +from utils import numpy_to_tensor, tensor_to_numpy, is_equal + +# pylint: disable=C0413 +PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../../")) +sys.path.append(PROJECT_ROOT) +from common.cell import compare_output + + +def load_graph_data(pkl_path: str): + """Load graph data from pickle file. + Args: + pkl_path: Path to the pickle file + Returns: + tuple: (input_graph_ms, output_graph_np) + """ + with open(pkl_path, "rb") as f: + loaded = pickle.load(f) + + input_graph_np = loaded["input_graph"] + output_graph_np = loaded["output_graph"] + + input_graph_ms = base.AtomGraphs( + *[numpy_to_tensor(getattr(input_graph_np, field)) + for field in input_graph_np._fields] + ) + + return input_graph_ms, output_graph_np + + +def get_gns( + latent_dim: int = 256, + mlp_hidden_dim: int = 512, + num_message_passing_steps: int = 15, + num_edge_in_features: int = 23, + distance_cutoff: bool = True, + attention_gate: str = "sigmoid", +) -> MoleculeGNS: + """Define the base pretrained model architecture. + Args: + latent_dim: The latent dimension of the model. + mlp_hidden_dim: The hidden dimension of the MLP layers. + num_message_passing_steps: The number of message passing steps. + num_edge_in_features: The number of edge input features. + distance_cutoff: Whether to use distance cutoff in the interaction. + attention_gate: The type of attention gate to use. + Returns: + MoleculeGNS: The MoleculeGNS model instance. + """ + return MoleculeGNS( + num_node_in_features=256, + num_node_out_features=3, + num_edge_in_features=num_edge_in_features, + latent_dim=latent_dim, + interactions="simple_attention", + interaction_params={ + "distance_cutoff": distance_cutoff, + "polynomial_order": 4, + "cutoff_rmax": 6, + "attention_gate": attention_gate, + }, + num_message_passing_steps=num_message_passing_steps, + num_mlp_layers=2, + mlp_hidden_dim=mlp_hidden_dim, + use_embedding=True, + node_feature_names=["feat"], + edge_feature_names=["feat"], + ) + + +def load_model_for_inference(model: nn.Cell, weights_path: str) -> nn.Cell: + """Load a pretrained model in inference mode. + Args: + model: The model to load the weights into. + weights_path: Path to the checkpoint file. + Returns: + nn.Cell: The model with loaded weights. + Raises: + FileNotFoundError: If the checkpoint file does not exist. + ValueError: If the checkpoint file has more parameters than the model. + """ + if not os.path.exists(weights_path): + raise FileNotFoundError(f"Checkpoint file {weights_path} not found.") + param_dict = load_checkpoint(weights_path) + + try: + load_param_into_net(model, param_dict) + except ValueError: + print("Warning: The checkpoint file has more parameters than the model. \ + This may be due to a mismatch in the model architecture or version.") + params = [] + for key in param_dict: + params.append(param_dict[key]) + for parameters in model.trainable_params(): + param_ckpt = params.pop(0) + assert parameters.shape == param_ckpt.shape, f"Shape mismatch: {parameters.name}" + param_ckpt = param_ckpt.reshape(parameters.shape) + parameters.set_data(param_ckpt) + + model.set_train(False) + return model + +def orb_v2(weights_path: Optional[str]) -> nn.Cell: + """Load ORB v2. + Args: + weights_path: Path to the checkpoint file. + Returns: + Orb GraphRegressor: The ORB v2 model instance. + """ + gns = get_gns() + + model = Orb( + graph_head=EnergyHead( + latent_dim=256, + num_mlp_layers=1, + mlp_hidden_dim=256, + target_property_dim=1, + node_aggregation="mean", + reference_energy_name="vasp-shifted", + train_reference=True, + predict_atom_avg=True, + ), + node_head=NodeHead( + latent_dim=256, + num_mlp_layers=1, + mlp_hidden_dim=256, + target_property_dim=3, + remove_mean=True, + ), + stress_head=GraphHead( + latent_dim=256, + num_mlp_layers=1, + mlp_hidden_dim=256, + target_property_dim=6, + compute_stress=True, + ), + model=gns, + ) + model = load_model_for_inference(model, weights_path) + return model + + +def orb_mptraj_only_v2( + weights_path: Optional[str] = None, +): + """Load ORB MPTraj Only v2.""" + + return orb_v2(weights_path,) + + +def download_file(url, local_filename): + """Download a file from a URL to a local path.""" + response = requests.get(url, timeout=30) + if response.status_code == 200: + with open(local_filename, 'wb') as f: + f.write(response.content) + else: + print(f"Failed to download file. HTTP Status Code: {response.status_code}") + + +@pytest.mark.level0 +@pytest.mark.platform_arm_ascend910b_training +@pytest.mark.env_onecard +def test_attn(): + """ + Feature: Test AttentionInteractionNetwork in platform ascend. + Description: The forward output should has expected shape and accuracy. + Expectation: Success or throw AssertionError. + """ + mindspore.set_context(mode=mindspore.PYNATIVE_MODE) + # prepare data + download_file( + 'https://download-mindspore.osinfra.cn/mindscience/mindchemistry/orb/test/attn_input_output.pkl', + 'attn_input_output.pkl' + ) + download_file( + 'https://download-mindspore.osinfra.cn/mindscience/mindchemistry/orb/orb_ckpts/attn_net.ckpt', + 'attn_net.ckpt' + ) + input_graph_ms, output_graph_np = load_graph_data('attn_input_output.pkl') + + attn_net = AttentionInteractionNetwork( + num_node_in=256, + num_node_out=256, + num_edge_in=256, + num_edge_out=256, + num_mlp_layers=2, + mlp_hidden_dim=512, + ) + + # load checkpoint + param_dict = load_checkpoint('attn_net.ckpt') + load_param_into_net(attn_net, param_dict) + + # inference + edges, nodes = attn_net( + input_graph_ms.edge_features, + input_graph_ms.node_features, + input_graph_ms.senders, + input_graph_ms.receivers, + ) + + # Validate results + out_node_feats = tensor_to_numpy(nodes["feat"]) + out_edge_feats = tensor_to_numpy(edges["feat"]) + out_node_feats_np = output_graph_np.node_features["feat"] + out_edge_feats_np = output_graph_np.edge_features["feat"] + + flag_node = is_equal(out_node_feats, out_node_feats_np) + flag_edge = is_equal(out_edge_feats, out_edge_feats_np) + assert flag_node, "Failed! Node features mismatch in attention network" + assert flag_edge, "Failed! Edge features mismatch in attention network" + + +@pytest.mark.level0 +@pytest.mark.platform_arm_ascend910b_training +@pytest.mark.env_onecard +def test_gns(): + """ + Feature: Test MoleculeGNS network in platform ascend. + Description: The forward output should has expected shape and accuracy. + Expectation: Success or throw AssertionError. + """ + mindspore.set_context(mode=mindspore.PYNATIVE_MODE) + download_file( + 'https://download-mindspore.osinfra.cn/mindscience/mindchemistry/orb/test/gns_input_output.pkl', + 'gns_input_output.pkl' + ) + download_file( + 'https://download-mindspore.osinfra.cn/mindscience/mindchemistry/orb/orb_ckpts/gns_net.ckpt', + 'gns_net.ckpt' + ) + input_graph_ms, output_graph_np = load_graph_data('gns_input_output.pkl') + + # load gns model and checkpoint + gns_model = get_gns() + + # load checkpoint + param_dict = load_checkpoint('gns_net.ckpt') + load_param_into_net(gns_model, param_dict) + + edges, nodes = gns_model( + input_graph_ms.edge_features, + input_graph_ms.node_features, + input_graph_ms.senders, + input_graph_ms.receivers, + ) + + out_node_feats = tensor_to_numpy(nodes["feat"]) + out_edge_feats = tensor_to_numpy(edges["feat"]) + out_node_feats_np = output_graph_np.node_features["feat"] + out_edge_feats_np = output_graph_np.edge_features["feat"] + + flag_node = is_equal(out_node_feats, out_node_feats_np) + flag_edge = is_equal(out_edge_feats, out_edge_feats_np) + assert flag_node, "Failed! Node features mismatch in MoleculeGNS network" + assert flag_edge, "Failed! Edge features mismatch in MoleculeGNS network" + + +@pytest.mark.level0 +@pytest.mark.platform_arm_ascend910b_training +@pytest.mark.env_onecard +def test_node_head(): + """ + Feature: Test NodeHead in platform ascend. + Description: The forward output should has expected shape and accuracy. + Expectation: Success or throw AssertionError. + """ + mindspore.set_context(mode=mindspore.PYNATIVE_MODE) + node_head = NodeHead( + latent_dim=256, + num_mlp_layers=1, + mlp_hidden_dim=256, + target_property_dim=3, + remove_mean=True, + ) + + n_atoms = 4 + n_node = Tensor([n_atoms], mindspore.int32) + atomic_numbers = Tensor(np.random.randint(1, 119, size=(n_atoms,), dtype=np.int32)) + atomic_numbers_embedding_np = np.zeros((n_atoms, 118), dtype=np.float32) + for i, num in enumerate(atomic_numbers.asnumpy()): + atomic_numbers_embedding_np[i, num - 1] = 1.0 + + node_features = { + "atomic_numbers": atomic_numbers, + "atomic_numbers_embedding": Tensor(atomic_numbers_embedding_np), + "positions": Tensor(np.random.randn(n_atoms, 3).astype(np.float32)), + "feat": Tensor(np.random.randn(n_atoms, 256).astype(np.float32)) + } + + output = node_head(node_features, n_node) + assert output['node_pred'].shape == (4, 3), \ + f"Expected node_pred shape (4, 3), but got {output['node_pred'].shape}" + + +@pytest.mark.level0 +@pytest.mark.platform_arm_ascend910b_training +@pytest.mark.env_onecard +def test_graph_head(): + """ + Feature: Test GraphHead in platform ascend. + Description: The forward output should has expected shape and accuracy. + Expectation: Success or throw AssertionError. + """ + mindspore.set_context(mode=mindspore.PYNATIVE_MODE) + graph_head = GraphHead( + latent_dim=256, + num_mlp_layers=1, + mlp_hidden_dim=256, + target_property_dim=6, + compute_stress=True, + ) + + n_atoms = 4 + n_node = Tensor([n_atoms], mindspore.int32) + atomic_numbers = Tensor(np.random.randint(1, 119, size=(n_atoms,), dtype=np.int32)) + atomic_numbers_embedding_np = np.zeros((n_atoms, 118), dtype=np.float32) + for i, num in enumerate(atomic_numbers.asnumpy()): + atomic_numbers_embedding_np[i, num - 1] = 1.0 + + node_features = { + "atomic_numbers": atomic_numbers, + "atomic_numbers_embedding": Tensor(atomic_numbers_embedding_np), + "positions": Tensor(np.random.randn(n_atoms, 3).astype(np.float32)), + "feat": Tensor(np.random.randn(n_atoms, 256).astype(np.float32)) + } + + output = graph_head(node_features, n_node) + assert output['stress_pred'].shape == (1, 6), \ + f"Expected stress_pred shape (1, 6), but got {output['stress_pred'].shape}" + + +@pytest.mark.level0 +@pytest.mark.platform_arm_ascend910b_training +@pytest.mark.env_onecard +def test_energy_head(): + """ + Feature: Test EnergyHead in platform ascend. + Description: The forward output should has expected shape and accuracy. + Expectation: Success or throw AssertionError. + """ + mindspore.set_context(mode=mindspore.PYNATIVE_MODE) + energy_head = EnergyHead( + latent_dim=256, + num_mlp_layers=1, + mlp_hidden_dim=256, + target_property_dim=1, + node_aggregation="mean", + reference_energy_name="vasp-shifted", + train_reference=True, + predict_atom_avg=True, + ) + + n_atoms = 4 + n_node = Tensor([n_atoms], mindspore.int32) + atomic_numbers = Tensor(np.random.randint(1, 119, size=(n_atoms,), dtype=np.int32)) + atomic_numbers_embedding_np = np.zeros((n_atoms, 118), dtype=np.float32) + for i, num in enumerate(atomic_numbers.asnumpy()): + atomic_numbers_embedding_np[i, num - 1] = 1.0 + + node_features = { + "atomic_numbers": atomic_numbers, + "atomic_numbers_embedding": Tensor(atomic_numbers_embedding_np), + "positions": Tensor(np.random.randn(n_atoms, 3).astype(np.float32)), + "feat": Tensor(np.random.randn(n_atoms, 256).astype(np.float32)) + } + + output = energy_head(node_features, n_node) + assert output['graph_pred'].shape == (1, 1), \ + f"Expected graph_pred shape {(1, 1)}, but got {output['graph_pred'].shape}" + + +@pytest.mark.level0 +@pytest.mark.platform_arm_ascend910b_training +@pytest.mark.env_onecard +def test_inference(): + """ + Feature: Test Orb network in platform ascend. + Description: The forward output should has expected shape and accuracy. + Expectation: Success or throw AssertionError. + """ + mindspore.set_context(mode=mindspore.PYNATIVE_MODE) + download_file( + 'https://download-mindspore.osinfra.cn/mindscience/mindchemistry/orb/test/orb_input_output.pkl', + 'orb_input_output.pkl' + ) + download_file( + 'https://download-mindspore.osinfra.cn/mindscience/mindchemistry/orb/orb_ckpts/orb-mptraj-only-v2.ckpt', + 'orb-mptraj-only-v2.ckpt' + ) + reference_path = 'orb_input_output.pkl' + with open(reference_path, "rb") as f: + loaded = pickle.load(f) + + atom_graph_ms = loaded["input_graph"] + output_pt = loaded["output"] + + regressor = orb_mptraj_only_v2(weights_path='orb-mptraj-only-v2.ckpt') + regressor.set_train(False) + + out_ms = regressor.predict( + atom_graph_ms.edge_features, + atom_graph_ms.node_features, + atom_graph_ms.senders, + atom_graph_ms.receivers, + atom_graph_ms.n_node, + atom_graph_ms.atomic_numbers, + ) + + out_ms = {k: tensor_to_numpy(v) for k, v in out_ms.items()} + + for k in out_ms: + flag = compare_output(out_ms[k], output_pt[k]) + assert flag, f"Failed! Orb network inference output {k} mismatch" diff --git a/tests/st/mindchemistry/cell/test_orb/utils.py b/tests/st/mindchemistry/cell/test_orb/utils.py new file mode 100644 index 000000000..ad100964a --- /dev/null +++ b/tests/st/mindchemistry/cell/test_orb/utils.py @@ -0,0 +1,105 @@ +# ============================================================================ +# Copyright 2025 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +"""Utils""" +import os +import sys +from typing import Any + +import numpy as np +from mindspore import Tensor + +# pylint: disable=C0413 +PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../../")) +sys.path.append(PROJECT_ROOT) +from common.cell import compare_output, FP32_ATOL, FP32_RTOL + + +def tensor_to_numpy(data: Any) -> Any: + """Convert MindSpore Tensors to NumPy arrays recursively. + This function traverses the input data structure and converts all MindSpore Tensors + to NumPy arrays, while leaving other data types unchanged. + Args: + data (Any): Input data which can be a MindSpore Tensor, dict, list, tuple, or other types. + Returns: + Any: Data structure with MindSpore Tensors converted to NumPy arrays. + """ + if isinstance(data, Tensor): + return data.numpy() + if isinstance(data, dict): + return {k: tensor_to_numpy(v) for k, v in data.items()} + if isinstance(data, (list, tuple)): + return type(data)(tensor_to_numpy(v) for v in data) + return data + + +def numpy_to_tensor(data: Any) -> Any: + """Convert NumPy arrays to MindSpore Tensors recursively. + This function traverses the input data structure and converts all NumPy arrays + to MindSpore Tensors, while leaving other data types unchanged. + Args: + data (Any): Input data which can be a NumPy array, dict, list, tuple, or other types. + Returns: + Any: Data structure with NumPy arrays converted to MindSpore Tensors. + """ + if isinstance(data, np.ndarray): + return Tensor(data) + if isinstance(data, dict): + return {k: numpy_to_tensor(v) for k, v in data.items()} + if isinstance(data, (list, tuple)): + return type(data)(numpy_to_tensor(v) for v in data) + return data + + +def is_equal(a: Any, b: Any) -> bool: + """Compare two objects for equality with special handling for different types. + + This function performs a deep comparison between two objects, supporting: + - NumPy arrays (using tolerance-based comparison) + - Dictionaries (recursive comparison of values) + - Lists and tuples (element-wise comparison) + - NamedTuples (field-wise comparison) + - Other types (using standard equality comparison) + + Args: + a (Any): First object to compare + b (Any): Second object to compare + + Returns: + bool: True if objects are considered equal, False otherwise + + Examples: + >>> is_equal(np.array([1.0]), np.array([1.0])) + True + >>> is_equal({'a': 1, 'b': 2}, {'a': 1, 'b': 2}) + True + >>> is_equal([1, 2, 3], [1, 2, 3]) + True + """ + if isinstance(a, np.ndarray) and isinstance(b, np.ndarray): + return compare_output(a, b, FP32_ATOL, FP32_RTOL) + if isinstance(a, dict) and isinstance(b, dict): + if a.keys() != b.keys(): + return False + return all(is_equal(a[k], b[k]) for k in a) + if isinstance(a, (list, tuple)) and isinstance(b, (list, tuple)): + if len(a) != len(b): + return False + return all(is_equal(x, y) for x, y in zip(a, b)) + if hasattr(a, "_fields") and hasattr(b, "_fields"): + if a._fields != b._fields: + return False + return all(is_equal(getattr(a, f), getattr(b, f)) for f in a._fields) + return a == b -- Gitee From 6b32593b898b4db819368c6393b5ffd4e5798d3a Mon Sep 17 00:00:00 2001 From: hsliu_ustc Date: Sat, 5 Jul 2025 06:10:39 +0000 Subject: [PATCH 09/17] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20.gitee?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitee/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .gitee/.keep diff --git a/.gitee/.keep b/.gitee/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From b003ff797b44d5ec36d3c22d418d28d82f648d5f Mon Sep 17 00:00:00 2001 From: hsliu_ustc Date: Sat, 5 Jul 2025 06:11:16 +0000 Subject: [PATCH 10/17] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20ISSUE=5FTEMPLATE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitee/ISSUE_TEMPLATE/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .gitee/ISSUE_TEMPLATE/.keep diff --git a/.gitee/ISSUE_TEMPLATE/.keep b/.gitee/ISSUE_TEMPLATE/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 52902750f9256b5bd985ecaf3a575653c5cbf42d Mon Sep 17 00:00:00 2001 From: hsliu_ustc Date: Sat, 5 Jul 2025 06:16:06 +0000 Subject: [PATCH 11/17] add .gitee/ISSUE_TEMPLATE/config.yaml. Signed-off-by: hsliu_ustc --- .gitee/ISSUE_TEMPLATE/config.yaml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .gitee/ISSUE_TEMPLATE/config.yaml diff --git a/.gitee/ISSUE_TEMPLATE/config.yaml b/.gitee/ISSUE_TEMPLATE/config.yaml new file mode 100644 index 000000000..b8ffbb4b2 --- /dev/null +++ b/.gitee/ISSUE_TEMPLATE/config.yaml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Gitee 帮助中心 + url: https://help.gitee.com/ + about: 提供 Git 使用指南、教程、Gitee.com 平台基本功能使用、介绍和常见问题解答 \ No newline at end of file -- Gitee From 676fa62b7ce75a114c4b8588b91e7865d2a099e5 Mon Sep 17 00:00:00 2001 From: jinduoxia Date: Mon, 7 Jul 2025 11:54:05 +0000 Subject: [PATCH 12/17] add ISSUE_TEMPLATE of mindscience --- .gitee/ISSUE_TEMPLATE/1-documentation.yml | 62 ++++ .gitee/ISSUE_TEMPLATE/2-installation.yml | 68 +++++ .gitee/ISSUE_TEMPLATE/3-bug-report.yml | 308 ++++++++++++++++++++ .gitee/ISSUE_TEMPLATE/4-ci-failure.yml | 83 ++++++ .gitee/ISSUE_TEMPLATE/5-feature-request.yml | 56 ++++ .gitee/ISSUE_TEMPLATE/6-new-model.yml | 46 +++ .gitee/ISSUE_TEMPLATE/7-RFC.yml | 87 ++++++ .gitee/ISSUE_TEMPLATE/8-internship.yml | 81 +++++ 8 files changed, 791 insertions(+) create mode 100644 .gitee/ISSUE_TEMPLATE/1-documentation.yml create mode 100644 .gitee/ISSUE_TEMPLATE/2-installation.yml create mode 100644 .gitee/ISSUE_TEMPLATE/3-bug-report.yml create mode 100644 .gitee/ISSUE_TEMPLATE/4-ci-failure.yml create mode 100644 .gitee/ISSUE_TEMPLATE/5-feature-request.yml create mode 100644 .gitee/ISSUE_TEMPLATE/6-new-model.yml create mode 100644 .gitee/ISSUE_TEMPLATE/7-RFC.yml create mode 100644 .gitee/ISSUE_TEMPLATE/8-internship.yml diff --git a/.gitee/ISSUE_TEMPLATE/1-documentation.yml b/.gitee/ISSUE_TEMPLATE/1-documentation.yml new file mode 100644 index 000000000..128e7e8c8 --- /dev/null +++ b/.gitee/ISSUE_TEMPLATE/1-documentation.yml @@ -0,0 +1,62 @@ +name: 📚 Documentation +description: Request updates or additions to MindScience documentation +title: "[Doc]: " +labels: ["documentation"] + +body: +- type: markdown + attributes: + value: | + Thanks for taking the time to help MindScience and improve our documentation! + - If this is your first time, please read [our contributor guidelines](https://gitee.com/mindspore/mindscience/blob/master/CONTRIBUTION.md). + - You also confirm that you have searched the [open documentation issues](https://gitee.com/mindspore/mindscience/issues) and have found no duplicates for this request +- type: dropdown + id: domain + attributes: + label: Which domain the issue belongs to? + options: + - MindSpore Science Core + - applications-SPONGE + - applications-Flow + - applications-Energy + - applications-Chemistry + - applications-Earth + - Others + validations: + required: true + +- type: dropdown + id: new_or_correction + attributes: + label: Is this for new documentation, or an update to existing docs? + options: + - New + - Update + validations: + required: true + +- type: textarea + attributes: + label: 📚 The doc issue + description: > + Describe the incorrect/future/missing documentation. + value: | + 1. 【Document Link】/【文档链接】 + + 2. 【Issues Section】/【问题文档片段】 + + 3. 【Existing Issues】/【存在的问题】 + + 4. 【Expected Result】【预期结果】 + + validations: + required: true +- type: textarea + attributes: + label: Suggest a potential alternative/fix + description: > + Tell us how we could improve the documentation in this regard. +- type: markdown + attributes: + value: > + Thanks for contributing 🎉! \ No newline at end of file diff --git a/.gitee/ISSUE_TEMPLATE/2-installation.yml b/.gitee/ISSUE_TEMPLATE/2-installation.yml new file mode 100644 index 000000000..5938cfe5d --- /dev/null +++ b/.gitee/ISSUE_TEMPLATE/2-installation.yml @@ -0,0 +1,68 @@ +name: 🛠️ Installation +description: Report an issue here when you hit errors during installation. +title: "[Installation]: " +labels: ["installation"] + +body: +- type: markdown + attributes: + value: > + #### Before submitting an issue, please make sure the issue hasn't been already addressed by searching through [the existing and past issues](https://gitee.com/mindspore/mindscience/issues). +- type: dropdown + id: domain + attributes: + label: Which domain the issue belongs to? + options: + - MindSpore Science Core + - applications-SPONGE + - applications-Flow + - applications-Energy + - applications-Chemistry + - applications-Earth + - Others + validations: + required: true + +- type: textarea + attributes: + label: Your current environment + description: | + Environment / 环境信息 (Mandatory / 必填) + value: | + - **Hardware Environment / 硬件环境(Mandatory / 必填)**: + Hardware (e.g.`Atlas 800T A2`) + + 样例: + + | 后端类型| 硬件具体类别 | + | --- | --- | + | Server | Atlas 800T A2 | + | CPU| Mac CPU/Win CPU/Linux CPU| + + + - **Software Environment / 软件环境 (Mandatory / 必填)**: + 迭代版本新增问题样例:(根据实际修改和增删) + + | Software | Version(根据实际修改,必填)| + | --- | --- | + | MindSpore | MindSpore 2.4.0 | + | CANN | 8.0.0.beta1 | + | Python | Python XXXXXX | + | OS platform | Ubuntu XXXXXX | + | GCC/Compiler version | XXXXXX | + + validations: + required: true +- type: textarea + attributes: + label: How you are installing MindScience + description: | + Paste the full command you are trying to execute. + placeholder: | + ```sh + pip install mindsponge_*.whl + ``` +- type: markdown + attributes: + value: > + Thanks for contributing 🎉! \ No newline at end of file diff --git a/.gitee/ISSUE_TEMPLATE/3-bug-report.yml b/.gitee/ISSUE_TEMPLATE/3-bug-report.yml new file mode 100644 index 000000000..ae8c1bae7 --- /dev/null +++ b/.gitee/ISSUE_TEMPLATE/3-bug-report.yml @@ -0,0 +1,308 @@ +name: 🐛 Bug report +description: Raise an issue here if you find a bug. +title: "[Bug]: " +labels: ["bug"] + +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to help MindScience and fill out this bug report! + - If this is your first time, please read [our contributor guidelines](https://gitee.com/mindspore/mindscience/blob/master/CONTRIBUTION.md). + - You also confirm that you have searched the [open documentation issues](https://gitee.com/mindspore/mindscience/issues) and have found no duplicates for this request + - type: dropdown + id: domain + attributes: + label: Which domain the issue belongs to? + options: + - MindSpore Science Core + - applications-SPONGE + - applications-Flow + - applications-Energy + - applications-Chemistry + - applications-Earth + - Others + validations: + required: true + + - type: input + id: version + attributes: + label: Version + description: What version of MindScience are you running? + placeholder: "example: r0.7" + validations: + required: true + + - type: textarea + attributes: + label: installation-method + description: | + Paste the full command you are trying to execute. + placeholder: | + ```sh + pip install mindsponge_*.whl + ``` + + - type: textarea + attributes: + label: Your current environment + description: | + Environment / 环境信息 (Mandatory / 必填) + value: | + - **Hardware Environment / 硬件环境(Mandatory / 必填)**: + Hardware (e.g.`Atlas 800T A2`) + + 样例: + + | 后端类型| 硬件具体类别 | + | --- | --- | + | Server | Atlas 800T A2 | + | CPU| Mac CPU/Win CPU/Linux CPU| + + + - **Software Environment / 软件环境 (Mandatory / 必填)**: + 迭代版本新增问题样例:(根据实际修改和增删) + + | Software | Version(根据实际修改,必填)| + | --- | --- | + | MindSpore | MindSpore 2.4.0 | + | CANN | 8.0.0.beta1 | + | Python | Python XXXXXX | + | OS platform | Ubuntu XXXXXX | + | GCC/Compiler version | XXXXXX | + + + bugfix版本问题引入样例:(根据实际修改和增删) + + | Software | Version(根据实际修改,必填)| + | --- | --- | + | MindSpore | MindSpore 2.4.0 (成功)master_202407131XXXXXX _a4230c71d(失败)| + | CANN | 8.0.0.beta1 | + | CANN 归档地址 | | + | Python | Python XXXXXX | + | OS platform | Ubuntu XXXXXX | + | GCC/Compiler version | XXXXXX | + + validations: + required: true + + + - type: textarea + id: description + attributes: + label: Describe the issue + description: | + Please provide a complete and succinct description of the problem, including what you expected to happen. + value: | + #### 1.Describe the current behavior / 问题描述 (Mandatory / 必填) + + 样例: (根据实际修改和增删) + + > sponge.colvar.Distance()报错,同时 sponge.metrics.Metric其子类的 .update() 报错 + + #### 2. / 关联用例 (Mandatory / 必填)Related testcase + + ```python + from mindspore import Tensor + from sponge.colvar import Distance + from sponge.metrics import MetricCV + cv = Distance([0,1]) + coordinate = Tensor([[[0.0, 0.0, 0.0], [0.0, 0.0, 1.0]]]) + metric = MetricCV(cv) + metric.update(coordinate) + print(metric.eval()) + ``` + + #### 3.Steps to reproduce the issue / 重现步骤 (Mandatory / 必填) + + > 测试步骤:运行关联用例即可 + > 用例执行命令:来自CI日志或者用户执行命令 + + + #### 4.Describe the expected behavior / 预期结果 (Mandatory / 必填) + + > **【预期结果】**:MindSpore 1.10.1 版本下,可正常运行。预期输出为 [1.] + + #### 5.Related log / screenshot / 日志 / 截图 (Mandatory / 必填) + + ```shell + --------------------------------------------------------------------------- + ValueError Traceback (most recent call last) + Cell In[4], line 7 + 5 coordinate = Tensor([[0.0, 0.0, 0.0], [0.0, 0.0, 1.0]]) + 6 metric = MetricCV(cv) + ----> 7 metric.update(coordinate) + 8 print(metric.eval()) + + File ~/mindscience/MindSPONGE/./src/sponge/metrics/metrics.py:190, in MetricCV.update(self, coordinate, pbc_box, energy, force, potentials, total_bias, biases) + 163 """ + 164 + 165 Args: + (...) + 186 V: Number of bias potential energies. + 187 """ + 188 #pylint: disable=unused-argument + --> 190 colvar = self.colvar(coordinate, pbc_box) + 192 self._value = self._convert_data(colvar) + + File ~/.local/lib/python3.8/site-packages/mindspore/nn/cell.py:705, in Cell.__call__(self, *args, **kwargs) + 703 except Exception as err: + 704 _pynative_executor.clear_res() + --> 705 raise err + 707 if isinstance(output, Parameter): + 708 output = output.data + + File ~/.local/lib/python3.8/site-packages/mindspore/nn/cell.py:701, in Cell.__call__(self, *args, **kwargs) + 699 try: + 700 _pynative_executor.new_graph(self, *args, **kwargs) + --> 701 output = self._run_construct(args, kwargs) + 702 _pynative_executor.end_graph(self, output, *args, **kwargs) + 703 except Exception as err: + + File ~/.local/lib/python3.8/site-packages/mindspore/nn/cell.py:482, in Cell._run_construct(self, cast_inputs, kwargs) + 480 output = self._shard_fn(*cast_inputs, **kwargs) + 481 else: + --> 482 output = self.construct(*cast_inputs, **kwargs) + 483 if self._enable_forward_hook: + 484 output = self._run_forward_hook(cast_inputs, output) + + File ~/mindscience/MindSPONGE/./src/sponge/colvar/basic/distance.py:146, in Distance.construct(self, coordinate, pbc_box) + 131 r"""calculate distance. + 132 + 133 Args: + (...) + 142 + 143 """ + 145 # (B, ..., D) + --> 146 vector = self.vector(coordinate, pbc_box) + 148 # (B, ...) or (B, ..., 1) + 149 if self.norm_last_dim is None: + + File ~/.local/lib/python3.8/site-packages/mindspore/nn/cell.py:705, in Cell.__call__(self, *args, **kwargs) + 703 except Exception as err: + 704 _pynative_executor.clear_res() + --> 705 raise err + 707 if isinstance(output, Parameter): + 708 output = output.data + + File ~/.local/lib/python3.8/site-packages/mindspore/nn/cell.py:701, in Cell.__call__(self, *args, **kwargs) + 699 try: + 700 _pynative_executor.new_graph(self, *args, **kwargs) + --> 701 output = self._run_construct(args, kwargs) + 702 _pynative_executor.end_graph(self, output, *args, **kwargs) + 703 except Exception as err: + + File ~/.local/lib/python3.8/site-packages/mindspore/nn/cell.py:482, in Cell._run_construct(self, cast_inputs, kwargs) + 480 output = self._shard_fn(*cast_inputs, **kwargs) + 481 else: + --> 482 output = self.construct(*cast_inputs, **kwargs) + 483 if self._enable_forward_hook: + 484 output = self._run_forward_hook(cast_inputs, output) + + File ~/mindscience/MindSPONGE/./src/sponge/colvar/atoms/vector.py:183, in Vector.construct(self, coordinate, pbc_box) + 180 atoms1 = self.atoms1(coordinate, pbc_box) + 181 else: + 182 # (B, ..., 2, D) + --> 183 atoms = self.atoms(coordinate, pbc_box) + 184 # (B, ..., 1, D) <- (B, ..., 2, D) + 185 atoms0, atoms1 = self.split2(atoms) + + File ~/.local/lib/python3.8/site-packages/mindspore/nn/cell.py:705, in Cell.__call__(self, *args, **kwargs) + 703 except Exception as err: + 704 _pynative_executor.clear_res() + --> 705 raise err + 707 if isinstance(output, Parameter): + 708 output = output.data + + File ~/.local/lib/python3.8/site-packages/mindspore/nn/cell.py:701, in Cell.__call__(self, *args, **kwargs) + 699 try: + 700 _pynative_executor.new_graph(self, *args, **kwargs) + --> 701 output = self._run_construct(args, kwargs) + 702 _pynative_executor.end_graph(self, output, *args, **kwargs) + 703 except Exception as err: + + File ~/.local/lib/python3.8/site-packages/mindspore/nn/cell.py:482, in Cell._run_construct(self, cast_inputs, kwargs) + 480 output = self._shard_fn(*cast_inputs, **kwargs) + 481 else: + --> 482 output = self.construct(*cast_inputs, **kwargs) + 483 if self._enable_forward_hook: + 484 output = self._run_forward_hook(cast_inputs, output) + + File ~/mindscience/MindSPONGE/./src/sponge/colvar/atoms/atoms.py:232, in Atoms.construct(self, coordinate, pbc_box) + 219 r"""get position coordinate(s) of specific atom(s) + 220 + 221 Args: + (...) + 229 + 230 """ + 231 # (B, a_1, a_2, ..., a_{n}, D) <- (B, A, D) + --> 232 atoms = func.gather_vector(coordinate, self.index) + 233 if self.keep_in_box: + 234 atoms = self.coordinate_in_pbc(atoms, pbc_box) + + File ~/.local/lib/python3.8/site-packages/mindspore/common/api.py:718, in jit..wrap_mindspore..staging_specialize(*args, **kwargs) + 716 if _is_pynative_parallel() and func.__name__ == _PYNATIVE_PARALLEL_FUNC_NAME: + 717 process_obj = hash_args + --> 718 out = _MindsporeFunctionExecutor(func, hash_obj, input_signature, process_obj, jit_config)(*args, **kwargs) + 719 return out + + File ~/.local/lib/python3.8/site-packages/mindspore/common/api.py:121, in _wrap_func..wrapper(*arg, **kwargs) + 119 @wraps(fn) + 120 def wrapper(*arg, **kwargs): + --> 121 results = fn(*arg, **kwargs) + 122 return _convert_python_data(results) + + File ~/.local/lib/python3.8/site-packages/mindspore/common/api.py:350, in _MindsporeFunctionExecutor.__call__(self, *args, **kwargs) + 348 except Exception as err: + 349 _pynative_executor.clear_res() + --> 350 raise err + 352 if context.get_context("precompile_only"): + 353 return None + + File ~/.local/lib/python3.8/site-packages/mindspore/common/api.py:344, in _MindsporeFunctionExecutor.__call__(self, *args, **kwargs) + 342 if context.get_context("mode") == context.PYNATIVE_MODE: + 343 _pynative_executor.set_jit_compile_status(True, phase) + --> 344 phase = self.compile(self.fn.__name__, *args_list, **kwargs) + 345 _pynative_executor.set_jit_compile_status(False, phase) + 346 else: + + File ~/.local/lib/python3.8/site-packages/mindspore/common/api.py:435, in _MindsporeFunctionExecutor.compile(self, method_name, *args, **kwargs) + 433 else: + 434 setattr(self.fn, "__jit_function__", True) + --> 435 is_compile = self._graph_executor.compile(self.fn, compile_args, kwargs, phase, True) + 436 if isinstance(self.fn, types.MethodType): + 437 delattr(self.fn.__func__, "__jit_function__") + + ValueError: For primitive[BroadcastTo], the attribute[x shape] must be less than or equal to 1, but got 2. + + ---------------------------------------------------- + - C++ Call Stack: (For framework developers) + ---------------------------------------------------- + mindspore/core/utils/check_convert_utils.cc:675 Check + ``` + + ### + + #### 6.Special notes for this issue/备注 (Optional / 选填) + + **【定位人】**吴某某(根据实际修改) + + validations: + required: true + + + - type: textarea + id: mvr + attributes: + label: Minimum reproducible example + description: Please supply a [minimum reproducible code example](https://matthewrocklin.com/blog/work/2018/02/28/minimal-bug-reports) here. + render: shell + + - type: textarea + id: logs + attributes: + label: Relevant log output + description: Please paste relevant error and log output here + render: shell + diff --git a/.gitee/ISSUE_TEMPLATE/4-ci-failure.yml b/.gitee/ISSUE_TEMPLATE/4-ci-failure.yml new file mode 100644 index 000000000..b63c24804 --- /dev/null +++ b/.gitee/ISSUE_TEMPLATE/4-ci-failure.yml @@ -0,0 +1,83 @@ +name: 🧪 CI failure report +description: Report a failing test. +title: "[CI Failure]: " +labels: ["ci-failure"] + +body: +- type: dropdown + id: domain + attributes: + label: Which domain the issue belongs to? + options: + - MindSpore Science Core + - applications-SPONGE + - applications-Flow + - applications-Energy + - applications-Chemistry + - applications-Earth + - Others + validations: + required: true + +- type: markdown + attributes: + value: > + #### Include the name of the failing Buildkite step and test file in the title. +- type: input + attributes: + label: Name of failing test + description: | + Paste in the fully-qualified name of the failing test from the logs. + placeholder: | + `path/to/test_file.py::test_name[params]` + validations: + required: true +- type: checkboxes + attributes: + label: Basic information + description: Select all items that apply to the failing test. + options: + - label: Flaky test + - label: Can reproduce locally + - label: Caused by external libraries (e.g. bug in `transformers`) +- type: textarea + attributes: + label: 🧪 Describe the failing test + description: | + Please provide a clear and concise description of the failing test. + placeholder: | + A clear and concise description of the failing test. + + ``` + The error message you got, with the full traceback and the error logs with [dump_input.py:##] if present. + ``` + validations: + required: true +- type: textarea + attributes: + label: 📝 History of failing test + description: | + Since when did the test start to fail? + + If you have time, identify the PR that caused the test to fail on main. You can do so via the following methods: + + - Use Buildkite Test Suites to find the PR where the test failure first occurred, and reproduce the failure locally. + + - Run [`git bisect`](https://git-scm.com/docs/git-bisect) locally. + + - Manually unblock Buildkite steps for suspected PRs on main and check the results. (authorized users only) + placeholder: | + Approximate timeline and/or problematic PRs + + A link to the Buildkite analytics of the failing test (if available) + validations: + required: true +- type: textarea + attributes: + label: CC List. + description: > + The list of people you want to CC. Usually, this includes those who worked on the PR that failed the test. +- type: markdown + attributes: + value: > + Thanks for reporting 🙏! \ No newline at end of file diff --git a/.gitee/ISSUE_TEMPLATE/5-feature-request.yml b/.gitee/ISSUE_TEMPLATE/5-feature-request.yml new file mode 100644 index 000000000..d500041de --- /dev/null +++ b/.gitee/ISSUE_TEMPLATE/5-feature-request.yml @@ -0,0 +1,56 @@ +name: 🚀 Feature request +description: Submit a proposal/request for a new MindScience feature +title: "[Feature]: " +labels: ["feature"] + +body: +- type: markdown + attributes: + value: > + #### Before submitting an issue, please make sure the issue hasn't been already addressed by searching through [the existing and past issues](https://gitee.com/mindspore/mindscience/issues). +- type: dropdown + id: domain + attributes: + label: Which domain the issue belongs to? + options: + - MindSpore Science Core + - applications-SPONGE + - applications-Flow + - applications-Energy + - applications-Chemistry + - applications-Earth + - Others + validations: + required: true +- type: dropdown + id: new_or_improvement + attributes: + label: Is this a new feature, an improvement, or a change to existing functionality? + options: + - New Feature + - Improvement + - Change + validations: + required: true + +- type: textarea + attributes: + label: 🚀 The feature, motivation and pitch + description: > + A clear and concise description of the feature proposal. Please outline the motivation for the proposal. Is your feature request related to a specific problem? e.g., *"I'm working on X and would like Y to be possible"*. If this is related to another GitHub issue, please link here too. + validations: + required: true +- type: textarea + attributes: + label: Alternatives + description: > + A description of any alternative solutions or features you've considered, if any. +- type: textarea + attributes: + label: Additional context + description: > + Add any other context or screenshots about the feature request. +- type: markdown + attributes: + value: > + Thanks for contributing 🎉! \ No newline at end of file diff --git a/.gitee/ISSUE_TEMPLATE/6-new-model.yml b/.gitee/ISSUE_TEMPLATE/6-new-model.yml new file mode 100644 index 000000000..41a53abb8 --- /dev/null +++ b/.gitee/ISSUE_TEMPLATE/6-new-model.yml @@ -0,0 +1,46 @@ +name: 🤗 Support request for a new model of science +description: Submit a proposal/request for a new model of science +title: "[New Model]: " +labels: ["new-model"] + +body: +- type: markdown + attributes: + value: > + #### Before submitting an issue, please make sure the issue hasn't been already addressed by searching through [the existing and past issues](https://gitee.com/mindspore/mindscience/issues). +- type: dropdown + id: domain + attributes: + label: Which domain the issue belongs to? + options: + - MindSpore Science Core + - applications-SPONGE + - applications-Flow + - applications-Energy + - applications-Chemistry + - applications-Earth + - Others + validations: + required: true + +- type: textarea + attributes: + label: The model to consider. + description: > + A url, pointing to the model, e.g. https://huggingface.co/openai-community/gpt2 . + validations: + required: true +- type: textarea + attributes: + label: The closest model MindScience already supports. + description: > + Here is the list of models already supported by MindScience: https://gitee.com/mindspore/mindscience#%E6%A6%82%E8%BF%B0 . Which model is the most similar to the model you want to add support for? +- type: textarea + attributes: + label: What's your difficulty of supporting the model you want? + description: > + For example, any new operators or new architecture? +- type: markdown + attributes: + value: > + Thanks for contributing 🎉! \ No newline at end of file diff --git a/.gitee/ISSUE_TEMPLATE/7-RFC.yml b/.gitee/ISSUE_TEMPLATE/7-RFC.yml new file mode 100644 index 000000000..63a9035e7 --- /dev/null +++ b/.gitee/ISSUE_TEMPLATE/7-RFC.yml @@ -0,0 +1,87 @@ +name: 💬 Request for comments (RFC). +description: Ask for feedback on major architectural changes or design choices. +title: "[RFC]: " +labels: ["RFC"] + +body: +- type: markdown + attributes: + value: > + #### Please take a look at previous [RFCs](https://gitee.com/mindspore/mindscience/issues) for reference. +- type: dropdown + id: domain + attributes: + label: Which domain the issue belongs to? + options: + - MindSpore Science Core + - applications-SPONGE + - applications-Flow + - applications-Energy + - applications-Chemistry + - applications-Earth + - Others + validations: + required: true + +- type: textarea + attributes: + label: Backgroud. + description: > + Backgroud(背景信息) + placeholder: | + - Describe/Explain the status of the problem you wish to solve. + - Attach relevant issues if there is any. + validations: + required: true +- type: textarea + attributes: + label: Origin + description: > + Origin(信息来源) + placeholder: | + - Explain which department/team made this request so that its priority can be given. + validations: + required: true +- type: textarea + attributes: + label: Benefit / Necessity + description: > + Benefit / Necessity (价值/作用) + placeholder: | + - Describe/Explain the key value by fulfilling the request. + validations: + required: true +- type: textarea + attributes: + label: Design + description: > + Design(设计方案) + placeholder: | + - Describe/Explain the general idea of the design. Pseudo-code is allowed + validations: + required: true +- type: textarea + attributes: + label: Feedback Period. + description: > + The feedback period of the RFC. Usually at least one week. + validations: + required: false +- type: textarea + attributes: + label: CC List. + description: > + The list of people you want to CC. + validations: + required: false +- type: textarea + attributes: + label: Any Other Things. + description: > + Any other things you would like to mention. + validations: + required: false +- type: markdown + attributes: + value: > + Thanks for contributing 🎉! \ No newline at end of file diff --git a/.gitee/ISSUE_TEMPLATE/8-internship.yml b/.gitee/ISSUE_TEMPLATE/8-internship.yml new file mode 100644 index 000000000..5bd065bcf --- /dev/null +++ b/.gitee/ISSUE_TEMPLATE/8-internship.yml @@ -0,0 +1,81 @@ +name: 💻 Internship +description: This issue is intended for the MindScience open source internship project for college students +title: "[Internship]: " +labels: ["internship"] + + +body: +- type: markdown + attributes: + value: | + - This issue is intended for the MindSpore open source internship project for college students. Developers who do not participate in this project are not allowed to receive it. + - 本issue为面向高校学生的“MindSpore开源实习”项目的任务,非参加该项目的人员勿领。 +- type: dropdown + id: domain + attributes: + label: Which domain the issue belongs to? + options: + - MindSpore Science Core + - applications-SPONGE + - applications-Flow + - applications-Energy + - applications-Chemistry + - applications-Earth + - Others + validations: + required: true + +- type: textarea + attributes: + label: Your information. + description: > + Your information for intership. + value: | + 【Task score】 + 【Background description】 + 【Requirements】 + 【Development environment】 + - Hardware: + - Software: + + 【Programming language】 + 【Acceptance criteria】 + 【PR Submission address】 + 【Expected completion time】 + 【Development guide】 + 【Tutor & email】 + + Note: This issue is intended for the MindSpore open source internship project for college students. Developers who do not participate in this project are not allowed to receive it. + + --- + + 【任务分值】 + 【背景描述】 + 【需求描述】 + 【环境要求】 + - 硬件: + - 软件: + + 【编程语言】 + 【产出标准】 + 【PR提交地址】 + 【期望完成时间】 + 【开发指导】 + 【导师及邮箱】 + + 本issue为面向高校学生的“MindSpore开源实习”项目的任务,非参加该项目的人员勿领。 + + validations: + required: false + +- type: textarea + attributes: + label: Any Other Things. + description: > + Any other things you would like to mention. + validations: + required: false +- type: markdown + attributes: + value: > + Thanks for contributing 🎉! \ No newline at end of file -- Gitee From f0c5b013a707fd177177986604be824ad67e3372 Mon Sep 17 00:00:00 2001 From: cs123abc Date: Thu, 10 Jul 2025 02:09:49 +0000 Subject: [PATCH 13/17] !2281 update .gitee/PULL_REQUEST_TEMPLATE * update .gitee/PULL_REQUEST_TEMPLATE --- .../PULL_REQUEST_TEMPLATE.en.md | 30 +++++++++++++++++++ .../PULL_REQUEST_TEMPLATE.zh-CN.md | 30 +++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 .gitee/PULL_REQUEST_TEMPLATE/PULL_REQUEST_TEMPLATE.en.md create mode 100644 .gitee/PULL_REQUEST_TEMPLATE/PULL_REQUEST_TEMPLATE.zh-CN.md diff --git a/.gitee/PULL_REQUEST_TEMPLATE/PULL_REQUEST_TEMPLATE.en.md b/.gitee/PULL_REQUEST_TEMPLATE/PULL_REQUEST_TEMPLATE.en.md new file mode 100644 index 000000000..9108f2790 --- /dev/null +++ b/.gitee/PULL_REQUEST_TEMPLATE/PULL_REQUEST_TEMPLATE.en.md @@ -0,0 +1,30 @@ +### PR Source +- [ ] Issue (Please link related issue) +- [ ] Feature request +- [ ] Bug report +- [ ] Community contributor + +### Change Description +- **Reason for Modification:** + +- **Content Modified:** + +### Function Validation +- [ ] **Self-verification** +- [ ] **Screenshots of local test cases** + +### Checklist +- [ ] **Code reviewed** +- [ ] **UT test coverage** (If not, explain reason: ____________________) +- [ ] **Involves public API changes in MindSpore Science** +- [ ] **Documentation updated** + +### Code Review Requirements +- Changes over 1000 lines require organized review meeting with conclusions +- PR without function validation cannot be merged +- PR with incomplete checklist cannot be merged +- PR without clear source identification or change description cannot be merged + +### Change Notification +- [ ] **Documentation modified** +- [ ] **API change description** (If API changed, detail description): \ No newline at end of file diff --git a/.gitee/PULL_REQUEST_TEMPLATE/PULL_REQUEST_TEMPLATE.zh-CN.md b/.gitee/PULL_REQUEST_TEMPLATE/PULL_REQUEST_TEMPLATE.zh-CN.md new file mode 100644 index 000000000..c166c30dc --- /dev/null +++ b/.gitee/PULL_REQUEST_TEMPLATE/PULL_REQUEST_TEMPLATE.zh-CN.md @@ -0,0 +1,30 @@ +### PR来源 +- [ ] issue单(请关联issue) +- [ ] 需求特性 +- [ ] 问题单 +- [ ] 社区开发者贡献 + +### 修改描述 +- **修改原因:** + +- **修改内容:** + +### 功能验证 +- [ ] **功能自验** +- [ ] **本地自验用例截图** + +### 检查清单 +- [ ] **是否经过代码检视** +- [ ] **是否具备UT测试用例看护**(如不符合,请说明原因:____________________) +- [ ] **是否涉及MindSpore Science公共接口变更** +- [ ] **是否涉及文档更新** + +### 代码检视要求 +- 合入代码超过1000行,需组织会议检视并附上结论 +- 未完成功能验证不允许合入 +- 未完成检查清单不允许合入 +- PR来源未标识或修改描述不清晰不允许合入 + +### 变更说明 +- [ ] **文档修改** +- [ ] **接口变更说明**(如涉及接口变更需详细描述): \ No newline at end of file -- Gitee From 2f60c87ace489dbae82d05d241c006a3d5d804fe Mon Sep 17 00:00:00 2001 From: goto Date: Thu, 10 Jul 2025 11:31:38 +0800 Subject: [PATCH 14/17] fix AdaHessian test cases for MS2.6 --- tests/st/mindflow/cell/test_optimizers.py | 24 ++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/tests/st/mindflow/cell/test_optimizers.py b/tests/st/mindflow/cell/test_optimizers.py index eaa34f1fc..4085507fd 100644 --- a/tests/st/mindflow/cell/test_optimizers.py +++ b/tests/st/mindflow/cell/test_optimizers.py @@ -22,7 +22,7 @@ import pytest import numpy as np import mindspore as ms -from mindspore import ops, set_seed, nn +from mindspore import ops, set_seed, nn, mint from mindspore import dtype as mstype from mindflow import UNet2D, TransformerBlock, MultiHeadAttention, AdaHessian from mindflow.cell.attention import FeedForward @@ -99,10 +99,11 @@ class TestAttentionBlock(TransformerBlock): self.act_fn = nn.ReLU() # replace `gelu` with `relu` to avoid `vjp` problem class TestMultiHeadAttention(MultiHeadAttention): - ''' MultiHeadAttention modified to avoid vjp bug ''' + ''' MultiHeadAttention modified to support vjp ''' def get_qkv(self, x: ms.Tensor) -> tuple[ms.Tensor]: ''' use masks to select out q, k, v, instead of tensor reshaping & indexing ''' - b, n, c = x.shape + b, n, c_full = x.shape + c = c_full // self.num_heads # use matmul with masks to select out q, k, v to avoid vjp problem q_mask = ms.Tensor(np.vstack([np.eye(c), np.zeros([2 * c, c])]), dtype=self.compute_dtype) @@ -110,10 +111,11 @@ class TestAttentionBlock(TransformerBlock): v_mask = ms.Tensor(np.vstack([np.zeros([2 * c, c]), np.eye(c)]), dtype=self.compute_dtype) qkv = self.qkv(x) + qkv = qkv.reshape(b, n, self.num_heads, -1).swapaxes(1, 2) - q = ops.swapaxes(ops.matmul(qkv, q_mask).reshape(b, n, self.num_heads, -1), 1, 2) - k = ops.swapaxes(ops.matmul(qkv, k_mask).reshape(b, n, self.num_heads, -1), 1, 2) - v = ops.swapaxes(ops.matmul(qkv, v_mask).reshape(b, n, self.num_heads, -1), 1, 2) + q = mint.matmul(qkv, q_mask) + k = mint.matmul(qkv, k_mask) + v = mint.matmul(qkv, v_mask) return q, k, v @@ -156,7 +158,7 @@ def test_adahessian_accuracy(mode): in_channels=2, out_channels=4, kernel_size=3, has_bias=True, weight_init=weight_init, bias_init=bias_init) def forward(a): - return ops.mean(net(a)**2)**.5 + return ops.sqrt(ops.mean(ops.square(net(a)))) grad_fn = ms.grad(forward, grad_position=None, weights=net.trainable_params()) @@ -192,7 +194,7 @@ def test_adahessian_st(mode, model_option): # default test with Attention network net = TestAttentionBlock(in_channels=256, num_heads=4) - inputs = ms.Tensor(np.random.rand(4, 100, 256), dtype=ms.float32) + inputs = ms.Tensor(np.sin(np.arange(102400)).reshape(4, 100, 256), dtype=ms.float32) # test with UNet network if model_option.lower() == 'unet': @@ -210,7 +212,7 @@ def test_adahessian_st(mode, model_option): inputs = ms.Tensor(np.random.rand(2, 2, 64, 64), dtype=ms.float32) def forward(a): - return ops.mean(net(a)**2)**.5 + return ops.sqrt(ops.mean(ops.square(net(a)))) grad_fn = ms.grad(forward, grad_position=None, weights=net.trainable_params()) @@ -242,10 +244,10 @@ def test_adahessian_compare(mode): def get_loss(optimizer_option): ''' compare Adam and AdaHessian ''' net = TestAttentionBlock(in_channels=256, num_heads=4) - inputs = ms.Tensor(np.random.rand(4, 100, 256), dtype=ms.float32) + inputs = ms.Tensor(np.sin(np.arange(102400)).reshape(4, 100, 256), dtype=ms.float32) def forward(a): - return ops.mean(net(a)**2)**.5 + return ops.sqrt(ops.mean(ops.square(net(a)))) grad_fn = ms.grad(forward, grad_position=None, weights=net.trainable_params()) -- Gitee From 8ab94e28b05a240f3d5b13b238fa721b17cadfda Mon Sep 17 00:00:00 2001 From: cs123abc Date: Tue, 8 Jul 2025 15:27:27 +0800 Subject: [PATCH 15/17] update .gitee/PULL_REQUEST_TEMPLATE --- .gitee/PULL_REQUEST_TEMPLATE.en.md | 30 +++++++++++++++++++++++++++ .gitee/PULL_REQUEST_TEMPLATE.zh-CN.md | 30 +++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 .gitee/PULL_REQUEST_TEMPLATE.en.md create mode 100644 .gitee/PULL_REQUEST_TEMPLATE.zh-CN.md diff --git a/.gitee/PULL_REQUEST_TEMPLATE.en.md b/.gitee/PULL_REQUEST_TEMPLATE.en.md new file mode 100644 index 000000000..9108f2790 --- /dev/null +++ b/.gitee/PULL_REQUEST_TEMPLATE.en.md @@ -0,0 +1,30 @@ +### PR Source +- [ ] Issue (Please link related issue) +- [ ] Feature request +- [ ] Bug report +- [ ] Community contributor + +### Change Description +- **Reason for Modification:** + +- **Content Modified:** + +### Function Validation +- [ ] **Self-verification** +- [ ] **Screenshots of local test cases** + +### Checklist +- [ ] **Code reviewed** +- [ ] **UT test coverage** (If not, explain reason: ____________________) +- [ ] **Involves public API changes in MindSpore Science** +- [ ] **Documentation updated** + +### Code Review Requirements +- Changes over 1000 lines require organized review meeting with conclusions +- PR without function validation cannot be merged +- PR with incomplete checklist cannot be merged +- PR without clear source identification or change description cannot be merged + +### Change Notification +- [ ] **Documentation modified** +- [ ] **API change description** (If API changed, detail description): \ No newline at end of file diff --git a/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md b/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md new file mode 100644 index 000000000..c166c30dc --- /dev/null +++ b/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md @@ -0,0 +1,30 @@ +### PR来源 +- [ ] issue单(请关联issue) +- [ ] 需求特性 +- [ ] 问题单 +- [ ] 社区开发者贡献 + +### 修改描述 +- **修改原因:** + +- **修改内容:** + +### 功能验证 +- [ ] **功能自验** +- [ ] **本地自验用例截图** + +### 检查清单 +- [ ] **是否经过代码检视** +- [ ] **是否具备UT测试用例看护**(如不符合,请说明原因:____________________) +- [ ] **是否涉及MindSpore Science公共接口变更** +- [ ] **是否涉及文档更新** + +### 代码检视要求 +- 合入代码超过1000行,需组织会议检视并附上结论 +- 未完成功能验证不允许合入 +- 未完成检查清单不允许合入 +- PR来源未标识或修改描述不清晰不允许合入 + +### 变更说明 +- [ ] **文档修改** +- [ ] **接口变更说明**(如涉及接口变更需详细描述): \ No newline at end of file -- Gitee From 300b85c45af2998ecc06c364f886c460d0af6900 Mon Sep 17 00:00:00 2001 From: brian Date: Thu, 10 Jul 2025 19:47:42 +0800 Subject: [PATCH 16/17] mod template --- .gitee/.keep | 0 .gitee/ISSUE_TEMPLATE/5-feature-request.yml | 20 +++-- ...6-new-model.yml => 6-application-case.yml} | 89 +++++++++---------- .../PULL_REQUEST_TEMPLATE.en.md | 30 ------- .../PULL_REQUEST_TEMPLATE.zh-CN.md | 30 ------- 5 files changed, 55 insertions(+), 114 deletions(-) delete mode 100644 .gitee/.keep rename .gitee/ISSUE_TEMPLATE/{6-new-model.yml => 6-application-case.yml} (75%) delete mode 100644 .gitee/PULL_REQUEST_TEMPLATE/PULL_REQUEST_TEMPLATE.en.md delete mode 100644 .gitee/PULL_REQUEST_TEMPLATE/PULL_REQUEST_TEMPLATE.zh-CN.md diff --git a/.gitee/.keep b/.gitee/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/.gitee/ISSUE_TEMPLATE/5-feature-request.yml b/.gitee/ISSUE_TEMPLATE/5-feature-request.yml index d500041de..a5129a7b4 100644 --- a/.gitee/ISSUE_TEMPLATE/5-feature-request.yml +++ b/.gitee/ISSUE_TEMPLATE/5-feature-request.yml @@ -9,16 +9,18 @@ body: value: > #### Before submitting an issue, please make sure the issue hasn't been already addressed by searching through [the existing and past issues](https://gitee.com/mindspore/mindscience/issues). - type: dropdown - id: domain + id: module attributes: - label: Which domain the issue belongs to? + label: Which module the issue belongs to? options: - - MindSpore Science Core - - applications-SPONGE - - applications-Flow - - applications-Energy - - applications-Chemistry - - applications-Earth + - MindScience data + - MindScience common + - MindScience e3nn + - MindScience models + - MindScience sciops + - MindScience solver + - MindScience sharker + - MindScience utils - Others validations: required: true @@ -37,7 +39,7 @@ body: attributes: label: 🚀 The feature, motivation and pitch description: > - A clear and concise description of the feature proposal. Please outline the motivation for the proposal. Is your feature request related to a specific problem? e.g., *"I'm working on X and would like Y to be possible"*. If this is related to another GitHub issue, please link here too. + A clear and concise description of the feature proposal. Please outline the motivation for the proposal. Is your feature request related to a specific problem? e.g., *"I'm working on X and would like Y to be possible"*. If this is related to another GitHub issue, please link here too. For design design, you can refer to [feature design template](https://gitee.com/mindspore/mindscience/blob/br_refactor/docs/template/feature_design.md). validations: required: true - type: textarea diff --git a/.gitee/ISSUE_TEMPLATE/6-new-model.yml b/.gitee/ISSUE_TEMPLATE/6-application-case.yml similarity index 75% rename from .gitee/ISSUE_TEMPLATE/6-new-model.yml rename to .gitee/ISSUE_TEMPLATE/6-application-case.yml index 41a53abb8..dfbf8e154 100644 --- a/.gitee/ISSUE_TEMPLATE/6-new-model.yml +++ b/.gitee/ISSUE_TEMPLATE/6-application-case.yml @@ -1,46 +1,45 @@ -name: 🤗 Support request for a new model of science -description: Submit a proposal/request for a new model of science -title: "[New Model]: " -labels: ["new-model"] - -body: -- type: markdown - attributes: - value: > - #### Before submitting an issue, please make sure the issue hasn't been already addressed by searching through [the existing and past issues](https://gitee.com/mindspore/mindscience/issues). -- type: dropdown - id: domain - attributes: - label: Which domain the issue belongs to? - options: - - MindSpore Science Core - - applications-SPONGE - - applications-Flow - - applications-Energy - - applications-Chemistry - - applications-Earth - - Others - validations: - required: true - -- type: textarea - attributes: - label: The model to consider. - description: > - A url, pointing to the model, e.g. https://huggingface.co/openai-community/gpt2 . - validations: - required: true -- type: textarea - attributes: - label: The closest model MindScience already supports. - description: > - Here is the list of models already supported by MindScience: https://gitee.com/mindspore/mindscience#%E6%A6%82%E8%BF%B0 . Which model is the most similar to the model you want to add support for? -- type: textarea - attributes: - label: What's your difficulty of supporting the model you want? - description: > - For example, any new operators or new architecture? -- type: markdown - attributes: - value: > +name: 🤗 Support request for a new application case of science +description: Submit a proposal/request for a new application case of science +title: "[Application Case]: " +labels: ["application-case"] + +body: +- type: markdown + attributes: + value: > + #### Before submitting an issue, please make sure the issue hasn't been already addressed by searching through [the existing and past issues](https://gitee.com/mindspore/mindscience/issues). +- type: dropdown + id: domain + attributes: + label: Which domain the issue belongs to? + options: + - MindSPONGE + - MindFlow + - MindEnergy + - MindChemistry + - MindEarth + - Others + validations: + required: true + +- type: textarea + attributes: + label: The model to consider. + description: > + A url, pointing to the model, e.g. https://huggingface.co/openai-community/gpt2 . + validations: + required: true +- type: textarea + attributes: + label: The closest model MindScience already supports. + description: > + Here is the list of models already supported by MindScience: https://gitee.com/mindspore/mindscience#%E6%A6%82%E8%BF%B0 . Which model is the most similar to the model you want to add support for? +- type: textarea + attributes: + label: What's your difficulty of supporting the model you want? + description: > + For example, any new operators or new architecture? +- type: markdown + attributes: + value: > Thanks for contributing 🎉! \ No newline at end of file diff --git a/.gitee/PULL_REQUEST_TEMPLATE/PULL_REQUEST_TEMPLATE.en.md b/.gitee/PULL_REQUEST_TEMPLATE/PULL_REQUEST_TEMPLATE.en.md deleted file mode 100644 index 9108f2790..000000000 --- a/.gitee/PULL_REQUEST_TEMPLATE/PULL_REQUEST_TEMPLATE.en.md +++ /dev/null @@ -1,30 +0,0 @@ -### PR Source -- [ ] Issue (Please link related issue) -- [ ] Feature request -- [ ] Bug report -- [ ] Community contributor - -### Change Description -- **Reason for Modification:** - -- **Content Modified:** - -### Function Validation -- [ ] **Self-verification** -- [ ] **Screenshots of local test cases** - -### Checklist -- [ ] **Code reviewed** -- [ ] **UT test coverage** (If not, explain reason: ____________________) -- [ ] **Involves public API changes in MindSpore Science** -- [ ] **Documentation updated** - -### Code Review Requirements -- Changes over 1000 lines require organized review meeting with conclusions -- PR without function validation cannot be merged -- PR with incomplete checklist cannot be merged -- PR without clear source identification or change description cannot be merged - -### Change Notification -- [ ] **Documentation modified** -- [ ] **API change description** (If API changed, detail description): \ No newline at end of file diff --git a/.gitee/PULL_REQUEST_TEMPLATE/PULL_REQUEST_TEMPLATE.zh-CN.md b/.gitee/PULL_REQUEST_TEMPLATE/PULL_REQUEST_TEMPLATE.zh-CN.md deleted file mode 100644 index c166c30dc..000000000 --- a/.gitee/PULL_REQUEST_TEMPLATE/PULL_REQUEST_TEMPLATE.zh-CN.md +++ /dev/null @@ -1,30 +0,0 @@ -### PR来源 -- [ ] issue单(请关联issue) -- [ ] 需求特性 -- [ ] 问题单 -- [ ] 社区开发者贡献 - -### 修改描述 -- **修改原因:** - -- **修改内容:** - -### 功能验证 -- [ ] **功能自验** -- [ ] **本地自验用例截图** - -### 检查清单 -- [ ] **是否经过代码检视** -- [ ] **是否具备UT测试用例看护**(如不符合,请说明原因:____________________) -- [ ] **是否涉及MindSpore Science公共接口变更** -- [ ] **是否涉及文档更新** - -### 代码检视要求 -- 合入代码超过1000行,需组织会议检视并附上结论 -- 未完成功能验证不允许合入 -- 未完成检查清单不允许合入 -- PR来源未标识或修改描述不清晰不允许合入 - -### 变更说明 -- [ ] **文档修改** -- [ ] **接口变更说明**(如涉及接口变更需详细描述): \ No newline at end of file -- Gitee From fe47bdeff72264226c1c2f7fcf2a6f1d34dd0d2d Mon Sep 17 00:00:00 2001 From: brian Date: Thu, 10 Jul 2025 19:48:53 +0800 Subject: [PATCH 17/17] fix --- .gitee/ISSUE_TEMPLATE/5-feature-request.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitee/ISSUE_TEMPLATE/5-feature-request.yml b/.gitee/ISSUE_TEMPLATE/5-feature-request.yml index a5129a7b4..a51b2526c 100644 --- a/.gitee/ISSUE_TEMPLATE/5-feature-request.yml +++ b/.gitee/ISSUE_TEMPLATE/5-feature-request.yml @@ -39,7 +39,7 @@ body: attributes: label: 🚀 The feature, motivation and pitch description: > - A clear and concise description of the feature proposal. Please outline the motivation for the proposal. Is your feature request related to a specific problem? e.g., *"I'm working on X and would like Y to be possible"*. If this is related to another GitHub issue, please link here too. For design design, you can refer to [feature design template](https://gitee.com/mindspore/mindscience/blob/br_refactor/docs/template/feature_design.md). + A clear and concise description of the feature proposal. Please outline the motivation for the proposal. Is your feature request related to a specific problem? e.g., *"I'm working on X and would like Y to be possible"*. If this is related to another GitHub issue, please link here too. For feature design, you can refer to [feature design template](https://gitee.com/mindspore/mindscience/blob/br_refactor/docs/template/feature_design.md). validations: required: true - type: textarea -- Gitee

  • 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�opo(AO>@0QsLf0U~sSN?Q;d&Owe90O|#*R+x?? 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