Skip to content

Csse tdmb 537h #471

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 2 commits into
base: next2025
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ jobs:
#if: false
run: |
conda remove qcelemental --force
python -m pip install 'git+https://github.com/MolSSI/QCElemental.git@next2025' --no-deps
python -m pip install 'git+https://github.com/loriab/QCElemental.git@csse_layout_536g' --no-deps

# note: conda remove --force, not mamba remove --force b/c https://github.com/mamba-org/mamba/issues/412
# alt. is micromamba but not yet ready for setup-miniconda https://github.com/conda-incubator/setup-miniconda/issues/75
Expand All @@ -200,7 +200,7 @@ jobs:
run: |
conda install pydantic=2 -c conda-forge
conda remove qcelemental --force
python -m pip install 'git+https://github.com/MolSSI/QCElemental.git@next2025' --no-deps
python -m pip install 'git+https://github.com/loriab/QCElemental.git@csse_layout_536g' --no-deps

- name: Special Config - Forced Interface Upgrade
if: matrix.cfg.label == 'Psi4-1.6'
Expand Down
19 changes: 14 additions & 5 deletions qcengine/procedures/torsiondrive.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
FailedOperation,
Molecule,
OptimizationInput,
OptimizationProperties,
OptimizationResult,
TorsionDriveInput,
TorsionDriveResult,
Expand Down Expand Up @@ -119,16 +120,20 @@ def _compute(self, input_model: "TorsionDriveInput", config: "TaskConfig"):
}

# even if we hit an error during the torsiondrive, we output what we can
output_data["final_energies"], output_data["final_molecules"] = {}, {}
output_data["scan_properties"], output_data["final_molecules"] = {}, {}

for grid_point, results in optimization_results.items():

final_energy, final_molecule = self._find_final_results(results)
final_energy, final_properties, final_molecule = self._find_final_results(results)

output_data["final_energies"][grid_point] = final_energy
# v1: output_data["final_energies"][grid_point] = final_energy
output_data["scan_properties"][grid_point] = final_properties
output_data["final_molecules"][grid_point] = final_molecule

output_data["scan_results"] = optimization_results
output_data["properties"] = {
"calcinfo_ngrid": len(optimization_results),
}

if error is not None:
output_data["error"] = error
Expand Down Expand Up @@ -211,14 +216,18 @@ def _spawn_optimization(
@staticmethod
def _find_final_results(
optimization_results: List[OptimizationResult],
) -> Tuple[float, Molecule]:
) -> Tuple[float, OptimizationProperties, Molecule]:
"""Returns the energy and final molecule of the lowest energy optimization
in a set."""

final_energies = np.array([result.properties.return_energy for result in optimization_results])
lowest_energy_idx = final_energies.argmin()

return float(final_energies[lowest_energy_idx]), optimization_results[lowest_energy_idx].final_molecule
return (
float(final_energies[lowest_energy_idx]),
optimization_results[lowest_energy_idx].properties,
optimization_results[lowest_energy_idx].final_molecule,
)

def _spawn_optimizations(
self, next_jobs: Dict[str, List[float]], input_model: "TorsionDriveInput", config: "TaskConfig"
Expand Down
28 changes: 19 additions & 9 deletions qcengine/tests/test_procedures.py
Original file line number Diff line number Diff line change
Expand Up @@ -687,7 +687,10 @@ def test_torsiondrive_generic(schema_versions, request, scan_ptcl):
if not (from_v2(request.node.name) and scan_ptcl == "none"):
assert {*opthist_tgt} == expected_grid_ids

assert {*ret.final_energies} == expected_grid_ids
if "v2" in request.node.name:
assert {*ret.scan_properties} == expected_grid_ids
else:
assert {*ret.final_energies} == expected_grid_ids
assert {*ret.final_molecules} == expected_grid_ids

assert (
Expand Down Expand Up @@ -741,9 +744,9 @@ def test_torsiondrive_extra_constraints(schema_versions, request):

if from_v2(request.node.name):
input_data = models.TorsionDriveInput(
initial_molecules=[models.Molecule(**qcng.get_molecule("propane", return_dict=True))],
initial_molecule=[models.Molecule(**qcng.get_molecule("propane", return_dict=True))],
specification=models.TorsionDriveSpecification(
keywords=models.TDKeywords(dihedrals=[(3, 0, 1, 2)], grid_spacing=[180]),
keywords=models.TorsionDriveKeywords(dihedrals=[(3, 0, 1, 2)], grid_spacing=[180]),
specification=models.OptimizationSpecification(
program="geomeTRIC",
keywords=keywords,
Expand All @@ -753,7 +756,9 @@ def test_torsiondrive_extra_constraints(schema_versions, request):
driver=models.DriverEnum.gradient,
model=models.Model(method="small", basis=None),
),
protocols=models.OptimizationProtocols(trajectory_results="all"),
),
protocols=models.TorsionDriveProtocols(scan_results="all"),
),
)
else:
Expand Down Expand Up @@ -782,11 +787,16 @@ def test_torsiondrive_extra_constraints(schema_versions, request):
assert ret.success

expected_grid_ids = {"180", "0"}
opthist_tgt = ret.scan_results if "v2" in request.node.name else ret.optimization_history

assert {*ret.optimization_history} == expected_grid_ids

assert {*ret.final_energies} == expected_grid_ids
assert {*opthist_tgt} == expected_grid_ids
if "v2" in request.node.name:
assert {*ret.scan_properties} == expected_grid_ids
else:
assert {*ret.final_energies} == expected_grid_ids
assert {*ret.final_molecules} == expected_grid_ids
if "v2" in request.node.name:
assert ret.properties.calcinfo_ngrid == 2

assert (
pytest.approx(ret.final_molecules["180"].measure([3, 0, 1, 2]), abs=1.0e-2) == 180.0
Expand All @@ -796,11 +806,11 @@ def test_torsiondrive_extra_constraints(schema_versions, request):
assert pytest.approx(ret.final_molecules["0"].measure([3, 0, 1, 2]), abs=1.0e-2) == 0.0

assert ret.provenance.creator.lower() == "torsiondrive"
assert ret.optimization_history["180"][0].provenance.creator.lower() == "geometric"
assert opthist_tgt["180"][0].provenance.creator.lower() == "geometric"
if "v2" in request.node.name:
assert ret.optimization_history["180"][0].trajectory_results[0].provenance.creator.lower() == "mace"
assert opthist_tgt["180"][0].trajectory_results[0].provenance.creator.lower() == "mace"
else:
assert ret.optimization_history["180"][0].trajectory[0].provenance.creator.lower() == "mace"
assert opthist_tgt["180"][0].trajectory[0].provenance.creator.lower() == "mace"

assert "Using MACE-OFF23 MODEL for MACECalculator" in ret.stdout
assert "All optimizations converged at lowest energy. Job Finished!\n" in ret.stdout
Expand Down
Loading