From 696cec4b456bce9744f4ff4751f82eaf5460a226 Mon Sep 17 00:00:00 2001 From: Yuheng Wang Date: Mon, 31 Mar 2025 12:02:02 +0800 Subject: [PATCH] chem_update_330 --- .../chemistry_config/dependent_packages.yaml | 2 +- MindChemistry/README.md | 100 ++- MindChemistry/README_CN.md | 104 +-- MindChemistry/RELEASE.md | 31 +- MindChemistry/RELEASE_CN.md | 29 + MindChemistry/applications/cdvae/README.md | 131 --- .../applications/cdvae/compute_metrics.py | 321 -------- .../applications/cdvae/conf/configs.yaml | 65 -- .../cdvae/conf/data/carbon_24.yaml | 12 - .../applications/cdvae/conf/data/mp_20.yaml | 12 - .../applications/cdvae/conf/data/perov_5.yaml | 12 - .../applications/cdvae/create_dataset.py | 341 -------- .../applications/cdvae/evaluation.py | 192 ----- .../cdvae/images/illustrative.png | Bin 177452 -> 0 bytes .../applications/cdvae/mp_20_process.py | 72 -- .../applications/cdvae/requirements.txt | 12 - .../applications/cdvae/src/__init__.py | 15 - .../applications/cdvae/src/dataloader.py | 233 ------ .../applications/cdvae/src/evaluate_utils.py | 191 ----- .../applications/cdvae/src/metrics_utils.py | 191 ----- MindChemistry/applications/cdvae/train.py | 185 ----- MindChemistry/docs/high-alloy.png | Bin 19722 -> 0 bytes MindChemistry/docs/high-alloy_cn.png | Bin 18531 -> 0 bytes MindChemistry/docs/mindchemistry_arch.png | Bin 36302 -> 0 bytes MindChemistry/docs/mindchemistry_archi.png | Bin 0 -> 73289 bytes MindChemistry/docs/mindchemistry_archi_cn.png | Bin 32772 -> 65352 bytes MindChemistry/mindchemistry/cell/__init__.py | 2 - .../mindchemistry/cell/cdvae/__init__.py | 19 - .../mindchemistry/cell/cdvae/cdvae.py | 777 ------------------ .../mindchemistry/cell/cdvae/decoder.py | 88 -- MindChemistry/mindchemistry/e3/o3/rotation.py | 2 +- MindChemistry/version.txt | 1 + .../mindchemistry.e3.o3.matrix_to_angles.rst | 2 +- 33 files changed, 166 insertions(+), 2976 deletions(-) delete mode 100644 MindChemistry/applications/cdvae/README.md delete mode 100644 MindChemistry/applications/cdvae/compute_metrics.py delete mode 100644 MindChemistry/applications/cdvae/conf/configs.yaml delete mode 100644 MindChemistry/applications/cdvae/conf/data/carbon_24.yaml delete mode 100644 MindChemistry/applications/cdvae/conf/data/mp_20.yaml delete mode 100644 MindChemistry/applications/cdvae/conf/data/perov_5.yaml delete mode 100644 MindChemistry/applications/cdvae/create_dataset.py delete mode 100644 MindChemistry/applications/cdvae/evaluation.py delete mode 100644 MindChemistry/applications/cdvae/images/illustrative.png delete mode 100644 MindChemistry/applications/cdvae/mp_20_process.py delete mode 100644 MindChemistry/applications/cdvae/requirements.txt delete mode 100644 MindChemistry/applications/cdvae/src/__init__.py delete mode 100644 MindChemistry/applications/cdvae/src/dataloader.py delete mode 100644 MindChemistry/applications/cdvae/src/evaluate_utils.py delete mode 100644 MindChemistry/applications/cdvae/src/metrics_utils.py delete mode 100644 MindChemistry/applications/cdvae/train.py delete mode 100644 MindChemistry/docs/high-alloy.png delete mode 100644 MindChemistry/docs/high-alloy_cn.png delete mode 100644 MindChemistry/docs/mindchemistry_arch.png create mode 100644 MindChemistry/docs/mindchemistry_archi.png delete mode 100644 MindChemistry/mindchemistry/cell/cdvae/__init__.py delete mode 100644 MindChemistry/mindchemistry/cell/cdvae/cdvae.py delete mode 100644 MindChemistry/mindchemistry/cell/cdvae/decoder.py diff --git a/.jenkins/test/config/chemistry_config/dependent_packages.yaml b/.jenkins/test/config/chemistry_config/dependent_packages.yaml index 14e9969f1..9e70df642 100644 --- a/.jenkins/test/config/chemistry_config/dependent_packages.yaml +++ b/.jenkins/test/config/chemistry_config/dependent_packages.yaml @@ -1,2 +1,2 @@ mindspore: - '/mindspore/mindspore/version/202411/20241129/r2.4.1_20241129194610_0fd8a04edb85b498cc12d9c41216e3e78cbc8564_newest/' \ No newline at end of file + '/mindspore/mindspore/version/202503/20250326/master_20250326010019_b91eca2945e61641319f9887aa76a1ccb38604d3_newest/' \ No newline at end of file diff --git a/MindChemistry/README.md b/MindChemistry/README.md index 93cdf9d70..6c02d93fd 100644 --- a/MindChemistry/README.md +++ b/MindChemistry/README.md @@ -1,17 +1,24 @@ - ENGLISH | [简体中文](README_CN.md) +# MindSpore Chemistry + +[查看中文](README_CN.md) [![PyPI](https://badge.fury.io/py/mindspore.svg)](https://badge.fury.io/py/mindspore) [![LICENSE](https://img.shields.io/github/license/mindspore-ai/mindspore.svg?style=flat-square)](https://github.com/mindspore-ai/mindspore/blob/master/LICENSE) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](https://gitee.com/mindspore/mindscience/pulls) -# MindSpore Chemistry +--- + +## Contents - [MindSpore Chemistry](#mindspore-chemistry) + - [Contents](#contents) - [Introduction](#introduction) - [Latest News](#latest-news) - - [Features](#features) - - [Applications](#applications) - - [Modules](#modules) + - [Applications](#applications) + - [Force Prediction](#force-prediction) + - [DFT Prediction](#dft-prediction) + - [Property Prediction](#property-prediction) + - [Structure Generation](#structure-generation) - [Installation](#installation) - [Version Dependency](#version-dependency) - [Dependency](#dependency) @@ -23,6 +30,8 @@ - [License](#license) - [References](#references) +--- + ## Introduction Conventional chemistry studies have long been confronted with numerous challenges. The process of experimental design, synthesis, characterization, and analysis can be time-consuming, costly, and highly dependent on experts’ experiences. @@ -30,56 +39,44 @@ The synergy between AI and chemistry offers unprecedented opportunities to overc **MindSpore Chemistry**(MindChemistry) is a toolkit built on MindSpore endeavoring to integrate AI with conventional chemistry research. It supports multi-scale tasks including molecular generation, property prediction and synthesis optimization on multiple chemistry systems such as organic, inorganic and composites chemistry systems. MindChemistry dedicates to enabling the joint research of AI and chemistry with high efficiency, and seek to facilitate an innovative paradigm of joint research between AI and chemistry, providing experts with novel perspectives and efficient tools. -
MindFlow Architecture
+
MindChemistry Architecture
## Latest News -- 🔥`2024.07.30` MindChemistry 0.1.0 is released. - -## Features +- `2025.03.30` MindChemistry 0.2.0 has been released, featuring several powerful applications, including NequIP, Allegro, DeephE3nn, Matformer, and DiffCSP. +- `2024.07.30` MindChemistry 0.1.0 has been released. -### Applications +## Applications -- Material Generation - - **Scenario**:Inorganic chemistry - - **Dataset**:High-entropy alloy dataset. The high-entropy alloy dataset includes the chemical composition of known high-entropy alloys and thermodynamic properties of the alloys. It provides chemical composition information such as the metal element types and corresponding percentages as well as thermodynamic properties such as magnetostrictive effects and Curie temperatures. - - **Task**:High-entropy alloy composition design. We integrate Machine learning-enabled high-entropy alloy discovery[1] approach for designing novel high-entropy alloys with low thermal expansion coefficients(TEC) in active learning fashion. In the active learning circle, candidates of high-enropy alloys are firstly generated based on the AI model and the candidate components are filtered based on the prediction model and the predicted thermal expansion coefficient calculated by the thermodynamics. Finally, the researchers need to determine the final high-entropy alloy components based on experimental verification. +### Force Prediction -
high-alloy
- -- **Property Prediction**: - - **Scenario**:Organic chemistry - - **Dataset**: Revised Molecular Dynamics 17(rMD17). rMD17 dataset includes molecular dynamics simulations of multiple organic chemical moleculars. It provides chemical desciptive information such as the atomic numbers and positions as well as molecular property information such as energies and forces. - - **Task**:Molecular energy prediction. We integrate the NequIP model [2] and Allegro model [3], according to the position of each atom in the molecular system and structure description of the atomic number information construction diagram, and calculate the energy of the molecular system based on the equivariant calculation and graph neural network. +- **Scenario**:Organic chemistry +- **Dataset**: Revised Molecular Dynamics 17(rMD17). rMD17 dataset includes molecular dynamics simulations of multiple organic chemical moleculars. It provides chemical desciptive information such as the atomic numbers and positions as well as molecular property information such as energies and forces. +- **Task**:Molecular energy prediction. We integrate the NequIP model [1] and Allegro model [2], according to the position of each atom in the molecular system and structure description of the atomic number information construction diagram, and calculate the energy of the molecular system based on the equivariant calculation and graph neural network.
nequip
-- **Electronic Structure Prediction**: - - **Scenario**: Materials - - **Dataset**: Bilayer graphene dataset. The dataset contains descriptive information such as atomic positions and atomic numbers, as well as property information such as Hamiltonian. - - **Task**: Density Functional Theory Hamiltonian Prediction. We integrate the DeephE3nn model [4], an equivariant neural network based on E3, to predict a Hamiltonian by using the structure of atoms. +### DFT Prediction -- **Prediction of crystalline material properties**: - - **Scenario**: Materials - - **Dataset**: JARVIS-DFT 3D dataset. The dataset contains descriptive information such as atomic position and atomic number of crystal materials, as well as property information such as energy and force field. - - **Task**: Prediction of crystalline material properties. We integrate the Matformer model [5] based on graph neural networks and Transformer architectures, for predicting various properties of crystalline materials. +- **Scenario**: Materials Chemistry +- **Dataset**: Bilayer graphene dataset. The dataset contains descriptive information such as atomic positions and atomic numbers, as well as property information such as Hamiltonian. +- **Task**: Density Functional Theory Hamiltonian Prediction. We integrate the DeephE3nn model [3], an equivariant neural network based on E3, to predict a Hamiltonian by using the structure of atoms. -- **Crystal Material Structure Prediction**: - - **Scenario**: Materials Chemistry - - **Dataset**: - - Perov-5: A perovskite dataset in which each unit cell contains five fixed atoms, and the structures are relatively similar. - - Carbon-24: A carbon crystal dataset, where each crystal contains between 6 and 24 carbon atoms, with various different material structures. - - MP-20: A dataset collected from the MP database, featuring experimental structures with up to 20 atoms per unit cell. The materials and structures are highly diverse. - - MPTS-52: An advanced version of MP-20, expanding the number of atoms per unit cell to 52. The materials and structures are highly diverse. - - **Task**: Crystal material structure prediction. We integrated the DiffCSP model[6], which is based on a graph neural network and diffusion model architecture, to predict the crystal material structures given their composition. +### Property Prediction -### Modules +- **Scenario**: Materials Chemistry +- **Dataset**: JARVIS-DFT 3D dataset. The dataset contains descriptive information such as atomic position and atomic number of crystal materials, as well as property information such as energy and force field. +- **Task**: Prediction of crystalline material properties. We integrate the Matformer model [4] based on graph neural networks and Transformer architectures, for predicting various properties of crystalline materials. -- **Equivariant Computing** - - **Introduction**:Symmetry is an essential property in science domain. Equivarient neural network adopts intuitive representation as input and computing equivariently with respect to spatial rotation,shift and inversion. Adopting equivariant neural network for modeling scientific scenarios results in higher representation effectiveness for data and high efficiency for model training. - - **Functions**:E(3) computing modules integrates basic modules such as Irreps, Spherical Harmonics and Tensor Products. Based on the basic modules, equivariant neural network layers such as equivariant Activation, Linear and Convolution layers are provided for constructing user customed equivariant neural networks. +### Structure Generation -
Equivariant(3) Computing Modules
+- **Scenario**: Materials Chemistry +- **Dataset**: + - Perov-5: A perovskite dataset in which each unit cell contains five fixed atoms, and the structures are relatively similar. + - Carbon-24: A carbon crystal dataset, where each crystal contains between 6 and 24 carbon atoms, with various different material structures. + - MP-20: A dataset collected from the MP database, featuring experimental structures with up to 20 atoms per unit cell. The materials and structures are highly diverse. + - MPTS-52: An advanced version of MP-20, expanding the number of atoms per unit cell to 52. The materials and structures are highly diverse. +- **Task**: Crystal material structure prediction. We integrated the DiffCSP model [5], which is based on a graph neural network and diffusion model architecture, to predict the crystal material structures given their composition. ## Installation @@ -89,8 +86,9 @@ Because MindChemistry is dependent on MindSpore, please click [MindSpore Downloa | MindChemistry | Branch | MindSpore | Python | |:-------- | :------ | :-------- | :------| -| master | master | >=2.3 | >=3.8 | -| 0.1.0 | r0.6 | >=2.2.12 | >=3.8 | +| [master](https://gitee.com/mindspore/mindscience/tree/master/MindChemistry) | master | >=2.3 | >=3.8 | +| [0.2.0]() | r0.7 | >=2.5.0 | >=3.11 | +| [0.1.0](https://gitee.com/mindspore/mindscience/tree/r0.6/MindChemistry) | r0.6 | >=2.2.12 | >=3.8 | ### Dependency @@ -134,9 +132,9 @@ pip install -r requirements.txt ### Core Contributor -Thanks goes to these wonderful people 🧑‍🤝‍🧑: +Thanks goes to these wonderful people: -yufan, wangzidong, liuhongsheng, gongyue, gengchenhua, linghejing, yanchaojie, suyun, wujian, caowenbin, Lin Peijia +wujian, wangyuheng, Lin Peijia, gengchenhua, caowenbin,Siyu Yang ## Contribution Guide @@ -148,14 +146,12 @@ yufan, wangzidong, liuhongsheng, gongyue, gengchenhua, linghejing, yanchaojie, s ## References -[1] Rao Z, Tung P Y, Xie R, et al. Machine learning-enabled high-entropy alloy discovery[J]. Science, 2022, 378(6615): 78-85. - -[2] Batzner S, Musaelian A, Sun L, et al. E(3)-equivariant graph neural networks for data-efficient and accurate interatomic potentials[J]. Nature communications, 2022, 13(1): 2453. +[1] Batzner S, Musaelian A, Sun L, et al. E(3)-equivariant graph neural networks for data-efficient and accurate interatomic potentials[J]. Nature communications, 2022, 13(1): 2453. -[3] Musaelian A, Batzner S, Johansson A, et al. Learning local equivariant representations for large-scale atomistic dynamics[J]. Nature communications, 2023, 14(1): 579. +[2] Musaelian A, Batzner S, Johansson A, et al. Learning local equivariant representations for large-scale atomistic dynamics[J]. Nature communications, 2023, 14(1): 579. -[4] Xiaoxun Gong, He Li, Nianlong Zou, et al. General framework for E(3)-equivariant neural network representation of density functional theory Hamiltonian[J]. Nature communications, 2023, 14: 2848. +[3] Xiaoxun Gong, He Li, Nianlong Zou, et al. General framework for E(3)-equivariant neural network representation of density functional theory Hamiltonian[J]. Nature communications, 2023, 14: 2848. -[5] Keqiang Yan, Yi Liu, Yuchao Lin, Shuiwang ji, et al. Periodic Graph Transformers for Crystal Material Property Prediction[J]. arXiv:2209.11807v1 [cs.LG] 23 sep 2022. +[4] Keqiang Yan, Yi Liu, Yuchao Lin, Shuiwang ji, et al. Periodic Graph Transformers for Crystal Material Property Prediction[J]. arXiv:2209.11807v1 [cs.LG] 23 sep 2022. -[6] Jiao Rui and Huang Wenbing and Lin Peijia, et al. Crystal structure prediction by joint equivariant diffusion[J]. Advances in Neural Information Processing Systems, 2024, 36. \ No newline at end of file +[5] Jiao Rui and Huang Wenbing and Lin Peijia, et al. Crystal structure prediction by joint equivariant diffusion[J]. Advances in Neural Information Processing Systems, 2024, 36. \ No newline at end of file diff --git a/MindChemistry/README_CN.md b/MindChemistry/README_CN.md index 7ae514662..d1d1546ca 100644 --- a/MindChemistry/README_CN.md +++ b/MindChemistry/README_CN.md @@ -1,17 +1,24 @@ -[ENGLISH](README.md) | 简体中文 +# MindSpore Chemistry + +[View English](README.md) [![PyPI](https://badge.fury.io/py/mindspore.svg)](https://badge.fury.io/py/mindspore) [![LICENSE](https://img.shields.io/github/license/mindspore-ai/mindspore.svg?style=flat-square)](https://github.com/mindspore-ai/mindspore/blob/master/LICENSE) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](https://gitee.com/mindspore/mindscience/pulls) -# MindSpore Chemistry +--- + +## 目录 - [MindSpore Chemistry](#mindspore-chemistry) + - [目录](#目录) - [介绍](#介绍) - [最新消息](#最新消息) - - [特性](#特性) - - [应用案例](#应用案例) - - [功能模块](#功能模块) + - [应用案例](#应用案例) + - [力场模拟](#力场模拟) + - [DFT模拟](#dft模拟) + - [性质预测](#性质预测) + - [结构生成](#结构生成) - [安装教程](#安装教程) - [版本依赖关系](#版本依赖关系) - [依赖安装](#依赖安装) @@ -23,58 +30,56 @@ - [许可证](#许可证) - [引用](#引用) +--- + ## 介绍 传统化学研究长期以来面临着众多挑战,实验设计、合成、表征和分析的过程往往耗时、昂贵,并且高度依赖专家经验。AI与化学的协同可以克服传统方法的局限性、开拓全新的研究范式,结合AI模型与化学知识,可以高效处理大量数据、挖掘隐藏的关联信息,构建仿真模型,从而加快化学反应的设计和优化,实现材料的性质预测,并辅助设计新材料。 **MindSpore Chemistry**(MindChemistry)是基于MindSpore构建的化学领域套件,支持多体系(有机/无机/复合材料化学)、多尺度任务(微观分子生成/预测、宏观反应优化)的AI+化学仿真,致力于高效使能AI与化学的融合研究,践行和牵引AI与化学联合多研究范式跃迁,为化学领域专家的研究提供全新视角与高效的工具。 -
MindFlow Architecture
+
MindChemistry Architecture
-## 最新消息 +--- -- `2024.07.30` 2024年7月30日 MindChemistry 0.1.0版本发布。 +## 最新消息 -## 特性 +- `2025.03.30` MindChemistry 0.2.0版本发布,包括多个应用案例,支持NequIP、Allegro、DeephE3nn、Matformer以及DiffCSP模型。 +- `2024.07.30` MindChemistry 0.1.0版本发布。 -### 应用案例 +--- -- **分子生成**: - - **体系**:无机化学 - - **数据**:高熵合金数据集。高熵合金数据集中包含了已知高熵合金的组分以及热动力学性质等信息,提供金属组分类型及组分比例,以及居里温度、磁致伸缩等热动力学性质信息。 - - **任务**:高熵合金组分设计。我们集成了基于主动学习进行高熵合金设计的方法[1],设计热膨胀系数极低的高熵合金组分。在主动学习流程中,首先基于AI模型生成候选的高熵合金组分,并基于预测模型和热动力学计算预测热膨胀系数对候选组分进行筛选,最终需要研究者基于实验验证确定最终的高熵合金组分。 +## 应用案例 -
high-alloy
+### 力场模拟 -- **分子预测**: - - **体系**:有机化学 - - **数据**:Revised Molecular Dynamics 17(rMD17)数据集。rMD17数据集包含了多种有机化合物的分子动力学性质,提供化合物的原子位置、原子数等描述信息以及能量、力场等性质信息。 - - **任务**:分子能量预测。我们集成了NequIP模型[2]、Allegro模型[3],根据分子体系中各原子的位置与原子数信息构建图结构描述,基于等变计算与图神经网络,计算出分子体系能量。 +- **体系**:有机化学 +- **数据**:Revised Molecular Dynamics 17 (rMD17) 数据集。该数据集包含了多种有机化合物的分子动力学性质,提供化合物的原子位置、原子数等描述信息,以及能量、力场等性质信息。 +- **任务**:分子能量预测。集成了 **NequIP** 模型[1] 和 **Allegro** 模型[2],根据分子体系中各原子的位置与原子数信息构建图结构描述,基于等变计算与图神经网络,计算出分子体系能量。 -
nequip
+
NequIP
-- **电子结构预测**: - - **体系**:材料化学 - - **数据**:双层石墨烯数据集。该数据集包含了原子位置、原子数等描述信息以及哈密顿量等性质信息。 - - **任务**:密度泛函理论哈密顿量预测。我们集成了DeephE3nn模型[4],基于E3的等变神经网络,利用原子的结构去预测其的哈密顿量。 +### DFT模拟 -- **晶体材料性质预测**: - - **体系**:材料化学 - - **数据**:JARVIS-DFT 3D数据集。该数据集包含了晶体材料的原子位置、原子数等描述信息以及能量、力场等性质信息。 - - **任务**:晶体材料性质预测。我们集成了Matformer模型[5],基于图神经网络和Transformer架构的模型,用于预测晶体材料的各种性质。 +- **体系**:材料化学 +- **数据**:双层石墨烯数据集。该数据集包含了原子位置、原子数等描述信息,以及哈密顿量等性质信息。 +- **任务**:密度泛函理论哈密顿量预测。集成了 **DeephE3nn** 模型[3],基于E3的等变神经网络,利用原子的结构预测哈密顿量。 -- **晶体材料结构预测**: - - **体系**:材料化学 - - **数据**:Perov-5是钙钛矿数据集,其中每个晶胞中都固定有五个原子,且结构上比较接近。Carbon-24是碳晶体数据集,每个晶体中含有6到24个碳原子,不同材料结构各异。MP-20是从MP数据集中收集到胞内不超过20个原子的实验结构,MPTS-52是它的进阶版本,将胞内原子数扩展到了52个,这两个数据集中的材料组分和结构都比较多样。 - - **任务**:晶体材料结构预测。我们集成了DiffCSP模型[6],基于图神经网络和扩散模型架构的模型,用于给定组分,预测晶体材料的结构。 +### 性质预测 -### 功能模块 +- **体系**:材料化学 +- **数据**:JARVIS-DFT 3D数据集,包含晶体材料的原子位置、原子数等描述信息以及能量、力场等性质信息。 +- **任务**:晶体材料性质预测。集成了 **Matformer** 模型[4],基于图神经网络和Transformer架构,预测晶体材料的各种性质。 -- **等变计算库** - - **简介**:对称性是科学领域的重要性质。等变神经网络以具有物理意义表征刻画化合物体系输入,并使得输入与输出在空间平移、旋转和反演等变换中具有等变性。使用等变神经网络来对科学场景建模可以提高数据的表征效率和模型的训练效率。 - - **核心模块**:等变计算库中集成了不可约表示、球谐函数以及张量积等基础模块,实现底层逻辑与运算过程,并基于基础模块构建了等变激活层、等变线性层和等变卷积层等神经网络层,可以更方便地调用从而构建等变神经网络。 +### 结构生成 -
等变计算库
+- **体系**:材料化学 +- **数据**: + - **Perov-5**:钙钛矿数据集,每个晶胞中固定5个原子,结构接近。 + - **Carbon-24**:碳晶体数据集,包含6到24个碳原子的不同结构。 + - **MP-20**:MP数据集中的实验数据,胞内不超过20个原子。 + - **MPTS-52**:MP-20的进阶版,胞内最多52个原子。 +- **任务**:晶体材料结构预测。集成了 **DiffCSP** 模型[5],基于图神经网络和扩散模型,预测晶体材料的结构。 ## 安装教程 @@ -82,13 +87,16 @@ 由于MindChemistry与MindSpore有依赖关系,请根据下表中所指示的对应关系,在[MindSpore下载页面](https://www.mindspore.cn/versions)下载并安装对应的whl包。 -| MindChemistry | 分支 | MindSpore | Python | -| :------------ | :----- |:----------| :----- | -| master | master | >=2.3 | >=3.8 | -| 0.1.0 | r0.6 | >=2.2.12 | >=3.8 | +| **MindChemistry** | **分支** | **MindSpore** | **Python** | +|:------------------|:--------|:--------------|:----------| +| [master](https://gitee.com/mindspore/mindscience/tree/master/MindChemistry) | master | >=2.3 | >=3.8 | +| [0.2.0]() | r0.7 | >=2.5.0 | >=3.11 | +| [0.1.0](https://gitee.com/mindspore/mindscience/tree/r0.6/MindChemistry) | r0.6 | >=2.2.12 | >=3.8 | ### 依赖安装 +使用以下命令安装所需的依赖包: + ```bash pip install -r requirements.txt ``` @@ -131,7 +139,7 @@ pip install -r requirements.txt 感谢以下开发者做出的贡献: -yufan, wangzidong, liuhongsheng, gongyue, gengchenhua, linghejing, yanchaojie, suyun, wujian, caowenbin, Lin Peijia +wujian, wangyuheng, Lin Peijia, gengchenhua, caowenbin,Siyu Yang ## 贡献指南 @@ -143,14 +151,12 @@ yufan, wangzidong, liuhongsheng, gongyue, gengchenhua, linghejing, yanchaojie, s ## 引用 -[1] Rao Z, Tung P Y, Xie R, et al. Machine learning-enabled high-entropy alloy discovery[J]. Science, 2022, 378(6615): 78-85. - -[2] Batzner S, Musaelian A, Sun L, et al. E(3)-equivariant graph neural networks for data-efficient and accurate interatomic potentials[J]. Nature communications, 2022, 13(1): 2453. +[1] Batzner S, Musaelian A, Sun L, et al. E(3)-equivariant graph neural networks for data-efficient and accurate interatomic potentials[J]. Nature communications, 2022, 13(1): 2453. -[3] Musaelian A, Batzner S, Johansson A, et al. Learning local equivariant representations for large-scale atomistic dynamics[J]. Nature communications, 2023, 14(1): 579. +[2] Musaelian A, Batzner S, Johansson A, et al. Learning local equivariant representations for large-scale atomistic dynamics[J]. Nature communications, 2023, 14(1): 579. -[4] Xiaoxun Gong, He Li, Nianlong Zou, et al. General framework for E(3)-equivariant neural network representation of density functional theory Hamiltonian[J]. Nature communications, 2023, 14: 2848. +[3] Xiaoxun Gong, He Li, Nianlong Zou, et al. General framework for E(3)-equivariant neural network representation of density functional theory Hamiltonian[J]. Nature communications, 2023, 14: 2848. -[5] Keqiang Yan, Yi Liu, Yuchao Lin, Shuiwang ji, et al. Periodic Graph Transformers for Crystal Material Property Prediction[J]. arXiv:2209.11807v1 [cs.LG] 23 sep 2022. +[4] Keqiang Yan, Yi Liu, Yuchao Lin, Shuiwang ji, et al. Periodic Graph Transformers for Crystal Material Property Prediction[J]. arXiv:2209.11807v1 [cs.LG] 23 sep 2022. -[6] Jiao Rui and Huang Wenbing and Lin Peijia, et al. Crystal structure prediction by joint equivariant diffusion[J]. Advances in Neural Information Processing Systems, 2024, 36. +[5] Jiao Rui and Huang Wenbing and Lin Peijia, et al. Crystal structure prediction by joint equivariant diffusion[J]. Advances in Neural Information Processing Systems, 2024, 36. diff --git a/MindChemistry/RELEASE.md b/MindChemistry/RELEASE.md index 1369ca8c6..1af49595b 100644 --- a/MindChemistry/RELEASE.md +++ b/MindChemistry/RELEASE.md @@ -4,6 +4,35 @@ MindSpore Chemistry is a toolkit built on MindSpore endeavoring to enable the joint research of AI and chemistry with high efficiency and to seek th facilitate an innovative paradigm of joint research between AI and chemistry. +## MindSpore Chemistry 0.2.0 Release Notes + +### Major Features and Enhancement + +#### Force prediction + +* [STABLE] [NequIP](https://gitee.com/mindspore/mindscience/tree/master/MindChemistry/applications/nequip): Leveraging the equivariant computing library, the model is trained efficiently and achieves highly accurate inference of molecular energy based on atomic information. +* [STABLE] [Allegro](https://gitee.com/mindspore/mindscience/tree/master/MindChemistry/applications/allegro): Leveraging the equivariant computing library, the model is trained efficiently and achieves highly accurate inference of molecular energy based on atomic information. + +#### DFT Prediction + +* [STABLE] [DeephE3nn](https://gitee.com/mindspore/mindscience/tree/master/MindChemistry/applications/deephe3nn): An equivariant neural network based on the E(3) group, designed to predict Hamiltonians using atomic structures. + +#### Property Prediction + +* [STABLE] [Matformer](https://gitee.com/mindspore/mindscience/tree/master/MindChemistry/applications/matformer): Leveraging graph neural networks and Transformer architectures to predict diverse properties of crystalline materials. + +#### Structure Generation + +* [STABLE] [DiffCSP](https://gitee.com/mindspore/mindscience/tree/master/MindChemistry/applications/diffcsp): New feature. This is a crystal structure prediction method based on diffusion models, specifically designed to learn structural distributions from stable crystal data. It predicts crystal structures by jointly generating lattice and atomic coordinates, and leverages a periodic E(3)-equivariant denoising model to better simulate the geometric properties of crystals. It is significantly more cost-effective in terms of computational resources compared to traditional methods based on Density Functional Theory (DFT) and performs remarkably well in crystal structure prediction tasks. + +### Contributors + +Thanks goes to these wonderful people: + +wujian, wangyuheng, Lin Peijia, gengchenhua, caowenbin,Siyu Yang + +------------------------------------------------ + ## MindSpore Chemistry 0.1.0 Release Notes ### Major Features @@ -21,4 +50,4 @@ Thanks goes to these wonderful people: yufan, wangzidong, liuhongsheng, gongyue, gengchenhua, linghejing, yanchaojie, suyun, wujian, caowenbin -Contributions of any kind are welcome! +Contributions of any kind are welcome! \ No newline at end of file diff --git a/MindChemistry/RELEASE_CN.md b/MindChemistry/RELEASE_CN.md index 7a18b9913..e85f4c2c8 100644 --- a/MindChemistry/RELEASE_CN.md +++ b/MindChemistry/RELEASE_CN.md @@ -4,6 +4,35 @@ MindSpore Chemistry是一个基于MindSpore构建的化学套件,致力于高效使能AI与化学的联合创新,践行AI与化学结合的全新科学研究范式。 +## MindSpore Chemistry 0.2.0 Release Notes + +### 主要特性和增强 + +#### 力场模拟 + +* [STABLE] [NequIP](https://gitee.com/mindspore/mindscience/tree/master/MindChemistry/applications/nequip): 基于等变图神经网络构建的SOTA模型,用于预测分子势能与力。 +* [STABLE] [Allegro](https://gitee.com/mindspore/mindscience/tree/master/MindChemistry/applications/allegro): 基于等变图神经网络构建的SOTA模型,可以在大规模材料体系中进行高精度预测,用于预测分子势能与力。 + +#### DFT模拟 + +* [STABLE] [DeephE3nn](https://gitee.com/mindspore/mindscience/tree/master/MindChemistry/applications/deephe3nn): 基于E3的等变神经网络,利用晶体中的原子结构去预测体系的电子哈密顿量。 + +#### 性质预测 + +* [STABLE] [Matformer](https://gitee.com/mindspore/mindscience/tree/master/MindChemistry/applications/matformer): 基于图神经网络和Transformer架构的深度学习模型,用于预测晶体材料的各种性质。 + +#### 结构生成 + +* [STABLE] [DiffCSP](https://gitee.com/mindspore/mindscience/tree/master/MindChemistry/applications/diffcsp): 新增。是一种基于扩散模型的晶体结构预测方法,专门用于从稳定晶体数据中学习结构分布。它通过联合生成晶格和原子坐标来预测晶体结构,并利用周期性 E(3) 等变去噪模型来更好地模拟晶体的几何特性。它在计算成本上远低于传统的基于密度泛函理论的方法,并且在晶体结构预测任务中表现出色。 + +### 贡献者 + +感谢以下开发者做出的贡献: + +wujian, wangyuheng, Lin Peijia, gengchenhua, caowenbin,Siyu Yang + +------------------------------------------------ + ## MindSpore Chemistry 0.1.0 Release Notes ### 主要特性 diff --git a/MindChemistry/applications/cdvae/README.md b/MindChemistry/applications/cdvae/README.md deleted file mode 100644 index 167242284..000000000 --- a/MindChemistry/applications/cdvae/README.md +++ /dev/null @@ -1,131 +0,0 @@ -# 模型名称 - -> CDVAE - -## 介绍 - -> Crystal Diffusion Variational AutoEncoder (CDVAE)是用来生成材料的周期性结构的SOTA模型,相关论文已发表在ICLR上。模型主要有两个部分组成,首先是encoder部分,将输入得信息转化成隐变量z,部分简单得特性,如原子数量和晶格常数等,直接使用MLP进行decode得到输出,其他部分如原子种类和原子在晶格中得位置等,则通过扩散模型得到。具体模型结构如下图所示: - -
- model_structure -
- -## 数据集 - -> 提供了三个数据集: - -1. Perov_5 (Castelli et al., 2012): 包含接近19000个钙钛矿晶体结构,结构相似,但是组成不同,下载地址:[Perov_5](https://figshare.com/articles/dataset/Perov5/22705189)。 -2. Carbon_24 (Pickard, 2020): 包含10000个仅包含碳原子的晶体结构,因此其具有相同的组成,但是结构不同,下载地址:[Carbon_24](https://figshare.com/articles/dataset/Carbon24/22705192)。 -3. MP_20(Jain et al., 2013): 包含有45000个无机材料结构,包含绝大多数小于单胞小于20个原子的实验已知材料,下载地址:[mp_20](https://figshare.com/articles/dataset/mp_20/25563693)。 - -前两个数据集下载后直接放在./data目录下即可。MP_20数据集下载后运行`python ./cdvae/dataloader/mp_20_process.py --init_path ./data/mp_20.json --data_path ./data/mp_20`, 其中 init_path是下载得到的json格式数据集的位置,而data_path是dataset存放的位置。 - -## 环境要求 - -> 1. 安装`pip install -r requirements.txt` - -## 脚本说明 - -### 代码目录结构 - -```txt -└─cdvae - │ README.md README文件 - │ train.py 训练启动脚本 - │ evaluation.py 推理启动脚本 - │ compute_metrics.py 评估结果脚本 - │ create_dataset.py 生成数据集 - │ - └─src - │ evaluate_utils.py 推理结果生成 - │ metrics_utils.py 评估结果计算 - │ dataloader.py 将数据集加载到网络 - | mp_20_process.py 对mp_20数据集预处理 - │ - └─conf 参数配置 - │ config.yaml 网络参数 - └─data 数据集参数 -``` - -## 训练 - -## 快速开始 - -> 训练命令: `python train.py --dataset 'perov_5'` - -### 命令行参数 - -```txt -dataset: 使用得数据集,perov_5, carbon_24, mp_20 -create_dataset: 是否重新对数据集进行处理 -num_sample_train: 如重新处理数据集,训练集得大小,-1为使用全部原始数据 -num_samples_val:如重新处理数据集,验证集得大小,-1为使用全部原始数据 -num_samples_test:如重新处理数据集,测试集得大小,-1为使用全部原始数据 -name_ckpt:保存权重的路径和名称 -load_ckpt:是否读取权重 -device_target:MindSpore使用的后端 -device_id:如MindSpore使用昇腾后端,使用的NPU卡号 -epoch_num:训练的epoch数 -``` - -## 推理评估过程 - -### 推理过程 - -```txt -1.将权重checkpoint文件保存至 `/loss/`目录下(默认读取目录) -2.执行推理脚本:reconstruction任务: - python evaluation.py --dataset perov_5 --tasks 'recon' (指定dataset为perov_5) - generation任务: - python evaluation.py --dataset perov_5 --tasks 'gen' - optimization任务(如需使用optimization,在训练时请在configs.yaml中将predict_property设置为True): - python evaluation.py --dataset perov_5 --tasks 'opt' -``` - -### 命令行参数 - -```txt -device_target:MindSpore使用的后端 -device_id:如MindSpore使用昇腾后端,使用的NPU卡号 -model_path: 权重保存路径 -dataset: 使用得数据集,perov_5, carbon_24, mp_20 -tasks:推理执行的任务,可选:recon,gen,opt -n_step_each:执行的denoising的步数 -step_lr:opt任务中设置的lr -min_sigma:生成随机噪声的最小值 -save_traj:是否保存traj -disable_bar:是否展示进度条 -num_evals:gen任务中产生的结果数量 -start_from:随机或从头开始读取数据集,可选:randon, data -batch_size: batch_size大小 -force_num_atoms:是否限制原子数不变 -force_atom_types:是否限制原子种类不变 -label:推理结果保存时的名称 -``` - -推理结果 - -```txt -可以在`/eval_result/`路径下找到推理的输出文件。 -reconstruction的输出文件为eval_recon.npy和gt_recon.npy,分别包含了reconstruction后的晶体结构信息以及作为ground truth的晶体结构信息; -generation的输出文件为eval_gen.npy,包含了随机生成结果的晶体结构信息; -optimization的输出文件为eval_opt.npy,包含了基于特定性质优化的晶体结构信息。 -``` - -### 结果评估 - -```txt -运行 python comput_metrics.py --eval_path './eval_result' --dataset 'perov_5' --task recon, 结果会保存在./eval_path文件夹下的eval_metrics.json文件中(目前支持recon和generation两种模式) -``` - -## 引用 - -[1] Xie T, Fu X, Ganea O E, et al. Crystal diffusion variational autoencoder for periodic material generation[J]. arXiv preprint arXiv:2110.06197, 2021. - -[2] Castelli I E, Landis D D, Thygesen K S, et al. New cubic perovskites for one-and two-photon water splitting using the computational materials repository[J]. Energy & Environmental Science, 2012, 5(10): 9034-9043. - -[3] Castelli I E, Olsen T, Datta S, et al. Computational screening of perovskite metal oxides for optimal solar light capture[J]. Energy & Environmental Science, 2012, 5(2): 5814-5819. - -[4] Pickard C J. AIRSS data for carbon at 10GPa and the C+ N+ H+ O system at 1GPa[J]. (No Title), 2020. - -[5] Jain A, Ong S P, Hautier G, et al. Commentary: The Materials Project: A materials genome approach to accelerating materials innovation[J]. APL materials, 2013, 1(1). \ No newline at end of file diff --git a/MindChemistry/applications/cdvae/compute_metrics.py b/MindChemistry/applications/cdvae/compute_metrics.py deleted file mode 100644 index e51be922e..000000000 --- a/MindChemistry/applications/cdvae/compute_metrics.py +++ /dev/null @@ -1,321 +0,0 @@ -# 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. -# ============================================================================ -"""Compute metrics -""" -from collections import Counter -import logging -import argparse -import os -import json - -import numpy as np -from tqdm import tqdm -from p_tqdm import p_map -from scipy.stats import wasserstein_distance -from pymatgen.core.structure import Structure -from pymatgen.core.composition import Composition -from pymatgen.core.lattice import Lattice -from pymatgen.analysis.structure_matcher import StructureMatcher -from matminer.featurizers.site.fingerprint import CrystalNNFingerprint -from matminer.featurizers.composition.composite import ElementProperty -from mindchemistry.cell.gemnet.data_utils import StandardScaler -from src.metrics_utils import ( - smact_validity, structure_validity, get_fp_pdist, - get_crystals_list, compute_cov) - -CRYSTALNNFP = CrystalNNFingerprint.from_preset("ops") -COMPFP = ElementProperty.from_preset("magpie") - -COV_CUTOFFS = { - "mp_20": {"struct": 0.4, "comp": 10.}, - "carbon_24": {"struct": 0.2, "comp": 4.}, - "perov_5": {"struct": 0.2, "comp": 4}, -} -# threshold for coverage metrics, olny struct distance and comp distance -# smaller than the threshold will be counted as covered. - - -class Crystal(): - """get crystal structures""" - - def __init__(self, crys_array_dict): - self.frac_coords = crys_array_dict["frac_coords"] - self.atom_types = crys_array_dict["atom_types"] - self.lengths = crys_array_dict["lengths"] - self.angles = crys_array_dict["angles"] - self.dict = crys_array_dict - - self.get_structure() - self.get_composition() - self.get_validity() - self.get_fingerprints() - - def get_structure(self): - """get structure""" - if min(self.lengths.tolist()) < 0: - self.constructed = False - self.invalid_reason = "non_positive_lattice" - else: - try: - self.structure = Structure( - lattice=Lattice.from_parameters( - *(self.lengths.tolist() + self.angles.tolist())), - species=self.atom_types, coords=self.frac_coords, coords_are_cartesian=False) - self.constructed = True - except (ValueError, AttributeError, TypeError): - self.constructed = False - self.invalid_reason = "construction_raises_exception" - if self.structure.volume < 0.1: - self.constructed = False - self.invalid_reason = "unrealistically_small_lattice" - - def get_composition(self): - elem_counter = Counter(self.atom_types) - composition = [(elem, elem_counter[elem]) - for elem in sorted(elem_counter.keys())] - elems, counts = list(zip(*composition)) - counts = np.array(counts) - counts = counts / np.gcd.reduce(counts) - self.elems = elems - self.comps = tuple(counts.astype("int").tolist()) - - def get_validity(self): - self.comp_valid = smact_validity(self.elems, self.comps) - if self.constructed: - self.struct_valid = structure_validity(self.structure) - else: - self.struct_valid = False - self.valid = self.comp_valid and self.struct_valid - - def get_fingerprints(self): - """get fingerprints""" - elem_counter = Counter(self.atom_types) - comp = Composition(elem_counter) - self.comp_fp = COMPFP.featurize(comp) - try: - site_fps = [CRYSTALNNFP.featurize( - self.structure, i) for i in range(len(self.structure))] - except (ValueError, AttributeError, TypeError): - # counts crystal as invalid if fingerprint cannot be constructed. - self.valid = False - self.comp_fp = None - self.struct_fp = None - return - self.struct_fp = np.array(site_fps).mean(axis=0) - - -class RecEval(): - """reconstruction evaluation result""" - - def __init__(self, pred_crys, gt_crys, stol=0.5, angle_tol=10, ltol=0.3): - assert len(pred_crys) == len(gt_crys) - self.matcher = StructureMatcher( - stol=stol, angle_tol=angle_tol, ltol=ltol) - self.preds = pred_crys - self.gts = gt_crys - - def get_match_rate_and_rms(self): - """get match rate and rms, match rate shows how much rate of the prediction has - the same structure as the ground truth.""" - def process_one(pred, gt, is_valid): - if not is_valid: - return None - try: - rms_dist = self.matcher.get_rms_dist( - pred.structure, gt.structure) - rms_dist = None if rms_dist is None else rms_dist[0] - return rms_dist - except (ValueError, AttributeError, TypeError): - return None - validity = [c.valid for c in self.preds] - - rms_dists = [] - for i in tqdm(range(len(self.preds))): - rms_dists.append(process_one( - self.preds[i], self.gts[i], validity[i])) - rms_dists = np.array(rms_dists) - match_rate = sum(x is not None for x in rms_dists) / len(self.preds) - mean_rms_dist = np.array( - [x for x in rms_dists if x is not None]).mean() - return {"match_rate": match_rate, - "rms_dist": mean_rms_dist} - - def get_metrics(self): - return self.get_match_rate_and_rms() - - -class GenEval(): - """Generation Evaluation result""" - - def __init__(self, pred_crys, gt_crys, comp_scaler, n_samples=10, eval_model_name=None): - self.crys = pred_crys - self.gt_crys = gt_crys - self.n_samples = n_samples - self.eval_model_name = eval_model_name - self.comp_scaler = comp_scaler - - valid_crys = [c for c in pred_crys if c.valid] - if len(valid_crys) >= n_samples: - sampled_indices = np.random.choice( - len(valid_crys), n_samples, replace=False) - self.valid_samples = [valid_crys[i] for i in sampled_indices] - else: - raise Exception( - f"not enough valid crystals in the predicted set: {len(valid_crys)}/{n_samples}") - - def get_validity(self): - """ - Compute Validity, which means whether the structure is reasonable and phyically stable - in both composition and structure. - """ - comp_valid = np.array([c.comp_valid for c in self.crys]).mean() - struct_valid = np.array([c.struct_valid for c in self.crys]).mean() - valid = np.array([c.valid for c in self.crys]).mean() - return {"comp_valid": comp_valid, - "struct_valid": struct_valid, - "valid": valid} - - def get_comp_diversity(self): - """the earth mover’s distance (EMD) between the property distribution of - generated materials and test materials. - """ - comp_fps = [c.comp_fp for c in self.valid_samples] - comp_fps = self.comp_scaler.transform(comp_fps) - comp_div = get_fp_pdist(comp_fps) - return {"comp_div": comp_div} - - def get_struct_diversity(self): - return {"struct_div": get_fp_pdist([c.struct_fp for c in self.valid_samples])} - - def get_density_wdist(self): - pred_densities = [c.structure.density for c in self.valid_samples] - gt_densities = [c.structure.density for c in self.gt_crys] - wdist_density = wasserstein_distance(pred_densities, gt_densities) - return {"wdist_density": wdist_density} - - def get_num_elem_wdist(self): - pred_nelems = [len(set(c.structure.species)) - for c in self.valid_samples] - gt_nelems = [len(set(c.structure.species)) for c in self.gt_crys] - wdist_num_elems = wasserstein_distance(pred_nelems, gt_nelems) - return {"wdist_num_elems": wdist_num_elems} - - def get_coverage(self): - """measure the similarity between ensembles of generated materials - and ground truth materials. COV-R measures the percentage of - ground truth materials being correctly predicted. - """ - cutoff_dict = COV_CUTOFFS[self.eval_model_name] - (cov_metrics_dict, _) = compute_cov( - self.crys, self.gt_crys, self.comp_scaler, - struc_cutoff=cutoff_dict["struct"], - comp_cutoff=cutoff_dict["comp"]) - return cov_metrics_dict - - def get_metrics(self): - metrics = {} - metrics.update(self.get_validity()) - metrics.update(self.get_comp_diversity()) - metrics.update(self.get_struct_diversity()) - metrics.update(self.get_density_wdist()) - metrics.update(self.get_num_elem_wdist()) - print(f'evaluation metrics:{metrics}') - metrics.update(self.get_coverage()) - return metrics - - -def get_crystal_array_list(data, gt_data=None, ground_truth=False): - """get crystal array list""" - crys_array_list = get_crystals_list( - np.concatenate(data["frac_coords"], axis=1).squeeze(0), - np.concatenate(data["atom_types"], axis=1).squeeze(0), - np.concatenate(data["lengths"], axis=1).squeeze(0), - np.concatenate(data["angles"], axis=1).squeeze(0), - np.concatenate(data["num_atoms"], axis=1).squeeze(0)) - - # if "input_data_batch" in data: - if ground_truth: - true_crystal_array_list = get_crystals_list( - np.concatenate(gt_data["frac_coords"], axis=0).squeeze(), - np.concatenate(gt_data["atom_types"], axis=0).squeeze(), - np.concatenate(gt_data["lengths"], - axis=0).squeeze().reshape(-1, 3), - np.concatenate(gt_data["angles"], axis=0).squeeze().reshape(-1, 3), - np.concatenate(gt_data["num_atoms"], axis=0).squeeze()) - else: - true_crystal_array_list = None - - return crys_array_list, true_crystal_array_list - - -def main(args): - all_metrics = {} - eval_model_name = args.dataset - - if "recon" in args.tasks: - out_data = np.load(args.eval_path+"/eval_recon.npy", - allow_pickle=True).item() - gt_data = np.load(args.eval_path+"/gt_recon.npy", - allow_pickle=True).item() - crys_array_list, true_crystal_array_list = get_crystal_array_list( - out_data, gt_data, ground_truth=True) - pred_crys = p_map(Crystal, crys_array_list) - gt_crys = p_map(Crystal, true_crystal_array_list) - - rec_evaluator = RecEval(pred_crys, gt_crys) - recon_metrics = rec_evaluator.get_metrics() - all_metrics.update(recon_metrics) - - if "gen" in args.tasks: - out_data = np.load(args.eval_path+"/eval_gen.npy", - allow_pickle=True).item() - gt_data = np.load(args.eval_path+"/gt_recon.npy", - allow_pickle=True).item() - crys_array_list, true_crystal_array_list = get_crystal_array_list( - out_data, gt_data, ground_truth=True) - - gen_crys = p_map(Crystal, crys_array_list) - gt_crys = p_map(Crystal, true_crystal_array_list) - gt_comp_fps = [c.comp_fp for c in gt_crys] - gt_fp_np = np.array(gt_comp_fps) - comp_scaler = StandardScaler(replace_nan_token=0.) - comp_scaler.fit(gt_fp_np) - - gen_evaluator = GenEval( - gen_crys, gt_crys, comp_scaler, eval_model_name=eval_model_name) - gen_metrics = gen_evaluator.get_metrics() - all_metrics.update(gen_metrics) - - logging.info(all_metrics) - - if args.label == "": - metrics_out_file = "eval_metrics.json" - else: - metrics_out_file = f"eval_metrics_{args.label}.json" - metrics_out_file = os.path.join(args.eval_path, metrics_out_file) - - with open(metrics_out_file, "w") as f: - json.dump(all_metrics, f) - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("--dataset", default="perov_5") - parser.add_argument("--eval_path", default="./eval_result") - parser.add_argument("--label", default="") - parser.add_argument("--tasks", nargs="+", default=["recon"]) - main_args = parser.parse_args() - logging.basicConfig(format="%(levelname)s:%(message)s", level=logging.INFO) - main(main_args) diff --git a/MindChemistry/applications/cdvae/conf/configs.yaml b/MindChemistry/applications/cdvae/conf/configs.yaml deleted file mode 100644 index a75a20a86..000000000 --- a/MindChemistry/applications/cdvae/conf/configs.yaml +++ /dev/null @@ -1,65 +0,0 @@ -hidden_dim: 256 -latent_dim: 256 -fc_num_layers: 0 -max_atoms: 20 -cost_natom: 1. -cost_coord: 10. -cost_type: 1. -cost_lattice: 10. -cost_composition: 1. -cost_edge: 10. -cost_property: 1. -beta: 0.01 -max_neighbors: 20 -radius: 7. -sigma_begin: 10. -sigma_end: 0.01 -type_sigma_begin: 5. -type_sigma_end: 0.01 -num_noise_level: 50 -teacher_forcing_lattice: True -predict_property: True - -Encoder: - hidden_channels: 128 - num_blocks: 4 - int_emb_size: 64 - basis_emb_size: 8 - out_emb_channels: 256 - num_spherical: 7 - num_radial: 6 - cutoff: 7.0 - max_num_neighbors: 20 - envelope_exponent: 5 - num_before_skip: 1 - num_after_skip: 2 - num_output_layers: 3 - -Decoder: - hidden_dim: 128 - -Optimizer: - learning_rate: 0.001 - factor: 0.6 - patience: 30 - cooldown: 10 - min_lr: 0.0001 - -Scaler: - TripInteraction_1_had_rbf: 18.873615264892578 - TripInteraction_1_sum_cbf: 7.996850490570068 - AtomUpdate_1_sum: 1.220463752746582 - TripInteraction_2_had_rbf: 16.10817527770996 - TripInteraction_2_sum_cbf: 7.614634037017822 - AtomUpdate_2_sum: 0.9690994620323181 - TripInteraction_3_had_rbf: 15.01930046081543 - TripInteraction_3_sum_cbf: 7.025179862976074 - AtomUpdate_3_sum: 0.8903237581253052 - OutBlock_0_sum: 1.6437848806381226 - OutBlock_0_had: 16.161039352416992 - OutBlock_1_sum: 1.1077653169631958 - OutBlock_1_had: 13.54678726196289 - OutBlock_2_sum: 0.9477927684783936 - OutBlock_2_had: 12.754337310791016 - OutBlock_3_sum: 0.9059251546859741 - OutBlock_3_had: 13.484951972961426 diff --git a/MindChemistry/applications/cdvae/conf/data/carbon_24.yaml b/MindChemistry/applications/cdvae/conf/data/carbon_24.yaml deleted file mode 100644 index 8a7c7093b..000000000 --- a/MindChemistry/applications/cdvae/conf/data/carbon_24.yaml +++ /dev/null @@ -1,12 +0,0 @@ -prop: energy_per_atom -num_targets: 1 -niggli: true -primitive: false -graph_method: crystalnn -lattice_scale_method: scale_length -preprocess_workers: 30 -readout: mean -max_atoms: 24 -otf_graph: false -eval_model_name: carbon -batch_size: 50 diff --git a/MindChemistry/applications/cdvae/conf/data/mp_20.yaml b/MindChemistry/applications/cdvae/conf/data/mp_20.yaml deleted file mode 100644 index f43fb448d..000000000 --- a/MindChemistry/applications/cdvae/conf/data/mp_20.yaml +++ /dev/null @@ -1,12 +0,0 @@ -prop: formation_energy_per_atom -num_targets: 1 -niggli: true -primitive: False -graph_method: crystalnn -lattice_scale_method: scale_length -preprocess_workers: 30 -readout: mean -max_atoms: 20 -otf_graph: false -eval_model_name: mp20 -batch_size: 50 diff --git a/MindChemistry/applications/cdvae/conf/data/perov_5.yaml b/MindChemistry/applications/cdvae/conf/data/perov_5.yaml deleted file mode 100644 index f25a93abd..000000000 --- a/MindChemistry/applications/cdvae/conf/data/perov_5.yaml +++ /dev/null @@ -1,12 +0,0 @@ -prop: heat_ref -num_targets: 1 -niggli: true -primitive: false -graph_method: crystalnn -lattice_scale_method: scale_length -preprocess_workers: 24 -readout: mean -max_atoms: 20 -otf_graph: false -eval_model_name: perovskite -batch_size: 128 diff --git a/MindChemistry/applications/cdvae/create_dataset.py b/MindChemistry/applications/cdvae/create_dataset.py deleted file mode 100644 index 827a1f2ba..000000000 --- a/MindChemistry/applications/cdvae/create_dataset.py +++ /dev/null @@ -1,341 +0,0 @@ -# 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. -# ============================================================================ -"""create_dataset""" - -import os -import logging -import argparse -import numpy as np -import pandas as pd -from p_tqdm import p_umap -from pymatgen.core.structure import Structure -from pymatgen.core.lattice import Lattice -from pymatgen.analysis.graphs import StructureGraph -from pymatgen.analysis import local_env - -from mindchemistry.utils.load_config import load_yaml_config_from_path -from mindchemistry.cell.gemnet.data_utils import get_scaler_from_data_list -from mindchemistry.cell.gemnet.data_utils import lattice_params_to_matrix -from mindchemistry.cell.dimenet.preprocess import PreProcess -logging.basicConfig(format="%(levelname)s:%(message)s", level=logging.INFO) - - -class CreateDataset: - """Create Dataset for crystal structures - - Args: - name (str): Name of the dataset - path (str): Path to the dataset - prop (str): Property to predict - niggli (bool): Whether to convert to Niggli reduced cell - primitive (bool): Whether to convert to primitive cell - graph_method (str): Method to create graph - preprocess_workers (int): Number of workers for preprocessing - lattice_scale_method (str): Method to scale lattice - num_samples (int): Number of samples to use, if None use all - """ - - def __init__(self, name, path, - prop, niggli, primitive, - graph_method, preprocess_workers, - lattice_scale_method, config_path, - num_samples=None): - super().__init__() - self.path = path - self.name = name - self.num_samples = num_samples - self.prop = prop - self.niggli = niggli - self.primitive = primitive - self.graph_method = graph_method - self.lattice_scale_method = lattice_scale_method - self.config = load_yaml_config_from_path(config_path).get("Encoder") - self.preprocess = PreProcess( - num_spherical=self.config.get("num_spherical"), - num_radial=self.config.get("num_radial"), - envelope_exponent=self.config.get("envelope_exponent"), - otf_graph=False, - cutoff=self.config.get("cutoff"), - max_num_neighbors=self.config.get("max_num_neighbors"),) - - self.cached_data = data_preprocess( - self.path, - preprocess_workers, - niggli=self.niggli, - primitive=self.primitive, - graph_method=self.graph_method, - prop_list=[prop], - num_samples=self.num_samples - )[:self.num_samples] - add_scaled_lattice_prop(self.cached_data, lattice_scale_method) - self.lattice_scaler = None - self.scaler = None - - def __len__(self): - return len(self.cached_data) - - def __getitem__(self, index): - data = self.cached_data[index] - - # scaler is set in DataModule set stage - prop = self.scaler.transform(data[self.prop]) - (frac_coords, atom_types, lengths, angles, edge_indices, - to_jimages, num_atoms) = data["graph_arrays"] - data_res = self.preprocess.data_process(angles.reshape(1, -1), lengths.reshape(1, -1), - np.array([num_atoms]), edge_indices.T, frac_coords, - edge_indices.shape[0], to_jimages, atom_types, prop) - return data_res - - def __repr__(self): - return f"CrystDataset({self.name}, {self.path})" - - def get_dataset_size(self): - return len(self.cached_data) - - -# match element with its chemical symbols -chemical_symbols = [ - # 0 - "X", - # 1 - "H", "He", - # 2 - "Li", "Be", "B", "C", "N", "O", "F", "Ne", - # 3 - "Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", - # 4 - "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", - "Ga", "Ge", "As", "Se", "Br", "Kr", - # 5 - "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", - "In", "Sn", "Sb", "Te", "I", "Xe", - # 6 - "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", - "Ho", "Er", "Tm", "Yb", "Lu", - "Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", - "Po", "At", "Rn", - # 7 - "Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", - "Cf", "Es", "Fm", "Md", "No", "Lr", - "Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", "Nh", "Fl", "Mc", - "Lv", "Ts", "Og" -] - -# used for crystal matching -CRYSTALNN = local_env.CrystalNN( - distance_cutoffs=None, x_diff_weight=-1, porous_adjustment=False) - - -def build_crystal(crystal_str, niggli=True, primitive=False): - """Build crystal from cif string.""" - crystal = Structure.from_str(crystal_str, fmt="cif") - - if primitive: - crystal = crystal.get_primitive_structure() - - if niggli: - crystal = crystal.get_reduced_structure() - - canonical_crystal = Structure( - lattice=Lattice.from_parameters(*crystal.lattice.parameters), - species=crystal.species, - coords=crystal.frac_coords, - coords_are_cartesian=False, - ) - # match is gaurantteed because cif only uses lattice params & frac_coords - assert canonical_crystal.matches(crystal) - return canonical_crystal - - -def build_crystal_graph(crystal, graph_method="crystalnn"): - """build crystal graph""" - - if graph_method == "crystalnn": - crystal_graph = StructureGraph.with_local_env_strategy( - crystal, CRYSTALNN) - elif graph_method == "none": - pass - else: - raise NotImplementedError - - frac_coords = crystal.frac_coords - atom_types = crystal.atomic_numbers - lattice_parameters = crystal.lattice.parameters - lengths = lattice_parameters[:3] - angles = lattice_parameters[3:] - - assert np.allclose(crystal.lattice.matrix, - lattice_params_to_matrix(*lengths, *angles)) - - edge_indices, to_jimages = [], [] - if graph_method != "none": - for i, j, to_jimage in crystal_graph.graph.edges(data="to_jimage"): - edge_indices.append([j, i]) - to_jimages.append(to_jimage) - edge_indices.append([i, j]) - to_jimages.append(tuple(-tj for tj in to_jimage)) - - atom_types = np.array(atom_types) - lengths, angles = np.array(lengths), np.array(angles) - edge_indices = np.array(edge_indices) - to_jimages = np.array(to_jimages) - num_atoms = atom_types.shape[0] - - return frac_coords, atom_types, lengths, angles, edge_indices, to_jimages, num_atoms - - -def save_data(dataset, is_train, dataset_name): - """save created dataset to npy""" - processed_data = dict() - data_parameters = ["atom_types", "dist", "angle", "idx_kj", "idx_ji", - "edge_j", "edge_i", "pos", "batch", "lengths", - "num_atoms", "angles", "frac_coords", - "num_bonds", "num_triplets", "sbf", "y"] - for j, name in enumerate(data_parameters): - if j == 16: - # Here, y is mindspore.Tensor, while others are all numpy.array, so need to change the type first. - processed_data[name] = [i[j].astype(np.float32) for i in dataset] - elif j == 14: - # Here, we need the sum of num_triplets, so get the summary before we save it. - processed_data[name] = [i[j].sum() for i in dataset] - else: - processed_data[name] = [i[j] for i in dataset] - - if not os.path.exists(f"./data/{dataset_name}/{is_train}"): - os.makedirs(f"./data/{dataset_name}/{is_train}") - logging.info("%s has been created", - f"./data/{dataset_name}/{is_train}") - if is_train == "train": - np.savetxt(f"./data/{dataset_name}/{is_train}/scaler_mean.csv", - dataset.scaler.means.reshape(-1)) - np.savetxt(f"./data/{dataset_name}/{is_train}/scaler_std.csv", - dataset.scaler.stds.reshape(-1)) - np.savetxt( - f"./data/{dataset_name}/{is_train}/lattice_scaler_mean.csv", dataset.lattice_scaler.means) - np.savetxt( - f"./data/{dataset_name}/{is_train}/lattice_scaler_std.csv", dataset.lattice_scaler.stds) - np.save( - f"./data/{dataset_name}/{is_train}/processed_data.npy", processed_data) - - -def process_one(row, niggli, primitive, graph_method, prop_list): - """process one one sample""" - crystal_str = row["cif"] - crystal = build_crystal( - crystal_str, niggli=niggli, primitive=primitive) - graph_arrays = build_crystal_graph(crystal, graph_method) - properties = {k: row[k] for k in prop_list if k in row.keys()} - result_dict = { - "mp_id": row["material_id"], - "cif": crystal_str, - "graph_arrays": graph_arrays, - } - result_dict.update(properties) - return result_dict - - -def data_preprocess(input_file, num_workers, niggli, primitive, graph_method, prop_list, num_samples): - """process data""" - df = pd.read_csv(input_file)[:num_samples] - - unordered_results = p_umap( - process_one, - [df.iloc[idx] for idx in range(len(df))], - [niggli] * len(df), - [primitive] * len(df), - [graph_method] * len(df), - [prop_list] * len(df), - num_cpus=num_workers) - - mpid_to_results = {result["mp_id"]: result for result in unordered_results} - ordered_results = [mpid_to_results[df.iloc[idx]["material_id"]] - for idx in range(len(df))] - - return ordered_results - - -def add_scaled_lattice_prop(data_list, lattice_scale_method): - """add scaled lattice prop to dataset""" - for data in data_list: - graph_arrays = data["graph_arrays"] - # the indexes are brittle if more objects are returned - lengths = graph_arrays[2] - angles = graph_arrays[3] - num_atoms = graph_arrays[-1] - assert lengths.shape[0] == angles.shape[0] == 3 - assert isinstance(num_atoms, int) - - if lattice_scale_method == "scale_length": - lengths = lengths / float(num_atoms)**(1 / 3) - - data["scaled_lattice"] = np.concatenate([lengths, angles]) - - -def create_dataset(args): - """create dataset""" - config_data_path = f"./conf/data/{args.dataset}.yaml" - config_path = f"./conf/configs.yaml" - config_data = load_yaml_config_from_path(config_data_path) - prop = config_data.get("prop") - niggli = config_data.get("niggli") - primitive = config_data.get("primitive") - graph_method = config_data.get("graph_method") - lattice_scale_method = config_data.get("lattice_scale_method") - preprocess_workers = config_data.get("preprocess_workers") - path_train = f"./data/{args.dataset}/train.csv" - train_dataset = CreateDataset("Formation energy train", path_train, prop, - niggli, primitive, graph_method, - preprocess_workers, lattice_scale_method, - config_path, args.num_samples_train) - lattice_scaler = get_scaler_from_data_list( - train_dataset.cached_data, - key="scaled_lattice") - scaler = get_scaler_from_data_list( - train_dataset.cached_data, - key=train_dataset.prop) - train_dataset.lattice_scaler = lattice_scaler - train_dataset.scaler = scaler - save_data(train_dataset, "train", args.dataset) - - path_val = f"./data/{args.dataset}/val.csv" - val_dataset = CreateDataset("Formation energy val", path_val, prop, - niggli, primitive, graph_method, - preprocess_workers, lattice_scale_method, args.num_samples_val) - val_dataset.lattice_scaler = lattice_scaler - val_dataset.scaler = scaler - save_data(val_dataset, "val", args.dataset) - - path_test = f"./data/{args.dataset}/test.csv" - test_dataset = CreateDataset("Formation energy test", path_test, prop, - niggli, primitive, graph_method, - preprocess_workers, lattice_scale_method, - args.num_samples_test) - test_dataset.lattice_scaler = lattice_scaler - test_dataset.scaler = scaler - save_data(test_dataset, "test", args.dataset) - - -def main(args): - create_dataset(args) - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("--dataset", default="perov_5") - parser.add_argument("--num_samples_train", default=300, type=int) - parser.add_argument("--num_samples_val", default=300, type=int) - parser.add_argument("--num_samples_test", default=300, type=int) - main_args = parser.parse_args() - main(main_args) diff --git a/MindChemistry/applications/cdvae/evaluation.py b/MindChemistry/applications/cdvae/evaluation.py deleted file mode 100644 index 4361fb5e4..000000000 --- a/MindChemistry/applications/cdvae/evaluation.py +++ /dev/null @@ -1,192 +0,0 @@ -# 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. -# ============================================================================ -"""Evaluation -""" - -import os -import time -import logging -from types import SimpleNamespace -import argparse -import mindspore as ms -import numpy as np - -from mindchemistry.cell.cdvae import CDVAE -from src.dataloader import DataLoaderBaseCDVAE -from src.evaluate_utils import (get_reconstructon_res, get_generation_res, - get_optimization_res) -from train import get_scaler - - -def task_reconstruction(model, ld_kwargs, graph_dataset, recon_args): - """Evaluate model on the reconstruction task.""" - logging.info("Evaluate model on the reconstruction task.") - (frac_coords, num_atoms, atom_types, lengths, angles, - gt_frac_coords, gt_num_atoms, gt_atom_types, - gt_lengths, gt_angles) = get_reconstructon_res( - graph_dataset, model, ld_kwargs, recon_args.num_evals, - recon_args.force_num_atoms, recon_args.force_atom_types) - - if recon_args.label == "": - recon_out_name = "eval_recon.npy" - else: - recon_out_name = f"eval_recon_{recon_args.label}.npy" - - result = { - "eval_setting": recon_args, - "frac_coords": frac_coords, - "num_atoms": num_atoms, - "atom_types": atom_types, - "lengths": lengths, - "angles": angles, - } - # save result as numpy - np.save("./eval_result/" + recon_out_name, result) - groundtruth = { - "frac_coords": gt_frac_coords, - "num_atoms": gt_num_atoms, - "atom_types": gt_atom_types, - "lengths": gt_lengths, - "angles": gt_angles, - } - # save ground truth as numpy - np.save("./eval_result/gt_recon.npy", groundtruth) - - -def task_generation(model, ld_kwargs, gen_args): - """Evaluate model on the generation task.""" - logging.info("Evaluate model on the generation task.") - - (frac_coords, num_atoms, atom_types, lengths, angles, - all_frac_coords_stack, all_atom_types_stack) = get_generation_res( - model, ld_kwargs, gen_args.num_batches_to_samples, gen_args.num_evals, - gen_args.batch_size, gen_args.down_sample_traj_step) - - if gen_args.label == "": - gen_out_name = "eval_gen.npy" - else: - gen_out_name = f"eval_gen_{gen_args.label}.npy" - - result = { - "eval_setting": gen_args, - "frac_coords": frac_coords, - "num_atoms": num_atoms, - "atom_types": atom_types, - "lengths": lengths, - "angles": angles, - "all_frac_coords_stack": all_frac_coords_stack, - "all_atom_types_stack": all_atom_types_stack, - } - # save result as numpy - np.save("./eval_result/" + gen_out_name, result) - - -def task_optimization(model, ld_kwargs, graph_dataset, opt_args): - """Evaluate model on the property optimization task.""" - logging.info("Evaluate model on the property optimization task.") - if opt_args.start_from == "data": - loader = graph_dataset - else: - loader = None - optimized_crystals = get_optimization_res(model, ld_kwargs, loader) - if opt_args.label == "": - gen_out_name = "eval_opt.npy" - else: - gen_out_name = f"eval_opt_{opt_args.label}.npy" - # save result as numpy - np.save("./eval_result/" + gen_out_name, optimized_crystals) - - -def main(args): - # check whether path exists, if not exists create the direction - folder_path = os.path.dirname(args.model_path) - if not os.path.exists(folder_path): - os.makedirs(folder_path) - logging.info("%s has been created", folder_path) - result_path = "./eval_result/" - if not os.path.exists(result_path): - os.makedirs(result_path) - logging.info("%s has been created", result_path) - config_path = "./conf/configs.yaml" - data_config_path = f"./conf/data/{args.dataset}.yaml" - # load model - model = CDVAE(config_path, data_config_path) - # load mindspore check point - param_dict = ms.load_checkpoint(args.model_path) - param_not_load, _ = ms.load_param_into_net(model, param_dict) - logging.info("parameter not load: %s.", param_not_load) - model.set_train(False) - - ld_kwargs = SimpleNamespace(n_step_each=args.n_step_each, - step_lr=args.step_lr, - min_sigma=args.min_sigma, - save_traj=args.save_traj, - disable_bar=args.disable_bar) - # load dataset - graph_dataset = DataLoaderBaseCDVAE( - args.batch_size, args.dataset, shuffle_dataset=False, mode="test") - # load scaler - lattice_scaler, scaler = get_scaler(args) - model.lattice_scaler = lattice_scaler - model.scaler = scaler - - start_time_eval = time.time() - if "recon" in args.tasks: - task_reconstruction(model, ld_kwargs, graph_dataset, args) - if "gen" in args.tasks: - task_generation(model, ld_kwargs, args) - if "opt" in args.tasks: - task_optimization(model, ld_kwargs, graph_dataset, args) - logging.info("end evaluation, time: %f s.", time.time() - start_time_eval) - -def get_args(): - """args used for evaluation""" - parser = argparse.ArgumentParser() - parser.add_argument("--device_target", default="Ascend", help="device target") - parser.add_argument("--device_id", default=7, type=int, help="device id") - parser.add_argument("--model_path", default="./loss/loss.ckpt", - help="path to checkpoint") - parser.add_argument("--dataset", default="perov_5", help="name of dataset") - parser.add_argument("--tasks", nargs="+", default=["gen"], - help="tasks to evaluate, choose from 'recon, gen, opt'") - parser.add_argument("--n_step_each", default=1, type=int, - help="number of steps in diffusion") - parser.add_argument("--step_lr", default=1e-3, type=float, help="learning rate") - parser.add_argument("--min_sigma", default=0, type=float, help="minimum sigma") - parser.add_argument("--save_traj", default=False, type=bool, - help="whether to save trajectory") - parser.add_argument("--disable_bar", default=False, type=bool, - help="disable progress bar") - parser.add_argument("--num_evals", default=1, type=int, - help="number of evaluations returned for each task") - parser.add_argument("--num_batches_to_samples", default=1, type=int, - help="number of batches to sample") - parser.add_argument("--start_from", default="data", type=str, - help="start from data or random") - parser.add_argument("--batch_size", default=128, type=int, help="batch size") - parser.add_argument("--force_num_atoms", action="store_true", - help="fixed num atoms or not") - parser.add_argument("--force_atom_types", action="store_true", - help="fixed atom types or not") - parser.add_argument("--down_sample_traj_step", default=10, type=int, help="down sample") - parser.add_argument("--label", default="", help="label for output file") - return parser.parse_args() - -if __name__ == "__main__": - main_args = get_args() - logging.basicConfig(format="%(levelname)s:%(message)s", level=logging.INFO) - ms.context.set_context(device_target=main_args.device_target, - device_id=main_args.device_id, mode=1) - main(main_args) diff --git a/MindChemistry/applications/cdvae/images/illustrative.png b/MindChemistry/applications/cdvae/images/illustrative.png deleted file mode 100644 index a70858f7f67a881ba63606c03ec3eba13fb7ef1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177452 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˻lRBC~>YSYXM*!Z`@s9CZ0d{1r*_C;x^%v~r1N=gH zN>o@vOJbnCAu7Bcc<1N$Wg%p!w6d>fmjDBY=3C?S5I+ zM0|FdESi(*1*%;cwb6P`(JMpL&0!AO}=gx>W3HAlC>+15rvcKrTEJq_~%P8 z5L6L##*XgapR>QjbN_fLM*veuu1s)3Wg-3_i|SwIp1-`r2!g=b5{Ec@{a*+BzrLl| z;7giq(4CAQ`Tu-uU~=Hd(4oQ#{?~y1*U0|Y6E!$sj#Tfx@7MkN^YeFy2SWiI8HSk9 z+yC>|kKugDT5+z(jt2bwF#p%_{QC(x0=Pze^y2T%m^&5yZgmAb}tML115pVMS&)hduz_vLa=z&!D%~X+qqMiG|eo~@c@dX)=RSuxi<^r)& z9FMKD?_|ZhT6x9F2HaDI&*8^DcUg(KAvll3A!o*_ZSu6WCPgE4R#L{ z@(;@)94%-wctqt5X;cT3itXtxyR83r;7TC zFtAd!mOBAk2#>R1yj<}>xbs^)BkBP@cg(+D6moEaa(k`&hq99vZQsW$?Tl{F$ZDOf z-rhplx3P;XY*G<#9a67LRq=jdto@M{wDqeHbTU?#{h3<4zDE&U;YR0U=0qm#FZY^n zj_W=w*1aV?nI1Zq;B)(3`r3M`|40Gm5PfA5*aX?KguL&M=|EckD$@m%KjQ_5Ol{$; zXfc)=Tiw{A);=`q8g4_FY*3DDXDDS=e(3{#pN8)Nm)g`MHOpN^^(A^=aL z;rD_KbQBc_U55Jx;;m;7(%99{{gxy`wlwG!(cw*E!=%rxfZ;Noy<$4?X`IWI$dgMS z+TLkD6{p3qJ|q#+pT@Gj9Soy((T3X~ou)^l#TY4I+FPidR;E|~t}V-aICW2RH1LM% z6iCeu0kq>y`!!;YKmGd4R3WB_iwr}ST5iqsiai?dDY9shhh&fs04|R--^8vu{+dB7WS&^OY#JYW#=Qj ztNp+~;u>KlYU*)WKRVJ`IdhDMy6`X5(=OTEzP}azYi`8IfYDcvLH9i7M+f&t5+O@u z0e?ur^<>31QF7qEBBWs`->`ih30J^ZO?lV4Sf`sZH1;?pT9D9iI{$fVrSrnLl=V_E zSzwwI!of@E#R~~1Wc(7@{y3gaS-v-d;H~OZeZzFWal+05kE8O?m+!7e@0=`cPwXZn zNWBg@DmaO^hQ2BrdL3~O*}xe70-#=B0cf>6(N&GC6gW4I)u73fb^2`%HTfVIvr_+b z#p{b(0|T-Pve{jxcwlao=N0c{svqyik8B#wFR>MHbFaOE#P{oPIw8`04e+)VNoV?L z=Lmrchn?xAZXO_#{DPUpu*-7>Q&%#vTw+cCiC*5tzUl2t{*|*(yfF6aU{-HT46qvI zkRE6hKAkn<^t`mZb=g&FSid_c^Mal5ivTtdWamI4M9<1ck)WP>4Hr`CGvU+2#mvbV z;7{V-m{uXPpb_Kc5LA0nC}XdH^rrZLx<}s~^}p};8;UhgG)MZ5db@eb=_w|BqYd^134~ZUg(+8nXN!k6HWN`s_}?0vX(GL7y3XZtDayZ1*9S`X6o+ zQkRzi<9TS=ZIwlDIunP%EHksz<)CZ^cQdVc%<<@wpv*jy@Y4^ZZ*gJ{P|J;OUoY#X zq}FBn1@cLMvZFXEfV@-j!4n?M@+P~a6&E`{{yUi12=uoh-7;@1(W|bMGugPkte(vY7 zZ@c=^d@(8*$M0nB@v$4hm$%`;oP2-sqAOHyOr(c<1m%UtaNg|MhvxZP_W+;4Jd;^g zAbAUy{?yZ2qae1phIdR@MZPt2)8|$#A@e2U{a!Qf+b#8VlE-6$0z|J+!<8GQM7bo| z(_{VWz{ZMn?spdJpvYA*_b;M%Cv93jQlf=AMRBjE=#{REIm$(;GLMU6L`#saYEpRi zaUyU0S4*5~#sC!UiYLh=w%Y8@7#mQW`?@&QzfH>RjYzFBJ~lI^EtR>DH-Vq|o;7zb z7394lwTJX^;* z0Ca|*zNzEf8DPU4M8a)iC17jPamloJ5Ch&4kiQsIxHZIXYz6zs*dM=)XTu(d` zj#urH+7$dH5E-|jOlw0JQ@#Ibp~%U?Pg94~3~CIGkQzvIUF*Z%%b7t*53m(i(i=Aa znDtPWKBf*A^VQ6MJALBq^)7qAm{^i@hh(vSsA{t>53q)a6R14^XHpWny;SX-#eRF` z0S1BRjZf&3ZxDmE_%+eYD?P4coGExH!59eSjR~qzIiBL&qo*{$;I1NnH!IR2>Vt^A ze3KS58{oEDo1MJw_md$k*ErWLL*zUxKkG&l=g4(FkYn$lT3Iyl#R`a%c`(22BK5m; zPNncvxdBw5UM_Rj!Sd}zUIigPU7~mKCO1%qNEz%XB6qVnek!jvj6`u5W$nAV7)y8r z=0A;?#dU{_KZQdtfigKWRCz_I_?xg`PUfXV7QGppGdsZVjRO7H3zY@2Vr`GSd0o)q#Slp07H}tIzT; zc|C5!pyf6I@DUU5RJ=mPZ9=VIa6#H4fg=V^5Jg;rrx(-F4AKiWhWKMBZAALxY)hhs z+!Yqgx<^Kw$9X35G+ii(uT1jrZ|`r6^#_Atz_ z+zSzS_s~3F{DWdCG#vl+UAJ0Fkq3-TyS+}{SRG@GnV_C+Ff@5~+*7%~Zy;u{@l>Oz z?p7#O?|8+{G_@rZo#+jq2^a)R)zRb?YnMyZxoh>%7c?CIg49eDHK)N>i1x%IO;u-Rn;zz8vbN{2bK7vHcoS8( zCiV|`M4%jMO(7Kw82F{tA(s-WkM?P3%Qj>ogGTUu2L_E^Jpl|Ei9k1?ZLm_L_4Ua5 zLju9d%kl4U1}?nwKHn$Pe)EadyjmG2%|z$Yb_~RwWK)VozN*ch?rL*n2uJ2G5e9Yr zJ{Pn|*@G>Jx=V~~uxj?P>(lN`A+Z!$-t649!w{C+9WLHFQ_A~$Bkm0%Hm=u!%h20W zp~7o4z$9W@1AYLx~b>(;Bc*Yoy_*6PTDX;O5t-ykZXp@jUk| zroO~1!ZsQ|#q=;aSiX5m3x>p0k0AIo`!%vmFfu^wG?nd%t!Q(SaTu!ro*zEAl-p`V z?kb$}gG1AeX4TEf`{J?0*Eh%*2i6Z`PqJiVy^@6Ua0GYE{*X6Vbxa!ebtP)eQ+V*8y2qAygUYmiExiV?^zW&?nie5VUQO#FS zb@8%<$}KCZN=X{ok4sb0mM@6Mlyf`G=@~p0o@SP!X?yp4yn_aUr!aY)hr&z398^xN zRj0pmhkSMBPqkN0dTxUh&z`Rr4=HX(5n^B1_ zF6%Ky7fYt!sxaY!mvi~5wEQlY73+E|yHd|!+9aY~fA0=Cdg3^a2hT!&(pY@Mv544I z6mKi`ud|HzsdO!9I9Q6zMd!Tv1n+&9%R+A#?|?~x1>Qz?JDvMT(zwtk;9KVRFnn$` z1#pnJ24QYJsW!SrY23zVVe9zhOlImjm&NEpd&hSf2pS){&YRoen54JN3x@Yg9O1<5 ze2VZV3jkilnhL*|y<9@Bh=B|r8O0(pZW!nUsuGv;MHM7}J-40usippbJ^^l|hH5Fc zG+Ec!JG1O)T(nmqJ3vZ_cI{J!mb5;RZ&RJxafPfT|84ryQTtI>W^(RkCufw~44g$& zUBjRaDZYJXHN?SIuCtQ@b1ewElQkwtmn3V@E z=)qHZFGMzjhK(L1d*`6k-N`NeM)8d3^j;^%8t;=GCLmOT1O>Jd*MQEH^SFlAYl>g2 z`?U<>|(bYapXQnHQxmy`)FFtH#KTqfQV4I>!t0c)B$OJUd-=geD!@R zsgZZmZ(aAw`G{ivA>%)yS|~*3PYgkMi&pAH+j%@rc1J8G{-|RI4pSTk=Ip#2OygI4 zkJu~AE9`>Pdz#;u$q|`vQm=P$1U(G@9xN@mGQ|dFN7*daI^6^+3!Aa(HRboBh2V0l zjb&2FUc`_K(t)|Jx$@uabgiI=lbum77CuII+-T$F1^8si3P;E6 zeThy?0hiBpBTnqXZB&uBNBxrg6~NFjV{sDR;RH>vMR1R5CZT}`n!VM?SqN7a%TEEz z7_%rAqqaI;8?XsI?(oKcE7lr=-8HZGE@Zg~D+H4wYkrqWG3?P}nyyn%kWmJfC}V~p z{jT>&Mj$D8*elGK3g*OZUAn=$O?~$B-JZ^UbQ^xy=2A3TwzT`0D_bU-B)4!(qvMuB z*V1~{@Z7MPc_zbe?XjnJyPE9FC(Vap7^KhpM}597GYx#M<%a=s6F(t#&^z_7_6U-I-X(&K9J1J^| z&y~gt+u|2}NMo*f9*u^;Vd%V?q$U5H2ZO8GR3Rfjl4DEeUM2POI_r}nYQ8zcL5-v29p<4#CeDCD~`A=C% zg6H-lKXl}{+*ByOUN57}%qbF)#qvA1e6*3RLkh08z1VNtw3u)5osggv3j2+_;(j9` zj3;1ixd#Mbo^I&MhHd)ME49+TRwN0UV(b3s9qVOjK9C?il5fII{}e}b zboPe}PkM_*hVPmdzqtkO-Ys@C9O7yX4)HUAjP?FnOFO~MyA3eiyZCPO;&|=#GUw1) z%@Z2&S)HN}E3ZoRq(aKjg|_{N%O>Vabs0oKf9y2P+wS(-xiPo5_HwI;-ZWQ1?Jl8h zWNvW4mv~F4q?rr*(|)6A24a6;gazN=pz@5iFz7ci@;+%>W_vK{RVIqx_cjg_0D1qWKT5wl zU8@d=reTcdERwGf>-8!q&!@tJMB=E_-l@jT-1*;Dgod-@(*okHCacgcZ+&5* z9r)5`kbV;J`lULQ^{_XS94XyzDPDft9}@k#xbhQ8h8M9I8Iyz#bl1NTK1}x|Jk6n+ zl+M(Sv#XO6m28YlJ8JY&HC5e_(cg(e5@(b2PLTpQzJo3Em>NTBZ7CNSa}Kwf`)*$# zgyx`gyR;8|i!)}3R|vVKCIVL&zIxU<5tLpyQ9YmrFa^XO%k)4M)kn0Oi5c zIt&aQ9HzEplOqux_Yk7%U=n?}^{dl;cJeWF!goX2xU;})E`yK6*u8s{=yj_#I(r!3 zoj&mCb%r5iPU-D14vq1WIq56|c+&nsZ1ry2=BvAV`7m6GrDcjA76TN%N_$|oSJ34k zJYxrg4PpR{kVWn@ipK=zDW73L1j0u9EdNmG zqXxj?gEBxLE!#9CUU(pn^IL2;D9?eiOWW9hPZk}2B=raMk-dehJ#>QJ>R2DVk9 z1_@z=**Nhb5u3-vRC$7Jeu6o2@ic=pzi<%Hj#x>e;pUdLcdWlqI4C{lwNLxb_$wwI z#`qA|ngotGs)d#rKd>Bi#W0zcBE;El;*Z#s7nMrNl|h5?krqAc(Fcjw(yKM8A;GZI zuOy$$)P{aPf7J25Sxz+2Dr_fFeVC;sRP-7oIz zqeD3h>9301?Y4<8UU;8v7>E9-AN){1`^q5aW}5z0M^>Yv&~7j?T{^2WBzxJg0aEUB zGAyfB;B3b4v=riVv6?JWFG2B=kvWR$hnI7&Ii^)a=qt$Uel>Q=kW|@-b1-GgGYrXr zH)PW_?C|83TpRhi1T*2L1UZp&rHNmP1xJtLCe)EF8_A~Y_TZyTsF-hbw-|&a+eXkhL&UH<2=0Gmo4D5 z{k}HPILOfT;0yMzj_3+L6!r|m_D)(>>@UW8Y|ktXpIpGs{hReU)-QPpl7l?oYkEe` zhjkl^s?ZV>2O@hKN4qXC6SRh5k{09Zo~0doj?bWx&bS3HKZ!v42TXUt>M9K|+H#75@wfNv{;*#_)I%+|KZ?CN-eUt9 z*c8Efrywet1dAF~MO~>-NVBE=I&i^xn#Ye2>2MCSYz<(Rd%x60GQNHM%r(DqN?4(N zaxjITYhgP^aPMG?99_IVfx49ZsI^+vjB^hOXhcZ|y6=c$>mPxks})wGXhMvVIC%P0?`bi`8SP$&-xop>-op`|EZSX4Wr!p&Yq15I#P=Sq zc*{m1e?|4Tk6m!l#5@6xWWte!&)J@!&1AL`ffHoGo!6SuyxtZk5F0E{X-RBBOvHyN zjwk3Ugm4B%au}iQUjyZVms_pPBwJrgYZ1p=tcBCdZrWJ7n!*=>!RsE`y%#U`bCM1G zUhnYt<8jNk!LJLyds*+60jjf;pWbpcd*UkXe`~_`JD#HDzXpYy35)l5?|z@xeIuzn z+Zpf6b0*t0Qh1Y$zCJXAr9V?@&{&tp&Uk6Ov7>Ah_Xg$%(~4dF`^^Hr6Np-~1Qe*L z*Pcc#=mk+>#li6S-;|HlCCaC+4!c$#55((#7JHD9=%G3KK!X&Ss0%ut{%iDAgkLI;4$1#pv+J<+Q8}z2SWv z(enbt#YdF3GZRPJ!Rs~0(+fdD0pG_zx3MjcN0L1x?4j>o+)7j-)FCS9BA=cpGBgC* zy3L)o^~1%NoitiS)s+9L3Wc^b-`z6nbIW6>nYMgC;o*7I3xc?oMRwgP1@lc0aYGGU zLS{`CBYh}F1{`z-dxC<=k!p%fmEDY%<4pzgfMTsLx@jFy%fAGJ5VEV*jzZ}m_Uc%t ziBAtCI$d_tsYz->+l?!pCT1db-JvC}sKk*jtDPVO*EV{e$@z&64K3<1bGlLfT(3gK zW9U`Aq2vwnhGX(G7(r2uNC-|_9yWSYLbNw=F-xeVlV&to2Mjuk2Z>)5CzxG8VtpB|=w7~Yj1AnD(1HGyxq(dusRtNv)5YjO;$N_x*OWK7V!ubI49k#QXlPl@|po`+nC>PFIgy5knt zyw~#pp*XHU8I#OXbk$=%`N%k&&H71F@!hSrr%L_SIF}J0TIx5;;xd=D>Gr5qsHbe>x1kHIL|iG)D^8e{^8nA7(>IFy;1u-4BE0kU z1;wZK!pCRu=Q^8cI#VvEZb7ebL^A0mhspNb*VG$)m_8L;FwzR;eaT)p{&mTHG-Sa{ z5EI7oh_1V_QHwwk^eJ}=%whdf#*7b5p`A`u!HjZoM)MboO4|TJ9@o=*0{+S5T*XwK zfyhe^++UetQ9WO&x?EfZef=c0o$7@ORs9eAZwuF!!yZVpyd9089joBW?5D2GeeqPc zs<>Fce&SgZ5~chIuBGRYu;!qnDawP;XGih=*F6l-AwjA9AY-;So5_YcnFD~xu*9Px z6)rL5?nC*jLov(RyP0PUg3-C63lzt18c1~3yW`t0=eSR?Uz>>C-F}l6Z4O2qG0QB8 zpCB2?RLzoE*m(BMW8a|FLAHJvVKAqHKlQ@-?~fW=82+th93{W=53~+XkTE0m zYrXB5{8;7La%FaYJTxPZyC>tFNr3*^rdZJ%CQ^G+pwKi>mFwG6-F^24ND z*p=S-fl?ZWIJPFI-p9P&GlH$*DG3*oi9&tB*)>gHaFT^ii1D{AJ_z$UP*I^`vDxJ) zLGSRIu>Dnh@B;@ExRLKm&Zww66R*fsICh483Jy?fGpO)m@G7rJ}rY zI@s<Jmb8#n95z;x-?^eal=oc*_WsdQnzp$(U zT(0Kb%*4IV?;bIF&NnCek3#q_>{j>!43~D#!f#G{xgs~buR4JvW^@sek2LH3PwAUV|r4ezt|R<6YeJy z4V;LhIJea#MaXWP8bKbz^SCI%%`Y+rs8te_L4Kq@*%Z8PPh7#KUDopSRzh7BV|-pb zQ>1z33au*E692t{zy7@nl9MlxW}fj_@#@=Z?`tbe35^e_?uQLu)hY|AdOryZiOli( z7%bJc?HN-H9j{FNy}O$5L2L@m`I^I5zER>cS!gxU(RcB(gR=AQLo4zF%Bw%g-TYbWqvFRdoql-ViVzbV=6OvWjr(%N^&$e zX|j6XmIl}srG<-N@hr-f1oq-ZoY4Ygnfh>wZxZjl6uX@q<%!OtjrI%+g2?7*1Aq9% z20Z|7fTMUXuVRDB-lt(l$decP?OYT>ke{!4iVwEtw;SPVFFxqvp0vaNQ8K27567bX zfJ^~tQHzlr##DCnNft9+J9&1>yO#&`dMbYY%HQoZ1x4Wg*h|X&a4v2>jK|SIWH`3i zTh$3`uiSeX2Uw$j4$FC)5Ls+k*Tc^luqWIANe^0s0K#L9kQw#{tbGmI7%=br*=(++ zZ&q5+Q9tGbhY*b>>E?A#wtBvH(dF6F2N;ic?cSR-e_S*6c-k#GI*%wfi4gjxI6_^V zLS84$vCCda|B#f4zPq_g`DIoAW4({P!+3f0FFQ|49uFdtypqK{#@e^R`$pDGVDKvR zV!JRvMr8Zrck`Zer{xu(FFCoU;Jj%~CCxkUl-uQ^`W-?yXM^T0BK6%_AxdfiX(`Pzn!ACOT< zL&Se=^_ilG>db7#dNR6P{c`^DxIra>V$8>3-7SzBXqY~H8$H1cz2I+n74NC%pKUQN zt!NmDmRky$pD56sGk{UZ|zg*ys2Z6(QY;V_rsV6yY&saDvzYBQ4x$e0I^g5c4viK}+ zow$&*+XC~da8{_RnFCc~8fIL$NzgDR4jPPzEP8PaJMGUd7k98GRNBj*L~Ox_CXqrT zApj#w11*hv+QkG}lTIXEnc~4^A&4m;+T9iLeIzaQAaCIU1MM!E8{fYeB}#G!mxVQ^ z(LVpGlW|-qBYc`obDLb$Qw9n>$k8+0)2ZFP{F1$}3g~@5DTAd?X zZK+>q+%(n*3Jpa1>G|)Aw=xk&43LZi{ZWnR?;b!^ZqH-hv9Az9Bm3jwH6f20km(0B zyZNa~#;KU)_=P>hTcHV;6%;YWrl9EDlpaT^Y4DRtb!yDRX@EzKvX;2;CCtZ4n}PK7 z%^3>+u?=fP=8~1iE#ZU?YTpB02J;bWR5}&dh+9$q{}qCQsN;_h8#=r(b9cOr)1oY; zG$JyE@hu|tShQPHvq17o{)TvKOF7Yy!{DVUmN33`Eb~@Exiq_er(1X=8v95Q5^h_| z#}U z3Lo3GDHr|Yz)6IYXrA+gL z#$xtPsmi?R{I;68JCiD?6?)^}Kc-m7O7m!TvaXUq(Yh?R-&3>80d^$IO(!LA#G98* z!cY=CCeDFT`7&RIEaC%_WQQP+PW&jxk2%V-0b!?|bEox!8lk~t<|3h~nlBi{^-{V1 zC&7vA?v+n_BfGz9puLz-XcF#o!m^#cO=fw0T*Lz4!epYJn)WOihB}kXlr9*b^;q-f zwICgzsBno5@Ezb$Dr1QLse_CAlFAmz(}cbIEEC7F)VM8~UH3`fi5qa8hDv_-p2axyxxgFeN8q6nHwkp* zO`6gI4MsQ}h|siyPgzpQ0dHlNUUEjLoV)+ZHV)YhIuU?m#O-x5p|%y(r})o$e%0oe zL8Mr&O-bPtcZziEJ&+0?@m>1yR-`@{)(pz>cgoI8XP=A1oyiPJ-t&CHZm`9XUNDVj zGeU$Ob{7cIJ*0u-YcDd5YP!YhpW2-n-a@*AhBbCtXmJE1;+b3p4GQPTjX#@|>znEA zy{6ZFGaA!eJbCVE!%}*rZgGpwYQJ{bQD|tkGdq4XnR&;H-5tM+w)y+)Nd``*f}s81 z&(}Yq>H<`tj~@FW*0RmJ{7NMo)1&LE$_+K^Au`l9_BVBVr0%x(7;2ii z;u$;6@2Cd~1Ifq_Aoap$Q>Nk!kt!o{3_(QnnNUyY-#g64>xVuz~L7kRKryNCfqtM*s`}GyqhDFGl+#^{d zqXaTE=aotOuf0wyrqE|@g-N{R%X`2TlN>~5=CVGRv`5k@;PK46O<-R&q{|~0y9EL+ zBkY5a(xMEF*2HB?Z%tZJ@n`4V>~`r9qoTX}#dOY^Z!9N`18I0?@2(#f4@v=C&7AGn|T=@fXx?8;)^CghRf|{i$nnBU~s zi>G*JQH8_yKMbUP#coDIFV7Hh{r<51f;Ijj*}xqIY?=l_Kcw8b}rT3%<~?peqFEGMEp1q84LH zX4dzi@{1&ke%%;XG1p}=-|J{$WJ|=L75u!Q2Itk@59M-YoYdFC7}7d(F3M$v6P{zC zZw3>4rgIZTH%D^g4Pf(h!ZNHQ9G96xh4!a3YWl~?>i=Dzzpfb71d!ZQ*z8Bx3278+ zCY=G=fHD>tBV|DX{+xU{-93!(UQ9vF%F#JeGoTH!3yaVjAHe%mP*t#tZ+H6K1Os}w z??TBY){bNtfApoq^l$=##tp$0c7J(=ch3RI@3)Qj%JzVCC>K}z&$X|@PA5f}8MW_NBekm22~!=HYVE$rfp z!WD4aBO60`gr=Xjqk?smjh{Up=uCDDymPtKCDe5lnX&bKwP(H*6D+i}qH&F*wfS=-#*W zkuy{=PTtgR%#c}lm4QbY6rr@0pZ=<}NzNe?bzX^37++6F^QmR<|@9Y5cW#>LiZcIrFz$$r1mI$4~ZWLoo!@ko&*tk%#(kMe+rGJmeY#E zUCn%w^k#E9-TCC)KXV0P;IOrmfZkg(OcU!z#QHyOwS-vUZRzO}$!4a-cq*YjS2U;F zp%Fh*?0FnFEnTn1gLz?4|&t(p_u%+m01-!EDpv1y#c>D)Mgjs3l+d!Wgw|KtJ%yD8ThE85wdJp zkq$n>KRh6lmAl{_cOgSN5F3$}Y@H!k$-l~dIu6DU5xZ+&0SMN8D9)nP9*z~uSX~V= z;qR5~u|8ZtsdM=P_)6(I;U3`NOAw6a0`^em^S4D_ug93l-t9ZNOd^tb1PcAielc)x z%MS0}{r(^8x^xTA0>{{3U3*`|77B|>5`MX?b%PS38JMx9S|f3;-*((&LuN9jC68+am-+!VEZo*&b_tFWi86*YJm5f#&IkWv(6aW_dP6>BWofi zwI42Zu`(r0>bX(tQ?P5v-U_jE$z!4)>2X#c6`^ja|j}1{V^$$5CQs9rVp*pGK z>KBn1R@P!aaztc$aA|b{PmII@66GU3tUTeZC5n#gU6WPHNwO37Ku(k>LdV9=XcEuF z}rds;W`G-!|$fb6*!__%Q!h`NKJlF?L|91cIr zGKbg%+&8Ge5Y#g5nf9X8-UW>IFpR>)^vvZl=3(Q70|0r^90$KXYT`v}6e(~pFu9B~ z;vKs*Rc|mB$;?^J6@SD4)2lIBzw2MFCI^j)p|n5hs9+bTaE3V2N?jF^q*JAg<*Q1b zT_1*PU|zLqXPE$z8Vi=YKa8=&fj8lY_9FTIHp6g!vOxl9xFV9~x>4L=5%A>sM1SJ> z8h1p^^KMlB<>XG{dY4i|2#NSF+e;k?-1n?N;6wLclD9bHh%*#Rt zutCc2zBgELO=oerRS7-Qe6|2 ze?b+h*_`#$LcrHpw6ck9P<~U_zE&DsxTc38U#2stW}i1r zsv^%)9qb_Iq4#1ePT!ys(~P5O=V{UN;{S%Qw~`hgN*G#I0z!uGXRqk>S4cv0lu}ed z<%m(V@TeFJpCdZ?7E#kROFeE!cpTHe*ZDVQa9sX+b%D9>)K9R?X*xmL^J(3a{P=Mr z>?fArlqc+r=pIUGG1E<8p zK<3UOiBRn*&)x}~F(rkFr!!QE& zexC$?4DT2B$~KT?5|+ZU-ENKyx`cqv?;k#a+VsG~R(?77M>KnXM#f2?rU|$x-SXOI zPVUT6_$045G3quvJqSQFiGpiOhy7GJLCElu2gVszpk#Shj&sXPw!$GBaRm7QG6xNjCQX=VKY0 z0MO@R(KOxV|Kj6`8$qqG9+&U^z{(7W6s+cX0!~X(R^X`ak71u`QA*>ZjwE9L0F?5= z+T(BdvG$!f_P+EU0?NRXKH`M!FQ@h_Pabn!TR8k~aJPDqE}-Fz89Mn__xyjCC$Q{3 zcq3%f{2#JN;2jE>9xEf$c#_c4eo?>Q6v@xh{T`~ERMoLO73?$hGc$;6>tHHY`Z2#r z2!VAo&@7bmHRQ)Ixpba5cVTwWN!D@0oALis`UWocrBFD@;;ufyj{kAq{vZof%aQLX zTWrtS$5ZaUDvWE|Dl9TFiMp@80sUw1l+&__iBLSoQc=!JRw$tAMP+-A&48PD#H2y& z_-9ukyy!GG$()*A+;fCp=RY>Ml)O>j2i7BCb`iHJ*__u_&$8Ey)RsJx9gMHjX0s&d*>$$qW6xHD0=3+_o%*TgDZW=S>?wYVPvqTM)=cckkXj&vokl z>mDqZUKp08Bv_%#;5U`A#f-{&ix%j#^-&bCIr|LwAJx2ykzFM;{ljR9&5H=er&98o zR$}2pR}wdHBPP9R>t0O>{;47pE5?q9C6+6fh+O{f-nxGcMG^N@k@#1Ss5k%_DZ%&4 zy@Yq(?~3({lb%*)(3_g2cM;Q+j+KdZsC*}wOVJh$x+KRJ|~Ii4s&F~D(FN{>1s=x1in<+N&y9qFz~y}#+Yu@xEyby&m;50`)n2Y#T{iNh!m_?%h9hltA$=i6W)XD{&d8VrV zqCZ`5a@XDrtVKez*aNMr-*=OSs-E^>kZYyTT^o8y3_*J1m#{8M-;?<5n-XSvM^4)d5}8ap9Sg(tcwKT8R3AHVPvySFor&tD zB1w3$-wv2UNV_DxQQ8_tNaRAyKe!*vYJr}{2i8vvu3e?gy+H1~vXP_Gc%F9O`3H_> zmAyuo0iZG^4b{5t&*={qN(kFcR~&&9q*wIrn)cqG#q);QAp8+|g3a-I^3iHvpPkz_ z+K4zJF5?f2=HnO^$iDEeMw{e?bL#{ z^-_Lwu!>Sv-KuV&Qz^dXfP$M-o?!QTV;IArV+R51v~n7ssvp3?K5br`wpj%Q4<(f@ z1GrGjjJd{D;Gfn!1mhBWS*vGhe%HC5GSUHc;}f&Kr0=|V)fb*_d+TuWrtOgAHT2G@ zc%^Ke)2)$gC({D`yqJs+G+-s;OFytx4(2H)D;aog(!aWfw>m8btDs3ipYN7F^uv`FfdZPFV;>?#J?5(*rkjgOc zcO31L$HWn*gk&X!t=TL)1Xa`jB|tybXuQ>4W(o|i6W&#RH(oXhHABu;ccEy6_}5so zMR!D-CpV60x0LH!-eIm3-I%_>NL)m5M4JpoB43JH`p)|%a9Jo>s8e(?JrG)6dd-_6 zwOz}pUI8VQOi?f67aWq^{wQQU6g_NGG&E$7zSpV(b#l`883K61xn1hA`vPtbm-PXN6_qb`VZhIvdOEfB_wTsf9MKT$XqY$inS>05x-gbIl}f%{2dzfC zr;ne#iSt+=sxCa)7?$)p+e-Q@fbr5`+~?~(C5`bb-m4LKM%2uy@U~etyo%o_6rRRrm1YHdg~tMtFR!_FvPx7Z>l)_pR@fS3`tt@ z5+%J?n`L+W_UJSGWWgUNmihKBP;jq?R)q%|sR~bUTHgW<_9-E;K7ZC7F}&!aO-IG5 zTM_5BJ>el1;w>-yhTk$`dDvhOv0LZUtp6&CH4D(0@tZuj22tqWo26*-IYYk=H_M}Pz3thqVj)OZj}pD=bQ zesn?KpT3%@h%YaUdrt8?|2?hjBc@z5n|crWl9`6rTz$urb3?xch`h5Su|&>W`~+HW zz0nCFy-#1|8!>eWBT?_sg&8s?A9N9iVV%Lq!XDhVIkva7-ug9^&Rqol7)0t6J}89I zzy0W4vA6EcGyOoQJ38BAcBn>6uyBM_6=kQ_$wIh-5;%JSEuzbnV1$t3(4)YkMx8%q zS!xK!8T?H3Y)ul{gK)9=(`zk~;T3by9Q+&bGo=7k6<@zAB>dfWd zTlr@cfc-fr4ff#AFyYU0{ogmUm>wQPve7S^O6W{ZW6rlUGnL5yw)S+o7&@CZekA|` zf!t4G<(RQ!V(_bEi9@>@s<7y=?76d1=;=DGR-oQ{oPZC7*Up}ZF3f8gM`Q|F4(>rCzq)sy%`K>W zd5FtsmTE0X`*O@?dau#Cw_Lhg50XY&`?B%lt_*T6+02iAVI9~pAORIq({SI?G~W4- zTzS@#B)=LNLy+-1Uqrsp+;>B1yIXFO6?VKwDi%Beh2AQObZ<0?De-f!5NX~Z$K3<% z`OlNrC*OzOB+V_?)7*0HoTO~O(>N?w<5E-Gx7`DVY_<6nZUb*-V^CWl-RpvnS zAaJ+w+3FwWnSZZ52=)iB{&yq)cY{;equOf4T0v$>#O-%M$=hp{Jxl`AGa6h%)`hR3 zQ>hwnNfe;IXRlxWN@F(^DcS-cPFg@@%1;XaRT0`%sQUB^#gfuXLXs*gZDb@VloBF4C7X2xU z{GDL@;7!q*<((?QY14}2DH|_zi-WI5U3i2xN$xzDn~aj(wo7+{qKZ;vgxLMYPN`xCjIqZ`muqy=>@stc|_rtSolO zvvA%Tb&AcO;!yuZBu^#^<0nEFUgboyQ16$TNV{&08Jxp9NwTwaY7d20hdY({)cXCHAB!YFc=1l6 z1bPJ*jD1&HlvB*mZ1x`C)A127L)T&uNqdmCZ`GG<-&@YAS)4+! zHD|CkTdJ4y4u9NB=JP8UJ-RKLR)zTdE!{}1?6IHBN}!1EB^~jzwv(CTVcHd;qYyzP z*wH{$+);BuxJUlcY63k)7J9|z*E_tkxUF1D#(F`UIz(ECga5^a1;5)?BGWe-eliiC zDHmJ!1OEp(BAp`g!b9PO$$w2B0UkJLmWbfP|1VJdf%G86H%tO=u@A@jSMmrZo_Nh+ z2G1+kI@e91V}U&56oek2lic79d7jvL0O1LW8q zsg~I3gpLYGnGC*!Og7qqgJaH{);*_^>A1SG*-)i(QkC7&U+t?7PhUM*=H%qo9rvE6 zcL_}R6Ul=xQoPPsqS;dSRx)ql+nR-&Kpcd>R+@MP>TA^+Q<_%#^6#+wev6tG2bH$l$)%xESn&QUy_|GBUtGw zOGQ3c$fRs%jK7>n-We+=y>Qt#xBx8WwV&%}vBKU$s~l)kSzVxDa+FA&b`CVv#io!( zT3ZOKuKf|r)?h^Clf)u%fm9p&m`z}4yo5NhBy}XmHcG~x@@ExkMsGZwTLet5yD8IH z&qDSQy-6ABsHPpyKH(%=LHqvSyH~&V=xz<0Q z-*;8`6MdfVTPSCmBD=w__CJ@OxR0E5f+F?B?T0Kd_szUd;JR{(+kf20NG_mE>5IuD z{`#|5)7}Ll`8i`*9#zeg?z^PewGZn860_Cb8`Ocwwfcbk#{N;%0eTt)PdT@#EOL>p zH3jkZ-TMnCR=XAg zsj4G?Q?(k{&tuWY3N&m-UuQ3#-`kzZ+t4YEC!<5!fU7%p;)bjMR{hb#qzW`|4!Ntn zi@eb!r^HK6fW^m$=m4YG>OpENg`OGXkdrh59qpqUGhG21MG4vhl58JN@$+voL;~MZ- zdRZxR+udfn+t0l1jEB?LcNZu3Rfbl9!B(&cQD_i|&V!CYJM;Zwdl>3bE*M6mCSus2 z{mIJS*&A{S)J5`OGB9pMbSV7FM_GtB9@9eEK#&5*KsO#S0;oa%b*6n;|SDH zEqNp8pD^Rh7?A5lG}odhdS7$B^-_03%17GI#0omG{z-+2ZYC@D9$j zu&IWA#n&u$hrcZ*nBWiFQx=`Q$)hPyF|s4(e9svE6|3gay=F{IeAZI2}4sUroDrJ^}~A=dI)cz64L(Dv>>d@ zU$I$t;RZ{5@M8bu6U6?@53E2UL!aSibDXqFB|K6tzVVgqi8gi+mfMbC`WYXL=A|^A0y0GWCaePvj)^ z;UdEBc}|?}XD|MIP}o<9Wh&hrZBzakd=htv&P68MN*WTXaxIwf94gP%K+50RRw4Qt zq#Kh3z~y|}zr=9c@fD^F&I~9Oz;xvR0=H^>Z1Or*~YAo=fUKetoFdW2D zW}-dO!)k8MTnKd@VM1ZB$6x8=!RKl7B8}aNvaT4ZaWb`dpCSNEMs>2{F%64%g@=+= z%%vy%ouy5ez07R^L-NUJtsRWrnE`j2?Sl^5&2yu4i3eNIUYwmDOE+Y#+_>CKZ|ae& zZGV|O4qX8WvbZq*LSvec=eKp?zU*Ompc$o^sdh+CZ@zu%u)&{4B)aztSgL!#X~8nN z-T0s#4+WwoZl4*ED#|gD87C%$=jbQWajeJZjw{!L7{nkh-}8Na7QEUCp<)#*C++D9 zYSFX>C3t(+um8p`QG*W@wWIF8VVdPohG1inKl@?RYe8OH!C6%FCkvpsQR&IjLcA=+ zA*8H5(hYz-44~V&plo=nd+()s*&ufv2Mul=kg6Y}xJ zAz!$bJygiEm<S^4G%3?NW-~ zL(|Z|RKouAx7^_wl+v&n-6VYOI5k zz5fIh>R*fs?w_1+`_Bn&0!8lnWp`480)b!j__7;tgG0TV-0jsmOb|4%N$z>bCt5jQ z56_;js^E$O0TI;Zb3^nXe{jZi9}1qIM&9hDk=ud~;T1FR2!DS_7?!5h8wxOXsiS|%j{?F$ zXTn>>aow4^48ZF8-d&OS*5rmL!HGWF6~#_x1)0!Ob?zTY@vOSlpMIxIpLs5!^84+i z@ZB@F)ebD8t@ZM-%Z1J!Ssk8|G3`Be+S8@BrUDAR;ff_v{ zNj}pM_7gHR!)^cwXF<9GH9C_}<@vn1LrPXX%T;aO=*7)h@uVXVu(UDcoBU!sXlq{V zB;A$fti=i&YCZ^>{VG2RoH^R1)FjkKna*P8r_0uk<=_%2XReVu8YM;- z$voR#ZO0NlxyHg6yYprIWh{2jtmpyvWti5O^{tCl~07E5FgGrTWel|3_E^qZ|&-srn&7*_Y3yU)095$^+D- zq_cT9H8!c^5GCYFvx%BMjtif$dGye0ee>pRcc}esk@0NEf1j;daHwDGwIACnd?GP~ zYm4O-_$qto0zNVPpdxKcmNc^CqnKBrug#+r0#H-JTB06v8BGqRJA$5#G2F8RFu6x! z+o*APduno$h*6ohM~PdTy;EpqMbXaI>YZmBZuAzohZq;(A2+uH$ECdT@5 zcrCYj7Lb|&4MHQ2qh6@|$c*RtG9$&Z`lZ)(<{)+km+y{FZB4`Oe3_Y` zSkEYGb>6Hn`P=88NO*y5`22f23KUO$TAy?-@JLeGUknYTznE^(2GR3#K@M-Q6+Ir1 z<9<+!InK$^y^jc9aPFb_aHrsK5bnNm-h{X^Ga=$|(SNma$>}MfIhGEZHU;HULauf~ z!ctR7eL~ZIR4FDl`EUkzTa4$T`9!Ryv_5VT69}3`6iOoy<YrK4mOnA-_ z9B~q-keF2(DQ<5YW-9Rz>&{K;e*zFE@CBIKUUs1gT2@N|Li#ILB|1i@*a~2>%DKH5 z5g&jsQf_J0g%bC{54#y=JZlK zOt0cCtUfF`IeCR<*|ZXsWZ@*0{aw;80_U=_tIG2RWiJ6eW7?Ym>3K!pK@(eFfa3vQ zvv!xT|xT8e^J@;wiC>2+LeiaLycXwfRbq+=|;%}aiLdYm4`7&z~~ld%`#G^Rw_NA7kp z$64ofQCN=LgGulo2;8FWtSob! z?Ch9}J5PWpOKqd2rG*)^y0!Dbj%h#9Z7uK~^NxL*XU)SD(;%Gt{#=pb3p6s_^1Lb`=Ytv>kt-$l!4 zK{8Dj0#9=nf4uMaCltqxP8b?-Sx{M-EsRyVU6%(AC|^1NPjOsO=~ak2OAq|X;0Oij z%a@sx4*J!u4{;-cRvdd$lzCD@S}i0YMjMSuL88(<-QA+>xnIvZEj-)X+aYP|riRt( zQZh1uj2fk2ql3=Q4hn=beQO<#OpJ8sxu>h6H?GcRjw>RI)M-(Sl z$p((NKJ?*C-o0}b{pn0jl(_7B)XZ>1>>MdpsN1G!8ZCU8z(A7zPH^(jVW53GfN`6< z*nlN&FintnOW-PHPvD3Z#u>{Hww~AWO!Gf(L=hj+*^K)_)w#KMpG)Knls>lWXkS=Fq0B;lR!)!-d7SOAUgl zVqvejulUaJTjVBeEHLcs*0G~IyRy%!w5w3)1kd5#9z)Pj*0EO7YAevOM1PiqtYN-j zCgyf4PI62^9Y{Jw+@jI}G9xp`k|;F7Q1xyFh`lG9Mk)`hXFWE#lHc8h#y3aZH|rXI z`8-x=A>7#I6MEiOBzK}?io}4xPi*-?QpCibOI5W1ndff{1|1UMGO@9}ygZzR1+?{G zMg$AFeh&?WOyj>%OwD3lVbZQqB|VdWz?_L(Z5ChW*)++cbA9uF4jT9gL(q4zw&QmS z-#b5=8-IY4$XdMsmMLi@a|RFl0eS?hC<7|z3k&rh-Psnw6$xn&dat-xTK}@8=1jf$ z8i&&jDN0%O^cLUXcFWCXIvlbCIS#+*Uy}>QJ3M`O6@+Js&7VCN=>|xU2+QbI<8$%r zXB6bh5)%_eud5_S`Mm-8BGJd1jSbUl+{nSBriYrsn{G7XpnLTOC-VY^y%{#s6!>cj zYGGl6$+y9)I-m3}mzI`9Jz6>mK!>~$5gC>c4bBzPzt0Q?`r;ui;%WIV=Kk)=j8a+2 zgP55)5k;f&?vPiME&ixBb_ws2a~f}i~*1y;s#q}H_#Gj?rC7Ko0S zC2%avDI>4?re4wE0U2jeHel?JOFm@CJ*F}; z`|S*cPEWU78$BJ4ZjuB9mYBov4hnDi8~eu|C` z)gpNO0}R38IT@;WSP>H^GhEcQ0X6tqRuJLS7Ipk3NvQtVh6poqun9S!?czb#GzJUT zS9Gwk16B}zs8W>p0yC7(uVD_$>v{@oqv!-MeTH+%CwK&e4gkK($j=80-5!f&rkrNQ zQhEW3*@a%!iv|5Wzc#>8jD3J?^D5Kl)igYk^FOoLbOOr&@~nn}`0Mt*@84hzoXs%? zl%GIk@3f~3(%o)rCi%7M1ck1D@MEuKS%uQTpL0(LjUgXMDM7`jBM7M+5EM3w0ffO} z#4)miCpW0mKBJtUot;kLfO{7DSq9R})VmS4C>==B(VFkaWYiF{du><-k~MNtP@auI z2(a%$qG7Fn4B{43u?p$~P*sono*vSL&NldDA&k(qHRF;^ zVm2-Lt`lV|0dV0`y*U00W@#2L?9qq?Sl<2=Hoz0eGqYKYe)Ly^~Pq?STjU zfhGpDV+@PuiwoM&>mD&Aq4?qw)9mfHwt2DG0TG*eAE`3c)^iO5m)YLD*oaiH4E^f& zh-KH4TE_V`Y)zDsQ~9z$cy$l|2(sSNnfW{a_s3Ar68?3B=O4y}5hw1IVSQamDM4S< zFeacC2wtdjgvDEpJW%F{iza)EK(oeh{Jlh*aDtXwopvPG)jC!G7H24e>+8>->}r~> z7i2H`P9&}VZ1#6}7D_5V9u=AC`9?jn5`uiE)u%fNh9(e8cJ!syXrowjcBm%q?_3*Fz>5SdFe*aKF8x#cN-fr`;i zH8K}JpLRDTWVcApkhZ>~y zx-%!g0T8V+8X+E0;oNkM7=~FAmn||5F7zM&_kTOT5LTcPbDT__$c>Y7ugov8t> zPW;$dcUBiiJqU>a3Mon;&;){CA#Fn*^^qyw4JMEX2LNY?oEFifC?Yf+%xMI=5T|%> zBfEE64T>>ez~S4##c$6A68S#v7l)Bnh*8%~<4HfTNRzNy9xyGS`BHFCLrZhFu%;wS zFr#nrq2|eUG=w4ifZK%3!p%TR|Lph7C4T`_oNb{UR=}vgY#w4I;bcW!rl^>xRSGs? z7cgdtmVBJ6Hjb%pvd*WPA&xouxxy}KpB>$kaj$jOukFPD+8!&6 zHKn4GGHOLX{)^IT4@r+5PJUKMuO%qPI zc_dbw9@n=Oza}DoQ89obn0YN(o4PEJ0%k`;kzoPLyE$LNyj_aq;TVti?l~sOrwSA} zOFU<=0DA3I>X;fd;JyZAu&mBgZ#dWMT3dw`4-dDPv>~dMW|)gjyl`1P+`(k{ompQ( zTx>qC9UP$9+1bUUr?beiXkppuP5Z>!FHN|H_5bhN(ip12^*L2i+|(YK@^Al;GYEKE zaWvfDc%?(C#rC()z=CE^5849`_?voM=WT0rTcB;DSVm~Arj1frm*sDVOJNmgQ^UTP zvb!zTD@o4e$Mjo*v>sF74urtr*iyt(DyU0|!1YqqmzS4^bptwwA@NT~PZu4HJ`;ccGF6jgoGPyl?8?DmR&mDQUT!d?P620C=g&!+l*&uk^3xg9`_1>&K zC#%H?5HZFyeuc$8B%6hxqVCsN6F-pNJe{jtpX8;_@G!5w3S9*F8ifAkhi4U zvC!rI+EGn!uAn$yk-z2#>}eAIhyJ5hF>UQ656#UBfZ;UJK=DIbocW*9|37yuAQ-zY zuoXkay=WPw*RhYDKQflOUd-KM5@bK8O(BGr{?u95L>8s-Uh3l`CBsW)tsH z;H}%uzG8|~bIS?x`tnRU@=y6EdK5iPB;W=1;$IN=?#By9>np&GjgPC<_t>%?^{OZc z!ULl^0l-R-saOdC8&^0xsg6+Y_F&Y8*PNWVcr4mK+!~6TbPr~}q65fwmNp%P>=HnK zmCn-ex04bRkrq=tw6K>!BDGM#e_Lk#)S8^BiU{xf2I~Eo>7+%ru!I0=jrLW#@wndmXVc@8TJ*suz<2m z1s*9rz$urzylwes&W8_HM@Ibo{GRRRw*Q(T)Qd7EH5F}axn^uzr(1PrV$g%GB*xyV z`_~_ry5O`Sm_z;Ul$zOFhQZ%KI2@w=T3@;RU`8vK*&D*@>+55_xpL>II6790_N<@- zu9-CjfDpM;D6cYDL8gkP>vbnANu*wk(-OUgw)XaA8rWW%my1`+oj~DIRYR$;%Vj&) z)|2i7GVnh`i}+sL+Ybpm2DJRu)+cb-0&cOoYVa_2IqoI}@a}L7B0147BvC*uPpgQU zO&)9!q}=FPSy^yLj?$Eno+_a7*7p==60T2fY|KY)W&a-<*=7aCS(H|t&^@iAv<7oS zeZ6H-_lLiY*aFnGTZ_ZpiZwC&yR~5L+${L7SV*A(I@w9pqjO$os%ZTB1(b6wJFLGp zLZy+L)kK%>%j32>xZ&yL&2Bdl8}JrR0M^9KYfSbGKbc@TxVi?bv$1uU z4fuVV!QUj)t9GIe3Jw+PK_?CBf^FEU09Kf1OjcwC1&4$+{y+6&5s+r7X4KWI<1i|i zcZvM{WJRwqi(H3g}xKbvG+CO25 zl?{d~CYgZMefZhOv*JQ`wgx8~^pEGP|FOfLKohqU@LrT}->Rqy8UF%XjATIf65Ri_ zB;cW$;E3k<8SDztNaOM<*C;AG{{4OdlbF3M^dAKl;$Cr|{fx^hlpY2mit63ZWf2x% z_OF%Cuj~uQ^Q+-P&pC|^$O`a8DUi>~6cSirrT~O?U*Sn_#018 zt4g#UpM(F_+yDMgK!uG5;*w_$OD>GeK6OziF;$A z90)k1c0lUpSEqKXgruaH3~ZJ|S5Hr8;@fI&JXA6P0$tr}{){PnSs1jiu&@K-y zrT%9A=bsKxo%427R*GJjU3dTYJg%$TGf;7H4TK=yBR z!Lz))<#J9Ysp;t$RhH5KaAgEgNLGM2=@}ON*X=jNg(LBW#o<;!gx@RX=`Ajw1^>v& z?O51OE4uIi#?;b85Kae^xjO-Nwv}M%jNxqrAp&79F!%vi)^Zv)le$!PcX?zETfbBl zr^d$3T`Qj+3}4o27X$SHDw1PLA^iNJ=iV0ZZ|L{*^jctn+2sy|(*}JGJB?t78!(N{ z&Wo?QP=F(_BuJ9FS)7|>Cr-~j5w+=;!Qs0(6nkL;lBR4!aLUo8pZe!UW&{T`Hw*ea z-fTON3BG!~x|qiFzF~h&O)Y}w72Vj_C;S9Cvec8U5}EMcha~Zz!s=g#zU5Fmb1IbcCq%bD`b|JQEX;9l6Iq_oqs;s9X_2ii$p z#miA%p%heF{2DtS4MrN}0-)?vTN*1ae#WK+*%Tw z|0{K`!c<&)`!*S&k8Pc!Tq#W<7t3|(bZYAr@VTs{AiT@P)hPrT=KnU@{&E=^Qf-ad zk490P^GSD_QVmJTXwiSAn9v5ya*Yg_X?YR8c{)0chU>?QE;^NGJXn()a8^3YoZE!| zPv7kyXIT6_KqL9kaC?>M?uMVs4s9V*-vzczdg zWC*KBHK!8a?SGDqh9u8{0bTO&{{asE+oZsO1dz>flCf%ECf#BXF?y3~iTryl1CZz< z18OUavQ*uERwB;Dy&e+Dlvc)10g2({urT%miIO9jj)gMF5zr_8%W*?a-~ehC(CO9< zNS2a{@!7|lnV%JLcn=O*nJQFc1f!#?-;-D;JwvJ)KYwBoaag)QjjnqN-1nU!7@@P3 zW+J9<`JeFGI=y*J?Alxp) z()xx8@ABdxTUsm_9|s4g?H3ZZYUTCg-BG4@G+Cj^k`YLn7D71%8>;Z}N2Eco6N8+D z0*nqVzSds1^j}T`@*9p0(ep*f3x%P6^pho z_96Mk(9E(jmZqC2osOI5m39`AX&dRx26k!)rSUf#nMP&u_5}KL2Gxx^# z)`b)t1=FtRv)`cAUDQt@awQBxW2F`R$6%!bgde6n7d?R|{qN5Oh=LXCfE`9r`Bk>l zrKCQ9F05g=k%#qHAO%1N$Y8-hrvnLi2A&uAEc$TB{ra&nMlDrUI3%Q`)`f-BH(6P) z9GslSib_kRarBpFXSJp+XXA*IN#zCz?(MR`ue|xv0y_mv86C-HdTG#Wy8eguijz&fwsOrPKQayXBrs#}w(cgqRi= zUKe$GP`fOu<;fcq8a!EnXqWpA1O#E&2KSd;zu#Z|F!o=whVw%wYV?Fy`ITzEE}D*# z>u4Vx(pTr3lt@HCBNjcb%cHnl*RUQRuyH*Q@TD+3_K1zZ$HL0GB)bHdX}@{?G1rin z`8U4{jUJq>|9@A}W~uma^gU(k1zXg34BAP^`R@W1qouQ96rvHi+1b{oDN71rmmSP| zKzaz%eG^$XJUUc)z+|b)QpF+);lj;!zGH(nZ3LJQ;fHd$Muqdp)tSl-j3F`}>T8Bic?qv3APnfUg%EbiS#(YVz|ZliecUOrtr*uQdU2DLE;qd77U#&ksa)=cf<3MHm&S z*H&Quz0R3?3$}Lc4gb}9&pNLIBHd;$HQeAfpbs*)CK^sD7Sa}oAq39#VP!mB)mXKbmD=%nRUi~RDMWa+X`<4B3ysB+)F6S`pF$)vTk zrN;7)uhb-mUJ!F7*p6LsSi>%-@fp^foRjtrwj(vbGd?{W&3n`NVHAfp$(Wy~Hq7n? z3$o+ekf7=ODwCPT_|81}AJ{kMB^1HK#8Fb>ww&RA#v6=H$3P$W#d*4L&}pz^bY!Ln z;8=f71bb z^^C=QONYH(kiX?=6#1k<_308Vh-RmN(p`%GnEzLaF6y@~aT>Kr1bmElgPLF=y+VUO zCd$-x&NLYmAdR;wtGa!z?d2LFY2{gUd_1CW$^9+JaS()a*S3Bk7}9yk;l3UlgWtn4W?Xr{|q)iVD)cOSH}tN`Jc3aw85lqNA@-8 z&Z^c>1h>%_rPWlV!E-$Ci}-d4yBBf(yvGo`Rw8&XHy==Z8>K>EavGK=*B9N*=XcN3 z6nV3!l>l*t>jje~r=c#VEnpasEyIRln^5wy=&-EwTqJ8Hun4%^uMUW4dYaOvNH>Hm zZMjG4Oh)RFZ{LrM=XBl)Lp4J6X^58q2Fy;m3oLPuoJ0bD&1;Zno#y6qzlDnE0cb3# z-8|OmDWd|d+ZD!pzgJX}!D$HmGRD80jX>`*2n2hqtx59SObLFp9^6VJgs8MO+}bur zu20zWGM6_VFF7mHy`}om;=JYcT`t4m9izpcJ<4P$H#;IDwrmWEz z-wvu*LF^29tY^2M=x0XjLXLHUZQf=2tjjF<8yMF5_Mm4R2rxHjUap3Y0ITdOh(?Tq zfBbm;4-P~RCFV^$ZpHRCI=jLC*i(0|t9R)fj$(wrMW^TLlDC4S9WOL6+Fjv@S><(O za{fjO-EP!2lIwMFV&u&*gT=``mc#MMTkY0`m)Pa1pg1v4H0B|xzQJP0FdVWksJ{D; zd~i8WxtawPqpi4oqx)PRrfJ#(-1q7$9L|439k2{on)nfw-Ry88yl*eNE)pQVFK3)D zd`bj*a=gf7>rm+l2y!)zPIYDaF%Q{9y{aREo)rp8|GDGGn)d9G{eAx-x6Ie zFk$bNmqqp0eLJ)#YKbJsm;F~Pz$CXZqjx2?p=fMByuxq#+lCg4YUJvL0E5DN4;0&Y z9!j3l|8t8UFh@9IViC*PHaWHs4d~hOFWWHZfTiiG{h>QiH-*2;QNvfMu=QO{DOYCc|&35XLs4(QL1Gq!hNI)WE)vcz=Wmf`HQeu6v&>#(L|iccr5yF z@Qh3cqexIuzR8s-C4r4(O~?SO)pI3EDPG?u6n4zH|4ZnTP6c=vBQUwux5zzR z-NDl%jGYQXuL$&gS>G4IPBTx<2<>i{Wn|&4&U5lN`5u5wvk>`Euw#f}+&NOB?8iw{ z{`}dOtERxPCm8*S&G9aU3e<0;%F0X{w= z8o~SW!crIW(~aL_Vk0T*%u-RVIyyQDRBZVa`m6V<4Ug$!srr-ZHJ zv_|`)@`TagS3!)nXie#Jin8KAtVtPP=7~4gw zUM&BJNd1n3Fl1-IHZfof>5sVmj1OwMKK|$a_fQ#2?jl?5&#UQKpP2QGswf&nR)XJ6bjCcQ)Lq*6{qYwwy&+$xPqSZX=l~fMtOre6tg+TFw2 zIqu5nL0BN>P#Az}PSqkg|L&=}VmplX2K)B(@^Y@Pt*Hh8o5e5yK@L??>-of}`jYe% zc5xo@?vwrLvOunEUw~ubQtEXDiFWC;Pm7PIJy%gz&*j1iR>IE_-h1cS zxsjN*jQyS*MoO=z;TL$+jBi0jS*kqjn0dVXv@_RbJmbyBa>_DYhdy@OWUmLOeCovN zzx$F-wDU{-kLPA+M*L39)O-O{;ymgMnR>dOb-R}N~&k%pLRnND?fC8i#$9V!LL4L9A?cC#T zHM)K!gEpObHs@n|A>d9k!mx1skl!02uF(~M|15EiA0Dw}Ae?C?;gkb0A=l^QTClP3O z___f5pAtDCDWI&ZYz}jlmvb9l)mpI=I?+2X8-2f}q@-je2yD<*D}oBp(Y-H8+k%FN zhxbABm6S5wZq=QB?(w|lP^~VrrRCw#1Xt>7D>sf5&D|E-CKk+mAqzRi-WKV$M^1h2 z7W}Xl^%3~BE}_4*&6?sRA_CP^^T=r`c_T}~DSVZ_&`hAexS;%5-}0Q|>$^h-+97yF*-B>WWjsSF^>DBeRB8dQd71~H4=fAy8C+d~$?Y!K%!PlJv1wT^1egEDO zN$h@x!(}ZQFew27VPV`1t+O&M6kh1BM=KKZ${wRK}Qg-Qz!bLGfDkGq4nP)x$m zIgEaGRA8@9!4x6@i0Pswv!*xYQtB3WmdQe5A$CfX#ZPzOxT!!#-NODUnY?yFXW^LOxfCM(V+WsP|~)O1A?eonXR$ZEkaA-WtsD3*PdLECd~{k0G+M zu0+=4q|n9go2#rR#evvD8RVI|BTjVBAPI6Ao~yTf{q7E-9eN$^@G?7zz*?yyu!Pjb z4h#Aq8BhWrs#><&&=4XaHeWjp*(;TE@a<%v8cS?%Ecn-qT=2}aW^GN9UIFpRv6FAv@B$VVba|YvSzj+Vz|+^|nYb@d>&v>Fn#p^*YQ6FUb2+) zgG|5rRR35oyKYL_*4ob_3=5n^SiOY(W{J$yv=hnO%WX500rWab;vn$MUN@T^NOW)B z`g0)2ZEQ$A5_^3Wo~mG}<2^lckrVP6fGZA$_;KnNR~tF#$OzZtD~L%Y8IkSfXj#U1 z9};*}A88T0KHp737<_L@I{H>yho=qRBAGt|#JhZI`%e5AN7}Wk2(lSM;JWprQ6nZk zhyuq}S_5Hp$Z4|ckj@>VSaJYn`S!ML$EHod@ay{{LKHuOZ`8g|M=?LWu{R7J zi{#_yx_`qHxe~wL;BoJYx%h{@3{3);Z)Veo`YgRdLfs=m?{DD;jpIEb49o2yEY45- z;WYn35y4UL%wUM#pK1pRHfYmcVJyINNZ|D50(O&EHCXu!1;LdX=Pv?^t4R95SukV^ z2v}l$LMT)azC#T`B~;Eqe})weg+OusjR38{VRww$Xaq=7kV6#MhxQmZzC3SGN2$*R z(pVs%U8T=N2L{5{H8hC2xz&uQxv8s1>Wy{Kp74KU;O>A|?8ebn69+-J+Cq`|$)23=Dxyb5`As{^#X+!7m4Ossi%O1}TV^6`(t-3KEZzJ4VdR5ts(n zozQ)4beO*Jvll`FaArSr0}GFA%z#OMm4ccAoJ8z>lGA`Ak0o36S~k&oS5 zX~O96NEM2*OLy8?y0foz^4b(BRU6IsnO9zp!vmP7Yg9Y!KMjMVXM&zoP;|*hNctt^ z@$Uwc80SU;eS->ouUd?d-F5!J=+H{Ffo09uHw+9PH4Hq(J=#j`)8knTLI}t6#8}R0 zo_xBH+cC53bxO?%pdB5e*VnC2xE+TGp+Od$F*1@PJ~ZrKo=Ki-Xx}V%#eU8uXk6 z1}l0s)03>4SZ$IXG~C}vy6sPu!dnVm&el=b0y(X=N}u8cet}X->se9b+;?B*YzmAh z6F>2Kq+oHOcqdrndr!)ug;KQrPPhS)Hr!?-=P+bcvalvA&YT(W&0v9o$whVnIr&?l zFJm!9_kx-DddaQEIRN6$lG>^A-X;1wDXUk9W2);p@9JWGtI%W}I(7^-jCL{EpUL+# z@8D%lTB_=rRNt#jl#7U!*H*ww%C;NHph#<4$+eBLV1f{$vAL{dyH9>Lk>t}c2lV}9 zFK-V-cwJisVH!VtbMPa5s^ znbX;R4;gIt%@K`FT>phd?HtOoJ_R4=^4VYrv((2Bv!l^en`X8p5A-t{Jn=VqC_%w!G zph?1AtL&f}KL%tp?xt9DTnW~dX)|WscqCQHXU3_(sDfR2xh2d<*qu`*fk%{=slc9S<1KHHQA8k6w>P{AZ|Eb0s_FW zo`EtSfa$TeS?6uT<;RC|r%h=OKn-veP=OBw(n#>8f_y4N3A(v_I$l%aB=Sv$KGJ~q zDtrR3b8fk~xcFodvj7k9ZJ#hdefkv8L*}m=O!f9Hpdmtx$myvOYjjhPm!|CbNd*xW z0TolUI6U=YcU*EI7#IySdKp;=F$ryI0G8L5G1yMGG-DR(s2TnswX_PozxUCsw)!@e zwrf8M@X4#v#%mQDJc@qQX)c?I3iAF02-)AQ&~efX;$x;C*2KdnEt^Z)LW>zl`ti+#K%>9aOoj$yuzzXMb%s)zSj??6yREO1Hq4RyLsjZnQSokF zfyK@#@cJ6;LePEsTc#?m$KD01|744-FgE~5QGZ{GWNk_VO4WgfCWrfe8@2ne5CX{U zW2gD;bMstJyK=>8P{KiYZK6qpiutfHF<%H9YEA>Hli(X0HQLwwab*{{s6CI98U_Wy zYEK*M(Q5T()RUgIX<%7k-gj$l4RLM;qOX7t4gCPp1`o8e&H{oC%Bl5Eo5&F)Y@i+f zIMgj=dVpNVx$FZAEC&NP56t=UoOTNYc&#_NdkJn55hO@JFH-eeNt^B_x!<)BZkbJ= z?Zfd8DGIbsIVFfJWwX~+2wnnkKvTz+Na$w(0 zGJE+vcbP#8l|dprKAFoV_?)RcjCWcfk+vLH25dGUT0o`4Db3~K{yg%gaJ)jM-0`+x zd}SeD9nS8@R{K|bbWzL150a=678@AN9aiM4pYdWN>=totsFjKeVM#chU-GC3ooY*G zr(KE0D#cpQh7}RVLL}rV-{?1!he`KE%raed{kN?Q`2vTN8hEcRA(T>|lJ)+$xJm#V zgy_|7pi#BW9H}q_l2de50xKB$J|REu!pTr zenuh$zUjU}4-Zjag!$ZeL1}4e4rGxdq3C3)GM`2CmjH^*H@6Q}zB;H1S6q*&gn^lx zyLZ7g;yVZT`(>@5U;~!6R$@d}<fkO@N(Une`JnzZAi3}9J_ir99S#|3l`I|WE@q-X|hbnDn-rv^dE}yL%&K8V@HmMfbfAM;RxsQCQv+LDxQ!~7NM=Q#p*b#Hb zR3%Dj_kZtXoAEOP-;b9K`@66IFJoo|g?DLiSoWL9!ekouLhx5tQ6Dp#lc4eQdeLt^ zt!(*99@bg%chbyQ=GXj<-d+>ThZfvQt$N2*A+ta;9ZOU+3QpXPaMxmpg4_bIbh3GLe(L(_=SJe6Z)@HhfNwMx>505Niufbyc zTmLi7oZ@H&jhMRw=iaBQySp$~y!-gquXjc&xYBM}+1c>Jjs+Su8yr;~N3Ci_8lAvq zbGY5zryy+_4A;3TBqj^5vy$4XRCaAGoqIAZD8}F}|7Se$FEOhc9FJkJqwYAtA!S7s zO|V|WDmXZn7EbJMunm0i_Ie{p1x*)&>o<0fkdOwS^>1G>S5GhP6ddjEqY$46ivM(; zX4Z^2qPA@Du14@Nbc8E4%N6y^VHem1rpYRy3u{YI0ZL~~2e+y~GTWq%C4g?Vp2~E5 z{cvEY`m_bfOxTwRJ8lWd`r_$1X_Ij-(z*D+#MiNPMw_t~^{9V*h%W!JT|whfBQL=4 z7yv_lDv;*CMHuE<3=+t9JSA-WM1Vd8OM$XO4-nfjXhrGMJ&^t5v>!3#^h(+qqvxm|3gj zmyv3&Z)`65oO*exNbPJi;e)wL)h99V*S)ItP=WEGKyR1%!tDz>U_m*YqE`m!Ua#Mn z2O5G#+!i2jRPHwopK#Vr&T8a}P4sm&gg-86He6;+t~snI2XE_sB1K`QBazudEoB z$o*E7NsGYIj~4*vIK8DuvY3aG`4My5U`8yPvQEbtP~Qqgry;B4%0hv8n zN8K@1N5)Go?(XiExRWiJd|xQT@d!VSAxH9W5Yi(D*DZeTMx*6O3rE4A3+3MolM~6V z;rcCJ253=TA`w?;hVgpl)SLfKU?GjY%?M>OCL|1@`@x6w?K8ruQD>+ITZ{^L4d}>$ zD#mcw6-OneH-JHepey0)7ksXJKeXg{xGr5s`M~(>FetAf=?5j(H}iqv`YjUC$FPVl z!ZTPHHxT~a z-qBDQ!F)V*0+-TgAvEdsS zpcrK0JehHqSHL5tcdsmE!Ol3t5g@U7{z2a(VkYQiWISrS@=w8ilo;q97QNeoIaQ3Q z{y!d&Aq@y^1fu5LMEaIqW!}gF_gu$d&yQ7i{;^I7JO48TLZxy3DjMOIZFhG|Q^hr$ zUqK?I#&#}0Vsf#;9lz<59GepRCxsMN7>ms&)!y;8`5r{95o;|X(S!(49C0(ipBmf4 zq(N%m3_SQz??unzh2$k<-Pai{kY!edH%u%>OH{_|Ij)5Q45+yv7f9 z$#ZB{9#-R%M4&k}p5{;-9b_l0p;IW!B{*xaxE$;`rG?xKNerp^E0k*S5E0$g^%;03 zTD}k0vs>->W~#d*`h~Lh6Jb=yiQ)oXv6o(Oi%zd$N^C5Z&vMY3JAE)|8B1pQ>Bgu$ zikF2STghlYjEXFQO1{1Jr*{h$rRRD&_+L=?ZVfJ}x8l)|c3UX-rn* zz8tjojL#Ma(19ieuNJ60V$wUR$ZwH@wS*Ia!PFexP#f81if;%Wn4cu-C}J&+~BtQ3`h5m-KbPqySAs5~Wlb8^-JYX6K_^ zOj6F{<8C-Qrb5)7;idP>+r`;t9q#r(U7~}MTu;sU8#@A{Xn|h;y8~{@({I&-%c^I- zdxHj)Fe)YSEM(?!apK*qNE|(?26k0W0}p`xF*m!`u->0lVqoa( zjv~Z1_x^n2fFNif$afPQtd>(><{i~XZNXJVyss-4&dq#* zh9`D;g(dibFSujao28)O=h+M=j|1OJiA!5_3{*S#!)qV$A>+_1$3@X3Bpr03-m|dq zj2}&?DWfV2#DX7E|5&v;lqy|$XLQ}?INY?BL8vb^VmYeZgYwPsLDeQoWH8!of|&Rr zF+Ihqm#NZ0V*bkkM$K7~pgFu-$9>s-=si1nnUbHHimLv?!If2C-@Qm2e&-Q{o0#;KtN!Up$nuUtXGX?>ZZwS z!mk5*PAmf6!OzlCLw#Fw$pyMcsW?ljJT`mZ&4z09ub-Ih`6%tRB`4zyrg5s$Udxaj zjQOyC{wz90;6yHpR9S@DFoDoI8-R!f4!F|jK{Kuwp%M^I4E{{%m*rp7=V6W{(>RoS zfrA>nJiA_5XiF%0{K_7HD{yo*Uu!a2=H}86=43f=`gN$`Y-4Iz6uB2dodU{mlR3|{ zr)7QIt#bU;zdwN_DdMLx2NL?@y%B1#2HHv1lk;d za6rDNd%mxa#$S=ERDF|JCzLAR{m>K#UVz7p4ILxCbKY!6YvVZBQu9XW!&EsdgVAAG zX%T-Mt5(`Y0Tu#K=5_78JD}Z`>Aobcx9Oao!b<_?eJ!3=*jdRwE(VJZtljB3aN7i> zOW~2NYFR*#j`DQb*qPvkARNSYggDes9^6`gSR7l% z2ofoxh9_Jy9P0%>yH*cTIodA!0cd{)Crnm&K^#r6xqq9gnM3|AK>NNOH~=^{u*bo0 z2{9c2*|jf&<2s1*?2eK1MOPc>%++|so|YeU&L>2^@r#*=0is$*XH&A>$tXoXld4P| zcwtiXy>NM>#)cPwi?j=1_Wadltl9UF*z!{tAWbYP!tvF1H-SfHhqajn9Lj?j6ZFu& z`JW{YU5^@Q!)nP=u$KL~sX%czB`@Mg=1Z)E8ErVVpW6)SKXqKUUlsdFc1CTL37->& zgPmpDly%^pc7n&tJv7($QyHxkJ&gay|G- z9Mq>ajT*y95fTp%kLVA*17BcnVh6cMud-uw|e06Nk zdcrRffq|!~_$_r5hs)Lao|EscI%6d{Cd5Y-xf@QE-8SPxSh^p+S+aL&tSiQ4cFv*7 zqw?s2&8v&oLQfJ;Du>d;$V#FnYn zwvK!n1b>CTl{Ze#Kv}{TE4R~oE1o%lI+mOgG6i>bh7ykBl$g$kT;=Tz4sREOB1Ief*87;L#Rk~l&Zb*oDOT#sd@aU#y zvfxK}!2ITlKU^ficbiw7WY^Rj&n6gt%~=9E2Xpf)hJOytCn|rLM>936{P%}nzSa1Y zrlQ0poioBTx&VFVn6pd_M-b*V^s8qff~&WFxjMY2+z?^*z3rb@AzK==-TW;WuC zkBG>iAj>`lgiqvp?hhlrs3v=HytxQfB%9)NWQ>)_R6)E;VvCY?z1p9uFxu#*@V6Xl z%44Ah5}^QysG!Mwyr$4tbLMTUVy|j?837#Dh24*jGyIC_YQulhfdt^2PviM~fe|*B zd-d)Z@)iQ1{$6v!aS%g7l4cM7*5hH6yDoBoF{ZC}JQoo+G~w_cXPOMRD9qR~DLYX;8$ za&zkRUSp7lfmW8qa;(`IW;@q?%@5O->0~(@W;9Q{jmM{)fwG`RLP8?!vSRw-?(R-y zVRj!@udKF8AhXamYxH;uZcEP<+9oF0U*F8`>G9F?XOVfw;!z$-Py-LL*zW`CA^tKG z4(D_sq|K>43&7ela>f5?+!>AU$e>>H_DZonrG9u0MB%l*{$Svc(uB zyMo5{RDIQBw+$jw??d6Lut``&|M0$pHGa$XDI_--f*QX1dIa3<#O-P>)umo)17P(;!NEaD zTC1^Rm}zbxcm5>XPJDxikBERtJ=shp4}im;AyV&0_x{5c!Lp^Fld|-u%-ZB+li`P8 zYg7G>bC7?d_EzPyB^w1h3yWuQ@n>Cwmkq0!RC$}XJvB89A2C~I^@s=vtl~BQIQ_jr zJO@JDA;g=Advh<}Fxhb8p(R`IK8Nh0A|WH2K^#-})056X&JJ}-!&Bky)Oa0UXXm`Y~nnynLN0QxN&$h4W%5Wft8AFJ3Q0>&?P=(+xQvLjp zfCj+D!*Wyl=Y0`3ZtTK+e;B?oG9@u0t+A@`r|T!NI7;{H@>m%)!X@jv?V#4CH4?&s zy|k478#`95R$9jNZ})KD)qIl1^cLhkZffsx5Fz&bY=+S;hWPJM}#grqR_Tpywl8~IPe`5j6I z+GmKdVArEM8;V>CAaVy>{m$X+8Ayx%$fvB%zD@}{jXib-0|HD%p`j7^Uvj;MYe%|x zcWcGXAftMlwfGCNOZZ$3b?&Lu0m{Juf?-^=mOd9hrg|2O^Zjk}z8(8aFSX>$6Eyhn zm6f;P*p*+Ta0sZYIlya_z9nD&tQfmg*3!vfVpG%q0cq=o(NqKPO(swma0;RkO<@}O z@u#N)+sofr5a04~i`L5*<9Esv?h5AbQrcp&n6@yqLszq%ZaN2|U8=3rLPOkP^c>6i5flKhK8TzQ z^%FQm@FN`B>dGaN!4#&oAk&rq%?_eJlVus1S&S;D9tnj@@bvV_CIWP<(eT|i z-^rfvS$RUzB48App;Q3zTEmeq(CN;mC5lQm+B3^1%VG{`p75mLgAw zk~ALU=_3k6uE#Z4DOkC`08{`>*V3xW$D8n|yCdcCyHf35%&Hz&mIcG&3OjZSXVJ@$ ztmeh2!y*ceCX4$Wp~N~mD& z@6E&&lXv3eJ)P1TAwpOBkA z0oUc}VfDz*s{;oMaDpTTxZXeu(?aCb-h-s`i0H%4mJ?maIOi%^Rw|YRUz<3(4D0XN zxQabq*_~TS| zmhxGe8IrR%^$0hk;?SH8vr!@k3Olt#9`Hz}g00jxQ#B%B4qmvxQRlB9T~ys&LDtga z#UBLfRmD&p&1INRtrf4=)9$q-@i!K9Ucm1;_M>naWbj2o{3aSQ^bBnfB@ZW*6y>SQ z$-vhQGTmyp2VHVtZk?Ch>ZBwousBSasJ}No_L)ef#h2EW_m98tWvf)2b$vke>CM-G z!hzY~rWs>n!R(LgDAPIfHZLV~)qc+AWQ__mEl2zOPmwE+w8Nnxk8}{AW@UTXuN95(0(qY^A#rn(E@-Twi0HE5w_e>0?yB5&^~mh>qEX;vHWyi_2D*8{V__ zwBgr&RRDkmHii7#a)o@CQM}vUsNf{9SIF_akL-6@=(DkT>izXWJ{=&??4}C)QL_6~ zD1{8`S2!L!G$4uOKR!NAVIvOkx&)Kurd`<%b!%}sDJm*m?`St5xoXwE?n7N^#A!;c%njfoXk<9p68yE)%K?E&08 zo?l9vDURJVPEPlgy?i%u8zPfns!47A)*3Pd->ws&yh&f@%-McQ$F-fv<1^xCE$OnH zBEMsumrx}CO!3(d$sqiv+ivLs8>pe*$qgZHtrcTQ@Ihoed2b=^K%OKbPX0~&dpfQ8 zgfLot9t36Ac&9Z^1~&}s^;UazV!IO>%dKi=+V&)81_*Vx+>;e>{szzNEALpXjm?tc zq{IG|?m)layN+WF4aezZbK*t#=>4tgh-5S*2=CBH5yPZiA^n`c_3{1fDtbbp0DuT6 zwQp(Qs0GO2b-Q2bJf2-UwKy?tbn-@OS3CBBb?*Mjw?Li z`7|ru4hBm^#RW8IcV%Vien7t&=-5WAIxpW!?Uw`lF~=|WbBY>A?LsBuhnZ&x=w1y$ z5^~4=aVn+9!8e9096Z9t)n$KNUNK(4ZyE(-KI+~d38$HL{359P8lblPptMf* zkN~ds&U_p0)8k2G?CJGq31*TdgLOKYRroM<%*>V(z}EWr6@2F3_+F?9RKKL)8=4C{ z_Z4xv1loNB&KhEa*WL;+7X<6#FF+*r+^p^tc&H~8*OGVdT2=1#Su)b2SA7}cv2r43 znVUlh<|8~k;g7L+!!o=7f-6vJ!$k|{#dX9-xm~UGp65?bxe_|SvrW4jCO?!w_DW+Q z3@0T7!2iWH`m^$@EV2bw4|ZSx7(0*uSd)l=fdA@Iit7dGEkHum`QdwTOH*Hjn&x-v z)Lz5CYcDFTxE8$09|r)u7h3>njtL+BUCab0Ev*!6tp=vQu&}UqB_|n~;HgA@@0&@2 z|I~9y-mzfDL)*lgO%z%KQH-OllByxjR(W+;qok{sv^vmXQ-U3r)#vInW^4S}FCqOh zSf}|c^Lh!5y!NO|?ux*81;Lx6MSQB&^r1B}8qQ<{HzwCzd<-YGZo@m=s;n?9ItPB3;elidKUh-GCH z&avSDTqEo0_F0HVNllmr981vtXD+hF=xbLrwf0cvlMDAQo4O7wrwA8N8hT6Ct?=;R z6|%+2o1Mugr4;IB4Mhqf8Lbn?=^Yr5MSrSs=ZxrrM?jSVG>;R^fnJwr3On+j+kD8J zIc(dn1j3tNGmhgZoOVZ40KguI9(>aa7ayP6v|FL{9rnCYbaa9!89cwx$6+ISf2jhy zdBj*ipY#n-zxb!=J4Q@vr_w}a$^zpMNixI`8BbNI%&Kc{8SGxL?x)&}K@D9&`A>VV zOa&v{mzV2f2(BUux7%AjXI^Z$%$sGGYH*nnB`Fj|{xS4{d2|H$YyY6Y){%OMDgBoCx0=j+?D+;RIoQQU^Nv#FabO^}$8!;l>qq)OC&>4#C#;7aQS< z+0SN*J~t-z=J6O<%CYzZV6e9oQVjLqNcHguMxTn1cpo%n7IxcjWD% z)TuX%(GhgB?@ZGtGxNU*PK78xY5;f%a9EJ%8*o_PmN#JM5$*i8C}5B%Ja7K_0Zw9> zQJ~b8Twf=4m1y+C`pl?RSExPiT_kpWuyA#oy<#2Za#LmqUxkM5ltgT2DLYK@T}E9o z7=T|7p!tk8DG_VpI^47c**lPUTD1?(X5)J1qnNyUOPEfvaGLHRA|?~WzBAAbZSC zwU3&FyJBn~^hWWczi(_^QoE6mvauPu!RmK;n5v)-Znqk%`rNYL>^R#|!hBpU?U-jy zyJlrEpK0B$?ICfvqI<|C3U7qE8=jQi72^!E^%pVr<;lbv-Tp?tSi7`ijA5!lhJARQ zPq|p75odaJqUJHbf%|8EGw8s;H)G){3I2Dy#w8t!0prEYCK03)7Hrbg?A77Kq`#(T z53X#rt;W7s>(_%tCB_`?MR;0-hyRGI79$u(HGyd{e7BGiI&IhtWt>-(g&o8OS zM4R;!r3-#H^2L8-Jc9&7nbWmIg6N~biVM?7?ISFY*6P-F`QG(*>x%AUb0lzrlA9je|8 z0XM63sJviw4Wi(_aTNX>L^pZ>4DSC*2FE#~<4R7rqG{xydt=T@XpN zjPyO>QIo#k0?G*=ix#RJ9F**w50*K#r!?7cn!xWCm|4dgy$^@NCbMHFndsY-*-#eE z)2DhXxuoBLQ%K$PuF3lg9ZjmP?@wM8rlojuq=((uT1s@fOE%Aj0k+`pr7Z>wg7H?~ zmp=o3wF$83UcLzdFMCJd^s-J+v}HXO{H`P1AcDMeP2r1L}J1ZGW?0- zAX4WWxo5moipqmhoz|vS_MIe77v+*pwfpHN!x)fm;HI=nYvLtJ_hC9ON!0jX5V}EYFvuUKN@`{W{ZH?Bj(6Bgr zI~+m4^`7aMc?4QsNg8h4>6x?~}i%EZAe{z`x7@bJln z->3OFXqc@$I)PGLY_!P9Ij&}~gv^T6jeX0~>*sd^{cSuAo7Flr3`H{xEq(nwL@YXD zOT3)zig!ZB^D5Us7If>`m{TJDqghk0Mzo6aR9LBoA|5I_RlfZ`k#b+5MtYYQ>@A_x zLd(p8=1T;no33{Z+O~_EvA~H=?i4?>lUvJymz_y|L)+y;qwLk~5|{)cf|nNrj6Xm3 z9x-?tr1Q2=q6p{_3c=$MnC|DVN#1xaN?GVCr95)Ir}(uny8J|G~7XS4{3 zyv2`cNcdoKbUx`z+#_4PV5V@L5S>nzROK3;sGi?xfV6HhDgtpyuHSkQ@@qcI+}$|w z0M1WFPVGJX(rF7T(-s35>cKM?fukN z{ldp8^V}=;;U%lmCf{#8&?4 z#KfcJ9ItR@FrPdlyVArXyee#AZ(%ZmlJ`2}UjkI&dbk3Tt#U4zt539kl+Osk*O{F^ zMB(6bt7L&+VoiH7^wb=FQpaJaj!RO~b|2a805$JE=aGuL=HH9w*!bjq#rdFn6VTK9 zPRM-jt25_)oaw_g(cJY@PnE%$T4YpvRnxB-Gc6<@BiHlBD6QpmdGe%pnNF!qq&{MG zD^oT7B{X(}p!e|LjQknDDA{A`ol-Z=lxg@MtaDf_(y@HsQ;q!)&Kd|HW-_Ke+qMw% zfXSOg%P&&v(ZIV*ivJAUocg0Ck!bNTN)Q?wI^Ri#SPT+O<=I%`y@4}*OC)uWLH?Z5 z%lhBr{r7K>vOMh!4|-1`%7$$TB_jPNyDHM-)Ww;X7Sl|hj3Vv)A8JkvprXfj>K+)) zh#*uQ&hI!R0!_Wl7V7$RWb;L2j^^o%#&cvs4%6G|_OdJ}-HryLS)!-1W+okoyED;7 zmupfzGDfijvmyAShUN#y+=u(GCZ|&!7C!>i?baKR&e0F>T&2L!TE4cy_P z%SmgPnpU3|giM1=b4&t{jGD9h4=a|Tm%2qxI-BDg8Q0O960)Sf1zVEs zEv|_?c}}5VBVb#q64lT0VI5I&?Zduxnr8}=VGI!R7$)-vFXmzW+7`=@8~H7 zm6>R6*Zrw@&sYUHaTr9i1$k#Cb7k?;F){IXN{!$B5OJ8q0C^Cii|3nmy7<~{P03z= z2Th9V(ke`8QkJEwV@#4rM#L>%H8|KRa|H<`qpG!5UfL`$bJRhQC}*cF^0s38U7la(&QmhhCc{ zE+j3EeRiAAmPXKzTlmC5=; ztvap9#0wF?@}X?8z=je|`^Hytdr4B8^XMz7@LWr3_UL zxW$S(1EXn%s87sg1$@Meqyz#3+?8MkPxM5OvXS9T3zNG2Ncx5Xh~lF(_FDoHalz+S zm5HL}BSf5cfjnTTaAhz0LrgEEH1vfLOM2F0o^n0T;+wm1M$%u`nVzw98-H#l5| z!Z^Fu36cdS=&dH^!?}+ZiJ+xjd_fVlHwHI`o@xd~F40v?pHQen>xN5C0EQb_NC6(% zf*Ar^V=an&1z>-C19g^U9*@kghcQTyz(Vq9J%pzZoRgVH`;Z2zs_UJc-_gC)A(VD% z{|HS|RIL7LWZOSIZeZV^zdK@+~k6%^Si&pPmmD! zg2$~`oOpAtiqFP%E=I!KR z>Bu`CPz_+}0m*2lMIYu99T8MdAyxJ@AJ3&=0%G#Ycl=(Y&&=IacUxcnmQh-*#WXd zQhb~~*Gfg8W8Wcb9c)Nge9xE2?jNU?#}F1R;cJAb4}(oh3s0M}jN#n|>Xw$U@SVE$ z(|vMmux>Qg8x;7hVDt+greIFAvUDzxXNM*@WbaGWD%SroX@Rh=t;U&v%eQhLzN}H_ zUa0WCgN7>HY;J6!Ozy#o&84ML88hki`u*$alW1OB6Bf}~C~(U~d*<{L&Kof0lV}>s z+T%ShZARj~YLY+t-k)YFv+eO%S@mB22m^WYSOPB&)03+3&pQ5bTRC8NDUX25%4HU3 zacJ)0x}P8!B0fplAkv|1g`oj+FYl^ArB+v|+1&iP0`5Oyr=*wJiaW83SOvpme^Y&0 z^y5)7Z>cKRjUY_3d+m3xksYXe-=(_;etJG>;G|SReJ6Z4Z*=~%hX2gD6e{c$O^Lg5 zy^L+^X+c3p2rI#2UUkVrDwPYuIq&u~u8w}4LB+LW?_#*+iBM%?ZLRZ_aXC#kKsO&1 z6}5hKwuKBREao51Rp&qImumuCjH0P*b}d|Ok6x^-tW`PzHv{yLbfWxsZD(u^;4njC z0-9V1iC9=sNpaf_`3@(`RL%Bx>Dw%fjPgK9^vRr?nOU*UV&(Yi?!MXEnT54sClNDKT6$-~hi!hO?7P`9*)(B!#c?vB^F6(r{8u1~rPe(&ZAEqN1;! zZ=4uG6OjL2V^0TgHa?dj>XUYkn=%E1@cu7e2V11-x&h9isin74WV1=ZmBPG-Q`T#cxU@^W>H3tMv=#DCT9=SXYXDh8| zmK+}3o)tCS$pM&a>B^1`A-Dv*>C?VCt5y|;pK;&w9>N^=y|u9MBB5Nfl6E_M(A(aY zP!9!1FOTqoFp@wFOSZWLupz}{jSUoe-(0(aXx zv@qvBBf6r6H^M=|$RZC6L4Upt$*VOIAQ(I>iP!351d$T7*3QG$O^2KmX+KAxQCiaXLM85weuU7wQZ#%kilU zn{OjDPq5uYCcG(iINpn6ESFUr-m^mMw36g875wM0RiO7iuT@vD)Jxa2GsIuuSra)wQjsm5hBW$Qt_DD zaE4Yc_(^_iPiV3MQ#1^R0&*CRO8P(UP!Xu2Ymf;pze?w2+4#U*!MZ5q$gKnjCKSMH zsjU=_*!+=>^*CpJqSczAe`WO7PMN;mvr$@90qGj^NF z4=5orJvl1eg*uX~O?oiOEq1MUbD*~2w(uW8anp%cxj?8nPM57wJMw{snwt6oe|TgB z8JfiGpWF>kAl&XsLz%};91AY)@Injqud;^q;~2C}(Y4{D_vy;z>kxc~7Iw&lrTe)j z{WeTI8qb_+y3fbCz-_Y&tSNG<3vc+p7S$^d?Gq(6eDT3sdkz@&^nWwgu#Om?%C-hdo84;fguMbno+@s{jSXOA32!_XuhlKAl#A z%A)+o1~5ThAOznLi)j$w7{{Lv{=LFHT2N8z>ktc`U9~fBtDo6i@8kmhY$V@Q9^3CS zAFdniXD?ZCVIsPJ`_6!tDxBy?r6GCMfGa3)1=RGPPyb~*z6J3Je79CoH%_HJuuxhX z2iS)Gaq8ZHR~FiVOPOdDhlmR!n?k&u#z#jdIn&0lln6p9|Jw9+nYxG;Lj0yhh&@sIrsTvTg87{w!_RP_Bj!p7rl zxJ}A=;cS7nfX&dW^E*d?ZuLK3%Cvxml<>sb^s3I)|JPt%L-zMN8#(UQNyr9}C!@2w zhDIO!$=Q6!1P1=v7G5X~SJSF`XY0SuJzj1+&U+s3&N~AL`hn}5gq>a0ymbp>Z>+WX zHJtW;i$(aQvXTyHIR3%(;xCO7DChM7wWV~aMSWJyU1eukdqS}}TfEC~wD?(^fcoV{ z`{6tgu%xhnCGCz>`PZQXgTzJIRcikMQ484?bgdjpJYP~N^mp14qy!#}K^+4yQ+)o! zWjP8G78j2#Q*Tx=nlx~GtW0rS|Dm5{N<~gh9yvhWuBPF*2K6J{pma%ViDn)N&+F3s zi7%f%_LBH_Uz_fmH*}Z6-@eMVn%rJawZ&}jtwrbZ((~>$?V&-U1ag4Mln5?!?gagN z=R~0IDwS8d-t2rQhdZl@SI1^RQ08O%E18Uf1)kb$TdD8c+&uplkF9rNgk!@Ta{(pL z(W@j|GA5Lu<^B2FN>azoFr^$q);Yx@hxfE<5-?#eFOtL*@yl1Gc>meE}y#w$X=pXGWvtTr|t zvY`*gq^g?My>W$fLAezL9qghKXMWw)rz+yUwf!+ta-$f~b*L;RS958C-Bf+aNW0uD zTudvQ+YAd@&3OZ6O~wf1N&dClJKlK_CDlh?{+bV)+>#?n^0zWvF#r2z1#B0i7zkh* zrEWf?bK1*|H=d1^cV#_ke`!;5-pj3Wy*m#=Mm$|k_qgMiV84=^Yp~MsRL#0i0!a-# zs?QiN`bMda|k7nQBx&tzA(In>BNPcOX>Z4Ogr8O{HVADwD)eAsK84#^9T$7proT0i>Fp5 zRIM|Q1^N<%B_!geOI1bN-Jgi5sD{jP0rrs0%aaw&{V9Z%L|1c~kkBxAw1m~$-FpD8T$z_*b}6ESx1 zq0r?QE#OcGN9>ypR5A;h8mC6=M{}qC2n&i@J8Bv@Xnz60JQad?b|xhyP{qq7zP|D5 z#Q^c(&)uXK|KrI0*~JPO?jlLJD{alLEtei&Pjp`N&2rsZ1-_oZ;PHSa0m^}Gth!bOo$V760w=&|HR4aA=qt=nh7JyWVR@5Ji2t@h&pT*|Im3)Njp~Us(s2&|U!Z;B=oa0=m@w}+mwXkVihx_Hx=5D6_ zS+BL71FyvF=4e5&tohklGQfB68ponV8lWEkjHzbn^|-_Ra>jB>qRS>G=uJJkJuY13 zFhxi{TSva@HuhE*&n;_`z|~mj^7ju32H}wyBGsCBAWLDB)kHCqiIpi}d%Q8#9x87h z0uLP8oYy4BSDS2)D6B|t4^%E&&`CKjqH;xZM>%FPj^W5sK=JDCjkb(E53)eO zN`15BQf_!}Ky@@<8=Y+4rVKCj;9*e`@Q`0=>-c>XXmC7YI;q#sp6Vdo9)3!1nQR2Vld2QTi%(& zw*CIkrC=Xo@ybt5EMX%K47S>UoIGk6w?-MW4~7P?Sf!o#vFZd5M2et1`yksCT6qky zHYK2f358DBC{JcY|9qWs{ShVfU|e{?`ldJNkjkrI`GD=}ri(n)Su_CVU-6+ zw8?qCY0OTM`%n4uFUJM6TEml`S4uKHnDzMm?h)Q#hIOfIdM01^Gf>g90Tty*KpN+C z)Xr$AZZ|QoJS4*5&Tma6(&x$-D_jqB;WLU~0San_viQ!uN#ajGoVeT{9TP1l#NV5_ zBRi_1LAUWG?hU>yovmGju{el^{KKMlsoP>(N;%Zx*KS*<%%&6IfUbU$-TI(e`*DR5xyUOhA>nT^S z*+ux8==;&Z1gs(qSzETlMVa(pDGsgr0BSP+S~PnypWuj-v4-(1(ny1k9|CY0An1Lh z-w%2Y4x^?=>|!^hgrg@M&#EqK&AqCNajpBOTxKnaD#U{FteE#fm(&tCoS_R$1Sn)8eYN6bzX(1B| zXi`XNcx)hj-ntak-!9}P=^hMgpF~8oOci!b78WmiI;*oiSym@qwokUZjR_#&qGUNP z#1}tu%ND*fML{+)+a1lcK3jRAhTGQI9dz*CNZVp?bPMhiky^+Zr{QM# zb)g(^(#Mb<49J=bjihnr0&2XuSdaoCAFO6OFEA-tOq02B@Eupd=9|??j}-W%G@DI}4$WAJ6yV_TbO6_sx#%h2gZ_`% z^ZmiY8NFSXe+RzwJXUK+lvzVZ&qcjUFQuYCiLkphEh-Uf%2)e+t)!ey>Rb$97nqu^WA1xrXT{}hQ3pe8eb^0?T9tW< z$EM)nZD>f)T#vm(Z7DL_O6ui}ZF?_EH;b}O>ayi4?w?lGn<}Hou0xiB^cS0pc?}{p zwe`~%^dg0`pJEb`4n>XhrnP6l;MpG1)|FSyqGj9w&U)*}#KObL`NJem(8}QPG#LC& zn!~boD9xw%pDz^h-tva#jU4eB%0hyeMmwSFFg_m z^C-c?q{(h3_=tDF4Ckn74{@|mPji7^rdnUt8Y~C^K0X5ebin9P#^?W;ZIGuYGdNrJ z;8F>l#W2#1j?6mhR*5-;?%lQc`BJ*5ZoH2PKk4u8fpdHLpn-vItsAHGX3Z!+of=4c4rjtJD5%A2J^?%DJTafd5j8VZ4cw|Iu zS8;jU2z5nhsb9Ei%oH1KJEZpX+R#W?G|OnJPdI1yJt{KOjv{ zTd^LXQW#Y?2sf#41vLBghG$mg)7#tzOc8c4b%t4cREpLBxy-ja0~se%lqhD3eg`2#7fW&VO~BNTB|aNwV4$R)1}J7ldxkUQjp%G`RGP zyXg#JZ(^&Ji0n-^R@*Y{O&80&R=%62tJN7Q3cVipKVd7i4nzJ13R<&~#`Dt!_ZueV zt@`rT-Mx|W<%d#8Y@gi#J*Vm7=Ky`H1MJnU0dVe_j~*ML%$va@-1X3sIY}AMBLUuL zWmg9!SGv`C&f?@rNW25hq$a`|8XDq_lx5jTkTQcSaY@##1DiX<**BGh($6oYA7t72 zv2nTQ;X~@1&&_`n^UWWzM1RzgIvA#N@1WgVDKU#RaAy8uv@dxyDM-D~t~8(UhU4`L zD-iNTJ3!y7K>l~o1)_um>I@~Idg!KFGz?5(3HLNK47>;klHc#m^z(iR_J{<*r2!H`7LA78s_2V#9`sgU?BGg*U$jNw)tn9ImdHhvc9O_!RmFl&$b1^X71Ak(&yK} z6-H(_?e~_5I&p((S<5~ zWjNdZr z@3Aa@y_;ThM%oe;SN2$JE2E6=%mh$fRhDbKcjK-Y0x8Z#uZFG#L+E5)@^YsmEwyT6 z=B5AGuU%+3%1Nfdrg?`=jFz)f+D7pMm}^$+hdy2}SX_S`uhJ7Wnk6R6(y+jCLy&Fj$ZF&Zx=dcMZa(a7m= z1*w>N$@BV>_^d@-^5GS-+N|%y^N>bY4Zio{#1z{vG&XCBI`15#^aG5|t2p+;F`k%B zB%j^;sCw(6+cDx}gi7vkxR(bxB$-VbOgvNmf&_i$39|FpV);M2_3sp22KYc6HB~7$ zHMIobpGe=&yPwwzmmjM*v!P8+vo$9r=BqG_s>K2oJwjyeb0H)2hwGzgI8;(4&F6S? z#8Ff{TFYu>hk0tY=vl_2=GIif6R0+3AG{itR)w3CboZ+LS_8*};JTxEVYS9BaG)GL z+7?5WCmH`+G_JR%hkypD1)#iDjcamkt7+3J;Vzp)Vwm`vABLC97x0!Y!^0!-dR7O2 zBD3AF3bea(-nf%?k(7}vj8o1JQz!+Xa6#RWM$tnh2C3?4M&r%~ms|qlfT1Uj9t&J` zoXTa?D)Txe-Af#&sBWtnGX6wGSCx~Q$S7givfno8$&-VC0t&x$cryb)BmQ+$1Ajsa z@w6{q*FWALlxG!|99eJ4EB+|kQ*Ya~D$8{W#wepHzEqnrdLC&$5h0+@t}o&@2m$zk z?{cRMX>EZDUT!(W-6nW7>BGB#abpv9Ae55VN2R<>c3sZ2`?;jYa9Th9^XJd;s~&X& ztDf#|l}?=*XJ+$R5WB;%?b7Di|EulG!=YZo_d`gMPNHMVa!x0TqA+5zwWw@SipZeF zSSCx%V1}`_E1Zy+7-fqXBHJ(~E%tqxu{1{6jX@Y=pWi#@)cKyyIlt@s*LVJM&A4Vh zpZD{=&vM_-b3bK5DTF}a@4%?N^dynuzK`_f!Ndo4!af(QF<m``_i2etFPNBbr;~+72(Dhd^&!8bM!l7<-8FY}X6uXwH>T zv~?x2uE}9%j@gj0MQdt~Q80@u_3y>wjZAPc303xbw{dS_7U4?NW4n5KdZ>~`$Uf?8 z#D%2P9z2WfS>Wq?=V?f<#ri9?evcM|JMT4E?U=@u^g;W@EtG%_I@M zt~4&^!o1Jn*@x;mrlJl{V;5A(^N;PW6F0 zRF6)wJJD}1Ucrm~U0dC2Jv^wtI2;PDB=-#tCi(U64_KJoKbKr6Uffscz)VHD`O#Qs z^=Sho%^UM_VxO|_FoKu|rGxACdbiO1E+eDN6LtOo4tlcgvON7=229ag&S>Y{)ci9g z4l$?|`EbiFYV0qX?Qb64;L#3$kl2fhu8-fIXzT&?d^Y>zpdsm1GnQwy4S6Wwc;G(W z0>y1&YUNT%p}XqS%?Wzm_eBEF>^!uX?Ti+K_~D>1ym!V^^L7#WV>!{p2aM4j$2;T8UdBd2H^UJHiO;NEGSs z-qPFJ$(2To-x_=R^L?nk2x6O&v3EfymC#${1maKcQ5nB`LCv0Ou3uD1W4}_C)76{V zehqgX?OKBoV!rME6a=8X@@zOUuYN2G{^R50R*r>6=DAge{L;Z_4ey1ghuf)Xxm1Is z667z))-LE7V%36$Dh+Ql2uZVlef4%%SB-3dX(SK~d1lwq8&ef7uKU~jrY&}2kKM`u zkC0wsbB#`4o=To*WvSw0X#{*H4HmB7=OjfDx&{vAWo))W53RU3F@TYS@o7UXjXv{< z)ByW^{;3zX;HyPQ7aQ`bHy9oqm@K{T`A78H&GLRt_ufn4qIQf?$tHPPl>*iQgxaRs zbveWE%2Ja&09rWb>H7>b=h#IHMhwr?(@{@=NK8~FXhiTd2YsaM>ac2tmEBR#-ILdI{Lgc+mM{e)ZZlfnJ=MrY4M%BGcw(nzF zBn5z@LtkAxa+-LQKv)f|T&LCPLsq73)dawgy4~DBO6Of+RK%O8PD%7Yx!|0|qRT}i zk?Dylmz_0$*Qm1^@X5A`!1c7JQw{iv#N!_m;+@gZ{wh80e22MJl5W7l4s(-@C}uy| zG{nyQl4E<0oZqLL)Ut(O`=BMK1l@q*iYx6;74hN@u^sSJYA~|0yH_Y2aZP8Y|=KD%DZId^!SD)Hr9r|y#dNM79IG(E>!z!rG zQJ*wvlWv5pQl*tFsZ;ot-ZinI&r&3C&Nd+92*=#A^07sK) znOT3&^6YCw=1zRiM4}sxdRk7K-g$*R4r%4+&xAar3~fgeGO{ScPc9D;5bj?McAD+U zLmCsVB4Szs*%zgC{AaGHKZi;d=T(`)ODbQyEy|FirOfhV2!KLF+$D8Uo?lY)8hG12 zr{R)U_(@l?NiD^&l@E6%k;o{tGog6%slV;7O( zX>MkQre9#SKyj;*@eV4apk>S`K{ci^L`+d#)MY{VV4Fuf*Lvk+yZpD+*a!#9)9T45 z^9}C%A&Lk6R!$91tfD)%ssRk;EH%$T)eNu6E-`MKA0_h5E{j1H;nq%y#Yoy&jojsM zg-f|kUG;IZ_l)#|d^hmV4zH*+Hd^V=0RT3sgi-8^TVvB^pGg0l!n779p(Z+wP;{oY z0(o&yl+IPbI=J(w{_M>Ag4(pCl4<0Lm} zJbY7O{xqUBGy_dD$lvO#)w9L8bwfo4jXN5lTHi&pyC&$Y*pEft=9|49qhuc;l$NxQ zwC?{r%Ot!Ci%T{J3K2Q6<7H)K>316m`jq)Hh}%eblxYa%1$vUzGm);CsMuAuUWzPV zn6tLW7)~7)Q0N2$Gv(qf&5t(q4|iXydcL6y$KCzv>4Wd_+W{VZG3=h&@y~dbXNHR3 zIssTySHiZ045)SQq69Oh=j-tN_2g+LCjP0-Cx^gw%s8Y2lHc_<7#&*|qu3Cokj@@C zfh=L(SVEfSm%{3|6$TXx)y5yNzajW8fHMW}odhu5HC_FnMX$Eb&pf`V#%2}LP5D$I ztmz4+B~`Aay?l8_;p{UP!F9z1q|6Zyy9AA;#QK1TMjWC#hqAKJ*S?_w7qoQROeD|H z`P0#JlOaV5d-~G|oC~NK17~%w!BK4=WAUC!Tsc%C2=M;1Uqn?eWlex>3MVn>60|wi znq-q*NtDQk)aG{t)Cy}Br~sY;NYYS`bMo(+2%$hjCm^%&*pvE`CrI)P@5&ULt8aIy z(?W5#9t{!uwocp5@t^w%U1WFQ-={Og;E_aYLMyS*(E;jO4!tL(Vkj^RL+Ttp+%{3r z99hZ8`N>|!(D{P-;ld);3-#DcGdzN_W$YT5%wf#rP9I^!>iOXwBd9pq`Ew-JplQn5 zbTGI425iTWpRR*IK1_K%1Mm4HLWT6w)a#R;%KrUzq!Fxr4yAv_LX%G{8aYGG{PGY(F254&Qn&yHnm6yCilaJkn%Lh9gM8`=tN- zh!{MQY~3)|nPoX#(4bNn76K+ry!j)~c-yGOF3N!-wO1~qtX@<2e3STAdz=Y%;tIoM z`i8Vl6(yC0(F@92dHbu;Vw?%3g%Bb4mgLV&_dZzoieQXY;JaHQ)cx*eZd0>U9kKz9 zy?(vpnI@*D!w%ueUhhP_X-R%o-M2LXdC^Rw8Wd(|dVVUsdAr8?&0H{dg&;Z81$`gD zp19cdoLcGO!9Rq-VAPsGrEOf?#qlM;lFnVJ@t1h2KbfX9)E?+xi9rY4Z}C<>=t5RROaY@Uqnf$V2l2`zcPHW=?ML|j~T45@%Bo* z>}wuyVoU^Jo|L&uEx{Ff{cHm<3uH(SV?()+J(RvAG6H)eSGfa@$AB2U0Ks-^lm1*O zWv0IVQrhtlw)5qCg!GDSd`V4tGh%^FehxHMhzH%3w6$%fe2h#eSJtpL`HrDQ4E#W$ z?92UAExOYc?J&A-TS}!+9h6=oR2!wcaLMm3rihg(7yKrY=@Iq;7EUhUAuw&RiwoFZ z?CQ@FH)K7iuAGc9?DTMie&Oo|+GiFL7n}@;H7hT>mNx03dG|5 zp%*T81JL!vd8oNtWQb6PT}0(ndwK*@p@u*}Q*9n!EFs$YG(ih$a>@ch9ihSzP!3hJ zj&drzC)#M*@rp6_3B+b$xQ8~p%}6rLoXk6K&fG7 zhuRa`78V}J78Vxf4nhZ37w5-$+9L!Z!EQ9ufFIs)*%@Jd`li{iea{vbu~W<~W8sKx zVa=Ms{b|G09KPfSLiwy08U0cLr?7@K%p7DcH;NIQH>hghYewnK)WGFB#qGOxI;U$-)A9&?=w5o!=LXHDoRt0TTn)}S8kW*|9Xp1k>d}HK zZwS3!b!(?sTUF!dlrKBe;W7(oq?gX#y&vhn+z|bRZ|w$iR=`(#u2KDCd`mt~HfqyG zlL0V<{YjIGNzm>i{`sh_GYq{dl2xyv{4<{0oTH~s|J^2luxzdo_RLZa_h!B~N_*sI z{-Jb;j)-t*7vjze3vY1sd4`jhCXDMpIHTEiiZnUSkHbktWYpu2$Kz=e^r;f%U}RAb^w2 z4hV?HiahMawf3-ioxDKux9G^yyh}@`zVCnmp?Pp%V3Q7eD8{MaH@{6ke`JKszY z-ZHuCC5=!n1rguaXv#mNDHOHoRy1h6-bRu}@c{aNM46kML&0b~WkD3YP}bW-z1-ST zAKB|w?&4+HL1fyt!A`WI3Al%rQ7{vBU1suQWz!Uka8JV1w+vlBhWnZe*Y@cK?}sAo zo_)n;R@|jbjT_w-%}4l3Z|=0;_w{Z&94u{9do}=>yRzeIJjNe7n3d&*>WeL(X4=ve zyoj`yq2A=PNPG?C)3kqUqkS+Ssy|I@T!w1pg`RM?w!DYzJ6G+{r=sI!fT}JimXVYk ze!bQ2DC*IuqG`y)w3aAQFoyeKJI)^y`o40S{ zL}aLVGAhY6uvY~qgacjH!1QWwSFcY*^I&m17d=0$IYEtJgPR_Q%spycp29Mq2Lmqh zr};uSF->m;{%YJ$0ayb@?i+gbL!PMht5=!Gsk^r0*ZFJ3%@Tg);Cr%QslI>|E5LLp zAd5?cN}!uE3ooImIpra1`y^cEFUSLI*XcBn1e=;gNf3>mLx)?R&5jab2H>f>!LUFE~rY zTwUjjPnegKVY2j+K4yhG0Ie}h)OZP#Dn2F@kS zhkXwa^i!mBXnXF}7^!s-8|Nr^ma(k}c8ffbBGU zt$X#uJ+&Gv_IZMkl4vxuY-b{B4IP68jn|&3!DiZb9_*E z>QQ!owX4{-yFYFV^20L>S=je{`iILga1kBrowY^5=j-c%&~>g&KWTk&@$2C5@-B~; zGdnydIyYB>sN0FVzD6ZY`rdZ$Eso>4VGRpdTjTkX71wD$Tqm0%N6<8@cEDyaM>Z3f z5OyMhn~+H$&S?1xogRpjR=@6fHqs8q?sDqiSv4+}`#nb5$E%f3FF)q+Ppk5Wk=Z1` zCuYZ7?#DM`ry!Hm0#Als+lEr17ih}*j-5Lj7Fd0T&VCF`jf~odG+i3aJRxNkpynhv zhh7<&8w`j#Y6B3I>%}+dNDYlPtW1-g1&;w1xKDT-GTUJ~u!8rj1l7Iejc$GY&iWIO zF6)GZNyu)`)|60kS$oadBv>5=kvpA7S+@mDeUx$3Xvl;_E2kkswbCV5SAXQ0Pj=oF z+vDFNnfz^zVzc?BW~lA|wvm8hYyGKoG&$fp02|_b&vaZuN@J>})B7eBflw1QaR5wh zi>)!uU)GZNEh;Li#IGDzG1ZIY)l2ir2h(eV)|W;NX~Hzp8bys-})1;P#nt|Z5<>^zF{ zW{#H)HXoJA*~{VO($r=he79U5b(ock}Gx8`Z5RItV^RKK9GS9PW z9N~VE(g(CWK51#M-;%fvYImz9gjlcxDV$Ec+80oTw>&@Izk8zNupa{*U-7kimtN9f zQxyZpC2P3%cH&Qv^$_pxh^ftVUnA@F_X$8dss+UL##o>2<@^e5dcW+6Plr|Ly?!h( z+Kg9}mX?m&J=`}n+z{Vjq?kO`XSDm#2L4|T0$q_bPw}J^|2E*jJcN2}YYl~?nbf$u zrt;$eBYpq8A#(mT0J9z^BFUUuz$Y zsQs|;f1OnMeE#sLqi5$8AJ@M<7Cux`<`W(SFdXx(Sh=z94)oStgA4ws82fLw>-*dP zSng|m;0P+p6`^DtRp5JU7L!@l#qyd{F}CR z56E6hrVleIQc^n>1A`6@X1Lzp|Ls?|_3#67&^tfvgYzw~mGZ;S))mapn8wD&?jTGX zIVlc3rR)-2T`YfHfMp__jB;&@l#T*T+>1+iosX+r)37Bj1cVj0o`CqTl_WPW^w*00 z=QHAcDsRBwywzRYLNQC~fB$FDMYI{vM%nVC|16XFA2<2eU$<_9tN8y~*dKo^B^$&* zuas(+{=WEsebbN6?8+}-;~nsjNcxY+;h%o#Wj45m?9JYKKRng{{9=PkAS4lw=sT(S z-+S(d70l-4!P#NY{(~+5@nS)rq7=Bb_g^&IjQ-Oi|8T|shs(. - """ - result_frac_coords = [] - result_num_atoms = [] - result_atom_types = [] - result_lengths = [] - result_angles = [] - gt_frac_coords = [] - groundtruth_num_atoms = [] - groundtruth_atom_types = [] - gt_lengths = [] - gt_angles = [] - for idx, data in enumerate(loader): - logging.info("Reconstructing %d", int(idx * data[-3])) - batch_frac_coords, batch_num_atoms, batch_atom_types = [], [], [] - batch_lengths, batch_angles = [], [] - - # only sample one z, multiple evals for stoichaticity in langevin dynamics - (atom_types, dist, _, idx_kj, idx_ji, - edge_j, edge_i, batch, lengths, num_atoms, - angles, frac_coords, _, batch_size, sbf, - total_atoms) = data - gt_frac_coords.append(frac_coords.asnumpy()) - gt_angles.append(angles.asnumpy()) - gt_lengths.append(lengths.asnumpy()) - groundtruth_atom_types.append(atom_types.asnumpy()) - groundtruth_num_atoms.append(num_atoms.asnumpy()) - _, _, z = model.encode(atom_types, dist, - idx_kj, idx_ji, edge_j, edge_i, - batch, total_atoms, batch_size, sbf) - for _ in range(num_evals): - gt_num_atoms = num_atoms if force_num_atoms else None - gt_atom_types = atom_types if force_atom_types else None - outputs = model.langevin_dynamics( - z, ld_kwargs, batch_size, total_atoms, gt_num_atoms, gt_atom_types) - # collect sampled crystals in this batch. - batch_frac_coords.append(outputs["frac_coords"].asnumpy()) - batch_num_atoms.append(outputs["num_atoms"].asnumpy()) - batch_atom_types.append(outputs["atom_types"].asnumpy()) - batch_lengths.append(outputs["lengths"].asnumpy()) - batch_angles.append(outputs["angles"].asnumpy()) - # collect sampled crystals for this z. - result_frac_coords.append(batch_frac_coords) - result_num_atoms.append(batch_num_atoms) - result_atom_types.append(batch_atom_types) - result_lengths.append(batch_lengths) - result_angles.append(batch_angles) - - return ( - result_frac_coords, result_num_atoms, result_atom_types, - result_lengths, result_angles, - gt_frac_coords, groundtruth_num_atoms, groundtruth_atom_types, - gt_lengths, gt_angles) - - -def get_generation_res(model, ld_kwargs, num_batches_to_sample, num_samples_per_z, - batch_size=512, down_sample_traj_step=1): - """ - generate new crystals based on randomly sampled z. - """ - all_frac_coords_stack = [] - all_atom_types_stack = [] - result_frac_coords = [] - result_num_atoms = [] - result_atom_types = [] - result_lengths = [] - result_angles = [] - - for _ in range(num_batches_to_sample): - batch_all_frac_coords = [] - batch_all_atom_types = [] - batch_frac_coords, batch_num_atoms, batch_atom_types = [], [], [] - batch_lengths, batch_angles = [], [] - - z = ms.ops.randn(batch_size, model.hidden_dim) - - for _ in range(num_samples_per_z): - samples = model.langevin_dynamics(z, ld_kwargs, batch_size) - - # collect sampled crystals in this batch. - batch_frac_coords.append(samples["frac_coords"].asnumpy()) - batch_num_atoms.append(samples["num_atoms"].asnumpy()) - batch_atom_types.append(samples["atom_types"].asnumpy()) - batch_lengths.append(samples["lengths"].asnumpy()) - batch_angles.append(samples["angles"].asnumpy()) - if ld_kwargs.save_traj: - batch_all_frac_coords.append( - samples["all_frac_coords"][::down_sample_traj_step].asnumpy()) - batch_all_atom_types.append( - samples["all_atom_types"][::down_sample_traj_step].asnumpy()) - - # collect sampled crystals for this z. - result_frac_coords.append(batch_frac_coords) - result_num_atoms.append(batch_num_atoms) - result_atom_types.append(batch_atom_types) - result_lengths.append(batch_lengths) - result_angles.append(batch_angles) - if ld_kwargs.save_traj: - all_frac_coords_stack.append( - batch_all_frac_coords) - all_atom_types_stack.append( - batch_all_atom_types) - - return (result_frac_coords, result_num_atoms, result_atom_types, - result_lengths, result_angles, - all_frac_coords_stack, all_atom_types_stack) - - -def get_optimization_res(model, ld_kwargs, data_loader, - num_starting_points=128, num_gradient_steps=5000, - lr=1e-3, num_saved_crys=10): - """ - optimize the structure based on specific proprety. - """ - model.set_train(True) - if data_loader is not None: - data = next(iter(data_loader)) - (atom_types, dist, _, idx_kj, idx_ji, - edge_j, edge_i, batch, _, num_atoms, - _, _, _, batch_size, sbf, - total_atoms) = data - _, _, z = model.encode(atom_types, dist, - idx_kj, idx_ji, edge_j, edge_i, - batch, total_atoms, batch_size, sbf) - z = mint.narrow(z, 0, 0, num_starting_points) - z = ms.Parameter(z, requires_grad=True) - else: - z = mint.randn(num_starting_points, model.hparams.hidden_dim) - z = ms.Parameter(z, requires_grad=True) - - opt = Adam([z], learning_rate=lr) - freeze_model(model) - - loss_fn = model.fc_property - - def forward_fn(data): - loss = loss_fn(data) - return loss - grad_fn = ms.value_and_grad(forward_fn, None, opt.parameters) - - def train_step(data): - loss, grads = grad_fn(data) - opt(grads) - return loss - - all_crystals = [] - total_atoms = mint.sum(mint.narrow( - num_atoms, 0, 0, num_starting_points)).item() - interval = num_gradient_steps // (num_saved_crys - 1) - for i in tqdm(range(num_gradient_steps)): - loss = mint.mean(train_step(z)) - logging.info("Task opt step: %d, loss: %f", i, loss) - if i % interval == 0 or i == (num_gradient_steps - 1): - crystals = model.langevin_dynamics( - z, ld_kwargs, batch_size, total_atoms) - all_crystals.append(crystals) - return {k: mint.cat([d[k] for d in all_crystals]).unsqueeze(0).asnumpy() for k in - ["frac_coords", "atom_types", "num_atoms", "lengths", "angles"]} - - -def freeze_model(model): - """ The model is fixed, only optimize z""" - for param in model.get_parameters(): - param.requires_grad = False diff --git a/MindChemistry/applications/cdvae/src/metrics_utils.py b/MindChemistry/applications/cdvae/src/metrics_utils.py deleted file mode 100644 index cf179ec10..000000000 --- a/MindChemistry/applications/cdvae/src/metrics_utils.py +++ /dev/null @@ -1,191 +0,0 @@ -# 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 for compute metrics""" -import itertools -import numpy as np - -from scipy.spatial.distance import pdist -from scipy.spatial.distance import cdist - -import smact -from smact.screening import pauling_test - -from create_dataset import chemical_symbols - - -def get_crystals_list( - frac_coords, atom_types, lengths, angles, num_atoms): - """ - args: - frac_coords: (num_atoms, 3) - atom_types: (num_atoms) - lengths: (num_crystals) - angles: (num_crystals) - num_atoms: (num_crystals) - """ - assert frac_coords.shape[0] == atom_types.shape[0] == num_atoms.sum() - assert lengths.shape[0] == angles.shape[0] == num_atoms.shape[0] - - start_idx = 0 - crystal_array_list = [] - for batch_idx, num_atom in enumerate(num_atoms.tolist()): - cur_frac_coords = frac_coords[start_idx:start_idx+num_atom] - cur_atom_types = atom_types[start_idx:start_idx+num_atom] - cur_lengths = lengths[batch_idx] - cur_angles = angles[batch_idx] - - crystal_array_list.append({ - "frac_coords": cur_frac_coords, - "atom_types": cur_atom_types, - "lengths": cur_lengths, - "angles": cur_angles, - }) - start_idx = start_idx + num_atom - return crystal_array_list - - -def smact_validity(comp, count, - use_pauling_test=True, - include_alloys=True): - """compute smact validity""" - elem_symbols = tuple([chemical_symbols[elem] for elem in comp]) - space = smact.element_dictionary(elem_symbols) - smact_elems = [e[1] for e in space.items()] - electronegs = [e.pauling_eneg for e in smact_elems] - ox_combos = [e.oxidation_states for e in smact_elems] - if len(set(elem_symbols)) == 1: - return True - if include_alloys: - is_metal_list = [elem_s in smact.metals for elem_s in elem_symbols] - if all(is_metal_list): - return True - - threshold = np.max(count) - compositions = [] - for ox_states in itertools.product(*ox_combos): - stoichs = [(c,) for c in count] - # Test for charge balance - cn_e, cn_r = smact.neutral_ratios( - ox_states, stoichs=stoichs, threshold=threshold) - # Electronegativity test - if cn_e: - if use_pauling_test: - try: - electroneg_pass = pauling_test(ox_states, electronegs) - except TypeError: - # if no electronegativity data, assume it is okay - electroneg_pass = True - else: - electroneg_pass = True - if electroneg_pass: - for ratio in cn_r: - compositions.append( - tuple([elem_symbols, ox_states, ratio])) - compositions = [(i[0], i[2]) for i in compositions] - compositions = list(set(compositions)) - res = bool(compositions) - return res - - -def structure_validity(crystal, cutoff=0.5): - """compute structure validity""" - dist_mat = crystal.distance_matrix - # Pad diagonal with a large number - dist_mat = dist_mat + np.diag( - np.ones(dist_mat.shape[0]) * (cutoff + 10.)) - res = None - if dist_mat.min() < cutoff or crystal.volume < 0.1: - res = False - else: - res = True - return res - - -def get_fp_pdist(fp_array): - if isinstance(fp_array, list): - fp_array = np.array(fp_array) - fp_pdists = pdist(fp_array) - return fp_pdists.mean() - - -def filter_fps(struc_fps, comp_fps): - assert len(struc_fps) == len(comp_fps) - - filtered_struc_fps, filtered_comp_fps = [], [] - - for struc_fp, comp_fp in zip(struc_fps, comp_fps): - if struc_fp is not None and comp_fp is not None: - filtered_struc_fps.append(struc_fp) - filtered_comp_fps.append(comp_fp) - return filtered_struc_fps, filtered_comp_fps - - -def compute_cov(crys, gt_crys, comp_scaler, - struc_cutoff, comp_cutoff, num_gen_crystals=None): - """compute COV""" - struc_fps = [c.struct_fp for c in crys] - comp_fps = [c.comp_fp for c in crys] - gt_struc_fps = [c.struct_fp for c in gt_crys] - gt_comp_fps = [c.comp_fp for c in gt_crys] - - assert len(struc_fps) == len(comp_fps) - assert len(gt_struc_fps) == len(gt_comp_fps) - - # Use number of crystal before filtering to compute COV - if num_gen_crystals is None: - num_gen_crystals = len(struc_fps) - - struc_fps, comp_fps = filter_fps(struc_fps, comp_fps) - - comp_fps = comp_scaler.transform(comp_fps) - gt_comp_fps = comp_scaler.transform(gt_comp_fps) - - struc_fps = np.array(struc_fps) - gt_struc_fps = np.array(gt_struc_fps) - comp_fps = np.array(comp_fps) - gt_comp_fps = np.array(gt_comp_fps) - - struc_pdist = cdist(struc_fps, gt_struc_fps) - comp_pdist = cdist(comp_fps, gt_comp_fps) - - struc_recall_dist = struc_pdist.min(axis=0) - struc_precision_dist = struc_pdist.min(axis=1) - comp_recall_dist = comp_pdist.min(axis=0) - comp_precision_dist = comp_pdist.min(axis=1) - - cov_recall = np.mean(np.logical_and( - struc_recall_dist <= struc_cutoff, - comp_recall_dist <= comp_cutoff)) - cov_precision = np.sum(np.logical_and( - struc_precision_dist <= struc_cutoff, - comp_precision_dist <= comp_cutoff)) / num_gen_crystals - - metrics_dict = { - "cov_recall": cov_recall, - "cov_precision": cov_precision, - "amsd_recall": np.mean(struc_recall_dist), - "amsd_precision": np.mean(struc_precision_dist), - "amcd_recall": np.mean(comp_recall_dist), - "amcd_precision": np.mean(comp_precision_dist), - } - - combined_dist_dict = { - "struc_recall_dist": struc_recall_dist.tolist(), - "struc_precision_dist": struc_precision_dist.tolist(), - "comp_recall_dist": comp_recall_dist.tolist(), - "comp_precision_dist": comp_precision_dist.tolist(), - } - - return metrics_dict, combined_dist_dict diff --git a/MindChemistry/applications/cdvae/train.py b/MindChemistry/applications/cdvae/train.py deleted file mode 100644 index 1b73927f5..000000000 --- a/MindChemistry/applications/cdvae/train.py +++ /dev/null @@ -1,185 +0,0 @@ -# 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. -# ============================================================================ -"""Train -""" - -import os -import logging -import argparse -import time -import numpy as np -import mindspore as ms -from mindspore.experimental import optim -from mindchemistry.utils.load_config import load_yaml_config_from_path -from mindchemistry.cell.cdvae import CDVAE -from mindchemistry.cell.gemnet.data_utils import StandardScalerMindspore -from create_dataset import create_dataset -from src.dataloader import DataLoaderBaseCDVAE - - -def train_epoch(epoch, model, optimizer, scheduler, train_dataset): - """Train the model for one epoch""" - model.set_train() - # Define forward function - - def forward_fn(data): - (atom_types, dist, _, idx_kj, idx_ji, - edge_j, edge_i, batch, lengths, num_atoms, - angles, frac_coords, y, batch_size, sbf, total_atoms) = data - loss = model(atom_types, dist, idx_kj, idx_ji, edge_j, edge_i, - batch, lengths, num_atoms, angles, frac_coords, - y, batch_size, sbf, total_atoms, True, True) - return loss - # Get gradient function - grad_fn = ms.value_and_grad( - forward_fn, None, optimizer.parameters, has_aux=False) - - # Define function of one-step training - def train_step(data): - loss, grads = grad_fn(data) - scheduler.step(loss) - optimizer(grads) - return loss - - start_time_step = time.time() - for batch, data in enumerate(train_dataset): - loss = train_step(data) - time_step = time.time() - start_time_step - start_time_step = time.time() - if batch % 10 == 0: - logging.info("Train Epoch: %d [%d]\tLoss: %4f,\t time_step: %4f", - epoch, batch, loss, time_step) - - -def test_epoch(model, val_dataset): - """test for one epoch""" - model.set_train(False) - test_loss = 0 - i = 1 - for i, data in enumerate(val_dataset): - (atom_types, dist, _, idx_kj, idx_ji, - edge_j, edge_i, batch, lengths, num_atoms, - angles, frac_coords, y, batch_size, sbf, total_atoms) = data - output = model(atom_types, dist, - idx_kj, idx_ji, edge_j, edge_i, - batch, lengths, num_atoms, - angles, frac_coords, y, batch_size, - sbf, total_atoms, False, True) - test_loss += float(output) - test_loss /= (i+1) - logging.info("Val Loss: %4f", test_loss) - return test_loss - -def get_scaler(args): - """get scaler""" - lattice_scaler_mean = ms.Tensor(np.loadtxt( - f"./data/{args.dataset}/train/lattice_scaler_mean.csv"), ms.float32) - lattice_scaler_std = ms.Tensor(np.loadtxt( - f"./data/{args.dataset}/train/lattice_scaler_std.csv"), ms.float32) - scaler_std = ms.Tensor(np.loadtxt( - f"./data/{args.dataset}/train/scaler_std.csv"), ms.float32) - scaler_mean = ms.Tensor(np.loadtxt( - f"./data/{args.dataset}/train/scaler_mean.csv"), ms.float32) - lattice_scaler = StandardScalerMindspore( - lattice_scaler_mean, lattice_scaler_std) - scaler = StandardScalerMindspore(scaler_mean, scaler_std) - return lattice_scaler, scaler - -def train_net(args): - """training process""" - folder_path = os.path.dirname(args.name_ckpt) - if not os.path.exists(folder_path): - os.makedirs(folder_path) - logging.info("%s has been created", folder_path) - config_path = "./conf/configs.yaml" - data_config_path = f"./conf/data/{args.dataset}.yaml" - - model = CDVAE(config_path, data_config_path) - - # load checkpoint - if args.load_ckpt: - model_path = args.name_ckpt - param_dict = ms.load_checkpoint(model_path) - param_not_load, _ = ms.load_param_into_net(model, param_dict) - logging.info("%s have not been loaded", param_not_load) - - # create dataset when running the model first-time or when dataset is not exist - if args.create_dataset or not os.path.exists(f"./data/{args.dataset}/train/processed_data.npy"): - logging.info("Creating dataset......") - create_dataset(args) # dataset created will be save to the dir based on args.dataset as npy - - # read dataset from processed_data - batch_size = load_yaml_config_from_path(data_config_path).get("batch_size") - train_dataset = DataLoaderBaseCDVAE( - batch_size, args.dataset, shuffle_dataset=True, mode="train") - val_dataset = DataLoaderBaseCDVAE( - batch_size, args.dataset, shuffle_dataset=False, mode="val") - lattice_scaler, scaler = get_scaler(args) - model.lattice_scaler = lattice_scaler - model.scaler = scaler - - config_opt = load_yaml_config_from_path(config_path).get("Optimizer") - learning_rate = config_opt.get("learning_rate") - min_lr = config_opt.get("min_lr") - factor = config_opt.get("factor") - patience = config_opt.get("patience") - - optimizer = optim.Adam(model.trainable_params(), learning_rate) - scheduler = optim.lr_scheduler.ReduceLROnPlateau( - optimizer, 'min', factor=factor, patience=patience, min_lr=min_lr) - - min_test_loss = float("inf") - for epoch in range(args.epoch_num): - train_epoch(epoch, model, optimizer, scheduler, train_dataset) - if epoch % 10 == 0: - test_loss = test_epoch(model, val_dataset) - if test_loss < min_test_loss: - min_test_loss = test_loss - ms.save_checkpoint(model, args.name_ckpt) - logging.info("Updata best acc: %f", test_loss) - - logging.info('Finished Training') - -def get_args(): - """get args""" - parser = argparse.ArgumentParser() - parser.add_argument("--dataset", default="perov_5", help="dataset name") - parser.add_argument("--create_dataset", default=False, - type=bool, help="whether create dataset again or not") - parser.add_argument("--num_samples_train", default=500, type=int, - help="number of samples for training,\ - only valid when create_dataset is True") - parser.add_argument("--num_samples_val", default=300, type=int, - help="number of samples for validation,\ - only valid when create_dataset is True") - parser.add_argument("--num_samples_test", default=300, type=int, - help="number of samples for test,\ - only valid when create_dataset is True") - parser.add_argument("--name_ckpt", default="./loss/loss.ckpt", - help="the path to save checkpoint") - parser.add_argument("--load_ckpt", default=False, type=bool, - help="whether load checkpoint or not") - parser.add_argument("--device_target", default="Ascend", help="device target") - parser.add_argument("--device_id", default=3, type=int, help="device id") - parser.add_argument("--epoch_num", default=100, type=int, help="number of epoch") - return parser.parse_args() - -if __name__ == "__main__": - main_args = get_args() - logging.basicConfig(format="%(levelname)s:%(message)s", level=logging.INFO) - ms.context.set_context(device_target=main_args.device_target, - device_id=main_args.device_id, - mode=1) - train_net(main_args) diff --git a/MindChemistry/docs/high-alloy.png b/MindChemistry/docs/high-alloy.png deleted file mode 100644 index ce2e0c7e1bac9ff4a34bc0475f797a6792eac6a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19722 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%0DYSWw~K} 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
  • 05@7=*GnnGJgAI(3l(-w+QDOW?2x2A%) zx!e;mxxJTX@VJF4RF^o?`1V*GQ!4>7HVBH7lYVIvflZb9EG|UcQa#bJbpahpI<&&C zS8i=(ivycDbts|==_RpW<58TDRmZ?H5|Ace?8s*!Yb)2Z(x}gW>T$W0hd2q%Z)NHu zt(c^GogDW*MQ?Iu{U!!2HMrqDA#ZPZBQ z1IOMm-WJ!ATUM}z^WJ_->-~<>i{IYdu%ze5^}3kwkL$~AruG^Km+VW{_td+3EO|WUPZnh>v>5)=EBe3UfOOc$`m#f%+%`YL=ACCxTU+`w`GJ;Z_P3*Tf9y1Y9ch*) z_dmYgAm7^;`oF1n=}yZpOqT!e&XZDqX&CBuePO2b%k%k6Z?-ii?<|>=CGNygXgqVZ z#luOwwn4ACpCod+&8Yh^J>BJ-l*1{{adw9e_OmTge&gJ+RYo({uVSgUR*t2LR3rj zY}I=2)9yZh6({^NWEV~6sa+EP^?lpSS-ZQ=PCpwev&#HNzvQG^&E#cz{hRLz)FjXpPn{dn%l9lk+Hm4O0Jg| zxQ}&)9q+8>l+aht4@Y0f;|sjDJ?+H}>-2)$gp7V(#8c zYd^hPnj`1AR{HL%a$6h=tCDy8jn0g3YYUMnHaAG$XHhzlZ?ovDub&OfOCuNM_FS$M zh&Vsx+DoGwY?JP-h}pVnz8UM$2Y*lZFJITJ<2gBf#*-HaplME7XQ|sS&+FSb+X>9 ztDPdh#rMVLzPx{wQ*JS^+Fw?*>JI;v{TJQ-O3$m;j`%Nj;=JZBkLk71KLu8v{IT1r z@$3iv8olUW&EV?f@TYuMyMuF&Ht8EjUydsOyyI5ZKN|*!_O|-R5Jgw_uLZUUrN6HK zwO!O?r@Y>hM~04Ewog2gzql#=U9I8V^ea5@QTG55r|;Lj-nV{by{PKEKhyXBDzE>x z^nC53cU|@U^Cy{$xOUpy2M$gBTMnF*x&QaY%gJx)#j0|G2dO z*QxOTZ?d}V9+oeX!mCx%2+-zvpY- zeV+fH88|0(^11#0o#$(Q1NMtut(nLrU$z6r4> fx3}~C{XgNTL0s$_y*I#PQy4s5{an^LB{Ts5+Kzpo diff --git a/MindChemistry/docs/mindchemistry_arch.png b/MindChemistry/docs/mindchemistry_arch.png deleted file mode 100644 index fae4dfcc250fcdaf33b44a283779889c382cc45d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36302 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

    A5Z9+K|N3Dk5@|6R$MF8 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 diff --git a/MindChemistry/docs/mindchemistry_archi.png b/MindChemistry/docs/mindchemistry_archi.png new file mode 100644 index 0000000000000000000000000000000000000000..4cff59cf72de047b1e83c1ad5ca774b7e1eea0ff GIT binary patch literal 73289 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 q(3#0!T+1##4~ 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�UdycIhx$FbUH0M;Nz%gbanM#{1;s<*P zM(5YAlZ}q~#JJT4U$_6PGtvrfNp+ZV6DF6)^10QRUSdEr!M-)~V(b1{98lW zOBXa;Cq?uA#npd2yBUEaz9QtK!Nip6*qxMBa{(`EV&UB^OKFjEV3x=2?_%}OFT-!D zaM5Kyt%Qs&6kRh$`_BL~pSHl@DGCn?&8!XzDfxmcjZ>E0! zMD2X-^UPPQc|=LTxp;S`^%`gQ#nm$tS=EI4G7e!5_B_k)i8;(G6TJL}&wI5+YyHP4#w@4{C4Ki;2-3O- zhz{y>#%P!suYU!kCgg4^(=K*9oRtV>O5rywt@0ap>T}=HZQhF@3Y|-8e{h-2&{LNV zz>JnDJdmH6Dv79~T##P-q=v#k5Ucw>4AX*iP$T6|V76XdpD2{}puikc^z=T;cMW5L zle+{|bE^>KM=`)7Ip1|v&s*5Mu7|+IIy%aR8^T7-z_v>MP3>=k!>BBbjlJJt<`#?#OiShbty+oSk%bk@&~w882ze%JbmOw z9MLXYlcg@z;{T+MA>$m;f_wC~N4sDl&8x5NWy0ECh&i8ZNb%l%){& z{*rK~LgiGcPhz?f6eVP+)vHMny69dF#GspAq_L5UBzCMPn^D`%L2(;p!1|AYl8Rz6 zlE}F+xS4~cvip+1B=WDHX2o^NMc2!q8XJwn=e5D6NX>6)#jNy&fSvkKFgPMn!<*Pt1*mkRWIeX&Lvp1CEM nAR_RBC1MYPbcP_b5EDLCIYT{XYooLp_Q4UG@4qdz_Kg2GNw2qq literal 0 HcmV?d00001 diff --git a/MindChemistry/docs/mindchemistry_archi_cn.png b/MindChemistry/docs/mindchemistry_archi_cn.png index 52b48ff4b6f99a59285fb8addc6ea99a8afd21cc..400d47732af1d585680669cdb019182774fd83c4 100644 GIT binary patch literal 65352 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

  • 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 R%fOw|P}RL(t^Dle{{i}_M~?si literal 32772 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 z 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 import numpy as np - >>> import mindspore as ms - >>> from mindspore import context, Tensor - >>> from mindchemistry.cell import CDVAE - >>> from mindchemistry.cell.cdvae.data_utils import StandardScalerMindspore - >>> os.environ["MS_JIT_MODULES"] = "mindchemistry" - >>> context.set_context(mode=context.PYNATIVE_MODE) - >>> config_path = "./configs.yaml" - >>> data_config_path = "./perov_5.yaml" - >>> cdvae_model = CDVAE(config_path, data_config_path) - >>> # input data - >>> batch_size = 2 - >>> atom_types = Tensor([6, 7, 6, 8], ms.int32) - >>> dist = Tensor([1.4, 1.7, 1.8, 1.9, 2.0, 2.1, 1.8, 1.6], ms.float32) - >>> idx_kj = Tensor([0, 1, 2, 3, 4, 5, 5, 4, 3, 2, 1, 0, 7, 6, 6, 7], ms.int32) - >>> idx_ji = Tensor([1, 0, 3, 2, 5, 4, 4, 5, 2, 3, 0, 1, 6, 7, 7, 6], ms.int32) - >>> edge_j = Tensor([0, 1, 1, 0, 2, 3, 3, 2], ms.int32) - >>> edge_i = Tensor([1, 0, 0, 1, 3, 2, 2, 3], ms.int32) - >>> batch = Tensor([0, 0, 1, 1], ms.int32) - >>> lengths = Tensor([[2.5, 2.5, 2.5], - ... [2.5, 2.5, 2.5]], ms.float32) - >>> angles = Tensor([[90.0, 90.0, 90.0], - ... [90.0, 90.0, 90.0]], ms.float32) - >>> frac_coords = Tensor([[0.0, 0.0, 0.0], - ... [0.5, 0.5, 0.5], - ... [0.7, 0.7, 0.7], - ... [0.5, 0.5, 0.5]], ms.float32) - >>> num_atoms = Tensor([2, 2], ms.int32) - >>> y = Tensor([0.08428, 0.01353], ms.float32) - >>> total_atoms = 4 - >>> sbf = Tensor(np.random.randn(16, 42), ms.float32) - >>> cdvae_model.lattice_scaler = StandardScalerMindspore( - ... Tensor([2.5, 2.5, 2.5, 90.0, 90.0, 90.0], ms.float32), - ... Tensor([1.0, 1.0, 1.0, 1.0, 1.0, 1.0], ms.float32)) - >>> cdvae_model.scaler = StandardScalerMindspore( - ... Tensor([2.62], ms.float32), - ... Tensor([1.0], ms.float32)) - >>> out = cdvae_model(atom_types, dist, - ... idx_kj, idx_ji, edge_j, edge_i, - ... batch, lengths, num_atoms, - ... angles, frac_coords, y, batch_size, - ... sbf, total_atoms, False, True) - >>> print("out:", out) - out: 27.780727 - """ - - def __init__(self, config_path, data_config_path): - super().__init__() - self.configs = load_yaml_config_from_path(config_path) - decoder_configs = self.configs.get("Decoder") - encoder_configs = self.configs.get("Encoder") - data_configs = load_yaml_config_from_path(data_config_path) - self.latent_dim = self.configs.get("latent_dim") - self.hidden_dim = self.configs.get("hidden_dim") - self.fc_num_layers = self.configs.get("fc_num_layers") - if isinstance(self.configs.get("predict_property"), bool): - self.set_predict_property = self.configs.get("predict_property") - else: - raise TypeError("predict_property should be bool.") - self.sigma_begin = self.configs.get("sigma_begin") - self.sigma_end = self.configs.get("sigma_end") - self.num_noise_level = self.configs.get("num_noise_level") - self.type_sigma_begin = self.configs.get("type_sigma_begin") - self.type_sigma_end = self.configs.get("type_sigma_end") - if isinstance(self.configs.get("teacher_forcing_lattice"), bool): - self.teacher_forcing_lattice = self.configs.get( - "teacher_forcing_lattice") - else: - raise TypeError("teacher_forcing_lattice should be bool.") - if data_configs.get("lattice_scale_method") in ["scale_length"]: - self.lattice_scale_method = data_configs.get( - "lattice_scale_method") - else: - raise ValueError( - "For lattice scale method, supported methods: 'scale_length'.") - self.max_atoms = data_configs.get("max_atoms") - - self.encoder = DimeNetPlusPlus( - num_targets=self.latent_dim, - hidden_channels=encoder_configs.get("hidden_channels"), - num_blocks=encoder_configs.get("num_blocks"), - int_emb_size=encoder_configs.get("int_emb_size"), - basis_emb_size=encoder_configs.get("basis_emb_size"), - out_emb_channels=encoder_configs.get("out_emb_channels"), - num_spherical=encoder_configs.get("num_spherical"), - num_radial=encoder_configs.get("num_radial"), - cutoff=encoder_configs.get("cutoff"), - envelope_exponent=encoder_configs.get("envelope_exponent"), - num_before_skip=encoder_configs.get("num_before_skip"), - num_after_skip=encoder_configs.get("num_after_skip"), - num_output_layers=encoder_configs.get("num_output_layers"), - readout=data_configs.get("readout")) - - self.decoder = GemNetTDecoder( - hidden_dim=decoder_configs.get("hidden_dim"), - latent_dim=self.configs.get("latent_dim"), - max_neighbors=self.configs.get("max_neighbors"), - radius=self.configs.get("radius"), - config_path=config_path - ) - self.fc_mu = mint.nn.Linear(self.latent_dim, self.latent_dim) - self.fc_var = mint.nn.Linear(self.latent_dim, self.latent_dim) - self.fc_num_atoms = MLP(self.latent_dim, self.hidden_dim, - self.fc_num_layers, self.max_atoms + 1, - activation='ReLU') - self.fc_lattice = MLP(self.latent_dim, self.hidden_dim, - self.fc_num_layers, 6, - activation='ReLU') - self.max_atomic_num = MAX_ATOMIC_NUM - self.fc_composition = MLP(self.latent_dim, self.hidden_dim, - self.fc_num_layers, self.max_atomic_num, - activation='ReLU') - # for property prediction. - if self.set_predict_property: - self.fc_property = MLP(self.latent_dim, self.hidden_dim, - self.fc_num_layers, 1, - activation='ReLU') - self.sigmas = np.exp(np.linspace( - np.log(self.sigma_begin), - np.log(self.sigma_end), - self.num_noise_level)) - - self.type_sigmas = np.exp(np.linspace( - np.log(self.type_sigma_begin), - np.log(self.type_sigma_end), - self.num_noise_level)) - - # obtain from datamodule. - self.lattice_scaler = None - self.scaler = None - self.decoder_preprocess = GemNetPreprocess(otf_graph=True) - self.aggregate_mean = AggregateNodeToGlobal(mode="mean") - self.lift_global = LiftGlobalToNode() - - def reparameterize(self, mu, logvar): - r""" - Reparameterization trick to sample to N(mu, var) from N(0,1). - - Args: - mu (Tensor): Mean of the latent Gaussian. - The shape of tensor is :math:`(batch\_size, latent\_dim)`. - logvar (Tensor): Standard deviation of the latent Gaussian. - The shape of tensor is :math:`(batch\_size, latent\_dim)`. - - Returns: - (Tensor) Randomly generated latent parameter. - The shape of tensor is :math:`(batch\_size, latent\_dim)`. - """ - - std = mint.exp(mint.mul(0.5, logvar)) - eps = ms.Tensor(np.random.randn( - std.shape[0], std.shape[1]), ms.float32) - return eps * std + mu - - def encode(self, atom_types, dist, idx_kj, idx_ji, edge_j, edge_i, batch, total_atoms, batch_size, sbf): - r""" - encode crystal structures to latents. - - Args: - atom_types (Tensor): Atom types of each atom. - The shape of tensor is :math:`(total\_atoms,)`. - dist (Tensor): Distance between atoms. - The shape of tensor is :math:`(total\_edges,)`. - idx_kj (Tensor): The index of the first edge in the triples. - The shape of tensor is :math:`(total\_triplets,)`. - idx_ji (Tensor): The index of the sechond edge in the triples. - The shape of tensor is :math:`(total\_triplets,)`. - edge_j (Tensor): The index of the first atom of the edges. - The shape of tensor is :math:`(total\_edges,)`. - edge_i (Tensor): The index of the second atom of the edges. - The shape of tensor is :math:`(total\_edges,)`. - batch (Tensor): The shape of tensor is :math:`(total\_atoms,)`. - total_atoms (int): Total atoms. - batch_size (int): Batch size. - sbf (Tensor): The shape of tensor is :math:`(total\_triplets, num\_spherical * num\_radial)`. - - Returns: - mu (Tensor): Mean of the latent Gaussian. - The shape of tensor is :math:`(batch\_size, latent\_dim)`. - log_var (Tensor): Standard deviation of the latent Gaussian. - The shape of tensor is :math:`(batch\_size, latent\_dim)`. - z (Tensor): Randomly generated latent parameter. - The shape of tensor is :math:`(batch\_size, latent\_dim)`. - """ - hidden = self.encoder(atom_types, dist, idx_kj, idx_ji, edge_j, edge_i, - batch, total_atoms, batch_size, sbf) - mu = self.fc_mu(hidden) - log_var = self.fc_var(hidden) - z = self.reparameterize(mu, log_var) - return mu, log_var, z - - def decode_stats(self, z, batch=None, gt_num_atoms=None, gt_lengths=None, gt_angles=None, - teacher_forcing=False): - r""" - Decode key statistics from latent embeddings. - - This method decodes key statistics from the given latent embeddings. - - Args: - z (Tensor): Randomly generated latent parameter. - The shape of the tensor is :math:`(batch\_size, latent\_dim)`. - batch (Tensor, optional): The shape of the tensor is :math:`(total\_atoms,)`. - gt_num_atoms (Tensor, optional): Ground truth number of atoms. - gt_lengths (Tensor, optional): Ground truth lattice constant. - gt_angles (Tensor, optional): Ground truth lattice angle. - teacher_forcing (bool): If `True`, teacher forcing is used during training; - otherwise, `False`. Default is `False`. - - Returns: - tuple of Tensor including: num_atoms, lengths_and_angles, lengths, angles, - composition_per_atom, z_per_atom and batch. - num_atoms (Tensor): The predicted number of atoms. The shape of the tensor is :math:`(batch\_size,)`. - lengths_and_angles (Tensor): The predicted lattice constants and angles. - The shape of the tensor is :math:`(batch\_size, 6)`. - lengths (Tensor): The predicted lattice constants. The shape of the tensor is :math:`(batch\_size, 3)`. - angles (Tensor): The predicted lattice angles. The shape of the tensor is :math:`(batch\_size, 3)`. - composition_per_atom (Tensor): The predicted composition per atom. - The shape of the tensor is :math:`(total\_atoms, max_atomic\_num)`. - z_per_atom (Tensor): The lifted global latent embeddings per atom. - The shape of the tensor is :math:`(total\_atoms, latent\_dim)`. - batch (Tensor): The batch tensor used to index which sample is the node belonging. - The shape of the tensor is :math:`(total\_atoms,)`. - """ - if gt_num_atoms is not None: - num_atoms = self.predict_num_atoms(z) - lengths_and_angles, lengths, angles = ( - self.predict_lattice(z, gt_num_atoms)) - assert batch is not None - z_per_atom = self.lift_global(z, batch) - composition_per_atom = self.predict_composition(z_per_atom) - if self.teacher_forcing_lattice and teacher_forcing: - lengths = gt_lengths - angles = gt_angles - else: - num_atoms = mint.argmax( - self.predict_num_atoms(z), dim=-1).astype(ms.int32) - lengths_and_angles, lengths, angles = ( - self.predict_lattice(z, num_atoms)) - batch = ms.ops.repeat_interleave(mint.arange( - num_atoms.shape[0], dtype=ms.int32), num_atoms) - z_per_atom = self.lift_global(z, batch) - composition_per_atom = self.predict_composition(z_per_atom) - # set the max and min values for lengths and angles. - angles = mint.clamp(angles, -180, 180) - lengths = mint.clamp(lengths, 0.5, 20) - return num_atoms, lengths_and_angles, lengths, angles, composition_per_atom, z_per_atom, batch - - def langevin_dynamics(self, z, ld_kwargs, batch_size, total_atoms=None, gt_num_atoms=None, gt_atom_types=None): - r""" - decode crystral structure from latent embeddings. - - Args: - ld_kwargs: args for doing annealed langevin dynamics sampling: - n_step_each (int): number of steps for each sigma level. - step_lr (int): step size param. - min_sigma (int): minimum sigma to use in annealed langevin dynamics. - save_traj (bool): if True, save the entire LD trajectory. - disable_bar (bool): disable the progress bar of langevin dynamics. - gt_num_atoms (Tensor, optional): if not , use the ground truth number of atoms. - gt_atom_types (Tensor, optional): if not , use the ground truth atom types. - - Returns: - (dict): Including num_atoms, lengths, anlges, frac_coords, atom_types, is_traj - num_atoms (Tensor): Number of atoms in each crystal. - The shape of tensor is :math:`(batch\_size,)`. - lengths (Tensor): Lattice constant of each crystal. - The shape of tensor is :math:`(batch\_size, 3)`. - angles (Tensor): Lattice angle of each crystal. - The shape of tensor is :math:`(batch\_size, 3)`. - frac_coords (Tensor): Fractional coordinates of each atom. - The shape of tensor is :math:`(total\_atoms, 3)`. - atom_types (Tensor): Atom types of each atom. - The shape of tensor is :math:`(total\_atoms,)`. - is_traj (bool): If True, save the entire LD trajectory. - """ - - if ld_kwargs.save_traj: - all_frac_coords = [] - all_pred_cart_coord_diff = [] - all_noise_cart = [] - all_atom_types = [] - # obtain key stats. - num_atoms, _, lengths, angles, composition_per_atom, z_per_atom, batch = self.decode_stats( - z, gt_num_atoms) - if gt_num_atoms is not None: - num_atoms = gt_num_atoms - else: - total_atoms = num_atoms.sum().item() - # obtain atom types. - composition_per_atom = mint.softmax(composition_per_atom, dim=-1) - if gt_atom_types is None: - cur_atom_types = self.sample_composition( - composition_per_atom, num_atoms, batch, batch_size, total_atoms) - else: - cur_atom_types = gt_atom_types - # init coords. - cur_frac_coords = np.random.rand(total_atoms, 3) - - # annealed langevin dynamics. - for sigma in tqdm(self.sigmas, total=self.sigmas.shape[0], disable=ld_kwargs.disable_bar, position=0): - if sigma < ld_kwargs.min_sigma: - break - step_size = ld_kwargs.step_lr * (sigma / self.sigmas[-1]) ** 2 - step_size_ms = ms.Tensor(step_size, ms.float32) - - for _ in range(ld_kwargs.n_step_each): - noise_cart = np.random.randn(cur_frac_coords.shape[0], - cur_frac_coords.shape[1]) * np.sqrt(step_size * 2) - noise_cart = ms.Tensor(noise_cart, ms.float32) - (_, idx_s, idx_t, id3_ca, id3_ba, - id3_ragged_idx, id3_ragged_idx_max, _, d_st, v_st, - id_swap, y_l_m) = self.decoder_preprocess.graph_generation( - cur_frac_coords, num_atoms.asnumpy(), - lengths.asnumpy(), angles.asnumpy(), - edge_index=None, - to_jimages=None, - num_bonds=None) - cur_frac_coords = ms.Tensor(cur_frac_coords, ms.float32) - batch = ms.ops.repeat_interleave( - mint.arange(num_atoms.shape[0]), num_atoms, 0) - - #### decoder #### - pred_cart_coord_diff, pred_atom_types = self.decoder( - cur_atom_types, idx_s, idx_t, id3_ca, id3_ba, id3_ragged_idx, id3_ragged_idx_max, - y_l_m, d_st, v_st, id_swap, batch, z_per_atom, total_atoms, batch_size) - - cur_cart_coords = frac_to_cart_coords( - cur_frac_coords, lengths, angles, batch, self.lift_global) - pred_cart_coord_diff = mint.div( - pred_cart_coord_diff, ms.Tensor(sigma, ms.float32)) - cur_cart_coords = cur_cart_coords + \ - mint.mul(step_size_ms, pred_cart_coord_diff) + noise_cart - cur_frac_coords = cart_to_frac_coords( - cur_cart_coords, lengths, angles, batch, self.lift_global) - - if gt_atom_types is None: - cur_atom_types = mint.argmax(pred_atom_types, dim=1) + 1 - if ld_kwargs.save_traj: - all_frac_coords.append(cur_frac_coords) - all_pred_cart_coord_diff.append( - step_size * pred_cart_coord_diff) - all_noise_cart.append(noise_cart) - all_atom_types.append(cur_atom_types) - cur_frac_coords = cur_frac_coords.asnumpy() - - output_dict = { - "num_atoms": num_atoms, "lengths": lengths, "angles": angles, - "frac_coords": ms.Tensor(cur_frac_coords), "atom_types": cur_atom_types, - "is_traj": False - } - if ld_kwargs.save_traj: - output_dict.update(dict( - all_frac_coords=mint.stack(all_frac_coords, dim=0), - all_atom_types=mint.stack(all_atom_types, dim=0), - all_pred_cart_coord_diff=mint.stack( - all_pred_cart_coord_diff, dim=0), - all_noise_cart=mint.stack(all_noise_cart, dim=0), - is_traj=True)) - return output_dict - - def construct(self, atom_types, dist, idx_kj, idx_ji, edge_j, edge_i, - batch, lengths, num_atoms, angles, frac_coords, y, batch_size, sbf, total_atoms, - teacher_forcing=True, training=True): - """CDVAE construct""" - ########### encoder ############ - mu, log_var, z = self.encode(atom_types, dist, idx_kj, idx_ji, edge_j, edge_i, - batch, total_atoms, batch_size, sbf) - ########### decode stats ############ - (pred_num_atoms, pred_lengths_and_angles, pred_lengths, pred_angles, - pred_composition_per_atom, z_per_atom, batch) = self.decode_stats( - z, batch, num_atoms, lengths, angles, teacher_forcing) - - out = self.add_noise(atom_types, num_atoms, pred_lengths, pred_angles, frac_coords, - pred_composition_per_atom) - (num_atoms_numpy, pred_lengths_numpy, pred_angles_numpy, noisy_frac_coords, - used_sigmas_per_atom, used_type_sigmas_per_atom, rand_atom_types) = out - - (_, idx_s, idx_t, id3_ca, id3_ba, - id3_ragged_idx, id3_ragged_idx_max, _, d_st, v_st, - id_swap, y_l_m) = self.decoder_preprocess.graph_generation( - noisy_frac_coords, num_atoms_numpy, pred_lengths_numpy, pred_angles_numpy, - edge_index=None, to_jimages=None, num_bonds=None,) - # switch to ms.Tensor - noisy_frac_coords = ms.Tensor(noisy_frac_coords, ms.float32) - used_sigmas_per_atom = ms.Tensor(used_sigmas_per_atom, ms.float32) - used_type_sigmas_per_atom = ms.Tensor( - used_type_sigmas_per_atom, ms.float32) - rand_atom_types = ms.Tensor(rand_atom_types, ms.int32) - - ################ decoder ############ - pred_cart_coord_diff, pred_atom_types = self.decoder( - rand_atom_types, idx_s, idx_t, id3_ca, id3_ba, id3_ragged_idx, id3_ragged_idx_max, - y_l_m, d_st, v_st, id_swap, batch, z_per_atom, total_atoms, batch_size) - - ################ compute loss ############ - num_atom_loss = self.num_atom_loss(pred_num_atoms, num_atoms) - lattice_loss = self.lattice_loss( - pred_lengths_and_angles, lengths, num_atoms, angles) - composition_loss = self.composition_loss( - pred_composition_per_atom, atom_types, batch, batch_size) - coord_loss = self.coord_loss( - pred_cart_coord_diff, noisy_frac_coords, used_sigmas_per_atom, - batch, lengths, angles, frac_coords, batch_size) - type_loss = self.type_loss(pred_atom_types, atom_types, - used_type_sigmas_per_atom, batch, batch_size) - kld_loss = self.kld_loss(mu, log_var) - - if self.set_predict_property: - property_loss = self.property_loss(z, y) - else: - property_loss = ms.Tensor([0], ms.float32) - outputs = { - "num_atom_loss": num_atom_loss, - "lattice_loss": lattice_loss, - "composition_loss": composition_loss, - "coord_loss": coord_loss, - "type_loss": type_loss, - "kld_loss": kld_loss, - "property_loss": property_loss, - "pred_num_atoms": pred_num_atoms, - "pred_lengths_and_angles": pred_lengths_and_angles, - "pred_lengths": pred_lengths, - "pred_angles": pred_angles, - "pred_cart_coord_diff": pred_cart_coord_diff, - "pred_atom_types": pred_atom_types, - "pred_composition_per_atom": pred_composition_per_atom, - "target_frac_coords": frac_coords, - "target_atom_types": atom_types, - "rand_frac_coords": noisy_frac_coords, - "rand_atom_types": rand_atom_types, - "z": z, - } - loss = self.compute_stats(batch, outputs, batch_size, training) - return loss - - def add_noise(self, atom_types, num_atoms, pred_lengths, pred_angles, frac_coords, - pred_composition_per_atom): - r""" - Adds noise to the given input parameters and returns the modified values. - - Args: - atom_types (Tensor): Array of atom types. The shape of tensor is :math:`(total\_atoms,)`. - num_atoms (Tensor): Array of number of atoms. The shape of tensor is :math:`(batch\_size,)`. - pred_lengths (Tensor): Array of predicted lengths. The shape of tensor is :math:`(batch\_size, 3)`. - pred_angles (Tensor): Array of predicted angles. The shape of tensor is :math:`(batch\_size, 3)`. - frac_coords (Tensor): Array of fractional coordinates. The shape of tensor is :math:`(total\_atoms, 3)`. - pred_composition_per_atom (Tensor): Array of predicted composition probabilities per atom. - The shape of tensor is :math:`(total\_atoms,)`. - - Returns: - Tuple of ndarray, including: num_atoms_numpy, pred_lengths_numpy, pred_angles_numpy, noisy_frac_coords, - used_sigmas_per_atom, used_type_sigmas_per_atom and rand_atom_types. - """ - one_hot_res = mint.nn.functional.one_hot( - mint.sub(atom_types, 1), self.max_atomic_num) - one_hot_res = one_hot_res.asnumpy() - pred_composition_probs = mint.softmax( - pred_composition_per_atom, dim=-1) - pred_composition_probs = pred_composition_probs.asnumpy() - num_atoms_numpy = num_atoms.asnumpy() - pred_lengths_numpy = pred_lengths.asnumpy() - pred_angles_numpy = pred_angles.asnumpy() - frac_coords_numpy = frac_coords.asnumpy() - # sample noise levels. - noise_level = np.random.randint( - 0, self.sigmas.shape[0], (1, num_atoms.shape[0])) - used_sigmas_per_atom = np.repeat( - self.sigmas[noise_level], num_atoms_numpy) - type_noise_level = np.random.randint( - 0, self.type_sigmas.shape[0], (1, num_atoms.shape[0])) - # test num_atoms - used_type_sigmas_per_atom = np.repeat(self.type_sigmas[type_noise_level], - num_atoms_numpy) - # add noise to atom types and sample atom types. - atom_type_probs = (one_hot_res + pred_composition_probs * - used_type_sigmas_per_atom[:, None]) - - rand_atom_types = np.zeros(atom_types.shape[0]) - for i in range(atom_types.shape[0]): - rand_atom_types[i] = np.random.choice( - 100, 1, p=atom_type_probs[i] / atom_type_probs[i].sum()) + 1 - - coord_rand = np.random.rand(frac_coords.shape[0], frac_coords.shape[1]) - cart_noises_per_atom = ( - coord_rand * used_sigmas_per_atom[:, None]) - cart_coords = frac_to_cart_coords_numpy( - frac_coords_numpy, pred_lengths_numpy, pred_angles_numpy, num_atoms_numpy) - cart_coords = cart_coords + cart_noises_per_atom - noisy_frac_coords = cart_to_frac_coords_numpy( - cart_coords, pred_lengths_numpy, pred_angles_numpy, num_atoms_numpy) - return (num_atoms_numpy, pred_lengths_numpy, pred_angles_numpy, noisy_frac_coords, - used_sigmas_per_atom, used_type_sigmas_per_atom, rand_atom_types) - - def sample_composition(self, composition_prob, num_atoms, batch, batch_size, total_atoms): - r""" - Samples composition such that it exactly satisfies composition_prob - - Args: - composition_prob (Tensor): The shape of tensor is :math:`(total\_atoms, max_atomic_num)`. - num_atoms (Tensor): The shape of tensor is :math:`(batch\_size,)`. - batch (Tensor): The shape of tensor is :math:`(total\_atoms,)`. - batch_size (int): Batch size. - total_atoms (int): Total atoms. - - Returns: - (Tensor): Sampled composition. - """ - assert composition_prob.shape[0] == total_atoms == batch.shape[0] - out = mint.zeros((batch_size, composition_prob.shape[1])) - composition_prob = self.aggregate_mean(composition_prob, batch, out) - all_sampled_comp = [] - for comp_prob, num_atom in zip(list(composition_prob), list(num_atoms)): - comp_num = ms.ops.round(comp_prob * num_atom).astype(ms.int32) - if mint.max(comp_num) != 0: - atom_type = mint.nonzero(comp_num)[:, 0] + 1 - else: - atom_type = (mint.argmax( - mint.mul(comp_prob, num_atom)) + 1).view(1, -1) - comp_num[atom_type - 1] = 1 - atom_num = comp_num[atom_type - 1].view(-1) - - sampled_comp = ms.ops.repeat_interleave( - atom_type, atom_num).astype(ms.int32) - - # if the rounded composition gives less atoms, sample the rest - if sampled_comp.shape[0] < num_atom: - left_atom_num = num_atom - sampled_comp.shape[0] - left_comp_prob = mint.div( - comp_prob - comp_num.float(), num_atom) - # left_comp_prob[left_comp_prob < 0.] = 0. - left_comp_prob = mint.where( - left_comp_prob < 0., 0., left_comp_prob) - left_comp = ms.ops.multinomial( - left_comp_prob, num_samples=left_atom_num, replacement=True) - # convert to atomic number - left_comp = left_comp + 1 - sampled_comp = mint.cat((sampled_comp, left_comp), dim=0) - # sampled_comp[:num_atom]) - sampled_comp = ms.ops.shuffle(mint.narrow( - sampled_comp, 0, 0, num_atom.item())) - all_sampled_comp.append(sampled_comp) - all_sampled_comp = mint.cat(all_sampled_comp, dim=0) - assert all_sampled_comp.shape[0] == num_atoms.sum() - return all_sampled_comp - - def predict_num_atoms(self, z): - return self.fc_num_atoms(z) - - def predict_lattice(self, z, num_atoms): - """predict lattice constants and angles""" - pred_lengths_and_angles = self.fc_lattice(z) - scaled_preds = self.lattice_scaler.inverse_transform( - pred_lengths_and_angles) - pred_lengths, pred_angles = mint.split(scaled_preds, 3, 1) - if self.lattice_scale_method == "scale_length": - pred_lengths = mint.mul(pred_lengths, mint.pow( - num_atoms.view(-1, 1), (1 / 3))) - return pred_lengths_and_angles, pred_lengths, pred_angles - - def predict_composition(self, z_per_atom): - pred_composition_per_atom = self.fc_composition(z_per_atom) - return pred_composition_per_atom - - def num_atom_loss(self, pred_num_atoms, num_atoms): - """compute num atom loss""" - return ms.ops.cross_entropy(pred_num_atoms, num_atoms) - - def property_loss(self, z, y): - """compute property loss""" - return ms.ops.mse_loss(self.fc_property(z), y) - - def lattice_loss(self, pred_lengths_and_angles, lengths, num_atoms, angles): - """compute lattice loss""" - assert self.lattice_scale_method == "scale_length" - target_lengths = lengths / \ - mint.pow(num_atoms.view(-1, 1), (1 / 3)) - target_lengths_and_angles = mint.cat( - (target_lengths, angles), dim=-1) - target_lengths_and_angles = self.lattice_scaler.transform( - target_lengths_and_angles) - return ms.ops.mse_loss(pred_lengths_and_angles, target_lengths_and_angles) - - def composition_loss(self, pred_composition_per_atom, target_atom_types, batch, batch_size): - """compute composition loss""" - target_atom_types = target_atom_types - 1 - loss = ms.ops.cross_entropy(pred_composition_per_atom, - target_atom_types, reduction="none") - out = mint.zeros(batch_size) - return mint.mean(self.aggregate_mean(loss, batch, out)) - - def coord_loss(self, pred_cart_coord_diff, noisy_frac_coords, - used_sigmas_per_atom, batch, lengths, angles, - frac_coords, batch_size): - r""" - comput coord loss - - Args: - pred_cart_coord_diff (Tensor): The shape of tensor is :math:`(total\_atoms, 3)`.. - noisy_frac_coords (Tensor): The shape of tensor is :math:`(total\_atoms, 3)`. - used_sigmas_per_atom (Tensor): The shape of tensor is :math:`(total\_atoms,)`. - batch (Tensor): The shape of tensor is :math:`(total\_atoms,)`. - lengths (Tensor): The shape of tensor is :math:`(batch\_size, 3)`. - angles (Tensor): The shape of tensor is :math:`(batch\_size, 3)`. - frac_coords (Tensor): The shape of tensor is :math:`(total\_atoms, 3)`. - batch_size (int): Batch size. - - Returns: - (Tensor): Loss. - """ - noisy_cart_coords = frac_to_cart_coords( - noisy_frac_coords, lengths, angles, batch, self.lift_global) - target_cart_coords = frac_to_cart_coords( - frac_coords, lengths, angles, batch, self.lift_global) - _, target_cart_coord_diff = min_distance_sqr_pbc( - target_cart_coords, noisy_cart_coords, lengths, angles, - batch, batch_size, self.lift_global, return_vector=True) - - target_cart_coord_diff = target_cart_coord_diff / \ - ms.ops.pow(used_sigmas_per_atom.view(-1, 1), 2) - pred_cart_coord_diff = pred_cart_coord_diff / \ - used_sigmas_per_atom.view(-1, 1) - - loss_per_atom = mint.sum( - ms.ops.pow((target_cart_coord_diff - pred_cart_coord_diff), 2), dim=1) - - loss_per_atom = 0.5 * loss_per_atom * \ - ms.ops.pow(used_sigmas_per_atom, 2) - out = mint.zeros(batch_size) - return mint.mean(self.aggregate_mean(loss_per_atom, batch, out)) - - def type_loss(self, pred_atom_types, target_atom_types, - used_type_sigmas_per_atom, batch, batch_size): - """compute type loss""" - target_atom_types = target_atom_types - 1 - loss = ms.ops.cross_entropy( - pred_atom_types, target_atom_types, reduction="none") - # rescale loss according to noise - loss = mint.div(loss, used_type_sigmas_per_atom) - out = mint.zeros(batch_size) - return mint.mean(self.aggregate_mean(loss, batch, out)) - - def kld_loss(self, mu, log_var): - """compute kld loss""" - kld_loss = mint.mean( - -0.5 * mint.sum(mint.sub(mint.sub(mint.add(1, log_var), ms.ops.pow(mu, 2)), - mint.exp(log_var)), dim=1), dim=0) - return kld_loss - - def compute_stats(self, batch, outputs, batch_size, prefix): - r"""compute stats - Args: - batch (Tensor): The shape of tensor is :math:`(total\_atoms,)`. - outputs (dict): The output dict. - batch_size (int): Batch size. - prefix (bool): If True, return training loss, - else, return validation loss. - Returns: - (Tensor): Loss. - """ - num_atom_loss = outputs["num_atom_loss"] - lattice_loss = outputs["lattice_loss"] - coord_loss = outputs["coord_loss"] - type_loss = outputs["type_loss"] - kld_loss = outputs["kld_loss"] - composition_loss = outputs["composition_loss"] - property_loss = outputs["property_loss"] - - cost_natom = self.configs.get("cost_natom") - cost_coord = self.configs.get("cost_coord") - cost_type = self.configs.get("cost_type") - cost_lattice = self.configs.get("cost_lattice") - cost_composition = self.configs.get("cost_composition") - cost_property = self.configs.get("cost_property") - beta = self.configs.get("beta") - - loss = mint.sum(mint.stack(( - mint.mul(cost_natom, num_atom_loss), - mint.mul(cost_lattice, lattice_loss), - mint.mul(cost_coord, coord_loss), - mint.mul(cost_type, type_loss), - mint.mul(beta, kld_loss), - mint.mul(cost_composition, composition_loss), - mint.mul(cost_property, property_loss)))) - - if prefix is False: - # validation/test loss only has coord and type - loss = ( - cost_coord * coord_loss + - cost_type * type_loss) - - # evaluate atom type prediction. - pred_atom_types = outputs["pred_atom_types"] - target_atom_types = outputs["target_atom_types"] - type_accuracy = pred_atom_types.argmax( - axis=-1) == (target_atom_types - 1) - type_accuracy = type_accuracy.astype(ms.float32) - out = mint.zeros_like(type_accuracy[:batch_size]) - type_accuracy = mint.mean( - self.aggregate_mean(type_accuracy, batch, out)) - - return loss diff --git a/MindChemistry/mindchemistry/cell/cdvae/decoder.py b/MindChemistry/mindchemistry/cell/cdvae/decoder.py deleted file mode 100644 index 5ac612684..000000000 --- a/MindChemistry/mindchemistry/cell/cdvae/decoder.py +++ /dev/null @@ -1,88 +0,0 @@ -# Copyright 2024 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. -# ============================================================================ -"""decoder -""" -import mindspore.nn as nn -import mindspore.mint as mint -from ..gemnet.layers.embedding_block import MAX_ATOMIC_NUM -from ..gemnet.gemnet import GemNetT - - -class GemNetTDecoder(nn.Cell): - r""" - Decoder with GemNetT. - - Args: - config_path (str): Path to the config file. - hidden_dim (int): Number of prediction targets. Default: ``128``. - latent_dim(int): Dimension of the latent parameter 'z'. Default: ``256``. - max_neighbors(int): Dimension of the latent parameter 'z'. Default: ``20``. - radius(float): Dimension of the latent parameter 'z'. Default: ``6.``. - - Inputs: - - **pred_atom_types** (Tensor) - The shape of tensor is :math:`(total\_atoms,)`. - - **idx_s** (Tensor) - The shape of tensor is :math:`(total\_edges,)`. - - **idx_t** (Tensor) - The shape of tensor is :math:`(total\_edges,)`. - - **id3_ca** (Tensor) - The shape of tensor is :math:`(total\_triplets,)`. - - **id3_ba** (Tensor) - The shape of tensor is :math:`(total\_triplets,)`. - - **id3_ragged_idx** (Tensor) - The shape of tensor is :math:`(total\_triplets,)`. - - **id3_ragged_idx_max** (int) - The maximum of id3_ragged_idx. - - **y_l_m** (Tensor) - The shape of tensor is :math:`(num\_spherical, total\_triplets)`. - - **d_st** (Tensor) - The shape of tensor is :math:`(total\_edges,)`. - - **v_st** (Tensor) - The shape of tensor is :math:`(total\_edges, 3)`. - - **id_swap** (Tensor) - The shape of tensor is :math:`(total\_triplets,)`. - - **batch** (Tensor) - The shape of tensor is :math:`(total\_atoms,)`. - - **z_per_atom** (Tensor) - The shape of tensor is :math:`(total\_atoms, latent\_dim)`. - - **total_atoms** (int) - Total number of atoms. - - **batch_size** (int) - batch_size. - - Outputs: - - **atom_frac_coords** (Tensor) - The shape of tensor is :math:`(total\_atoms, 3)`. - - **atom_types** (Tensor) - The shape of tensor is :math:`(total\_atoms, MAX\_ATOMIC\_NUM)`. - """ - - def __init__( - self, - config_path, - hidden_dim=128, - latent_dim=256, - max_neighbors=20, - radius=6., - ): - super().__init__() - self.cutoff = radius - self.max_num_neighbors = max_neighbors - - self.gemnet = GemNetT( - num_targets=1, - latent_dim=latent_dim, - emb_size_atom=hidden_dim, - emb_size_edge=hidden_dim, - regress_forces=True, - cutoff=self.cutoff, - max_neighbors=self.max_num_neighbors, - config_path=config_path - ) - self.fc_atom = mint.nn.Linear(hidden_dim, MAX_ATOMIC_NUM) - - def construct(self, pred_atom_types, idx_s, idx_t, id3_ca, id3_ba, - id3_ragged_idx, id3_ragged_idx_max, y_l_m, d_st, v_st, id_swap, batch, z_per_atom, - total_atoms, batch_size): - """construct""" - h, pred_cart_coord_diff = self.gemnet( - pred_atom_types, idx_s, idx_t, id3_ca, id3_ba, id3_ragged_idx, - id3_ragged_idx_max, y_l_m, d_st, v_st, id_swap, batch, z_per_atom, total_atoms, batch_size) - pred_atom_types = self.fc_atom(h) - return pred_cart_coord_diff, pred_atom_types diff --git a/MindChemistry/mindchemistry/e3/o3/rotation.py b/MindChemistry/mindchemistry/e3/o3/rotation.py index 6a241a5c4..96bbe21cc 100644 --- a/MindChemistry/mindchemistry/e3/o3/rotation.py +++ b/MindChemistry/mindchemistry/e3/o3/rotation.py @@ -288,7 +288,7 @@ def matrix_to_angles(r_param): Conversion from matrix to angles. Args: - R (Tensor): The rotation matrices. Matrices of shape :math:`(..., 3, 3)`. + r_param (Tensor): The rotation matrices. Matrices of shape :math:`(..., 3, 3)`. Returns: - alpha (Tensor), The alpha Euler angles. The shape of Tensor is :math:`(...)`. diff --git a/MindChemistry/version.txt b/MindChemistry/version.txt index 6c6aa7cb0..74a1f8ab2 100644 --- a/MindChemistry/version.txt +++ b/MindChemistry/version.txt @@ -1 +1,2 @@ +0.2.0 0.1.0 \ No newline at end of file diff --git a/docs/api_python/mindchemistry/e3/o3/mindchemistry.e3.o3.matrix_to_angles.rst b/docs/api_python/mindchemistry/e3/o3/mindchemistry.e3.o3.matrix_to_angles.rst index 54ed92aa5..9863e912a 100644 --- a/docs/api_python/mindchemistry/e3/o3/mindchemistry.e3.o3.matrix_to_angles.rst +++ b/docs/api_python/mindchemistry/e3/o3/mindchemistry.e3.o3.matrix_to_angles.rst @@ -6,7 +6,7 @@ mindchemistry.e3.o3.matrix_to_angles 从矩阵到角度的转换。 参数: - - **R** (Tensor) - 旋转矩阵。形状为 :math:`(..., 3, 3)` 的矩阵。 + - **r_param** (Tensor) - 旋转矩阵。形状为 :math:`(..., 3, 3)` 的矩阵。 返回: - **alpha** (Tensor) - Alpha 欧拉角。形状为 :math:`(...)` 的张量。 -- Gitee
  • _*}&GpO;zZjQC$QK(`XzeziRb1 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Νx)bj8~Ti2huefF6Cb+Sx}qVc#ZF15@I3v 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

    q!c%gSRq+M^*(r+#%n+)J`iRlz$SGXNEHTFb65N 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