Skip to content

Commit 7bc8ded

Browse files
committed
Merge remote-tracking branch 'origin/fastcsp_updates' into fastcsp_updates
2 parents 2f90fb2 + d1664c9 commit 7bc8ded

11 files changed

Lines changed: 44 additions & 85 deletions

File tree

packages/fairchem-core/pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ dependencies = [
1919
"huggingface_hub>=0.27.1",
2020
"ase>=3.26.0",
2121
"ase-db-backends>=0.10.0",
22-
"monty>=v2025.1.3",
22+
"monty>=2026.2.18",
2323
"clusterscope==0.0.18",
2424
"setuptools<81.0.0",
2525
"requests",
@@ -38,7 +38,7 @@ dev = ["pre-commit", "pytest", "pytest-cov", "coverage", "syrupy", "ruff==0.5.1"
3838
docs = ["jupyter-book", "jupytext", "sphinx","sphinx-autoapi==3.3.3", "astroid<4", "umap-learn", "vdict", "ipywidgets", "jupyter_book>=2.0", "torch-dftd"]
3939
adsorbml = ["dscribe", "x3dase", "scikit-image"]
4040
torchsim = ["torch-sim-atomistic>=0.5.2; python_version >= '3.12'"]
41-
extras = ["pymatgen", "quacc[phonons]>=0.15.3", "pandas", "nvalchemi-toolkit-ops==0.2.0", "pyarrow"]
41+
extras = ["pymatgen>=2025.1.9", "quacc[phonons]>=0.15.3", "pandas", "nvalchemi-toolkit-ops==0.2.0", "pyarrow"]
4242

4343
[project.scripts]
4444
fairchem = "fairchem.core._cli:main"

packages/fairchem-demo-ocpapi/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ dependencies = [
2222
"requests",
2323
"responses == 0.23.2",
2424
"tenacity == 8.2.3",
25-
"tqdm == 4.66.1",
25+
"tqdm",
2626
]
2727

2828
[project.urls]

src/fairchem/applications/fastcsp/core/configs/genarris_base.conf

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,26 @@
66
name = ???
77
molecule_path = ???
88
Z = ???
9-
log_level = debug
10-
downselection_workflow = robust_flow
11-
restart = True
9+
log_level = info
1210

13-
[generation]
14-
num_structures_per_spg = ???
15-
spg_distribution_type = ???
16-
specific_radius_proportion = 0.95
17-
max_attempts_per_spg = 100000000
18-
tol = 0.01
19-
unit_cell_volume_mean = predict
20-
volume_mult = 1.5
21-
max_attempts_per_volume = 10000000
22-
generation_type = crystal
23-
natural_cutoff_mult = 1.2
11+
[workflow]
12+
tasks = ['generation', 'symm_rigid_press']
2413

25-
[symm_rigid_press]
26-
sr = 0.85
27-
method = BFGS
28-
natural_cutoff_mult = 1.2
14+
[generation]
15+
num_structures_per_spg = ???
16+
spg_distribution_type = ???
17+
specific_radius_proportion = 0.95
18+
max_attempts_per_spg = 100000000
2919
tol = 0.01
30-
debug_flag = False
20+
unit_cell_volume_mean = predict
21+
volume_mult = 1.5
22+
max_attempts_per_volume = 10000000
23+
generation_type = crystal
24+
natural_cutoff_mult = 1.2
25+
26+
[symm_rigid_press]
27+
sr = 0.85
28+
method = BFGS
29+
natural_cutoff_mult = 1.2
30+
tol = 0.01
31+
debug_flag = False

src/fairchem/core/common/utils.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,13 @@ def decorator(func):
7575
@wraps(func)
7676
def cls_method(self, *args, **kwargs):
7777
f = func
78-
if self.regress_forces and not getattr(self, "direct_forces", 0):
78+
if hasattr(self, "regress_config"):
79+
regress_forces = self.regress_config.forces
80+
direct_forces = self.regress_config.direct_forces
81+
else:
82+
regress_forces = self.regress_forces
83+
direct_forces = getattr(self, "direct_forces", 0)
84+
if regress_forces and not direct_forces:
7985
f = dec(func)
8086
return f(self, *args, **kwargs)
8187

src/fairchem/core/models/base.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -161,13 +161,6 @@ def tasks(self) -> dict[str, Task]:
161161
"""
162162
return self._tasks
163163

164-
@property
165-
def direct_forces(self) -> bool:
166-
"""
167-
Whether this model uses direct force prediction.
168-
"""
169-
return getattr(self.backbone, "direct_forces", False)
170-
171164
@property
172165
def dataset_to_tasks(self) -> dict[str, list]:
173166
"""
@@ -191,8 +184,10 @@ def _validate_task_compatibility(self, task: Task) -> None:
191184
"""
192185
derivative_properties = ("forces", "stress", "hessian")
193186

187+
backbone_regress_config = getattr(self.backbone, "regress_config", None)
194188
if (
195-
self.direct_forces
189+
backbone_regress_config is not None
190+
and backbone_regress_config.direct_forces
196191
and task.inference_only
197192
and task.property in derivative_properties
198193
):

src/fairchem/core/models/uma/escn_md.py

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -512,18 +512,6 @@ def __init__(
512512
)
513513
self.register_buffer("coefficient_index", coefficient_index, persistent=False)
514514

515-
@property # deprecate this
516-
def direct_forces(self) -> bool:
517-
return self.regress_config.direct_forces
518-
519-
@property # deprecate this
520-
def regress_forces(self) -> bool:
521-
return self.regress_config.forces
522-
523-
@property # deprecate this
524-
def regress_stress(self) -> bool:
525-
return self.regress_config.stress
526-
527515
def balance_channels(
528516
self,
529517
x_message_prime: torch.Tensor,
@@ -903,7 +891,7 @@ def get_default_untrained_tasks(
903891
stress computation requires energy-conserving force computation.
904892
"""
905893
# Direct force models can't compute stress via autograd
906-
if self.direct_forces:
894+
if self.regress_config.direct_forces:
907895
return []
908896

909897
tasks = []
@@ -1065,14 +1053,6 @@ def __init__(
10651053
backbone.force_block = None
10661054
self.regress_config = backbone.regress_config
10671055

1068-
@property
1069-
def regress_forces(self) -> bool:
1070-
return self.regress_config.forces
1071-
1072-
@property
1073-
def regress_stress(self) -> bool:
1074-
return self.regress_config.stress
1075-
10761056
@conditional_grad(torch.enable_grad())
10771057
def forward(
10781058
self, data: AtomicData, emb: dict[str, torch.Tensor]

src/fairchem/core/models/uma/escn_moe.py

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -449,14 +449,6 @@ def __init__(
449449
self.merged_on_dataset = None
450450
self.non_merged_dataset_names: list[str] = []
451451

452-
@property
453-
def regress_forces(self) -> bool:
454-
return self.regress_config.forces
455-
456-
@property
457-
def regress_stress(self) -> bool:
458-
return self.regress_config.stress
459-
460452
@staticmethod
461453
def _build_expert_mapping(
462454
dataset_names: list[str] | None,
@@ -608,14 +600,6 @@ def __init__(
608600
# keep track if this head has been merged or not
609601
self.merged_on_dataset = None
610602

611-
@property
612-
def regress_forces(self) -> bool:
613-
return self.regress_config.forces
614-
615-
@property
616-
def regress_stress(self) -> bool:
617-
return self.regress_config.stress
618-
619603
def merge_MOLE_model(self, data):
620604
self.merged_on_dataset = data.dataset[0]
621605
self.non_merged_dataset_names = [

src/fairchem/core/units/mlip_unit/predict.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -196,16 +196,12 @@ def __init__(
196196
self.assert_on_nans = assert_on_nans
197197
self._warned_upcast = False
198198

199-
if self.model.module.direct_forces:
199+
if self.model.module.backbone.regress_config.direct_forces:
200200
logging.warning(
201201
"This is a direct-force model. Direct force predictions may lead to "
202202
"discontinuities in the potential energy surface and energy conservation errors."
203203
)
204204

205-
@property
206-
def direct_forces(self) -> bool:
207-
return self.model.module.direct_forces
208-
209205
@property
210206
def dataset_to_tasks(self) -> dict[str, list]:
211207
return self.model.module.dataset_to_tasks
@@ -478,7 +474,11 @@ def _run_inference(self, data: AtomicData, undo_refs: bool) -> dict:
478474
"""
479475
Execute model inference.
480476
"""
481-
inference_context = torch.no_grad() if self.direct_forces else nullcontext()
477+
inference_context = (
478+
torch.no_grad()
479+
if self.model.module.backbone.regress_config.direct_forces
480+
else nullcontext()
481+
)
482482
tf32_context = (
483483
tf32_context_manager() if self.inference_settings.tf32 else nullcontext()
484484
)

tests/core/calculate/test_ase_calculator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ def test_calculator_setup(all_calculators):
194194
datasets = list(calc.predictor.dataset_to_tasks.keys())
195195

196196
# all conservative UMA checkpoints should support E/F/S!
197-
if not calc.predictor.direct_forces and (
197+
if not calc.predictor.model.module.backbone.regress_config.direct_forces and (
198198
len(datasets) > 1 or (calc.task_name != "omol" and calc.task_name != "odac")
199199
):
200200
print(len(datasets), calc.task_name)

tests/core/models/test_inference_interface.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -166,13 +166,6 @@ def test_dataset_to_tasks_raises_before_setup(self, mock_hydra_model):
166166
with pytest.raises(RuntimeError, match="setup_tasks"):
167167
_ = mock_hydra_model.dataset_to_tasks
168168

169-
def test_direct_forces_property(self, mock_hydra_model):
170-
"""Test direct_forces property delegates to backbone."""
171-
assert mock_hydra_model.direct_forces is False
172-
173-
mock_hydra_model.backbone.direct_forces = True
174-
assert mock_hydra_model.direct_forces is True
175-
176169

177170
class TestBackboneInterface:
178171
"""Tests for backbone interface method implementations."""

0 commit comments

Comments
 (0)