Skip to content

Commit 0dfbb35

Browse files
committed
change behavior of reference evaluate function to never return a NullState
1 parent 2248948 commit 0dfbb35

File tree

4 files changed

+25
-10
lines changed

4 files changed

+25
-10
lines changed

psiflow/reference/_cp2k.py

-5
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,6 @@ def parse_cp2k_output(
117117
energy = float(line.split()[-1]) * Ha
118118
if energy is None:
119119
return NullState
120-
# atoms.reference_status = True
121120
geometry.energy = energy
122121
geometry.per_atom.forces[:] = np.nan
123122

@@ -136,7 +135,6 @@ def parse_cp2k_output(
136135
forces[j, :] = np.array([float(f) for f in line.split()[3:6]])
137136
forces *= Ha / Bohr
138137
geometry.per_atom.forces[:] = forces
139-
# atoms.info.pop("stress", None) # remove if present for some reason
140138
geometry.stress = None
141139
return geometry
142140

@@ -185,9 +183,6 @@ def cp2k_singlepoint_post(
185183
from psiflow.geometry import NullState, new_nullstate
186184
from psiflow.reference._cp2k import parse_cp2k_output
187185

188-
if geometry == NullState:
189-
return NullState.copy() # copy?
190-
191186
with open(inputs[0], "r") as f:
192187
cp2k_output_str = f.read()
193188
geometry = parse_cp2k_output(cp2k_output_str, properties, geometry)

psiflow/reference/gpaw_.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def gpaw_singlepoint_post(
5656
with open(inputs[0], "r") as f:
5757
lines = f.read().split("\n")
5858

59-
geometry = new_nullstate()
59+
geometry = new_nullstate() # GPAW parsing doesn't require initial geometry
6060
for i, line in enumerate(lines):
6161
if "CALCULATION SUCCESSFUL" in line:
6262
natoms = int(lines[i + 1])

psiflow/reference/reference.py

+21-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
@typeguard.typechecked
2222
def _extract_energy(state: Geometry):
23-
if state == NullState:
23+
if state.energy is None:
2424
return 1e10
2525
else:
2626
return state.energy
@@ -40,6 +40,24 @@ def get_minimum_energy(element, configs, *energies):
4040
return copy_app_future(energy)
4141

4242

43+
@typeguard.typechecked
44+
def _nan_if_unsuccessful(
45+
geometry: Geometry,
46+
result: Geometry,
47+
) -> Geometry:
48+
if result == NullState:
49+
geometry.energy = None
50+
geometry.per_atom.forces[:] = np.nan
51+
geometry.per_atom.stress = None
52+
geometry.stdout = result.stdout
53+
return geometry
54+
else:
55+
return result
56+
57+
58+
nan_if_unsuccessful = python_app(_nan_if_unsuccessful, executors=['default_threads'])
59+
60+
4361
@join_app
4462
@typeguard.typechecked
4563
def evaluate(
@@ -54,10 +72,11 @@ def evaluate(
5472
stdout=parsl.AUTO_LOGNAME,
5573
stderr=parsl.AUTO_LOGNAME,
5674
)
57-
return reference.app_post(
75+
result = reference.app_post(
5876
geometry=geometry.copy(),
5977
inputs=[future.stdout, future.stderr, future],
6078
)
79+
return nan_if_unsuccessful(geometry, result)
6180

6281

6382
@join_app

tests/test_reference.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,8 @@ def test_cp2k_failure(context, tmp_path):
320320
evaluated = evaluate(geometry, reference)
321321
assert isinstance(evaluated, AppFuture)
322322
state = evaluated.result()
323-
assert state == NullState
323+
assert state.energy is None
324+
assert np.all(np.isnan(state.per_atom.forces))
324325
with open(state.stdout, "r") as f:
325326
log = f.read()
326327
assert "ABORT" in log # verify error is captured
@@ -445,4 +446,4 @@ def test_gpaw_single(dataset, dataset_h2):
445446
assert gpaw.compute_atomic_energy("Zr", box_size=9).result() == 0.0
446447

447448
gpaw = GPAW(askdfj="asdfk") # invalid input
448-
assert evaluate(dataset_h2[1], gpaw).result() == NullState
449+
assert evaluate(dataset_h2[1], gpaw).result().energy is None

0 commit comments

Comments
 (0)