diff --git a/devtools/conda-envs/basic.yaml b/devtools/conda-envs/basic.yaml index ac580048..2194db17 100644 --- a/devtools/conda-envs/basic.yaml +++ b/devtools/conda-envs/basic.yaml @@ -23,8 +23,8 @@ dependencies: - nglview - qcengine >=0.25 - - qcelemental >=0.25.1 - - qcfractal >=0.65,<0.70.0a0 + - qcelemental >=0.50.2 + - qcfractal >=0.65 - qcarchivetesting - qcportal diff --git a/devtools/conda-envs/psi4.yaml b/devtools/conda-envs/psi4.yaml index 22395266..dd71b152 100644 --- a/devtools/conda-envs/psi4.yaml +++ b/devtools/conda-envs/psi4.yaml @@ -22,8 +22,8 @@ dependencies: - nglview - qcengine >=0.25 - - qcelemental >=0.25.1 - - qcfractal >=0.65,<0.70.0a0 + - qcelemental >=0.50.2 + - qcfractal >=0.65 - qcarchivetesting - qcportal diff --git a/docs/releasehistory.md b/docs/releasehistory.md index fd86c0e4..fb308931 100644 --- a/docs/releasehistory.md +++ b/docs/releasehistory.md @@ -11,6 +11,13 @@ Releases are given with dates in YYYY-MM-DD format. +## 0.59.0 / 2026-09-24 + +### API/Behavior Changes + +[PR #398:] Updates for QCPortal 0.70/QCElemental 0.50. After these changes, QCSubmit requires QCElemental >=0.51.2 but +may continue to work with older versions of QCPortal. [@bennybp] [@j-wags] + ## 0.58.0 / 2026-08-13 ### API/Behavior Changes @@ -244,6 +251,7 @@ For more information on this release, see https://github.com/openforcefield/open [PR #382:]: https://github.com/openforcefield/openff-qcsubmit/pull/382 [PR #387:]: https://github.com/openforcefield/openff-qcsubmit/pull/387 [PR #394:]: https://github.com/openforcefield/openff-qcsubmit/pull/394 +[PR #398:]: https://github.com/openforcefield/openff-qcsubmit/pull/398 [@jthorton]: https://github.com/jthorton [@dotsdl]: https://github.com/dotsdl @@ -253,3 +261,4 @@ For more information on this release, see https://github.com/openforcefield/open [@j-wags]: https://github.com/j-wags [@pavankum]: https://github.com/pavankum [@ntBre]: https://github.com/ntBre +[@bennybp]: https://github.com/bennybp diff --git a/openff/qcsubmit/_tests/results/__init__.py b/openff/qcsubmit/_tests/results/__init__.py index f184a769..53a444e0 100644 --- a/openff/qcsubmit/_tests/results/__init__.py +++ b/openff/qcsubmit/_tests/results/__init__.py @@ -71,6 +71,9 @@ def mock_basic_result_collection(molecules, monkeypatch) -> BasicResultCollectio is_service=False, created_on=datetime.datetime(2022, 4, 21, 0, 0, 0), modified_on=datetime.datetime(2022, 4, 21, 0, 0, 0), + properties=None, + manager_name=None, + creator_user=None, # compute_history=list(), status=RecordStatusEnum.complete, client=_PortalClient(address=address), @@ -129,6 +132,9 @@ def mock_optimization_result_collection( is_service=False, created_on=datetime.datetime(2022, 4, 21, 0, 0, 0), modified_on=datetime.datetime(2022, 4, 21, 0, 0, 0), + properties=None, + manager_name=None, + creator_user=None, # compute_history=list(), # ), client=_PortalClient(address=address), @@ -170,7 +176,7 @@ def mock_torsion_drive_result_collection( id=entry.record_id, specification=TorsiondriveSpecification( program="torsiondrive", - keywords=TDKeywords(dihedrals=[], grid_spacing=[]), + keywords=TDKeywords(dihedrals=[], grid_spacing=[]).dict(), optimization_specification=OptimizationSpecification( program="geometric", keywords={}, @@ -194,6 +200,9 @@ def mock_torsion_drive_result_collection( is_service=True, created_on=datetime.datetime(2022, 4, 21, 0, 0, 0), modified_on=datetime.datetime(2022, 4, 21, 0, 0, 0), + properties=None, + manager_name=None, + creator_user=None, ), molecules[address][int(entry.record_id) - 1], ) diff --git a/openff/qcsubmit/_tests/results/test_filters.py b/openff/qcsubmit/_tests/results/test_filters.py index f562c0ab..565eee5b 100644 --- a/openff/qcsubmit/_tests/results/test_filters.py +++ b/openff/qcsubmit/_tests/results/test_filters.py @@ -227,6 +227,9 @@ def test_connectivity_filter(): status=RecordStatusEnum.complete, is_service=False, # client=_PortalClient(address=address) + properties=None, + manager_name=None, + creator_user=None, ) connectivity_filter = ConnectivityFilter() @@ -255,6 +258,9 @@ def test_record_status_filter(): molecule_id=1, status=RecordStatusEnum.complete, is_service=False, + properties=None, + manager_name=None, + creator_user=None, ) status_filter = RecordStatusFilter(status=RecordStatusEnum.complete) diff --git a/openff/qcsubmit/_tests/results/test_results.py b/openff/qcsubmit/_tests/results/test_results.py index 3f714b1c..47aa4f72 100644 --- a/openff/qcsubmit/_tests/results/test_results.py +++ b/openff/qcsubmit/_tests/results/test_results.py @@ -164,6 +164,9 @@ def test_base_validate_record_types(): created_on=datetime.datetime(2022, 4, 21, 0, 0, 0), modified_on=datetime.datetime(2022, 4, 21, 0, 0, 0), id=1, + properties=None, + manager_name=None, + creator_user=None, ), OptimizationRecord( # OptimizationRecord( @@ -177,11 +180,16 @@ def test_base_validate_record_types(): ), ), initial_molecule_id=1, + final_molecule_id=1, + energies=[], status=RecordStatusEnum.complete, is_service=False, created_on=datetime.datetime(2022, 4, 21, 0, 0, 0), modified_on=datetime.datetime(2022, 4, 21, 0, 0, 0), id=1, + properties=None, + manager_name=None, + creator_user=None, ), ] @@ -494,6 +502,9 @@ def test_torsion_smirnoff_coverage(public_client, monkeypatch): created_on=datetime.datetime(2022, 4, 21, 0, 0, 0), modified_on=datetime.datetime(2022, 4, 21, 0, 0, 0), # compute_history=list(), + properties=None, + manager_name=None, + creator_user=None, # ) ), molecule, diff --git a/openff/qcsubmit/common_structures.py b/openff/qcsubmit/common_structures.py index aeeb5138..783bf297 100644 --- a/openff/qcsubmit/common_structures.py +++ b/openff/qcsubmit/common_structures.py @@ -27,8 +27,8 @@ import numpy as np from openff.toolkit.topology import Molecule from qcelemental import constants -from qcelemental.models.common_models import Model -from qcelemental.models.results import WavefunctionProtocolEnum +from qcelemental.models.v1.common_models import Model +from qcelemental.models.v1.results import WavefunctionProtocolEnum from qcportal.singlepoint import SinglepointDriver from openff.qcsubmit._pydantic import ( diff --git a/openff/qcsubmit/datasets/datasets.py b/openff/qcsubmit/datasets/datasets.py index eb557912..60d5cfb9 100644 --- a/openff/qcsubmit/datasets/datasets.py +++ b/openff/qcsubmit/datasets/datasets.py @@ -847,15 +847,17 @@ def _get_entries(self) -> List[SinglepointDatasetNewEntry]: name = index + f"-{tag + j}" entries.append( SinglepointDatasetNewEntry( - name=name, molecule=molecule, attributes=entry.attributes + name=name, + molecule=molecule.dict(), + attributes=entry.attributes.dict(), ) ) else: entries.append( SinglepointDatasetNewEntry( name=entry_name, - molecule=entry.initial_molecules[0], - attributes=entry.attributes, + molecule=entry.initial_molecules[0].dict(), + attributes=entry.attributes.dict(), ) ) @@ -1032,7 +1034,7 @@ def _get_specifications(self) -> Dict[str, OptimizationSpecification]: program=self.optimization_procedure.program, qc_specification=qc_spec, keywords=opt_kw, - protocols=self.protocols, + protocols=self.protocols.dict(), ) return ret @@ -1042,7 +1044,7 @@ def _get_entries(self) -> List[OptimizationDatasetNewEntry]: for entry_name, entry in self.dataset.items(): # TODO this probably needs even more keywords - opt_kw = dict(constraints=entry.constraints) + opt_kw = dict(constraints=entry.constraints.dict()) opt_kw.update(entry.keywords) if len(entry.initial_molecules) > 1: # check if the index has a number tag @@ -1054,18 +1056,18 @@ def _get_entries(self) -> List[OptimizationDatasetNewEntry]: entries.append( OptimizationDatasetNewEntry( name=name, - initial_molecule=molecule, + initial_molecule=molecule.dict(), additional_keywords=opt_kw, - attributes=entry.attributes, + attributes=entry.attributes.dict(), ) ) else: entries.append( OptimizationDatasetNewEntry( name=entry_name, - initial_molecule=entry.initial_molecules[0], + initial_molecule=entry.initial_molecules[0].dict(), additional_keywords=opt_kw, - attributes=entry.attributes, + attributes=entry.attributes.dict(), ) ) @@ -1251,7 +1253,7 @@ def _get_specifications(self) -> Dict[str, TorsiondriveSpecification]: spec = OptimizationSpecification( program=self.optimization_procedure.program, qc_specification=qc_spec, - protocols=self.protocols, + protocols=self.protocols.dict(), ) ret[spec_name] = TorsiondriveSpecification( optimization_specification=spec, @@ -1274,15 +1276,15 @@ def _get_entries(self) -> List[TorsiondriveDatasetNewEntry]: td_keywords.update(entry.keywords.dict(exclude_defaults=True)) - opt_keywords = dict(constraints=entry.constraints) + opt_keywords = dict(constraints=entry.constraints.dict()) entries.append( TorsiondriveDatasetNewEntry( name=entry_name, - initial_molecules=entry.initial_molecules, + initial_molecules=[m.dict() for m in entry.initial_molecules], additional_keywords=td_keywords, additional_optimization_keywords=opt_keywords, - attributes=entry.attributes, + attributes=entry.attributes.dict(), ) ) diff --git a/openff/qcsubmit/results/results.py b/openff/qcsubmit/results/results.py index f13e402e..19db3f4b 100644 --- a/openff/qcsubmit/results/results.py +++ b/openff/qcsubmit/results/results.py @@ -766,7 +766,9 @@ def create_basic_dataset( isomeric=True, explicit_hydrogens=False, mapped=False ), molecule=None, - initial_molecules=[rec.final_molecule for rec, _ in records], + initial_molecules=[ + rec.final_molecule.convert_v(1) for rec, _ in records + ], attributes=MoleculeAttributes.from_openff_molecule(base_molecule), extras=base_record.extras, keywords=base_record.specification.keywords,