File: test_jelsteps.py

package info (click to toggle)
pymatgen 2025.10.7%2Bdfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 83,468 kB
  • sloc: python: 175,932; javascript: 780; makefile: 221; sh: 59
file content (125 lines) | stat: -rw-r--r-- 3,188 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
from __future__ import annotations

from typing import Any

import pytest
from pytest import approx

from pymatgen.io.jdftx.jelstep import JElStep, JElSteps

from .outputs_test_utils import (
    ex_fillings_line1,
    ex_fillings_line1_known,
    ex_iter_line1,
    ex_iter_line1_known,
    ex_subspace_line1,
    ex_subspace_line1_known,
)
from .outputs_test_utils import ex_jstep_known1 as ex_known1
from .outputs_test_utils import ex_jstep_known2 as ex_known2
from .outputs_test_utils import ex_jstep_lines1 as ex_lines1
from .outputs_test_utils import ex_jstep_lines2 as ex_lines2


def is_right_known(val: Any, ex_known_val: Any):
    if isinstance(val, type(ex_known_val)):
        result = ex_known_val == approx(val) if isinstance(val, float) else ex_known_val == val
    else:
        result = False
    return result


@pytest.mark.parametrize(
    (
        "exfill_line",
        "exfill_known",
        "exiter_line",
        "exiter_known",
        "exsubspace_line",
        "exsubspace_known",
        "etype",
        "eitertype",
    ),
    [
        (
            ex_fillings_line1,
            ex_fillings_line1_known,
            ex_iter_line1,
            ex_iter_line1_known,
            ex_subspace_line1,
            ex_subspace_line1_known,
            "F",
            "ElecMinimize",
        )
    ],
)
def test_JElStep_known(
    exfill_line: str,
    exfill_known: dict[str, float],
    exiter_line: str,
    exiter_known: dict[str, float],
    exsubspace_line: str,
    exsubspace_known: dict[str, float],
    etype: str,
    eitertype,
):
    ex_lines_collect = [exiter_line, exfill_line, exsubspace_line, ""]  # Empty line added for coverage
    jei = JElStep._from_lines_collect(ex_lines_collect, eitertype, etype)
    str(jei)
    ex_known = {}
    for dictlike in [exfill_known, exiter_known, exsubspace_known]:
        ex_known.update(dictlike)
    for var in [
        "mu",
        "nelectrons",
        "abs_magneticmoment",
        "tot_magneticmoment",
        "nstep",
        "e",
        "grad_k",
        "alpha",
        "linmin",
        "t_s",
        "subspacerotationadjust",
    ]:
        val = getattr(jei, var)
        assert is_right_known(val, ex_known[var])


@pytest.mark.parametrize(
    ("ex_lines", "ex_knowns", "etype", "eitertype"),
    [
        (
            [ex_lines1, ex_lines2],
            [ex_known1, ex_known2],
            "F",
            "ElecMinimize",
        )
    ],
)
def test_JElSteps_known(
    ex_lines: list[list[str]],
    ex_knowns: list[dict],
    etype: str,
    eitertype,
):
    text_slice = [line for exl in ex_lines for line in exl]
    jeis = JElSteps._from_text_slice(text_slice, opt_type=eitertype, etype=etype)
    for var in [
        "mu",
        "nelectrons",
        "abs_magneticmoment",
        "tot_magneticmoment",
        "nstep",
        "e",
        "grad_k",
        "alpha",
        "linmin",
        "t_s",
        "subspacerotationadjust",
    ]:
        val = getattr(jeis, var)
        assert is_right_known(val, ex_knowns[-1][var])
        for i in range(len(ex_lines)):
            val2 = getattr(jeis[i], var)
            assert is_right_known(val2, ex_knowns[i][var])