Coverage for ase / constraints / __init__.py: 96.30%
27 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-30 08:22 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-30 08:22 +0000
1"""Constraints"""
3from copy import deepcopy
4from typing import Any
6from ase.constraints.constraint import (
7 FixConstraint,
8 constrained_indices,
9)
10from ase.constraints.external_force import ExternalForce
11from ase.constraints.fix_atoms import FixAtoms
12from ase.constraints.fix_bond_lengths import FixBondLength, FixBondLengths
13from ase.constraints.fix_cartesian import FixCartesian
14from ase.constraints.fix_com import FixCom, FixSubsetCom
15from ase.constraints.fix_internals import FixInternals
16from ase.constraints.fix_linear_triatomic import FixLinearTriatomic
17from ase.constraints.fix_parametric_relations import (
18 FixCartesianParametricRelations,
19 FixParametricRelations,
20 FixScaledParametricRelations,
21)
22from ase.constraints.fix_scaled import FixScaled
23from ase.constraints.fix_symmetry import FixSymmetry
24from ase.constraints.fixed_line import FixedLine
25from ase.constraints.fixed_mode import FixedMode
26from ase.constraints.fixed_plane import FixedPlane
27from ase.constraints.hookean import Hookean
28from ase.constraints.mirror_force import MirrorForce
29from ase.constraints.mirror_torque import MirrorTorque
31__all__ = [
32 'FixCartesian',
33 'FixBondLength',
34 'FixedMode',
35 'FixAtoms',
36 'FixScaled',
37 'FixCom',
38 'FixSubsetCom',
39 'FixedPlane',
40 'FixConstraint',
41 'FixedLine',
42 'FixBondLengths',
43 'FixLinearTriatomic',
44 'FixInternals',
45 'Hookean',
46 'ExternalForce',
47 'MirrorForce',
48 'MirrorTorque',
49 'FixParametricRelations',
50 'FixScaledParametricRelations',
51 'FixCartesianParametricRelations',
52 'FixSymmetry',
53 'constrained_indices',
54]
57def dict2constraint(dct: dict[str, Any]) -> FixConstraint:
58 """Convert dictionary to ASE `FixConstraint` object."""
59 if dct['name'] not in __all__:
60 raise ValueError
61 # address backward-compatibility breaking between ASE 3.22.0 and 3.23.0
62 # https://gitlab.com/ase/ase/-/merge_requests/3786
63 if dct['name'] in {'FixedLine', 'FixedPlane'} and 'a' in dct['kwargs']:
64 dct = deepcopy(dct)
65 dct['kwargs']['indices'] = dct['kwargs'].pop('a')
66 return globals()[dct['name']](**dct['kwargs'])