Source code for atomistics.calculators.interface

# best would be StrEnum from py3.11
import sys
from collections.abc import Iterable
from enum import Enum
from typing import TYPE_CHECKING, Any, Callable, Union

if sys.version_info < (3, 11):
    # official impl' is not significantly different
    class StrEnum(str, Enum):
        def __str__(self):
            return str(self.value)

else:
    from enum import StrEnum


[docs] class TaskEnum(StrEnum): """Enumeration of supported calculator tasks.""" calc_energy = "calc_energy" calc_forces = "calc_forces" calc_stress = "calc_stress" optimize_positions = "optimize_positions" optimize_positions_and_volume = "optimize_positions_and_volume" optimize_volume = "optimize_volume" optimize_cell = "optimize_cell" calc_molecular_dynamics_thermal_expansion = ( "calc_molecular_dynamics_thermal_expansion" )
[docs] class TaskOutputEnum(Enum): """Maps task names to their corresponding output key names.""" energy = "calc_energy" forces = "calc_forces" stress = "calc_stress" structure_with_optimized_cell = "optimize_cell" structure_with_optimized_positions = "optimize_positions" structure_with_optimized_positions_and_volume = "optimize_positions_and_volume" structure_with_optimized_volume = "optimize_volume" volume_over_temperature = "calc_molecular_dynamics_thermal_expansion"
TaskName = Union[str, TaskEnum] if TYPE_CHECKING: from ase import Atoms TaskSpec = tuple[Atoms, list[TaskName]] TaskDict = dict[str, TaskSpec] TaskResults = dict[TaskName, Any] ResultsDict = dict[str, TaskResults] SimpleEvaluator = Callable[..., TaskResults]
[docs] def get_quantities_from_tasks(tasks: Iterable[str]) -> list[str]: """ Get a list of quantities based on the given tasks. Args: tasks (Iterable[str]): The requested tasks. Returns: list[str]: A list of quantities. """ quantities = [] if "calc_energy" in tasks: quantities.append("energy") if "calc_forces" in tasks: quantities.append("forces") if "calc_stress" in tasks: quantities.append("stress") return quantities