Skip to content
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

Models: Consistent model nomenclature moving forward #167

Merged
merged 2 commits into from
Nov 12, 2019
Merged
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
16 changes: 8 additions & 8 deletions docs/source/model_result.rst
Original file line number Diff line number Diff line change
@@ -1,27 +1,27 @@
Result
AtomicResult
======

A Python implementation of the `MolSSI QCSchema
<https://github.com/MolSSI/QCSchema>`_ ``Result`` object.
<https://github.com/MolSSI/QCSchema>`_ ``AtomicResult`` object.


ResultInput
AtomicInput
-----------

.. autoclass:: qcelemental.models.ResultInput
.. autoclass:: qcelemental.models.AtomicInput

Result
AtomicResult
------

.. autoclass:: qcelemental.models.Result
.. autoclass:: qcelemental.models.AtomicResult


API
---

.. autoclass:: qcelemental.models.results.ResultProtocols
.. autoclass:: qcelemental.models.results.AtomicResultProtocols

.. autoclass:: qcelemental.models.results.ResultProperties
.. autoclass:: qcelemental.models.results.AtomicResultProperties

.. autoclass:: qcelemental.models.results.WavefunctionProperties

1 change: 0 additions & 1 deletion qcelemental/datum.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
from typing import Any, Dict, Optional

import numpy as np

from pydantic import BaseModel, validator


Expand Down
4 changes: 2 additions & 2 deletions qcelemental/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@
from .basis import BasisSet
from .common_models import ComputeError, DriverEnum, FailedOperation, Provenance
from .molecule import Molecule
from .procedures import Optimization, OptimizationInput
from .results import Result, ResultInput, ResultProperties
from .procedures import Optimization, OptimizationInput, OptimizationResult
from .results import AtomicInput, AtomicResult, AtomicResultProperties, Result, ResultInput, ResultProperties
1 change: 0 additions & 1 deletion qcelemental/models/align.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import numpy as np

from pydantic import validator

from ..util import blockwise_contract, blockwise_expand
Expand Down
2 changes: 1 addition & 1 deletion qcelemental/models/basemodels.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
from typing import Any, Dict, Optional, Set, Union

import numpy as np

from pydantic import BaseModel, BaseSettings

from qcelemental.testing import compare_recursive
from qcelemental.util import deserialize, serialize
from qcelemental.util.autodocs import AutoPydanticDocGenerator
Expand Down
1 change: 0 additions & 1 deletion qcelemental/models/common_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
from typing import Any, Dict, Optional

import numpy as np

from pydantic import Field

from .basemodels import ProtoModel
Expand Down
1 change: 0 additions & 1 deletion qcelemental/models/molecule.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
from typing import Any, Dict, List, Optional, Tuple, Union

import numpy as np

from pydantic import Field, constr, validator

from ..molparse import from_arrays, from_schema, from_string, to_schema, to_string
Expand Down
13 changes: 10 additions & 3 deletions qcelemental/models/procedures.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
qcschema_optimization_output_default,
)
from .molecule import Molecule
from .results import Result
from .results import AtomicResult


class TrajectoryProtocolEnum(str, Enum):
Expand Down Expand Up @@ -81,13 +81,13 @@ def __repr_args__(self) -> "ReprArgs":
]


class Optimization(OptimizationInput):
class OptimizationResult(OptimizationInput):
schema_name: constr( # type: ignore
strip_whitespace=True, regex=qcschema_optimization_output_default
) = qcschema_optimization_output_default

final_molecule: Optional[Molecule] = Field(..., description="The final molecule of the geometry optimization.")
trajectory: List[Result] = Field(
trajectory: List[AtomicResult] = Field(
..., description="A list of ordered Result objects for each step in the optimization."
)
energies: List[float] = Field(..., description="A list of ordered energies for each step in the optimization.")
Expand Down Expand Up @@ -123,3 +123,10 @@ def _trajectory_protocol(cls, v, values):
raise ValueError(f"Protocol `trajectory:{keep_enum}` is not understood.")

return v


def Optimization(*args, **kwargs):
from warnings import warn

warn("Optimization has been renamed to OptimizationResult and will be removed in v0.13.0", DeprecationWarning)
return OptimizationResult(*args, **kwargs)
45 changes: 38 additions & 7 deletions qcelemental/models/results.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
from typing import Any, Dict, List, Optional, Set, Union

import numpy as np

from pydantic import Field, constr, validator

from ..util import provenance_stamp
Expand All @@ -13,7 +12,7 @@
from .types import Array


class ResultProperties(ProtoModel):
class AtomicResultProperties(ProtoModel):
"""
Named properties of quantum chemistry computations following the MolSSI QCSchema.
"""
Expand Down Expand Up @@ -259,7 +258,7 @@ class WavefunctionProtocolEnum(str, Enum):
none = "none"


class ResultProtocols(ProtoModel):
class AtomicResultProtocols(ProtoModel):
"""
Protocols regarding the manipulation of a Result output data.
"""
Expand All @@ -276,7 +275,7 @@ class Config:
### Primary models


class ResultInput(ProtoModel):
class AtomicInput(ProtoModel):
"""The MolSSI Quantum Chemistry Schema"""

id: Optional[str] = Field(None, description="An optional ID of the ResultInput object.")
Expand All @@ -287,7 +286,9 @@ class ResultInput(ProtoModel):
driver: DriverEnum = Field(..., description=str(DriverEnum.__doc__))
model: Model = Field(..., description=str(Model.__base_doc__))
keywords: Dict[str, Any] = Field({}, description="The program specific keywords to be used.")
protocols: ResultProtocols = Field(ResultProtocols(), description=str(ResultProtocols.__base_doc__))
protocols: AtomicResultProtocols = Field(
AtomicResultProtocols(), description=str(AtomicResultProtocols.__base_doc__)
)

extras: Dict[str, Any] = Field({}, description="Extra fields that are not part of the schema.")

Expand All @@ -301,10 +302,10 @@ def __repr_args__(self) -> "ReprArgs":
]


