sponge.core.Sponge
- class sponge.core.Sponge(network: Union[Molecule, WithEnergyCell, RunOneStepCell], potential: PotentialCell = None, optimizer: Optimizer = None, metrics: dict = None, analysis: AnalysisCell = None, **kwargs)[源代码]
MindSPONGE 的核心引擎,用于模拟和分析。
这个 Cell 是分子系统(
sponge.system.Molecule
),势能(sponge.potential.PotentialCell
)和优化器( mindspore.nn.Optimizer )在 MindSPONGE 中的三个模块的顶级封装。有三种方式来封装这些模块:
直接将 system、 potential 和 optimizer 封装到
sponge.core.Sponge
中。先将 system 和 potential 用
sponge.core.WithEnergyCell
封装,然后将sponge.core.WithEnergyCell
和 optimizer 一起封装到sponge.core.Sponge
中。在这种情况下,可以通过调整sponge.core.WithEnergyCell
来实现对势能的调整,例如设置 neighbour_list 和sponge.core.WithEnergyCell
中的 bias。先将 system 和 potential 用
sponge.core.WithEnergyCell
封装,然后将sponge.core.WithEnergyCell
和 optimizer 一起封装到sponge.core.RunOneStepCell
中,最后将sponge.core.RunOneStepCell
传递到sponge.core.Sponge
中。在这种情况下,可以通过调整sponge.core.RunOneStepCell
来实现对力的调整,例如在sponge.core.RunOneStepCell
中添加sponge.core.WithForceCell
。
对于模拟:
通过执行成员函数
sponge.core.Sponge.run()
来进行模拟。对于分析:
sponge.core.Sponge
还可以通过 metrics 来分析模拟系统。 metrics 应该是sponge.metrics.Metric
或sponge.colvar.Colvar
的字典。可以通过执行成员函数sponge.core.Sponge.analyse()
来计算 metrics 的值。- 参数:
network (Union[Molecule, WithEnergyCell, RunOneStepCell]) - 模拟系统的 Cell。数据类型参考
sponge.system.Molecule
、sponge.core.WithEnergyCell
和sponge.core.RunOneStepCell
。potential (
sponge.potential.PotentialCell
, 可选) - 势能。默认值:None
。optimizer (mindspore.nn.Optimizer, 可选) - 优化器。默认值:
None
。metrics (dict, 可选) - 用于系统分析的metrics字典。字典的键类型应为 str,值类型应为
sponge.metrics.Metric
或sponge.colvar.Colvar
。默认值:None
。analysis (
sponge.core.AnalysisCell
, 可选) - 分析网络。默认值:None
。
- 支持平台:
Ascend
GPU
- analyse(dataset: Dataset = None, callbacks: Union[Callback, List[Callback]] = None)[源代码]
分析API。
说明
要使用此API,必须在
sponge.core.Sponge
初始化时设置 metrics。- 参数:
dataset (Dataset) - 要分析的模拟数据集。默认值:
None
。callbacks (Union[mindspore.train.Callback, List[mindspore.train.Callback]]) - 训练期间应执行的回调对象列表。默认值:
None
。
- 返回:
Dict,键是用户定义的度量名称,值是测试模式下模型的度量值。
样例:
>>> from mindsponge.colvar import Torsion >>> from mindsponge.colvar import Torsion >>> phi = Torsion([4, 6, 8, 14]) >>> psi = Torsion([6, 8, 14, 16]) >>> md = Sponge(system, potential, optimizer, metrics={'phi': phi, 'psi': psi}) >>> metrics = md.analyse() >>> for k, v in metrics.items(): >>> print(k, v) phi [[3.1415927]] psi [[3.1415927]]
- calc_biases()[源代码]
计算模拟系统的各个偏置势项。
- 返回:
Tensor,shape为 \((B, V)\) 的Tensor。这里 \(B\) 是batch size, \(V\) 是偏置势项的数量。数据类型为float。偏置势项。
- calc_energy()[源代码]
计算模拟系统的总势能(势能和偏置势)。
- 返回:
shape为 \((B, 1)\) 的Tensor。这里 \(B\) 是batch size。数据类型为float。总势能。
- calc_energies()[源代码]
计算模拟系统的各个能量项。
- 返回:
List[Tensor], 包含各个能量项的Tensor列表。每个张量的形状为 \((B, U)\) ,这里 \(B\) 是batch size, \(U\) 是能量项的数量。数据类型为float。
- calc_potential()[源代码]
计算并返回势能。
- 返回:
Tensor,shape为 \((B, 1)\) 的Tensor。总势能。这里 \(B\) 是batch size,即模拟中的步行者数量。数据类型为float。
- change_optimizer(optimizer: Optimizer)[源代码]
更改优化器。
- 参数:
optimizer (
mindsponge.optimizer.Optimizer
) - 优化器。
- change_potential(potential: PotentialCell)[源代码]
更改势能。
- 参数:
potential (
sponge.potential.PotentialCell
) - 势能。
- property energy_names
能量项的名称。
- 返回:
List[str]。能量项的名称。
- get_bias()[源代码]
获取总偏置势能。
- 返回:
Tensor,shape为 \((B, 1)\) 的Tensor。这里 \(B\) 是batch size,即模拟中的步行者数量。数据类型为float。
- get_biases()[源代码]
获取偏置势。
- 返回:
Tensor,shape为 \((B, V)\) 的Tensor。偏置势项。 这里 \(B\) 是batch size,即模拟中的步行者数量,\(V\) 是偏置势项的数量。数据类型为float。
- get_energies()[源代码]
获取势能项。
- 返回:
Tensor,shape为 \((B, U)\) 的Tensor。势能项。这里 \(B\) 是batch size,即模拟中的步行者数量,\(U\) 是势能项的数量。数据类型为float。
- property num_biases
偏置势项的数量 V。
- 返回:
int。偏置势项的数量。
- property num_energies
能量项的数量。
- 返回:
int。能量项的数量。
- run(steps: int, callbacks: Union[Callback, List[Callback]] = None, dataset: Dataset = None, show_time: bool = True)[源代码]
运行模拟的接口函数。
- 参数:
steps (int) - 步骤数。
callbacks (Union[mindspore.train.Callback, List[mindspore.train.Callback]]) - 获取模拟系统信息的回调函数。默认值:
None
。dataset (Dataset) - 模拟过程中使用的数据集。默认值:
None
。show_time (bool) - 是否显示时间。默认值:
True
。
样例:
>>> from sponge import Sponge >>> from sponge.system import Molecule >>> from sponge.potential.forcefield import ForceField >>> from sponge.optimizer import Updater >>> from sponge.callback import RunInfo >>> system = Molecule(template='water.tip3p.yaml') >>> potential = ForceField(system, parameters='SPCE') >>> optimizer = Updater(system, controller=None, time_step=1e-3) >>> md = Sponge(system, potential, optimizer) >>> md.run(100, callbacks=[RunInfo(10)])