Source code for metatrain.gap.documentation
"""
GAP
===
This is an implementation of the sparse Gaussian Approximation Potential
(GAP) :footcite:p:`bartok_representing_2013` using Smooth Overlap of Atomic Positions
(SOAP) :footcite:p:`bartok_gaussian_2010` implemented in `featomic <FEATOMIC_>`_.
.. _FEATOMIC: https://github.com/Luthaf/featomic
The GAP model in metatrain can only train on CPU, but evaluation
is also supported on GPU.
{{SECTION_INSTALLATION}}
{{SECTION_DEFAULT_HYPERS}}
{{SECTION_MODEL_HYPERS}}
with the following definitions needed to fully understand some of the parameters:
.. autoclass:: {{architecture_path}}.documentation.KRRHypers
:members:
:undoc-members:
.. autoclass:: {{architecture_path}}.documentation.SOAPHypers
:members:
:undoc-members:
.. autoclass:: {{architecture_path}}.documentation.SOAPCutoffHypers
:members:
:undoc-members:
.. autoclass:: {{architecture_path}}.documentation.SOAPCutoffSmoothingHypers
:members:
:undoc-members:
.. autoclass:: {{architecture_path}}.documentation.SOAPDensityHypers
:members:
:undoc-members:
.. autoclass:: {{architecture_path}}.documentation.SOAPDensityScalingHypers
:members:
:undoc-members:
.. autoclass:: {{architecture_path}}.documentation.SOAPBasisHypers
:members:
:undoc-members:
.. autoclass:: {{architecture_path}}.documentation.SOAPBasisRadialHypers
:members:
:undoc-members:
"""
from typing import Literal, Optional
from typing_extensions import TypedDict
from metatrain.utils.hypers import init_with_defaults
[docs]
class SOAPCutoffSmoothingHypers(TypedDict):
"""Smoothing configuration for the SOAP descriptor cutoff."""
type: Literal["ShiftedCosine"] = "ShiftedCosine"
"""Cutoff function used to smooth the behavior around the cutoff
radius.
Currently, only the Shifted Cosine function is supported, which is defined
as ``f(r) = 1/2 * (1 + cos(π (r- cutoff + width) / width ))``."""
width: float = 1.0
[docs]
class SOAPCutoffHypers(TypedDict):
"""Cutoff configuration for the SOAP descriptor."""
radius: float = 5.0
"""
This should be set to a value after which most of the
interactions between atoms is expected to be negligible.
"""
smoothing: SOAPCutoffSmoothingHypers = init_with_defaults(SOAPCutoffSmoothingHypers)
[docs]
class SOAPDensityScalingHypers(TypedDict):
"""Density scaling configuration for the SOAP descriptor."""
type: Literal["Willatt2018"] = "Willatt2018"
r"""Type of scaling, currently only one type is supported. It uses a
long-range algebraic decay and smooth behavior at
:math:`r\rightarrow 0`: as introduced by :footcite:t:`willatt_feature_2018` as
``f(r) = rate / (rate + (r / scale) ^ exponent)``."""
rate: float = 1.0
scale: float = 2.0
exponent: float = 7.0
[docs]
class SOAPDensityHypers(TypedDict):
"""Density configuration for the SOAP descriptor."""
type: Literal["Gaussian"] = "Gaussian"
"""Currently, we only support a Gaussian type orbitals (GTO) as radial basis
functions and radial integrals."""
center_atom_weight: float = 1.0
"""Weight of the central atom contribution to the features. If
1.0 the center atom contribution is weighted the same as any other
contribution. If 0.0 the central atom does not contribute to the features
at all."""
width: float = 0.3
"""Width of the atom-centered gaussian creating the atomic
density."""
scaling: SOAPDensityScalingHypers = init_with_defaults(SOAPDensityScalingHypers)
"""Radial scaling can be used to reduce the importance of neighbor
atoms further away from the center, usually improving the performance
of the model.
"""
[docs]
class SOAPBasisRadialHypers(TypedDict):
"""Radial basis configuration for the SOAP descriptor."""
type: Literal["Gto"] = "Gto"
max_radial: int = 7
"""Maximum radial channels of the spherical harmonics when
computing the SOAP descriptors. In general, increasing this
hyperparameter might lead to better accuracy, especially on larger
datasets, at the cost of increased training and evaluation time."""
[docs]
class SOAPBasisHypers(TypedDict):
"""Basis configuration for the SOAP descriptor."""
type: Literal["TensorProduct"] = "TensorProduct"
max_angular: int = 6
"""Maximum angular channels of the spherical harmonics when
computing the SOAP descriptors. In general, increasing this
hyperparameter might lead to better accuracy, especially on larger
datasets, at the cost of increased training and evaluation time."""
radial: SOAPBasisRadialHypers = init_with_defaults(SOAPBasisRadialHypers)
[docs]
class SOAPHypers(TypedDict):
"""Configuration for the SOAP descriptors."""
cutoff: SOAPCutoffHypers = init_with_defaults(SOAPCutoffHypers)
"""Spherical cutoff (Å) to use for atomic environments."""
density: SOAPDensityHypers = init_with_defaults(SOAPDensityHypers)
basis: SOAPBasisHypers = init_with_defaults(SOAPBasisHypers)
[docs]
class KRRHypers(TypedDict):
"""Hyperparameters for the KRR model."""
degree: Literal[2] = 2
"""Degree of the kernel. For now, only 2 is allowed."""
num_sparse_points: int = 500
"""Number of sparse points to use during
the training, it select the number of actual samples
to use during the training. The selection is done with
the Further Point Sampling (FPS) algorithm.
The optimal number of sparse points depends on the system.
Increasing it might impreve the accuracy, but it also increase the
memory and time required for training."""
class ModelHypers(TypedDict):
"""Hyperparameters for the GAP model."""
soap: SOAPHypers = init_with_defaults(SOAPHypers)
krr: KRRHypers = init_with_defaults(KRRHypers)
zbl: bool = False
class TrainerHypers(TypedDict):
"""Hyperparameters for the GAP trainer."""
regularizer: float = 1e-3
"""Value of the regularizer for the energy. It should
be tuned depending on the specific dataset. If it is too small might
lead to overfitting, if it is too big might lead to bad accuracy."""
regularizer_forces: Optional[float] = None
"""Value of the regularizer for the forces. It has
a similar effect as ``regularizer``. If ``None``, it is set equal to
``regularizer``. It might be changed to have better accuracy."""