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

1"""Constraints""" 

2 

3from copy import deepcopy 

4from typing import Any 

5 

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 

30 

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] 

55 

56 

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'])