Skip to content

Commit

Permalink
add Deprecated entry checking, update dependencies
Browse files Browse the repository at this point in the history
  • Loading branch information
mattmcdermott committed Dec 21, 2023
1 parent 39d855c commit 2663cd1
Show file tree
Hide file tree
Showing 6 changed files with 60 additions and 29 deletions.
2 changes: 1 addition & 1 deletion examples/1_enumerators.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -1790,7 +1790,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.11"
"version": "3.11.5"
},
"vscode": {
"interpreter": {
Expand Down
13 changes: 6 additions & 7 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,9 @@ requires-python = ">=3.9"
dependencies = [
"pymatgen>=2023.11.12",
"numba>=0.58.1",
"jobflow>=0.1.14",
"ray>=2.8.0",
"jobflow>=0.1.15",
"ray>=2.9.0",
"rustworkx>=0.13.2",
"pydantic<2.5" # ray not supporting pydantic 2.5 yet
]

[project.optional-dependencies]
Expand All @@ -54,16 +53,16 @@ docs = [
"sphinx==7.2.6",
]
tests = [
"mp-api==0.37.5", # required for testing get_entry_set job
"mp-api==0.39.4", # required for testing get_entry_set job
"pytest==7.4.3",
"pytest-cov==4.1.0",
"pytest-xdist==3.3.1",
"pytest-xdist==3.5.0",
]
strict = [
"pymatgen==2023.11.12",
"pymatgen==2023.12.18",
"numba==0.58.1",
"jobflow==0.1.14",
"ray==2.8.0",
"ray==2.9.0",
"rustworkx==0.13.2",
]

Expand Down
3 changes: 3 additions & 0 deletions src/rxn_network/data/nist/deprecated_compounds.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[
"NaCO3"
]
62 changes: 41 additions & 21 deletions src/rxn_network/entries/experimental.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@
from scipy.interpolate import interp1d

from rxn_network.core import Composition
from rxn_network.utils.funcs import get_logger

logger = get_logger(__name__)


if TYPE_CHECKING:
from pymatgen.core.periodic_table import Element
Expand All @@ -22,6 +26,7 @@ class ExperimentalReferenceEntry(ComputedEntry):
"""

REFERENCES: dict = {}
DEPRECATED: list = []

def __init__(
self,
Expand All @@ -30,19 +35,23 @@ def __init__(
energy_adjustments: list[EnergyAdjustment] | None = None,
data: dict | None = None,
):
"""Args:
composition: Composition object
temperature: Temperature in Kelvin. If temperature is not selected within
the range of the reference data (see self._validate_temperature), then
this will raise an error.
energy_adjustments: A list of EnergyAdjustments to apply to the entry.
data: Optional dictionary containing entry data.
"""
Args:
composition: Composition object
temperature: Temperature in Kelvin. If temperature is not selected within
the range of the reference data (see self._validate_temperature), then
this will raise an error.
energy_adjustments: A list of EnergyAdjustments to apply to the entry.
data: Optional dictionary containing entry data.
"""
self.is_deprecated = composition.reduced_formula in self.DEPRECATED

formula = composition.reduced_formula

entry_id = f"{self.__class__.__name__}-{formula}_{temperature}"

self._temperature = temperature
self._validate_temperature(formula, temperature)
self._temperature = temperature

energy = self._get_energy(formula, temperature)

Expand All @@ -54,8 +63,9 @@ def __init__(
entry_id=entry_id,
)
self._composition = composition

self.name = formula
if self.is_deprecated:
self.name += " (deprecated)"

def get_new_temperature(self, new_temperature: float) -> ExperimentalReferenceEntry:
"""Return a copy of the NISTReferenceEntry at the new specified temperature.
Expand All @@ -82,19 +92,20 @@ def to_grand_entry(self, chempots: dict[Element, float]):
"""
return GrandPotPDEntry(self, chempots)

@classmethod
def _validate_temperature(cls, formula: str, temperature: float) -> None:
def _validate_temperature(self, formula: str, temperature: float) -> None:
"""Ensure that the temperature is from a valid range."""
if formula not in cls.REFERENCES:
raise ValueError(f"{formula} not in reference data!")
if self.is_deprecated:
logger.warning(f"{formula} is deprecated! Using a formation energy of 0.0 eV.")
return # skip validation

g = cls.REFERENCES[formula]
if formula not in self.REFERENCES:
raise ValueError(f"{formula} not in reference data!")

g = self.REFERENCES[formula]
if temperature < min(g) or temperature > max(g):
raise ValueError(f"Temperature must be selected from range: {min(g)} K to {max(g)} K")

@classmethod
def _get_energy(cls, formula: str, temperature: float) -> float:
def _get_energy(self, formula: str, temperature: float) -> float:
"""Convenience method for accessing and interpolating experimental data.
Args:
Expand All @@ -104,7 +115,10 @@ def _get_energy(cls, formula: str, temperature: float) -> float:
Returns:
Gibbs free energy of formation of formula at specified temperature [eV]
"""
data = cls.REFERENCES[formula]
if self.is_deprecated:
return 0.0

data = self.REFERENCES[formula]

if temperature % 100 > 0:
g_interp = interp1d(list(data.keys()), list(data.values()))
Expand Down Expand Up @@ -169,10 +183,16 @@ def from_dict(cls, d: dict) -> ExperimentalReferenceEntry:
)

def __repr__(self) -> str:
output = [
f"{self.__class__.__name__} | {self.composition.reduced_formula}",
f"Gibbs Energy ({self.temperature} K) = {self.energy:.4f}",
]
output = []
if self.is_deprecated:
output.append("DEPRECATED")

output.extend(
[
f"{self.__class__.__name__} | {self.composition.reduced_formula}",
f"Gibbs Energy ({self.temperature} K) = {self.energy:.4f}",
]
)
return "\n".join(output)

def __eq__(self, other) -> bool:
Expand Down
4 changes: 4 additions & 0 deletions src/rxn_network/entries/nist.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

from typing import TYPE_CHECKING

from monty.serialization import loadfn

from rxn_network.data import PATH_TO_NIST, load_experimental_data
from rxn_network.entries.experimental import ExperimentalReferenceEntry

Expand All @@ -14,6 +16,7 @@
from rxn_network.core import Composition

G_COMPOUNDS = load_experimental_data(PATH_TO_NIST / "compounds.json.gz")
DEPRECATED_COMPOUNDS = loadfn(PATH_TO_NIST / "deprecated_compounds.json")


class NISTReferenceEntry(ExperimentalReferenceEntry):
Expand All @@ -28,6 +31,7 @@ class NISTReferenceEntry(ExperimentalReferenceEntry):
"""

REFERENCES = G_COMPOUNDS
DEPRECATED = DEPRECATED_COMPOUNDS

def __init__(
self,
Expand Down
5 changes: 5 additions & 0 deletions tests/entries/test_nist.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@ def test_invalid_temperature():
NISTReferenceEntry(Composition("K2CO3"), temperature=2300)


def test_deprecated():
entry = NISTReferenceEntry(Composition("NaCO3"), temperature=300)
assert entry.is_deprecated


def test_energy(entries):
expected_energies = [
-4.087606831162386,
Expand Down

0 comments on commit 2663cd1

Please sign in to comment.