From 39136d3109ebea4c01464e4da95e767bd9d7831b Mon Sep 17 00:00:00 2001 From: yqf66 Date: Mon, 1 Jun 2026 15:41:52 +0800 Subject: [PATCH 1/2] Add GPWNO electronic structure model --- electronic_structure/README.md | 48 +- electronic_structure/configs/gpwno/README.md | 203 ++++ .../configs/gpwno/gpwno_md17_benzene.yaml | 148 +++ .../configs/gpwno/gpwno_md17_ethane.yaml | 148 +++ .../configs/gpwno/gpwno_mp.yaml | 167 ++++ ppmat/models/__init__.py | 2 + ppmat/models/gpwno/GPWNO.py | 913 ++++++++++++++++++ ppmat/models/gpwno/GPWNO_utils.py | 212 ++++ ppmat/models/gpwno/PWNO_utils.py | 180 ++++ 9 files changed, 1997 insertions(+), 24 deletions(-) create mode 100644 electronic_structure/configs/gpwno/README.md create mode 100644 electronic_structure/configs/gpwno/gpwno_md17_benzene.yaml create mode 100644 electronic_structure/configs/gpwno/gpwno_md17_ethane.yaml create mode 100644 electronic_structure/configs/gpwno/gpwno_mp.yaml create mode 100644 ppmat/models/gpwno/GPWNO.py create mode 100644 ppmat/models/gpwno/GPWNO_utils.py create mode 100644 ppmat/models/gpwno/PWNO_utils.py diff --git a/electronic_structure/README.md b/electronic_structure/README.md index edeece03..63960ad3 100644 --- a/electronic_structure/README.md +++ b/electronic_structure/README.md @@ -6,28 +6,28 @@ Machine Learning Electronic Structure (MLES) is an emerging paradigm in computat ## 2.Models Matrix -| **Supported Functions** | **[InfGCN](./configs/infgcn/README.md)** | -| -------------------------------------------- | :--------: | -| **Forward Prediction · Materials Properties**| | -| Electron density | ✅ | -| **ML Capabilities · Training** | | -| Single-GPU | ✅ | -| Distributed training | ✅ | -| Mixed precision (AMP) | — | -| Fine-tuning | ✅ | -| Uncertainty / Active Learning | — | -| Dynamic→Static graphs | — | -| Compiler (CINN) opt. | — | -| **ML Capabilities · Predict** | | -| Distillation / Pruning | — | -| Standard inference | ✅ | -| Distributed inference | — | -| Compiler-level inference | — | -| **Datasets** | | -| **Materials Project** | | -| MP_EC | ✅ | -| MD17_EC | ✅ | -| QM9_EC | ✅ | -| OMol25_EC | ✅ | +| **Supported Functions** | **[InfGCN](./configs/infgcn/README.md)** | **[GPWNO](./configs/gpwno/README.md)** | +| -------------------------------------------- | :--------: | :--------: | +| **Forward Prediction · Materials Properties**| | | +| Electron density | ✅ | ✅ | +| **ML Capabilities · Training** | | | +| Single-GPU | ✅ | ✅ | +| Distributed training | ✅ | ✅ | +| Mixed precision (AMP) | — | — | +| Fine-tuning | ✅ | ✅ | +| Uncertainty / Active Learning | — | — | +| Dynamic→Static graphs | — | — | +| Compiler (CINN) opt. | — | — | +| **ML Capabilities · Predict** | | | +| Distillation / Pruning | — | — | +| Standard inference | ✅ | ✅ | +| Distributed inference | — | — | +| Compiler-level inference | — | — | +| **Datasets** | | | +| **Materials Project** | | | +| MP_EC | ✅ | ✅ | +| MD17_EC | ✅ | ✅ | +| QM9_EC | ✅ | — | +| OMol25_EC | ✅ | — | -**Notice**:🌟 represent originate research work published from paddlematerials toolkit \ No newline at end of file +**Notice**:🌟 represent originate research work published from paddlematerials toolkit diff --git a/electronic_structure/configs/gpwno/README.md b/electronic_structure/configs/gpwno/README.md new file mode 100644 index 00000000..48458044 --- /dev/null +++ b/electronic_structure/configs/gpwno/README.md @@ -0,0 +1,203 @@ +# GPWNO + +[Gaussian Plane-Wave Neural Operator for Electron Density Estimation](https://arxiv.org/abs/2402.04278) + +Official implementation: [seongsukim-ml/GPWNO](https://github.com/seongsukim-ml/GPWNO) + +## Abstract + +GPWNO is an equivariant neural operator for electron-density estimation. It combines atom-centered Gaussian basis functions with a plane-wave neural operator, allowing the model to capture both local atomic environments and global Fourier-space density patterns. The model follows the same electron-density prediction setting as InfGCN and was originally built on top of a similar data pipeline. + +--- + +## Model Description + +### Overview + +Given atom types and atomic coordinates, GPWNO predicts a continuous electron-density field. The model first learns local equivariant features around atoms, then refines the field with a plane-wave operator in Fourier space. + +The main components are: + +- Gaussian atom-centered density basis +- SE(3)-equivariant coefficient learning +- Plane-wave neural operator refinement +- Optional periodic-boundary support for crystalline systems + +### Method + +#### 1) Gaussian basis expansion + +The electron density is represented with atom-centered basis functions: + +$$ +\hat{\rho}(x) = +\sum_i \sum_{n,l,m} +c_{i,nlm}\,g_n(\|x-r_i\|)\,Y_{lm}(\widehat{x-r_i}) +$$ + +where $g_n$ is a radial Gaussian basis and $Y_{lm}$ is a spherical harmonic basis. The learnable part is the coefficient tensor $c_{i,nlm}$. + +#### 2) Equivariant local message passing + +GPWNO learns basis coefficients with equivariant message passing over the atomic graph. Edge features are built from interatomic distances and angular information, preserving rotation and translation behavior needed for density prediction. + +#### 3) Plane-wave neural operator + +After local coefficient learning, GPWNO applies a Fourier-space operator to improve global consistency: + +$$ +\rho_{\mathrm{out}} = \mathcal{F}^{-1} +\left( +W(k)\,\mathcal{F}(\rho_{\mathrm{local}}) +\right) +$$ + +The Fourier module is controlled mainly by `num_fourier`, `num_fourier_time`, `width`, `fourier_mode`, `padding`, and `using_ff`. + +#### 4) Training objective and metric + +The model is trained with point-wise density regression on sampled grid points. The commonly reported metric is Normalized Mean Absolute Error: + +$$ +\mathrm{NMAE} = +\frac{\sum_i |\hat{\rho}(x_i)-\rho(x_i)|} +{\sum_i |\rho(x_i)|} +$$ + +--- + +## Dataset Description + +GPWNO uses the same electron-density datasets and dataloaders as InfGCN. + +- **MD17_EC**: Small-molecule molecular dynamics electron-density data. The supported molecules include benzene, ethanol, phenol, resorcinol, ethane, and malonaldehyde. [Data](https://paddle-org.bj.bcebos.com/paddlematerials/datasets/MD17_ES/md17_es.tar.gz). +- **MP_EC (cubic)**: Materials Project-style crystal electron densities stored as `*.json.xz` under `./data/data_mp`. [Data](https://paddle-org.bj.bcebos.com/paddlematerials/datasets/MP_ES/mp_es.tar), [atom dictionary](https://paddle-org.bj.bcebos.com/paddlematerials/datasets/MP_ES/crystal.json), [split file](https://paddle-org.bj.bcebos.com/paddlematerials/datasets/MP_ES/crystal_data_split.json). + +--- + +## Key Configuration + +The PaddleMaterials configs follow the original GPWNO hyper-parameter choices: + +| Dataset | Original model profile | Main differences | +| --- | --- | --- | +| MD17_EC | `GPWNO_MD.yaml` | `num_spherical=3`, `num_fourier=40`, `padding=4`, `use_max_cell=true`, `equivariant_frame=true`, `residual=false` | +| MP_EC | `GPWNO_pbc.yaml` | `pbc=true`, `num_fourier=20`, `padding=0`, `use_max_cell=false`, `max_cell_size=324`, `equivariant_frame=false` | + +--- + +## Results + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Model NameDatasetNormalized MAE of DensityGPUsTraining timeConfigCheckpoint | Log
gpwno_md17_benzeneMD17_EC_Benzene3.5567% (val, 10 epochs)115hour33mingpwno_md17_benzeneTBD
gpwno_md17_ethaneMD17_EC_Ethane4.8339% (test)152hour18mingpwno_md17_ethaneTBD
gpwno_mpMP_EC (cubic)37.8910%137hour46mingpwno_mpTBD
+ +Note: The MD17_EC_Benzene result is reported from the epoch-10 validation of the local run `gpwno_md17_benzene_t_20260527_182931_s_42`; the corresponding checkpoint is `checkpoints/best.pdparams`. The run was intentionally recorded as a 10-epoch result. + +Note: The MD17_EC_Ethane result is reported from the final test set evaluation of the local run `gpwno_md17_ethane_t_20260529_204928_s_42`. The final validation NMAE is `4.8302%`, and the final test NMAE is `4.8339%`. + +Note: The MP_EC result is reported from the final test set evaluation of the local run `gpwno_mp_resume_t_20260528_204842_s_42`. The final validation NMAE is `34.8928%`, and the final test NMAE is `37.8910%`. + +Note: Checkpoint and log links are reserved as `TBD`. The local checkpoints and logs are not submitted in this PR; they will be uploaded separately by the project maintainers and replaced with Paddle-hosted links after conversion. + +--- + +## Command + +### Data preparation + +The datasets are downloaded automatically by the dataset classes when the configured root directory is missing and `auto_download` is enabled. + +```bash +# MD17_EC will be prepared under ./data/data_md +python electronic_structure/train.py -c electronic_structure/configs/gpwno/gpwno_md17_ethane.yaml Global.do_train=False Global.do_eval=False Global.do_test=True +``` + +### Training + +```bash +# single-gpu training +python electronic_structure/train.py -c electronic_structure/configs/gpwno/gpwno_md17_ethane.yaml + +# multi-gpu training +python -m paddle.distributed.launch --gpus="0,1,2,3" electronic_structure/train.py -c electronic_structure/configs/gpwno/gpwno_md17_benzene.yaml +``` + +### Validation + +```bash +python electronic_structure/train.py -c electronic_structure/configs/gpwno/gpwno_md17_ethane.yaml Global.do_train=False Global.do_eval=True Global.do_test=False Trainer.pretrained_model_path='path/to/model.pdparams' +``` + +### Testing + +```bash +python electronic_structure/train.py -c electronic_structure/configs/gpwno/gpwno_md17_ethane.yaml Global.do_train=False Global.do_eval=False Global.do_test=True Trainer.pretrained_model_path='path/to/model.pdparams' +``` + +### Prediction + +```bash +python electronic_structure/predict.py -c electronic_structure/configs/gpwno/gpwno_md17_ethane.yaml Trainer.pretrained_model_path='path/to/model.pdparams' +``` + +--- + +## Citation + +```bibtex +@inproceedings{kim2024gaussian, + title={Gaussian Plane-Wave Neural Operator for Electron Density Estimation}, + author={Kim, Seongsu and Kim, Dong Hwan and Lee, Woo Youn and Han, Seungwu}, + booktitle={International Conference on Machine Learning}, + year={2024} +} +``` + +```bibtex +@article{fandel2023infgcn, + title={InfGCN: Equivariant Neural Operator Learning with Graphon Convolution}, + author={Fandel, Dorian and von Rudorff, Guido Falk and von Lilienfeld, O. Anatole}, + journal={arXiv preprint arXiv:2311.10908}, + year={2023} +} +``` diff --git a/electronic_structure/configs/gpwno/gpwno_md17_benzene.yaml b/electronic_structure/configs/gpwno/gpwno_md17_benzene.yaml new file mode 100644 index 00000000..9108a3be --- /dev/null +++ b/electronic_structure/configs/gpwno/gpwno_md17_benzene.yaml @@ -0,0 +1,148 @@ +Global: + do_train: True + do_eval: True + do_test: True + use_voxel: False + +Trainer: + max_epochs: 32 + max_iter: 10000 + seed: 42 + output_dir: ./output/gpwno_md17_benzene + save_freq: 2000 + log_freq: 1 + start_eval_epoch: 0 + eval_freq: 1 + pretrained_model_path: null + pretrained_weight_name: null + resume_from_checkpoint: null + use_amp: False + amp_level: 'O1' + eval_with_no_grad: True + gradient_accumulation_steps: 1 + best_metric_indicator: 'eval_loss' + name_for_best_metric: "mae" + greater_is_better: False + compute_metric_during_train: True + metric_strategy_during_eval: 'epoch' + use_visualdl: False + use_wandb: False + use_tensorboard: True + +Model: + __class_name__: GPWNO + __init_params__: + n_atom_type: 3 + num_radial: 16 + num_spherical: 3 + radial_embed_size: 64 + radial_hidden_size: 128 + num_radial_layer: 2 + num_gcn_layer: 2 + cutoff: 3.0 + grid_cutoff: 0.75 + probe_cutoff: 1.5 + is_fc: false + gauss_start: 0.5 + gauss_end: 5.0 + residual: false + pbc: false + activation: norm + num_fourier: 40 + num_fourier_time: 12 + width: 16 + fourier_mode: 0 + padding: 4 + use_max_cell: true + max_cell_size: 20 + equivariant_frame: true + normalize: true + using_ff: true + model_sharing: false + num_infgcn_layer: 3 + use_detach: false + num_spherical_RNO: 4 + scalar_mask: true + mask_cutoff: 3.0 + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 0.005 + factor: 0.5 + patience: 5 + min_lr: 0.00001 + by_epoch: True + indicator: "eval_loss" + indicator_name: "loss" + weight_decay: 0.0 + beta1: 0.9 + beta2: 0.999 + +Dataset: + train: + dataset: + __class_name__: SmallDensityDataset + __init_params__: + root: ./data/data_md + mol_name: benzene + split: "train" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 + loader: + num_workers: 4 + use_shared_memory: False + collate_fn: DensityCollator + collate_params: + n_samples: 2048 + val: + dataset: + __class_name__: SmallDensityDataset + __init_params__: + root: ./data/data_md + mol_name: benzene + split: "validation" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 + loader: + num_workers: 8 + use_shared_memory: False + collate_fn: DensityCollator + collate_params: + n_samples: 2048 + test: + dataset: + __class_name__: SmallDensityDataset + __init_params__: + root: ./data/data_md + mol_name: benzene + split: "test" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 1 + loader: + num_workers: 2 + use_shared_memory: False + collate_fn: DensityCollator + collate_params: + n_samples: 2048 + +Predict: + eval_with_no_grad: True + num_infer: null + num_vis: 2 + inf_samples: 4096 diff --git a/electronic_structure/configs/gpwno/gpwno_md17_ethane.yaml b/electronic_structure/configs/gpwno/gpwno_md17_ethane.yaml new file mode 100644 index 00000000..35e1d64d --- /dev/null +++ b/electronic_structure/configs/gpwno/gpwno_md17_ethane.yaml @@ -0,0 +1,148 @@ +Global: + do_train: True + do_eval: True + do_test: True + use_voxel: False + +Trainer: + max_epochs: 32 + max_iter: 10000 + seed: 42 + output_dir: ./output/gpwno_md17_ethane + save_freq: 2000 + log_freq: 1 + start_eval_epoch: 0 + eval_freq: 1 + pretrained_model_path: null + pretrained_weight_name: null + resume_from_checkpoint: null + use_amp: False + amp_level: 'O1' + eval_with_no_grad: True + gradient_accumulation_steps: 1 + best_metric_indicator: 'eval_loss' + name_for_best_metric: "mae" + greater_is_better: False + compute_metric_during_train: True + metric_strategy_during_eval: 'epoch' + use_visualdl: False + use_wandb: False + use_tensorboard: True + +Model: + __class_name__: GPWNO + __init_params__: + n_atom_type: 3 + num_radial: 16 + num_spherical: 3 + radial_embed_size: 64 + radial_hidden_size: 128 + num_radial_layer: 2 + num_gcn_layer: 2 + cutoff: 3.0 + grid_cutoff: 0.75 + probe_cutoff: 1.5 + is_fc: false + gauss_start: 0.5 + gauss_end: 5.0 + residual: false + pbc: false + activation: norm + num_fourier: 40 + num_fourier_time: 12 + width: 16 + fourier_mode: 0 + padding: 4 + use_max_cell: true + max_cell_size: 20 + equivariant_frame: true + normalize: true + using_ff: true + model_sharing: false + num_infgcn_layer: 3 + use_detach: false + num_spherical_RNO: 4 + scalar_mask: true + mask_cutoff: 3.0 + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 0.005 + factor: 0.5 + patience: 5 + min_lr: 0.00001 + by_epoch: True + indicator: "eval_loss" + indicator_name: "loss" + weight_decay: 0.0 + beta1: 0.9 + beta2: 0.999 + +Dataset: + train: + dataset: + __class_name__: SmallDensityDataset + __init_params__: + root: ./data/data_md + mol_name: ethane + split: "train" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 + loader: + num_workers: 4 + use_shared_memory: False + collate_fn: DensityCollator + collate_params: + n_samples: 1024 + val: + dataset: + __class_name__: SmallDensityDataset + __init_params__: + root: ./data/data_md + mol_name: ethane + split: "validation" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 + loader: + num_workers: 8 + use_shared_memory: False + collate_fn: DensityCollator + collate_params: + n_samples: 2048 + test: + dataset: + __class_name__: SmallDensityDataset + __init_params__: + root: ./data/data_md + mol_name: ethane + split: "test" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 1 + loader: + num_workers: 2 + use_shared_memory: False + collate_fn: DensityCollator + collate_params: + n_samples: 2048 + +Predict: + eval_with_no_grad: True + num_infer: null + num_vis: 2 + inf_samples: 4096 diff --git a/electronic_structure/configs/gpwno/gpwno_mp.yaml b/electronic_structure/configs/gpwno/gpwno_mp.yaml new file mode 100644 index 00000000..33e1aebe --- /dev/null +++ b/electronic_structure/configs/gpwno/gpwno_mp.yaml @@ -0,0 +1,167 @@ +Global: + do_train: True + do_eval: True + do_test: True + use_voxel: False + +Trainer: + max_epochs: 2 + max_iter: 100000 + seed: 42 + output_dir: ./output/gpwno_mp + save_freq: 2000 + log_freq: 1 + start_eval_epoch: 0 + eval_freq: 1 + pretrained_model_path: null + pretrained_weight_name: null + resume_from_checkpoint: null + use_amp: False + amp_level: 'O1' + eval_with_no_grad: True + gradient_accumulation_steps: 1 + best_metric_indicator: 'eval_loss' + name_for_best_metric: "mae" + greater_is_better: False + compute_metric_during_train: True + metric_strategy_during_eval: 'epoch' + use_visualdl: False + use_wandb: False + use_tensorboard: True + +Model: + __class_name__: GPWNO + __init_params__: + n_atom_type: 84 + num_radial: 16 + num_spherical: 3 + radial_embed_size: 64 + radial_hidden_size: 128 + num_radial_layer: 2 + num_gcn_layer: 2 + cutoff: 3.0 + grid_cutoff: 0.75 + probe_cutoff: 1.5 + is_fc: false + gauss_start: 0.5 + gauss_end: 5.0 + residual: true + pbc: true + activation: norm + num_fourier: 20 + num_fourier_time: 12 + width: 16 + fourier_mode: 0 + padding: 0 + use_max_cell: false + max_cell_size: 324 + equivariant_frame: false + normalize: true + using_ff: true + model_sharing: false + num_infgcn_layer: 3 + use_detach: false + num_spherical_RNO: 3 + scalar_mask: true + mask_cutoff: 1.0 + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 0.001 + factor: 0.5 + patience: 10 + min_lr: 0.00001 + by_epoch: True + indicator: "eval_loss" + indicator_name: "loss" + weight_decay: 0.0 + beta1: 0.9 + beta2: 0.999 + +Dataset: + train: + dataset: + __class_name__: DensityDataset + __init_params__: + root: ./data/data_mp + split_file: crystal_data_split.json + atom_file: ./data/data_mp/crystal.json + extension: json + compression: xz + pbc: true + split: "train" + enable_cache: false + overwrite: false + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 16 + loader: + num_workers: 0 + use_shared_memory: False + collate_fn: DensityCollator + collate_params: + n_samples: 1024 + val: + dataset: + __class_name__: DensityDataset + __init_params__: + root: ./data/data_mp + split_file: crystal_data_split.json + atom_file: ./data/data_mp/crystal.json + extension: json + compression: xz + pbc: true + split: "validation" + enable_cache: false + overwrite: false + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 6 + loader: + num_workers: 0 + use_shared_memory: False + collate_fn: DensityCollator + collate_params: + n_samples: 4096 + test: + dataset: + __class_name__: DensityDataset + __init_params__: + root: ./data/data_mp + split_file: crystal_data_split.json + atom_file: ./data/data_mp/crystal.json + extension: json + compression: xz + pbc: true + split: "test" + rotate: false + enable_cache: false + overwrite: false + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 1 + loader: + num_workers: 0 + use_shared_memory: False + collate_fn: DensityCollator + collate_params: + n_samples: 2048 + +Predict: + eval_with_no_grad: True + num_infer: 100 + num_vis: 2 + inf_samples: 4096 diff --git a/ppmat/models/__init__.py b/ppmat/models/__init__.py index 95d73232..b25a5fc9 100644 --- a/ppmat/models/__init__.py +++ b/ppmat/models/__init__.py @@ -41,6 +41,7 @@ from ppmat.models.mattersim.m3gnet_graph_converter import M3GNetGraphConvertor from ppmat.models.megnet.megnet import MEGNetPlus from ppmat.models.infgcn.infgcn import InfGCN +from ppmat.models.gpwno.GPWNO import GPWNO from ppmat.models.mateno.mateno import MatENO from ppmat.utils import download from ppmat.utils import logger @@ -66,6 +67,7 @@ "DiffPrior", "DiffNMR", "InfGCN", + "GPWNO", "MatENO", ] diff --git a/ppmat/models/gpwno/GPWNO.py b/ppmat/models/gpwno/GPWNO.py new file mode 100644 index 00000000..12c772c7 --- /dev/null +++ b/ppmat/models/gpwno/GPWNO.py @@ -0,0 +1,913 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. +# +# 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. + +import sys +import numpy as np +import paddle +from ..common.e3nn import o3 +from ..common.e3nn.math import soft_one_hot_linspace +from ..common.e3nn.nn import Activation, Extract, FullyConnectedNet +from .GPWNO_utils import * +from ..common.orbital import GaussianOrbital +from .PWNO_utils import * +from ppmat.datasets.graph_utils.infgcn_graph_utils import radius +from ppmat.datasets.graph_utils.infgcn_graph_utils import radius_graph +# from ....paddle_geometric.paddle_geometric.nn import radius, radius_graph +from paddle_scatter.scatter import scatter + + +def pbc_vec(vec, cell): + """ + Apply periodic boundary condition to the vector + :param vec: original vector of (N, K, 3) + :param cell: cell frame of (N, 3, 3) + :return: shortest vector of (N, K, 3) + """ + coord = vec @ paddle.linalg.inv(x=cell) + coord = coord - paddle.round(coord) + pbc_vec = coord @ cell + return pbc_vec.detach(), coord.detach() + + +class PWNO(paddle.nn.Module): + def __init__( + self, + modes1, + modes2, + modes3, + width, + num_fourier_time, + padding=0, + num_layers=2, + using_ff=False, + ): + super(PWNO, self).__init__() + """ + The overall network. It contains 4 layers of the Fourier layer. + 1. Lift the input to the desire channel dimension by self.fc0 . + 2. 4 layers of the integral operators u' = (W + K)(u). + W defined by self.w; K defined by self.conv . + 3. Project from the channel space to the output space by self.fc1 and self.fc2 . + + input: the solution of the first 10 timesteps + 3 locations (u(1, x, y), ..., u(10, x, y), x, y, t). It's a constant function in time, except for the last index. + input shape: (batchsize, x=64, y=64, t=40, c=13) + output: the solution of the next 40 timesteps + output shape: (batchsize, x=64, y=64, t=40, c=1) + """ + self.modes1 = modes1 + self.modes2 = modes2 + self.modes3 = modes3 + self.width = width + self.num_fourier_time = num_fourier_time + self.padding = padding + self.fc0 = paddle.compat.nn.Linear(self.num_fourier_time + 3, self.width) + self.num_layers = num_layers + if using_ff: + self.conv = paddle.nn.ModuleList( + [ + SpectralConv3d_FFNO( + self.width, self.width, self.modes1, self.modes2, self.modes3 + ) + for _ in range(self.num_layers) + ] + ) + else: + self.conv = paddle.nn.ModuleList( + [ + SpectralConv3d( + self.width, self.width, self.modes1, self.modes2, self.modes3 + ) + for _ in range(self.num_layers) + ] + ) + self.w = paddle.nn.ModuleList( + [ + paddle.nn.Conv3d(self.width, self.width, 1) + for _ in range(self.num_layers) + ] + ) + self.bn = paddle.nn.ModuleList( + [ + paddle.nn.BatchNorm3D(num_features=self.width) + for _ in range(self.num_layers) + ] + ) + + def forward(self, residue, fourier_grid): + x = paddle.cat([residue, fourier_grid], dim=-1) + x = self.fc0(x) + x = x.permute(0, 4, 1, 2, 3) + if self.padding != 0: + x = paddle.compat.nn.functional.pad( + x, [0, self.padding, 0, self.padding, 0, self.padding] + ) + for i in range(self.num_layers): + x1 = self.conv[i](x) + x2 = self.w[i](x) + x = x1 + x2 + if i != self.num_layers - 1: + x = paddle.nn.functional.gelu(x) + if self.padding != 0: + x = x[..., :, : -self.padding, : -self.padding, : -self.padding] + x = x.permute(0, 2, 3, 4, 1) + return x + + +class GPWNO(paddle.nn.Layer): + def __init__( + self, + n_atom_type, + num_radial, + num_spherical, + radial_embed_size, + radial_hidden_size, + num_fourier=64, + num_fourier_time=4, + num_radial_layer=2, + num_gcn_layer=3, + cutoff=3.0, + grid_cutoff=3.0, + probe_cutoff=3.0, + is_fc=True, + gauss_start=0.5, + gauss_end=5.0, + activation="norm", + residual=True, + pbc=False, + width=20, + padding=6, + use_max_cell=True, + max_cell_size=22, + equivariant_frame=True, + probe_and_node=False, + product=False, + normalize=True, + model_sharing=True, + num_infgcn_layer=3, + input_infgcn=False, + using_ff=True, + scalar_mask=True, + use_detach=True, + mask_cutoff=3.0, + scalar_inv=False, + num_spherical_RNO=None, + positive_output=False, + atomic_gauss_dist=False, + input_dist=False, + atom_info=None, + fourier_mode=0, + *args, + **kwargs, + ): + """ + Implement the GPWNO model for electron density estimation + :param n_atom_type: number of atom types + :param num_radial: number of radial basis + :param num_spherical: maximum number of spherical harmonics for each radial basis, + number of spherical basis will be (num_spherical + 1)^2 + :param radial_embed_size: embedding size of the edge length + :param radial_hidden_size: hidden size of the radial network + :param num_radial_layer: number of hidden layers in the radial network + :param num_gcn_layer: number of GPWNO layers + :param cutoff: cutoff distance for building the molecular graph + :param grid_cutoff: cutoff distance for building the grid-atom graph + :param is_fc: whether the GPWNO layer should use fully connected tensor product + :param gauss_start: start coefficient of the Gaussian radial basis + :param gauss_end: end coefficient of the Gaussian radial basis + :param activation: activation type for the GPWNO layer, can be ['scalar', 'norm'] + :param residual: whether to use the residue prediction layer + :param pbc: whether the data satisfy the periodic boundary condition + """ + super(GPWNO, self).__init__(*args, **kwargs) + self.n_atom_type = n_atom_type + self.num_radial = num_radial + self.num_spherical = num_spherical + self.radial_embed_size = radial_embed_size + self.radial_hidden_size = radial_hidden_size + self.num_radial_layer = num_radial_layer + self.num_gcn_layer = num_gcn_layer + self.cutoff = cutoff + self.grid_cutoff = grid_cutoff + self.is_fc = is_fc + self.gauss_start = gauss_start + self.gauss_end = gauss_end + self.activation = activation + self.residual = residual + self.pbc = pbc + self.num_fourier = num_fourier + self.num_fourier_time = num_fourier_time + self.probe_cutoff = probe_cutoff + self.use_max_cell = use_max_cell + self.max_cell_size = max_cell_size + self.equivariant_frame = equivariant_frame + self.probe_and_node = probe_and_node + self.normalize = normalize + self.model_sharing = model_sharing + self.num_infgcn_layer = num_infgcn_layer + self.input_infgcn = input_infgcn + self.scalar_mask = scalar_mask + self.use_detach = use_detach + self.mask_cutoff = mask_cutoff + self.scalar_inv = scalar_inv + self.positive_output = positive_output + self.atomic_gauss_dist = atomic_gauss_dist + self.input_dist = input_dist + self.atom_info = atom_info + self.fourier_mode = fourier_mode + self.num_spherical_RNO = num_spherical_RNO + if model_sharing == True or num_spherical_RNO is None: + self.num_spherical_RNO = num_spherical + self.product = product + assert activation in ["scalar", "norm"] + self.embedding = paddle.nn.Embedding(n_atom_type, num_radial) + self.irreps_sh = o3.Irreps.spherical_harmonics(num_spherical, p=1) + self.irreps_feat = (self.irreps_sh * num_radial).sort().irreps.simplify() + self.irreps_sh_RNO = o3.Irreps.spherical_harmonics(num_spherical_RNO, p=1) + self.irreps_feat_RNO = ( + (self.irreps_sh_RNO * num_radial).sort().irreps.simplify() + ) + self.gcns_RNO = paddle.nn.ModuleList( + [ + GCNLayer( + f"{num_radial}x0e" if i == 0 else self.irreps_feat_RNO, + self.irreps_feat_RNO, + self.irreps_sh_RNO, + radial_embed_size, + num_radial_layer, + radial_hidden_size, + is_fc=is_fc, + **kwargs, + ) + for i in range(num_gcn_layer) + ] + ) + if self.activation == "scalar": + self.act = ScalarActivation( + self.irreps_feat, paddle.nn.functional.silu, paddle.sigmoid + ) + self.act_RNO = ScalarActivation( + self.irreps_feat_RNO, paddle.nn.functional.silu, paddle.sigmoid + ) + else: + self.act = NormActivation(self.irreps_feat) + self.act_RNO = NormActivation(self.irreps_feat_RNO) + if self.model_sharing == False: + self.infgcns = paddle.nn.ModuleList( + [ + GCNLayer( + f"{num_radial}x0e" if i == 0 else self.irreps_feat, + self.irreps_feat, + self.irreps_sh, + radial_embed_size, + num_radial_layer, + radial_hidden_size, + is_fc=is_fc, + **kwargs, + ) + for i in range(num_infgcn_layer) + ] + ) + self.residue = None + if self.residual: + self.residue = GCNLayer( + self.irreps_feat, + "0e", + self.irreps_sh, + radial_embed_size, + num_radial_layer, + radial_hidden_size, + is_fc=True, + use_sc=False, + **kwargs, + ) + self.probe_gcn = GCNLayer( + self.irreps_feat_RNO, + f"{num_fourier_time}x0e", + self.irreps_sh_RNO, + radial_embed_size, + num_radial_layer, + radial_hidden_size, + is_fc=True, + use_sc=False, + **kwargs, + ) + self.act_probe = NormActivation(f"{num_fourier_time}x0e") + self.mode = ( + self.num_fourier // 2 if self.fourier_mode == 0 else self.fourier_mode + ) + self.width = width + if self.input_infgcn: + self.num_fourier_time += 1 + if self.input_dist: + self.num_fourier_time += 1 + if self.atomic_gauss_dist: + self.num_fourier_time += 10 + self.PWNO = PWNO( + modes1=self.mode, + modes2=self.mode, + modes3=self.mode, + width=self.width, + num_fourier_time=self.num_fourier_time, + padding=padding, + using_ff=using_ff, + ) + self.scalar_field_gcn = GCNLayer( + f"{self.width}x0e", + f"0e", + self.irreps_sh_RNO, + radial_embed_size, + num_radial_layer, + radial_hidden_size, + is_fc=True, + use_sc=False, + **kwargs, + ) + self.orbital = GaussianOrbital( + gauss_start, gauss_end, num_radial, num_spherical + ) + if self.atomic_gauss_dist and atom_info is not None: + import json + + with open(atom_info) as f: + atom_info = json.load(f) + atom_radius = [info["radius"] for info in atom_info] + self.atom_radius = [radius for idx, radius in enumerate(atom_radius)] + self.atom_radius = paddle.FloatTensor(self.atom_radius) + + def forward(self, batch_idx): + """ + ppmat-style forward + + batch_idx: + graph: PGL graph, with x / pos / batch_idx + grid_coord: [B, K, 3] + density: optional, [B, K] + density_mask: optional, [B, K] + infos: optional, list[dict], may contain 'cell' + """ + graph = batch_idx["graph"] + grid = batch_idx["grid_coord"] + infos = batch_idx.get("infos", None) + + density_gt = batch_idx.get("density", None) + mask = batch_idx.get("density_mask", None) + + pred, aux = self._forward_density( + atom_types=graph.x, + atom_coord=graph.pos, + grid=grid, + batch_idx=graph.batch, + infos=infos, + ) + + loss_dict = {} + if density_gt is not None: + loss, mae = self._compute_loss(pred, density_gt, mask) + loss_dict["loss"] = loss + loss_dict["mae"] = mae + + return { + "loss_dict": loss_dict, + "pred_dict": {"density": pred}, + "aux_dict": aux, + } + + def _compute_loss(self, pred, label, mask=None): + if mask is not None: + pred = pred * mask + label = label * mask + denom = paddle.sum(mask) + 1e-8 + loss = paddle.sum((pred - label) ** 2) / denom + mae = paddle.sum(paddle.abs(pred - label)) / ( + paddle.sum(label) + 1e-8 + ) + else: + loss = paddle.mean((pred - label) ** 2) + mae = paddle.sum(paddle.abs(pred - label)) / ( + paddle.sum(label) + 1e-8 + ) + return loss, mae + + def _forward_density(self,atom_types,atom_coord,grid,batch_idx,infos,): + + device = atom_coord.place + + cell = None + if infos is not None and "cell" in infos[0]: + cell = paddle.stack([info["cell"] for info in infos], axis=0).to(device) + + atom_types = atom_types.to(device) + grid = grid.to(device) + + feat = self.embedding(atom_types) + n_graph, n_sample = grid.shape[0], grid.shape[1] + + if self.use_max_cell and self.equivariant_frame: + atom_center = scatter(atom_coord, batch_idx, dim=0, reduce="mean") + atom_coord = atom_coord - atom_center[batch_idx] + grid -= atom_center.unsqueeze(1) + edge_index = radius_graph(atom_coord, self.cutoff, batch_idx, loop=False) + src, dst = edge_index + edge_vec = atom_coord[src] - atom_coord[dst] + edge_len = edge_vec.norm(dim=-1) + 1e-08 + edge_feat = o3.spherical_harmonics( + list(range(self.num_spherical + 1)), + edge_vec / edge_len[..., None], + normalize=False, + normalization="integral", + ) + edge_embed = soft_one_hot_linspace( + edge_len, + start=0.0, + end=self.cutoff, + number=self.radial_embed_size, + basis="gaussian", + cutoff=False, + ).mul(self.radial_embed_size**0.5) + edge_feat_RNO = o3.spherical_harmonics( + list(range(self.num_spherical_RNO + 1)), + edge_vec / edge_len[..., None], + normalize=False, + normalization="integral", + ) + if self.model_sharing == False: + infgcn_feat = feat + for i, gcn in enumerate(self.infgcns): + infgcn_feat = gcn( + edge_index, + infgcn_feat, + edge_feat, + edge_embed, + dim_size=atom_types.size(0), + ) + if i != self.num_infgcn_layer - 1: + infgcn_feat = self.act(infgcn_feat) + for i, gcn in enumerate(self.gcns_RNO): + feat = gcn( + edge_index, feat, edge_feat_RNO, edge_embed, dim_size=atom_types.size(0) + ) + if i != self.num_gcn_layer - 1: + feat = self.act_RNO(feat) + bins_lin = paddle.linspace(0, 1, self.num_fourier).to(atom_coord.place) + if self.pbc: + half = len(bins_lin) // 2 + super_bins = paddle.cat( + [bins_lin[half:-1] - 1, bins_lin, bins_lin[1:half] + 1] + ).to(atom_coord.place) + super_bins = paddle.meshgrid(super_bins, super_bins, super_bins) + super_probe = paddle.stack(super_bins, dim=-1).to(atom_coord.place) + bins_idx = paddle.arange(len(bins_lin)) + bins_idx[-1] = 0 + super_bins_idx = paddle.cat( + [bins_idx[half:-1], bins_idx, bins_idx[1:half]] + ).to(atom_coord.place) + smart_idx = ( + paddle.arange((len(bins_idx) - 1) ** 3) + .reshape(len(bins_idx) - 1, len(bins_idx) - 1, len(bins_idx) - 1) + .to(atom_coord.place) + ) + super_probe_idx_help = paddle.stack( + paddle.meshgrid(super_bins_idx, super_bins_idx, super_bins_idx), dim=-1 + ).reshape(-1, 3) + super_probe_idx = smart_idx[ + super_probe_idx_help[:, 0], + super_probe_idx_help[:, 1], + super_probe_idx_help[:, 2], + ].reshape(-1) + del super_probe_idx_help + if self.use_max_cell and self.equivariant_frame: + bins_lin -= 0.5 + bins = paddle.meshgrid(bins_lin, bins_lin, bins_lin) + probe = paddle.stack(bins, dim=-1).to(atom_coord.place) + cell_inp = cell + if self.use_max_cell: + if self.max_cell_size is None: + self.max_cell_size = 20 + if self.equivariant_frame: + num_batch = grid.size(0) + new_cell = [] + for i in range(num_batch): + atom_bat = atom_coord[batch_idx == i] + atoms_centered = atom_bat - atom_bat.mean(dim=0) + R = paddle.matmul(atoms_centered.t(), atoms_centered) + _, vec = paddle.linalg.eigh(x=R) + vec /= paddle.linalg.norm(vec, dim=0) + new_cell.append(vec) + new_cell = paddle.stack(new_cell, dim=0) + max_cell = new_cell * self.max_cell_size + else: + max_cell_tensor = np.eyes(3) * self.max_cell_size + max_cell = paddle.FloatTensor(self.max_cell_size).to(atom_coord.place) + max_cell = max_cell.unsqueeze(0).repeat(grid.size(0), 1, 1) + cell_inp = max_cell + probe = paddle.einsum("ijkl,blm->bijkm", probe, cell_inp).detach() + probe_log = probe.cpu() + if self.use_max_cell and self.equivariant_frame: + probe_log += atom_center.reshape(-1, 1, 1, 1, 3).cpu() + probe_flat = probe.reshape(-1, 3) + probe_batch = paddle.arange(grid.size(0), device=grid.device).repeat_interleave( + len(bins_lin) ** 3 + ) + if self.pbc: + super_probe = paddle.einsum( + "ijkl,blm->bijkm", super_probe, cell_inp + ).detach() + super_probe_flat = super_probe.reshape(-1, 3) + super_probe_batch = paddle.arange( + grid.size(0), device=grid.device + ).repeat_interleave(len(super_bins_idx) ** 3) + super_probe_idx_batch = paddle.arange( + grid.size(0), device=grid.device + ).repeat_interleave(len(super_probe_idx)) * len( + bins_lin + ) ** 3 + super_probe_idx.repeat( + grid.size(0) + ) + if self.pbc: + super_probe_dst, probe_src = radius( + atom_coord, + super_probe_flat, + self.probe_cutoff, + batch_idx, + super_probe_batch, + ) + probe_dst = super_probe_idx_batch[super_probe_dst] + else: + probe_dst, probe_src = radius( + atom_coord, probe_flat, self.probe_cutoff, batch_idx, probe_batch + ) + avg_probe_degree = ( + probe_dst.size(0) / probe_flat.size(0) if probe_flat.size(0) != 0 else 0 + ) + avg_probe_exist_degree = ( + probe_dst.size(0) / probe_dst.unique().size(0) + if probe_dst.unique().size(0) != 0 + else 0 + ) + avg_probe_exist_rate = ( + probe_dst.unique().size(0) / probe_flat.size(0) + if probe_dst.unique().size(0) != 0 + else 0 + ) + if self.pbc: + probe_edge = super_probe_flat[super_probe_dst] - atom_coord[probe_src] + else: + probe_edge = probe_flat[probe_dst] - atom_coord[probe_src] + probe_len = paddle.norm(probe_edge, dim=-1) + 1e-08 + probe_edge_feat = o3.spherical_harmonics( + list(range(self.num_spherical_RNO + 1)), + probe_edge / (probe_len[..., None] + 1e-08), + normalize=False, + normalization="integral", + ) + probe_edge_embed = soft_one_hot_linspace( + probe_len, + start=0.0, + end=self.probe_cutoff, + number=self.radial_embed_size, + basis="gaussian", + cutoff=False, + ).mul(self.radial_embed_size**0.5) + probe_feat = self.probe_gcn.forward_mean( + (probe_src, probe_dst), + feat, + probe_edge_feat, + probe_edge_embed, + dim_size=probe_flat.size(0), + ) + probe_feat = self.act_probe(probe_feat) + probe_feat = probe_feat.reshape( + grid.size(0), self.num_fourier, self.num_fourier, self.num_fourier, -1 + ) + minimal_dist_grid = paddle.zeros(grid.size(0), grid.size(1)) + for b_idx in range(grid.size(0)): + if self.pbc: + minimal_dist_grid[b_idx] = paddle.compat.min( + paddle.compat.min( + paddle.norm( + grid[b_idx].unsqueeze(1).unsqueeze(1) + - atom_coord[batch_idx == b_idx].unsqueeze(0).unsqueeze(0) + + paddle.stack( + [ + ( + i * cell[b_idx][0] + + j * cell[b_idx][1] + + k * cell[b_idx][2] + ) + for i in [-1, 0, 1] + for j in [-1, 0, 1] + for k in [-1, 0, 1] + ], + dim=0, + ).reshape(1, 27, 1, 3), + dim=-1, + ), + dim=-2, + )[0], + dim=-1, + )[0] + else: + minimal_dist_grid[b_idx] = paddle.compat.min( + paddle.norm( + grid[b_idx].unsqueeze(1) + - atom_coord[batch_idx == b_idx].unsqueeze(0), + dim=-1, + ), + dim=-1, + )[0] + mask = minimal_dist_grid > self.mask_cutoff + atomic_dist_probe = paddle.zeros(grid.size(0), self.num_fourier**3, 10).to( + atom_coord.place + ) + alpha = paddle.tensor([0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0]).to( + atom_coord.place + ) + alpha = alpha.reshape(1, 1, 10) + minimal_dist_probe = paddle.zeros(grid.size(0), self.num_fourier**3).to( + atom_coord.place + ) + for b_idx in range(grid.size(0)): + if self.pbc: + pr = probe.reshape(grid.size(0), -1, 3) + dist_min = paddle.compat.min( + paddle.norm( + pr[b_idx].unsqueeze(1).unsqueeze(1) + - atom_coord[batch_idx == b_idx].unsqueeze(0).unsqueeze(0) + + paddle.stack( + [ + ( + i * cell[b_idx][0] + + j * cell[b_idx][1] + + k * cell[b_idx][2] + ) + for i in [-1, 0, 1] + for j in [-1, 0, 1] + for k in [-1, 0, 1] + ], + dim=0, + ).reshape(1, 27, 1, 3), + dim=-1, + ), + dim=-2, + )[0] + if self.atomic_gauss_dist and self.atom_info is not None: + self.atom_radius = self.atom_radius.to(atom_coord.place) + atomic_dist_probe[b_idx] = paddle.sum( + paddle.exp( + -alpha + * ( + dist_min + / self.atom_radius[ + atom_types[batch_idx == b_idx] + ].unsqueeze(0) + ).unsqueeze(-1) + ), + dim=-2, + ) + minimal_dist_probe[b_idx] = paddle.compat.min(dist_min, dim=-1)[0] + if self.input_infgcn: + probe_vec = probe.reshape(grid.size(0), -1, 3)[ + batch_idx + ] - atom_coord.unsqueeze(-2) + if self.pbc: + probe_vec, frac = pbc_vec(probe_vec, cell[batch_idx]) + density_res = paddle.zeros(grid.size(0), self.num_fourier**3, 1).to( + atom_coord.place + ) + for b_idx in range(grid.size(0)): + if self.model_sharing == False: + density_res[b_idx] = ( + ( + self.orbital(probe_vec[b_idx]) + * infgcn_feat[batch_idx == b_idx].unsqueeze(0) + ) + .sum(dim=-1) + .reshape(-1, 1) + ) + else: + density_res[b_idx] = ( + ( + self.orbital(probe_vec[b_idx]) + * feat[batch_idx == b_idx].unsqueeze(0) + ) + .sum(dim=-1) + .reshape(-1, 1) + ) + density_res = density_res.reshape( + grid.size(0), self.num_fourier, self.num_fourier, self.num_fourier, -1 + ) + if self.model_sharing == True: + infgcn_feat = feat + if self.residual and self.input_infgcn: + res_feat = infgcn_feat + probe_edge_feat_res = o3.spherical_harmonics( + list(range(self.num_spherical + 1)), + probe_edge / (probe_len[..., None] + 1e-08), + normalize=False, + normalization="integral", + ) + residue = self.residue( + (probe_src, probe_dst), + res_feat, + probe_edge_feat_res, + probe_edge_embed, + dim_size=probe_flat.size(0), + ) + density_res = density_res + residue.reshape( + grid.size(0), + self.num_fourier, + self.num_fourier, + self.num_fourier, + -1, + ) + probe_feat = paddle.cat([probe_feat, density_res], dim=-1) + if self.input_dist: + minimal_dist_probe = paddle.exp(-minimal_dist_probe * 0.5).unsqueeze(-1) + minimal_dist_probe = minimal_dist_probe.reshape( + grid.size(0), self.num_fourier, self.num_fourier, self.num_fourier, 1 + ) + probe_feat = paddle.cat([probe_feat, minimal_dist_probe], dim=-1) + if self.atomic_gauss_dist: + atomic_dist_probe = atomic_dist_probe.reshape( + grid.size(0), self.num_fourier, self.num_fourier, self.num_fourier, 10 + ) + probe_feat = paddle.cat([probe_feat, atomic_dist_probe], dim=-1) + fourier_grid = self.get_grid(probe_feat.shape, probe_feat.device) + probe_feat = self.PWNO(probe_feat, fourier_grid) + probe_feat = probe_feat.reshape(-1, probe_feat.size(-1)) + sample_flat = grid.reshape(-1, 3) + sample_batch = ( + paddle.arange(n_graph, device=grid.device) + .repeat_interleave(n_sample) + .detach() + ) + probe_and_node = probe_flat + probe_and_node_batch = probe_batch + if self.pbc: + sample_dst, super_probe_and_node_src = radius( + super_probe_flat, + sample_flat, + self.grid_cutoff, + super_probe_batch, + sample_batch, + ) + probe_and_node_src = super_probe_idx_batch[super_probe_and_node_src] + else: + sample_dst, probe_and_node_src = radius( + probe_and_node, + sample_flat, + self.grid_cutoff, + probe_and_node_batch, + sample_batch, + ) + avg_sample_degree = ( + sample_dst.size(0) / sample_flat.size(0) if sample_flat.size(0) != 0 else 0 + ) + avg_sample_exist_degree = ( + sample_dst.size(0) / sample_dst.unique().size(0) + if sample_dst.unique().size(0) != 0 + else 0 + ) + avg_sample_exist_rate = ( + sample_dst.unique().size(0) / sample_flat.size(0) + if sample_dst.unique().size(0) != 0 + else 0 + ) + if self.pbc: + sample_edge = ( + sample_flat[sample_dst] - super_probe_flat[super_probe_and_node_src] + ) + else: + sample_edge = sample_flat[sample_dst] - probe_flat[probe_and_node_src] + sample_len = paddle.norm(sample_edge, dim=-1) + 1e-08 + sample_edge_feat = o3.spherical_harmonics( + list(range(self.num_spherical_RNO + 1)), + sample_edge / (sample_len[..., None] + 1e-08), + normalize=False, + normalization="integral", + ) + sample_edge_embed = soft_one_hot_linspace( + sample_len, + start=0.0, + end=self.grid_cutoff, + number=self.radial_embed_size, + basis="gaussian", + cutoff=False, + ).mul(self.radial_embed_size**0.5) + probe_and_node_feat = probe_feat + scalar_field_gcn = self.scalar_field_gcn.forward_mean( + (probe_and_node_src, sample_dst), + probe_and_node_feat, + sample_edge_feat, + sample_edge_embed, + dim_size=sample_flat.size(0), + ) + if self.residual: + grid_flat = grid.view(-1, 3) + grid_batch = paddle.arange(n_graph, device=grid.device).repeat_interleave( + n_sample + ) + grid_dst, node_src = radius( + atom_coord, grid_flat, self.cutoff, batch_idx, grid_batch + ) + grid_edge = grid_flat[grid_dst] - atom_coord[node_src] + grid_len = paddle.norm(grid_edge, dim=-1) + 1e-08 + grid_edge_feat = o3.spherical_harmonics( + list(range(self.num_spherical + 1)), + grid_edge / (grid_len[..., None] + 1e-08), + normalize=False, + normalization="integral", + ) + grid_edge_embed = soft_one_hot_linspace( + grid_len, + start=0.0, + end=self.cutoff, + number=self.radial_embed_size, + basis="gaussian", + cutoff=False, + ).mul(self.radial_embed_size**0.5) + res_feat = feat + if self.model_sharing == False: + res_feat = infgcn_feat + residue = self.residue( + (node_src, grid_dst), + res_feat, + grid_edge_feat, + grid_edge_embed, + dim_size=grid_flat.size(0), + ) + else: + residue = 0.0 + sample_vec = grid[batch_idx] - atom_coord.unsqueeze(-2) + if self.pbc: + sample_vec, frac = pbc_vec(sample_vec, cell[batch_idx]) + orbital = self.orbital(sample_vec) + if self.model_sharing == False: + density = (orbital * infgcn_feat.unsqueeze(1)).sum(dim=-1) + else: + density = (orbital * feat.unsqueeze(1)).sum(dim=-1) + density = scatter(density, batch_idx, dim=0, reduce="sum") + #scalar_field = scalar_field_gcn.reshape(grid.size(0), grid.size(1)).real() + scalar_field = scalar_field_gcn.reshape([grid.shape[0], grid.shape[1]]) + if self.residual: + density = density + residue.view(*density.size()) + if self.scalar_mask: + # 修复1:bool转float32 + 移除.cuda(),改用Paddle的设备对齐 + mask_float = mask.astype(paddle.float32).to(scalar_field.place) + scalar_field = scalar_field * mask_float + + if self.scalar_inv: + # 修复2:1 - mask时先转浮点,避免bool运算,同时对齐设备 + mask_inv_float = (1 - mask_float).astype(paddle.float32) + density = density * mask_inv_float + if self.positive_output: + density_res = density + scalar_field + density_res[(density_res < 0) & (density > 0) & (scalar_field < 0)] = 0 + scalar_field[(density_res < 0) & (density > 0) & (scalar_field < 0)] = 0 + density = density_res + else: + density = density + scalar_field + scalar_field_influence = (scalar_field.abs().sum() / density.sum()).detach() + + aux = { + "avg_probe_degree": avg_probe_degree, + "avg_probe_exist_degree": avg_probe_exist_degree, + "avg_probe_exist_rate": avg_probe_exist_rate, + "avg_sample_degree": avg_sample_degree, + "avg_sample_exist_degree": avg_sample_exist_degree, + "avg_sample_exist_rate": avg_sample_exist_rate, + "scalar_field": scalar_field, + "coefficient_field": density - scalar_field, + "scalar_field_influence": scalar_field_influence, + "probe": probe, # ⚠️ 只做 aux,不再 cpu() + } + + return density, aux + + + def get_grid(self, shape, device): + batchsize, size_x, size_y, size_z = shape[0], shape[1], shape[2], shape[3] + gridx = paddle.linspace(0, 1, size_x) + gridx = gridx.reshape(1, size_x, 1, 1, 1).repeat( + [batchsize, 1, size_y, size_z, 1] + ) + gridy = paddle.linspace(0, 1, size_y) + gridy = gridy.reshape(1, 1, size_y, 1, 1).repeat( + [batchsize, size_x, 1, size_z, 1] + ) + gridz = paddle.linspace(0, 1, size_z) + gridz = gridz.reshape(1, 1, 1, size_z, 1).repeat( + [batchsize, size_x, size_y, 1, 1] + ) + return paddle.cat((gridx, gridy, gridz), dim=-1).to(device) diff --git a/ppmat/models/gpwno/GPWNO_utils.py b/ppmat/models/gpwno/GPWNO_utils.py new file mode 100644 index 00000000..ec568107 --- /dev/null +++ b/ppmat/models/gpwno/GPWNO_utils.py @@ -0,0 +1,212 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. +# +# 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. + +import paddle +from ..common.e3nn import o3 +from ..common.e3nn.nn import Activation, Extract, FullyConnectedNet +# from torch_scatter import scatter +from paddle_scatter.scatter import scatter + + + +class ScalarActivation(paddle.nn.Module): + """ + Use the invariant scalar features to gate higher order equivariant features. + Adapted from `e3nn.nn.Gate`. + """ + + def __init__(self, irreps_in, act_scalars, act_gates): + """ + :param irreps_in: input representations + :param act_scalars: scalar activation function + :param act_gates: gate activation function (for higher order features) + """ + super(ScalarActivation, self).__init__() + self.irreps_in = o3.Irreps(irreps_in) + self.num_spherical = len(self.irreps_in) + irreps_scalars = self.irreps_in[0:1] + irreps_gates = irreps_scalars * (self.num_spherical - 1) + irreps_gated = self.irreps_in[1:] + self.act_scalars = Activation(irreps_scalars, [act_scalars]) + self.act_gates = Activation( + irreps_gates, [act_gates] * (self.num_spherical - 1) + ) + self.extract = Extract( + self.irreps_in, + [irreps_scalars, irreps_gated], + instructions=[(0,), tuple(range(1, self.irreps_in.lmax + 1))], + ) + self.mul = o3.ElementwiseTensorProduct(irreps_gates, irreps_gated) + + def forward(self, features): + scalars, gated = self.extract(features) + scalars_out = self.act_scalars(scalars) + if gated.shape[-1]: + gates = self.act_gates(scalars.repeat(1, self.num_spherical - 1)) + gated_out = self.mul(gates, gated) + features = paddle.cat([scalars_out, gated_out], dim=-1) + else: + features = scalars_out + return features + + +class NormActivation(paddle.nn.Module): + """ + Use the norm of the higher order equivariant features to gate themselves. + Idea from the TFN paper. + """ + + def __init__( + self, + irreps_in, + act_scalars=paddle.nn.functional.silu, + act_vectors=paddle.sigmoid, + ): + """ + :param irreps_in: input representations + :param act_scalars: scalar activation function + :param act_vectors: vector activation function (for the norm of higher order features) + """ + super(NormActivation, self).__init__() + self.irreps_in = o3.Irreps(irreps_in) + self.scalar_irreps = self.irreps_in[0:1] + self.vector_irreps = self.irreps_in[1:] + self.act_scalars = act_scalars + self.act_vectors = act_vectors + self.scalar_idx = self.irreps_in[0].mul + inner_out = o3.Irreps([(mul, (0, 1)) for mul, _ in self.vector_irreps]) + self.inner_prod = o3.TensorProduct( + self.vector_irreps, + self.vector_irreps, + inner_out, + [(i, i, i, "uuu", False) for i in range(len(self.vector_irreps))], + ) + self.mul = o3.ElementwiseTensorProduct(inner_out, self.vector_irreps) + + def forward(self, features): + scalars = self.act_scalars(features[..., : self.scalar_idx]) + vectors = features[..., self.scalar_idx :] + norm = paddle.sqrt(self.inner_prod(vectors, vectors) + 1e-08) + act = self.act_vectors(norm) + vectors_out = self.mul(act, vectors) + return paddle.cat([scalars, vectors_out], dim=-1) + + +class GCNLayer(paddle.nn.Module): + def __init__( + self, + irreps_in, + irreps_out, + irreps_edge, + radial_embed_size, + num_radial_layer, + radial_hidden_size, + is_fc=True, + use_sc=True, + irrep_normalization="component", + path_normalization="element", + *args, + **kwargs + ): + """ + A single InfGCN layer for Tensor Product-based message passing. + If the tensor product is fully connected, we have (for every path) + + .. math:: + z_w=\\sum_{uv}w_{uvw}x_u\\otimes y_v=\\sum_{u}w_{uw}x_u \\otimes y + + Else, we have + + .. math:: + z_u=x_u\\otimes \\sum_v w_{uv}y_v=w_u (x_u\\otimes y) + + Here, uvw are radial (channel) indices of the first input, second input, and output, respectively. + Notice that in our model, the second input is always the spherical harmonics of the edge vector, + so the index v can be safely ignored. + + :param irreps_in: irreducible representations of input node features + :param irreps_out: irreducible representations of output node features + :param irreps_edge: irreducible representations of edge features + :param radial_embed_size: embedding size of the edge length + :param num_radial_layer: number of hidden layers in the radial network + :param radial_hidden_size: hidden size of the radial network + :param is_fc: whether to use fully connected tensor product + :param use_sc: whether to use self-connection + :param irrep_normalization: representation normalization passed to the `o3.FullyConnectedTensorProduct` + :param path_normalization: path normalization passed to the `o3.FullyConnectedTensorProduct` + """ + super(GCNLayer, self).__init__() + self.irreps_in = o3.Irreps(irreps_in) + self.irreps_out = o3.Irreps(irreps_out) + self.irreps_edge = o3.Irreps(irreps_edge) + self.radial_embed_size = radial_embed_size + self.num_radial_layer = num_radial_layer + self.radial_hidden_size = radial_hidden_size + self.is_fc = is_fc + self.use_sc = use_sc + if self.is_fc: + self.tp = o3.FullyConnectedTensorProduct( + self.irreps_in, + self.irreps_edge, + self.irreps_out, + internal_weights=False, + shared_weights=False, + irrep_normalization=irrep_normalization, + path_normalization=path_normalization, + ) + else: + instr = [ + (i_1, i_2, i_out, "uvu", True) + for i_1, (_, ir_1) in enumerate(self.irreps_in) + for i_2, (_, ir_edge) in enumerate(self.irreps_edge) + for i_out, (_, ir_out) in enumerate(self.irreps_out) + if ir_out in ir_1 * ir_edge + ] + self.tp = o3.TensorProduct( + self.irreps_in, + self.irreps_edge, + self.irreps_out, + instr, + internal_weights=False, + shared_weights=False, + irrep_normalization=irrep_normalization, + path_normalization=path_normalization, + ) + self.fc = FullyConnectedNet( + [radial_embed_size] + + num_radial_layer * [radial_hidden_size] + + [self.tp.weight_numel], + paddle.nn.functional.silu, + ) + self.sc = None + if self.use_sc: + self.sc = o3.Linear(self.irreps_in, self.irreps_out) + + def forward(self, edge_index, node_feat, edge_feat, edge_embed, dim_size=None): + src, dst = edge_index + weight = self.fc(edge_embed) + out = self.tp(node_feat[src], edge_feat, weight=weight) + out = scatter(out, dst, dim=0, dim_size=dim_size, reduce="sum") + if self.use_sc: + out = out + self.sc(node_feat) + return out + + def forward_mean(self, edge_index, node_feat, edge_feat, edge_embed, dim_size=None): + src, dst = edge_index + weight = self.fc(edge_embed) + out = self.tp(node_feat[src], edge_feat, weight=weight) + out = scatter(out, dst, dim=0, dim_size=dim_size, reduce="mean") + if self.use_sc: + out = out + self.sc(node_feat) + return out diff --git a/ppmat/models/gpwno/PWNO_utils.py b/ppmat/models/gpwno/PWNO_utils.py new file mode 100644 index 00000000..86b0336d --- /dev/null +++ b/ppmat/models/gpwno/PWNO_utils.py @@ -0,0 +1,180 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. +# +# 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. + +import numpy as np +import paddle + + +class SpectralConv3d(paddle.nn.Module): + def __init__(self, in_channels, out_channels, modes1, modes2, modes3): + super(SpectralConv3d, self).__init__() + """ + 3D Fourier layer. It does FFT, linear transform, and Inverse FFT. + """ + self.in_channels = in_channels + self.out_channels = out_channels + self.modes1 = modes1 + self.modes2 = modes2 + self.modes3 = modes3 + self.scale = 1 / (in_channels * out_channels) + self.weights1 = paddle.nn.Parameter( + self.scale + * paddle.rand( + in_channels, + out_channels, + self.modes1, + self.modes2, + self.modes3, + dtype=paddle.complex64, + ) + ) + self.weights2 = paddle.nn.Parameter( + self.scale + * paddle.rand( + in_channels, + out_channels, + self.modes1, + self.modes2, + self.modes3, + dtype=paddle.complex64, + ) + ) + self.weights3 = paddle.nn.Parameter( + self.scale + * paddle.rand( + in_channels, + out_channels, + self.modes1, + self.modes2, + self.modes3, + dtype=paddle.complex64, + ) + ) + self.weights4 = paddle.nn.Parameter( + self.scale + * paddle.rand( + in_channels, + out_channels, + self.modes1, + self.modes2, + self.modes3, + dtype=paddle.complex64, + ) + ) + + def compl_mul3d(self, input, weights): + return paddle.einsum("bixyz,ioxyz->boxyz", input, weights) + + def forward(self, x): + batchsize = x.shape[0] + # ✅ 修复1:rfftn的dim传列表(多维FFT要求) + x_ft = paddle.fft.rfftn(x, dim=[-3, -2, -1], norm="ortho") + # ✅ 修复2:Paddle创建张量,替换new_zeros,修正device为place + out_ft = paddle.zeros( + [ + batchsize, + self.out_channels, + x.shape[-3], + x.shape[-2], + x.shape[-1] // 2 + 1, + ], + dtype=paddle.complex64, + device=x.device, + ) + # 维度切片赋值(原逻辑正确,保留) + out_ft[:, :, : self.modes1, : self.modes2, : self.modes3] = self.compl_mul3d( + x_ft[:, :, : self.modes1, : self.modes2, : self.modes3], self.weights1 + ) + out_ft[:, :, -self.modes1 :, : self.modes2, : self.modes3] = self.compl_mul3d( + x_ft[:, :, -self.modes1 :, : self.modes2, : self.modes3], self.weights2 + ) + out_ft[:, :, : self.modes1, -self.modes2 :, : self.modes3] = self.compl_mul3d( + x_ft[:, :, : self.modes1, -self.modes2 :, : self.modes3], self.weights3 + ) + out_ft[:, :, -self.modes1 :, -self.modes2 :, : self.modes3] = self.compl_mul3d( + x_ft[:, :, -self.modes1 :, -self.modes2 :, : self.modes3], self.weights4 + ) + # ✅ 修复3:irfftn的dim传列表(多维逆FFT要求) + x = paddle.fft.irfftn(out_ft, s=(x.shape[-3], x.shape[-2], x.shape[-1]), dim=[-3, -2, -1], norm="ortho") + return x + + +class SpectralConv3d_FFNO(paddle.nn.Module): + def __init__(self, in_channels, out_channels, modes1, modes2, modes3): + super(SpectralConv3d_FFNO, self).__init__() + """ + 3D Fourier layer (FFNO版本). 修正Paddle兼容问题 + 维度对齐 + """ + self.in_channels = in_channels + self.out_channels = out_channels + self.modes_x = modes1 + self.modes_y = modes2 + self.modes_z = modes3 + self.fourier_weight = paddle.nn.ParameterList(parameters=[]) + for n_modes in [self.modes_x, self.modes_y, self.modes_z]: + # ✅ 修复4:Paddle创建参数,替换FloatTensor,指定dtype + weight = paddle.randn([in_channels, out_channels, n_modes, 2], dtype=paddle.float32) + paddle.nn.init.xavier_normal_(weight) + self.fourier_weight.append(paddle.nn.Parameter(weight)) + + def forward(self, x): + B, I, S1, S2, S3 = x.shape # [batch, in_ch, x, y, z] + + # -------------------------- 处理z轴 (dim=-1) -------------------------- + # ✅ 修复5:rfftn传列表,irfft传单个整数 + x_ftz = paddle.fft.rfftn(x, dim=[-1,], norm="ortho") + # ✅ 修复6:替换new_zeros为paddle.zeros,修正形状和device + out_ft = x_ftz.new_zeros(B, I, S1, S2, S3 // 2 + 1) + # einsum公式匹配维度,避免形状不匹配 + out_ft[:, :, :, :, : self.modes_z] = paddle.einsum( + "bixyz,ioz->boxyz", + x_ftz[:, :, :, :, : self.modes_z], + paddle.view_as_complex(self.fourier_weight[2]) + ) + # ✅ 修复7:irfft传单个整数dim=-1,移除重复调用 + xz = paddle.fft.irfft(out_ft, n=S3, dim=-1, norm="ortho") + + # -------------------------- 处理y轴 (dim=-2) -------------------------- + x_fty = paddle.fft.rfftn(x, dim=[-2,], norm="ortho") + out_ft = x_ftz.new_zeros(B, I, S1, S2 // 2 + 1, S3) + out_ft[:, :, :, : self.modes_y, :] = paddle.einsum( + "bixyz,ioy->boxyz", + x_fty[:, :, :, : self.modes_y, :], + paddle.view_as_complex(self.fourier_weight[1]) + ) + xy = paddle.fft.irfft(out_ft, n=S2, dim=-2, norm="ortho") + + # -------------------------- 处理x轴 (dim=-3) -------------------------- + # ✅ 修复8:修正FFT维度为dim=-3(x轴),而非dim=-1 + x_ftx = paddle.fft.rfftn(x, dim=[-3,], norm="ortho") + out_ft = x_ftz.new_zeros(B, I, S1 // 2 + 1, S2, S3) + out_ft[:, :, : self.modes_x, :, :] = paddle.einsum( + "bixyz,iox->boxyz", + x_ftx[:, :, : self.modes_x, :, :], + paddle.view_as_complex(self.fourier_weight[0]) + ) + # ✅ 修复9:irfft传单个整数dim=-3,而非列表 + xx = paddle.fft.irfft(out_ft, n=S1, dim=-3, norm="ortho") + + # 求和输出 + x = xx + xy + xz + return x + + +def plane_wave_sum(x): + N = x.shape[-1] # ✅ 修复10:Paddle用shape而非size + n = paddle.arange(N).float().to(x.device) # ✅ 修正device为place + k = n.unsqueeze(1) # ✅ 修复11:Paddle用unsqueeze而非view + M = paddle.exp(-2.0j * np.pi * k * n) + return paddle.matmul(M, x) From 34105f6da7a1af0720865339b8d4cc7d91ee00b0 Mon Sep 17 00:00:00 2001 From: yqf66 Date: Sat, 27 Jun 2026 14:57:16 +0800 Subject: [PATCH 2/2] Update GPWNO docs and QM9 results --- electronic_structure/README.md | 2 +- electronic_structure/configs/gpwno/README.md | 32 +++- .../configs/gpwno/gpwno_qm9.yaml | 167 ++++++++++++++++++ electronic_structure/docs/gpwno_overview.png | Bin 0 -> 227995 bytes ppmat/models/gpwno/GPWNO.py | 7 +- ppmat/models/gpwno/PWNO_utils.py | 43 ++--- 6 files changed, 220 insertions(+), 31 deletions(-) create mode 100644 electronic_structure/configs/gpwno/gpwno_qm9.yaml create mode 100644 electronic_structure/docs/gpwno_overview.png diff --git a/electronic_structure/README.md b/electronic_structure/README.md index 63960ad3..351e2ee7 100644 --- a/electronic_structure/README.md +++ b/electronic_structure/README.md @@ -27,7 +27,7 @@ Machine Learning Electronic Structure (MLES) is an emerging paradigm in computat | **Materials Project** | | | | MP_EC | ✅ | ✅ | | MD17_EC | ✅ | ✅ | -| QM9_EC | ✅ | — | +| QM9_EC | ✅ | ✅ | | OMol25_EC | ✅ | — | **Notice**:🌟 represent originate research work published from paddlematerials toolkit diff --git a/electronic_structure/configs/gpwno/README.md b/electronic_structure/configs/gpwno/README.md index 48458044..16c67bde 100644 --- a/electronic_structure/configs/gpwno/README.md +++ b/electronic_structure/configs/gpwno/README.md @@ -8,6 +8,10 @@ Official implementation: [seongsukim-ml/GPWNO](https://github.com/seongsukim-ml/ GPWNO is an equivariant neural operator for electron-density estimation. It combines atom-centered Gaussian basis functions with a plane-wave neural operator, allowing the model to capture both local atomic environments and global Fourier-space density patterns. The model follows the same electron-density prediction setting as InfGCN and was originally built on top of a similar data pipeline. +
+ GPWNO overview +
+ --- ## Model Description @@ -71,6 +75,7 @@ $$ GPWNO uses the same electron-density datasets and dataloaders as InfGCN. - **MD17_EC**: Small-molecule molecular dynamics electron-density data. The supported molecules include benzene, ethanol, phenol, resorcinol, ethane, and malonaldehyde. [Data](https://paddle-org.bj.bcebos.com/paddlematerials/datasets/MD17_ES/md17_es.tar.gz). +- **QM9_EC**: QM9 molecule electron-density data stored as `qm9.json`, `qm9_data_split.json`, and `*.CHGCAR.lz4` files under `./data/data_qm9`. Data link: TBD. - **MP_EC (cubic)**: Materials Project-style crystal electron densities stored as `*.json.xz` under `./data/data_mp`. [Data](https://paddle-org.bj.bcebos.com/paddlematerials/datasets/MP_ES/mp_es.tar), [atom dictionary](https://paddle-org.bj.bcebos.com/paddlematerials/datasets/MP_ES/crystal.json), [split file](https://paddle-org.bj.bcebos.com/paddlematerials/datasets/MP_ES/crystal_data_split.json). --- @@ -82,6 +87,7 @@ The PaddleMaterials configs follow the original GPWNO hyper-parameter choices: | Dataset | Original model profile | Main differences | | --- | --- | --- | | MD17_EC | `GPWNO_MD.yaml` | `num_spherical=3`, `num_fourier=40`, `padding=4`, `use_max_cell=true`, `equivariant_frame=true`, `residual=false` | +| QM9_EC | `GPWNO_QM9.yaml` | `num_spherical=4`, `num_fourier=40`, `padding=4`, `use_max_cell=true`, `equivariant_frame=true`, `residual=true` | | MP_EC | `GPWNO_pbc.yaml` | `pbc=true`, `num_fourier=20`, `padding=0`, `use_max_cell=false`, `max_cell_size=324`, `equivariant_frame=false` | --- @@ -119,6 +125,15 @@ The PaddleMaterials configs follow the original GPWNO hyper-parameter choices: gpwno_md17_ethane TBD + + gpwno_qm9 + QM9_EC + 7.4001% (test, 2 epochs) + 3 + 36hour33min + gpwno_qm9 + TBD + gpwno_mp MP_EC (cubic) @@ -135,9 +150,9 @@ Note: The MD17_EC_Benzene result is reported from the epoch-10 validation of the Note: The MD17_EC_Ethane result is reported from the final test set evaluation of the local run `gpwno_md17_ethane_t_20260529_204928_s_42`. The final validation NMAE is `4.8302%`, and the final test NMAE is `4.8339%`. -Note: The MP_EC result is reported from the final test set evaluation of the local run `gpwno_mp_resume_t_20260528_204842_s_42`. The final validation NMAE is `34.8928%`, and the final test NMAE is `37.8910%`. +Note: The QM9_EC result is reported from the final test set evaluation of the local run `gpwno_qm9_t_20260626_164201_s_42`, which resumed from `gpwno_qm9_t_20260625_221247_s_42/checkpoints/latest`. The best validation NMAE is `7.0865%`, and the final test NMAE is `7.4001%`. The corresponding checkpoint is `checkpoints/best.pdparams`. -Note: Checkpoint and log links are reserved as `TBD`. The local checkpoints and logs are not submitted in this PR; they will be uploaded separately by the project maintainers and replaced with Paddle-hosted links after conversion. +Note: The MP_EC result is reported from the final test set evaluation of the local run `gpwno_mp_resume_t_20260528_204842_s_42`. The final validation NMAE is `34.8928%`, and the final test NMAE is `37.8910%`. --- @@ -150,6 +165,9 @@ The datasets are downloaded automatically by the dataset classes when the config ```bash # MD17_EC will be prepared under ./data/data_md python electronic_structure/train.py -c electronic_structure/configs/gpwno/gpwno_md17_ethane.yaml Global.do_train=False Global.do_eval=False Global.do_test=True + +# QM9_EC will be prepared under ./data/data_qm9 after the dataset package is downloaded and extracted +python electronic_structure/train.py -c electronic_structure/configs/gpwno/gpwno_qm9.yaml Global.do_train=False Global.do_eval=False Global.do_test=True ``` ### Training @@ -160,18 +178,28 @@ python electronic_structure/train.py -c electronic_structure/configs/gpwno/gpwno # multi-gpu training python -m paddle.distributed.launch --gpus="0,1,2,3" electronic_structure/train.py -c electronic_structure/configs/gpwno/gpwno_md17_benzene.yaml + +# QM9_EC multi-gpu training +python -m paddle.distributed.launch --gpus="0,1,2" electronic_structure/train.py -c electronic_structure/configs/gpwno/gpwno_qm9.yaml + +# resume training from checkpoint +python -m paddle.distributed.launch --gpus="0,1,2" electronic_structure/train.py -c electronic_structure/configs/gpwno/gpwno_qm9.yaml Trainer.resume_from_checkpoint='path/to/checkpoints/latest' ``` ### Validation ```bash python electronic_structure/train.py -c electronic_structure/configs/gpwno/gpwno_md17_ethane.yaml Global.do_train=False Global.do_eval=True Global.do_test=False Trainer.pretrained_model_path='path/to/model.pdparams' + +python electronic_structure/train.py -c electronic_structure/configs/gpwno/gpwno_qm9.yaml Global.do_train=False Global.do_eval=True Global.do_test=False Trainer.pretrained_model_path='path/to/checkpoints/best.pdparams' ``` ### Testing ```bash python electronic_structure/train.py -c electronic_structure/configs/gpwno/gpwno_md17_ethane.yaml Global.do_train=False Global.do_eval=False Global.do_test=True Trainer.pretrained_model_path='path/to/model.pdparams' + +python electronic_structure/train.py -c electronic_structure/configs/gpwno/gpwno_qm9.yaml Global.do_train=False Global.do_eval=False Global.do_test=True Trainer.pretrained_model_path='path/to/checkpoints/best.pdparams' ``` ### Prediction diff --git a/electronic_structure/configs/gpwno/gpwno_qm9.yaml b/electronic_structure/configs/gpwno/gpwno_qm9.yaml new file mode 100644 index 00000000..29943cad --- /dev/null +++ b/electronic_structure/configs/gpwno/gpwno_qm9.yaml @@ -0,0 +1,167 @@ +Global: + do_train: True + do_eval: True + do_test: True + use_voxel: False + +Trainer: + max_epochs: 2 + max_iter: null + seed: 42 + output_dir: ./output/gpwno_qm9 + save_freq: 1 + log_freq: 1 + start_eval_epoch: 0 + eval_freq: 1 + pretrained_model_path: null + pretrained_weight_name: null + resume_from_checkpoint: null + use_amp: False + amp_level: 'O1' + eval_with_no_grad: True + gradient_accumulation_steps: 1 + best_metric_indicator: 'eval_loss' + name_for_best_metric: "mae" + greater_is_better: False + compute_metric_during_train: True + metric_strategy_during_eval: 'epoch' + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: GPWNO + __init_params__: + n_atom_type: 5 + num_radial: 16 + num_spherical: 4 + radial_embed_size: 64 + radial_hidden_size: 128 + num_radial_layer: 2 + num_gcn_layer: 2 + cutoff: 3.0 + grid_cutoff: 0.75 + probe_cutoff: 1.5 + is_fc: false + gauss_start: 0.5 + gauss_end: 5.0 + residual: true + pbc: false + activation: norm + num_fourier: 40 + num_fourier_time: 12 + width: 16 + fourier_mode: 0 + padding: 4 + use_max_cell: true + max_cell_size: 20 + equivariant_frame: true + normalize: true + using_ff: true + model_sharing: false + num_infgcn_layer: 3 + use_detach: false + num_spherical_RNO: 4 + scalar_mask: true + mask_cutoff: 3.0 + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 0.005 + factor: 0.5 + patience: 5 + min_lr: 0.00001 + by_epoch: True + indicator: "eval_loss" + indicator_name: "loss" + weight_decay: 0.000000000001 + beta1: 0.9 + beta2: 0.999 + +Dataset: + train: + dataset: + __class_name__: DensityDataset + __init_params__: + root: ./data/data_qm9 + split_file: qm9_data_split.json + atom_file: ./data/data_qm9/qm9.json + extension: CHGCAR + compression: lz4 + pbc: false + split: "train" + enable_cache: false + overwrite: false + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 32 + loader: + num_workers: 4 + use_shared_memory: False + collate_fn: DensityCollator + collate_params: + n_samples: 1024 + val: + dataset: + __class_name__: DensityDataset + __init_params__: + root: ./data/data_qm9 + split_file: qm9_data_split.json + atom_file: ./data/data_qm9/qm9.json + extension: CHGCAR + compression: lz4 + pbc: false + split: "validation" + enable_cache: false + overwrite: false + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 32 + loader: + num_workers: 4 + use_shared_memory: False + collate_fn: DensityCollator + collate_params: + n_samples: 2048 + test: + dataset: + __class_name__: DensityDataset + __init_params__: + root: ./data/data_qm9 + split_file: qm9_data_split.json + atom_file: ./data/data_qm9/qm9.json + extension: CHGCAR + compression: lz4 + pbc: false + split: "test" + rotate: false + enable_cache: false + overwrite: false + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 8 + loader: + num_workers: 4 + use_shared_memory: False + collate_fn: DensityCollator + collate_params: + n_samples: 2048 + +Predict: + eval_with_no_grad: True + num_infer: 100 + num_vis: 2 + inf_samples: 4096 diff --git a/electronic_structure/docs/gpwno_overview.png b/electronic_structure/docs/gpwno_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..973e6e9a33757a8dcc0e5d1c681c574e4f4b9b63 GIT binary patch literal 227995 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 z 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 E2SUpU^8f$< literal 0 HcmV?d00001 diff --git a/ppmat/models/gpwno/GPWNO.py b/ppmat/models/gpwno/GPWNO.py index 12c772c7..a03cd1d1 100644 --- a/ppmat/models/gpwno/GPWNO.py +++ b/ppmat/models/gpwno/GPWNO.py @@ -863,12 +863,11 @@ def _forward_density(self,atom_types,atom_coord,grid,batch_idx,infos,): if self.residual: density = density + residue.view(*density.size()) if self.scalar_mask: - # 修复1:bool转float32 + 移除.cuda(),改用Paddle的设备对齐 + # Match the mask dtype and device with the scalar field. mask_float = mask.astype(paddle.float32).to(scalar_field.place) scalar_field = scalar_field * mask_float - + if self.scalar_inv: - # 修复2:1 - mask时先转浮点,避免bool运算,同时对齐设备 mask_inv_float = (1 - mask_float).astype(paddle.float32) density = density * mask_inv_float if self.positive_output: @@ -890,7 +889,7 @@ def _forward_density(self,atom_types,atom_coord,grid,batch_idx,infos,): "scalar_field": scalar_field, "coefficient_field": density - scalar_field, "scalar_field_influence": scalar_field_influence, - "probe": probe, # ⚠️ 只做 aux,不再 cpu() + "probe": probe, } return density, aux diff --git a/ppmat/models/gpwno/PWNO_utils.py b/ppmat/models/gpwno/PWNO_utils.py index 86b0336d..0ab5d59b 100644 --- a/ppmat/models/gpwno/PWNO_utils.py +++ b/ppmat/models/gpwno/PWNO_utils.py @@ -78,9 +78,8 @@ def compl_mul3d(self, input, weights): def forward(self, x): batchsize = x.shape[0] - # ✅ 修复1:rfftn的dim传列表(多维FFT要求) + # Pass explicit dimensions for the 3D real FFT. x_ft = paddle.fft.rfftn(x, dim=[-3, -2, -1], norm="ortho") - # ✅ 修复2:Paddle创建张量,替换new_zeros,修正device为place out_ft = paddle.zeros( [ batchsize, @@ -92,7 +91,6 @@ def forward(self, x): dtype=paddle.complex64, device=x.device, ) - # 维度切片赋值(原逻辑正确,保留) out_ft[:, :, : self.modes1, : self.modes2, : self.modes3] = self.compl_mul3d( x_ft[:, :, : self.modes1, : self.modes2, : self.modes3], self.weights1 ) @@ -105,8 +103,13 @@ def forward(self, x): out_ft[:, :, -self.modes1 :, -self.modes2 :, : self.modes3] = self.compl_mul3d( x_ft[:, :, -self.modes1 :, -self.modes2 :, : self.modes3], self.weights4 ) - # ✅ 修复3:irfftn的dim传列表(多维逆FFT要求) - x = paddle.fft.irfftn(out_ft, s=(x.shape[-3], x.shape[-2], x.shape[-1]), dim=[-3, -2, -1], norm="ortho") + # Use the original spatial shape for the inverse 3D real FFT. + x = paddle.fft.irfftn( + out_ft, + s=(x.shape[-3], x.shape[-2], x.shape[-1]), + dim=[-3, -2, -1], + norm="ortho", + ) return x @@ -114,7 +117,7 @@ class SpectralConv3d_FFNO(paddle.nn.Module): def __init__(self, in_channels, out_channels, modes1, modes2, modes3): super(SpectralConv3d_FFNO, self).__init__() """ - 3D Fourier layer (FFNO版本). 修正Paddle兼容问题 + 维度对齐 + 3D Fourier layer for FFNO-style factorized spectral convolution. """ self.in_channels = in_channels self.out_channels = out_channels @@ -123,29 +126,24 @@ def __init__(self, in_channels, out_channels, modes1, modes2, modes3): self.modes_z = modes3 self.fourier_weight = paddle.nn.ParameterList(parameters=[]) for n_modes in [self.modes_x, self.modes_y, self.modes_z]: - # ✅ 修复4:Paddle创建参数,替换FloatTensor,指定dtype weight = paddle.randn([in_channels, out_channels, n_modes, 2], dtype=paddle.float32) paddle.nn.init.xavier_normal_(weight) self.fourier_weight.append(paddle.nn.Parameter(weight)) def forward(self, x): B, I, S1, S2, S3 = x.shape # [batch, in_ch, x, y, z] - - # -------------------------- 处理z轴 (dim=-1) -------------------------- - # ✅ 修复5:rfftn传列表,irfft传单个整数 + + # Spectral convolution along the z axis. x_ftz = paddle.fft.rfftn(x, dim=[-1,], norm="ortho") - # ✅ 修复6:替换new_zeros为paddle.zeros,修正形状和device out_ft = x_ftz.new_zeros(B, I, S1, S2, S3 // 2 + 1) - # einsum公式匹配维度,避免形状不匹配 out_ft[:, :, :, :, : self.modes_z] = paddle.einsum( "bixyz,ioz->boxyz", x_ftz[:, :, :, :, : self.modes_z], paddle.view_as_complex(self.fourier_weight[2]) ) - # ✅ 修复7:irfft传单个整数dim=-1,移除重复调用 xz = paddle.fft.irfft(out_ft, n=S3, dim=-1, norm="ortho") - - # -------------------------- 处理y轴 (dim=-2) -------------------------- + + # Spectral convolution along the y axis. x_fty = paddle.fft.rfftn(x, dim=[-2,], norm="ortho") out_ft = x_ftz.new_zeros(B, I, S1, S2 // 2 + 1, S3) out_ft[:, :, :, : self.modes_y, :] = paddle.einsum( @@ -154,9 +152,8 @@ def forward(self, x): paddle.view_as_complex(self.fourier_weight[1]) ) xy = paddle.fft.irfft(out_ft, n=S2, dim=-2, norm="ortho") - - # -------------------------- 处理x轴 (dim=-3) -------------------------- - # ✅ 修复8:修正FFT维度为dim=-3(x轴),而非dim=-1 + + # Spectral convolution along the x axis. x_ftx = paddle.fft.rfftn(x, dim=[-3,], norm="ortho") out_ft = x_ftz.new_zeros(B, I, S1 // 2 + 1, S2, S3) out_ft[:, :, : self.modes_x, :, :] = paddle.einsum( @@ -164,17 +161,15 @@ def forward(self, x): x_ftx[:, :, : self.modes_x, :, :], paddle.view_as_complex(self.fourier_weight[0]) ) - # ✅ 修复9:irfft传单个整数dim=-3,而非列表 xx = paddle.fft.irfft(out_ft, n=S1, dim=-3, norm="ortho") - - # 求和输出 + x = xx + xy + xz return x def plane_wave_sum(x): - N = x.shape[-1] # ✅ 修复10:Paddle用shape而非size - n = paddle.arange(N).float().to(x.device) # ✅ 修正device为place - k = n.unsqueeze(1) # ✅ 修复11:Paddle用unsqueeze而非view + N = x.shape[-1] + n = paddle.arange(N).float().to(x.device) + k = n.unsqueeze(1) M = paddle.exp(-2.0j * np.pi * k * n) return paddle.matmul(M, x)