class Result(ResultInput):
class AtomicResult(AtomicInput):
schema_name: constr(strip_whitespace=True, regex=qcschema_output_default) = qcschema_output_default # type: ignore

properties: ResultProperties = Field(..., description=str(ResultProperties.__base_doc__))
properties: AtomicResultProperties = Field(..., description=str(AtomicResultProperties.__base_doc__))
wavefunction: Optional[WavefunctionProperties] = Field(None, description=str(WavefunctionProperties.__base_doc__))

return_result: Union[float, Array[float], Dict[str, Any]] = Field(
Expand Down Expand Up @@ -424,3 +425,33 @@ def _stdout_protocol(cls, value, values):
return None
else:
raise ValueError(f"Protocol `stdout:{outp}` is not understood")


def ResultProtocols(*args, **kwargs):
from warnings import warn

warn("ResultProtocols has been renamed to AtomicResultProtocols and will be removed in v0.13.0", DeprecationWarning)
return AtomicResultProtocols(*args, **kwargs)


def ResultProperties(*args, **kwargs):
from warnings import warn

warn(
"ResultProperties has been renamed to AtomicResultProperties and will be removed in v0.13.0", DeprecationWarning
)
return AtomicResultProperties(*args, **kwargs)


def ResultInput(*args, **kwargs):
from warnings import warn

warn("ResultInput has been renamed to AtomicInput and will be removed in v0.13.0", DeprecationWarning)
return AtomicInput(*args, **kwargs)


def Result(*args, **kwargs):
from warnings import warn

warn("Result has been renamed to AtomicResult and will be removed in v0.13.0", DeprecationWarning)
return AtomicResult(*args, **kwargs)
2 changes: 1 addition & 1 deletion qcelemental/molutil/test_molutil.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
import pprint

import numpy as np
import pydantic
import pytest

import pydantic
import qcelemental as qcel
from qcelemental.testing import compare, compare_molrecs, compare_recursive, compare_values

Expand Down
1 change: 0 additions & 1 deletion qcelemental/testing.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
from typing import Callable, Dict, List, Union

import numpy as np

from pydantic import BaseModel

pp = pprint.PrettyPrinter(width=120)
Expand Down
2 changes: 1 addition & 1 deletion qcelemental/tests/test_datum.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from decimal import Decimal

import numpy as np
import pydantic
import pytest

import pydantic
import qcelemental as qcel
from qcelemental.testing import compare_recursive, compare_values

Expand Down
12 changes: 6 additions & 6 deletions qcelemental/tests/test_model_general.py
Original file line number Diff line number Diff line change
@@ -1,30 +1,30 @@
import pytest

from qcelemental.models import (
AtomicInput,
AtomicResult,
AtomicResultProperties,
ComputeError,
FailedOperation,
Molecule,
Optimization,
OptimizationInput,
ProtoModel,
Provenance,
Result,
ResultInput,
ResultProperties,
)


def test_result_properties_default_skip():

obj = ResultProperties(scf_one_electron_energy="-5.0")
obj = AtomicResultProperties(scf_one_electron_energy="-5.0")

assert pytest.approx(obj.scf_one_electron_energy) == -5.0

assert obj.dict().keys() == {"scf_one_electron_energy"}


def test_result_properties_default_repr():
obj = ResultProperties(scf_one_electron_energy="-5.0")
obj = AtomicResultProperties(scf_one_electron_energy="-5.0")
assert "none" not in str(obj).lower()
assert "scf_one_electron_energy" in str(obj)
assert len(str(obj)) < 100
Expand Down Expand Up @@ -56,7 +56,7 @@ def test_repr_failed_op():

def test_repr_result():

result = ResultInput(
result = AtomicInput(
**{"driver": "gradient", "model": {"method": "UFF"}, "molecule": {"symbols": ["He"], "geometry": [0, 0, 0]}}
)
assert "molecule_hash" in str(result)
Expand Down
33 changes: 24 additions & 9 deletions qcelemental/tests/test_model_results.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,25 +214,25 @@ def test_basis_map_raises():


def test_result_build(result_data_fixture):
ret = qcel.models.Result(**result_data_fixture)
ret = qcel.models.AtomicResult(**result_data_fixture)
assert ret.wavefunction is None


def test_result_build_wavefunction_delete(wavefunction_data_fixture):
del wavefunction_data_fixture["protocols"]
ret = qcel.models.Result(**wavefunction_data_fixture)
ret = qcel.models.AtomicResult(**wavefunction_data_fixture)
assert ret.wavefunction is None


def test_wavefunction_build(wavefunction_data_fixture):
assert qcel.models.Result(**wavefunction_data_fixture)
assert qcel.models.AtomicResult(**wavefunction_data_fixture)


def test_wavefunction_matrix_size_error(wavefunction_data_fixture):

wavefunction_data_fixture["wavefunction"]["scf_orbitals_a"] = np.random.rand(2, 2)
with pytest.raises(ValueError) as e:
qcel.models.Result(**wavefunction_data_fixture)
qcel.models.AtomicResult(**wavefunction_data_fixture)

assert "castable to shape" in str(e.value)

Expand All @@ -241,7 +241,7 @@ def test_wavefunction_return_result_pointer(wavefunction_data_fixture):

del wavefunction_data_fixture["wavefunction"]["scf_orbitals_a"]
with pytest.raises(ValueError) as e:
qcel.models.Result(**wavefunction_data_fixture)
qcel.models.AtomicResult(**wavefunction_data_fixture)

assert "does not exist" in str(e.value)

Expand Down Expand Up @@ -288,7 +288,7 @@ def test_wavefunction_protocols(protocol, restricted, provided, expected, wavefu
else:
wfn_data[scf_name] = np.random.rand(bas.nbf, bas.nbf)

wfn = qcel.models.Result(**wavefunction_data_fixture)
wfn = qcel.models.AtomicResult(**wavefunction_data_fixture)

if len(expected) == 0:
assert wfn.wavefunction is None
Expand All @@ -305,7 +305,7 @@ def test_optimization_trajectory_protocol(keep, indices, optimization_data_fixtu

if keep is not None:
optimization_data_fixture["protocols"] = {"trajectory": keep}
opt = qcel.models.Optimization(**optimization_data_fixture)
opt = qcel.models.OptimizationResult(**optimization_data_fixture)

assert len(opt.trajectory) == len(indices)
for result, index in zip(opt.trajectory, indices):
Expand All @@ -314,12 +314,12 @@ def test_optimization_trajectory_protocol(keep, indices, optimization_data_fixtu

def test_result_build_stdout_delete(result_data_fixture):
result_data_fixture["protocols"] = {"stdout": False}
ret = qcel.models.Result(**result_data_fixture)
ret = qcel.models.AtomicResult(**result_data_fixture)
assert ret.stdout is None


def test_result_build_stdout(result_data_fixture):
ret = qcel.models.Result(**result_data_fixture)
ret = qcel.models.AtomicResult(**result_data_fixture)
assert ret.stdout == "I ran."


Expand All @@ -342,3 +342,18 @@ def test_failed_operation(result_data_fixture):
failed_json = failed.json()
assert isinstance(failed_json, str)
assert "its all good" in failed_json


def test_result_model_deprecations(result_data_fixture, optimization_data_fixture):

with pytest.warns(DeprecationWarning):
qcel.models.ResultProperties(scf_one_electron_energy="-5.0")

with pytest.warns(DeprecationWarning):
qcel.models.ResultInput(**{k: result_data_fixture[k] for k in ["molecule", "model", "driver"]})

with pytest.warns(DeprecationWarning):
qcel.models.Result(**result_data_fixture)

with pytest.warns(DeprecationWarning):
qcel.models.Optimization(**optimization_data_fixture)
2 changes: 1 addition & 1 deletion qcelemental/tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

import numpy as np
import pytest
from pydantic import BaseModel, Field

import qcelemental as qcel
from pydantic import BaseModel, Field
from qcelemental.testing import compare_recursive, compare_values

from .addons import serialize_extensions
Expand Down
1 change: 0 additions & 1 deletion qcelemental/util/serialization.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
from typing import Any, Union

import numpy as np

from pydantic.json import pydantic_encoder

from .importing import which_import
Expand Down
Loading