Skip to content

Commit

Permalink
internal classes to pyd v2 api
Browse files Browse the repository at this point in the history
  • Loading branch information
loriab committed Sep 18, 2024
1 parent bbf32bf commit ec2dc9d
Show file tree
Hide file tree
Showing 34 changed files with 67 additions and 154 deletions.
5 changes: 1 addition & 4 deletions qcengine/compute.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,7 @@
from .util import compute_wrapper, environ_context, handle_output_metadata, model_wrapper

if TYPE_CHECKING:
try:
from pydantic.v1.main import BaseModel
except ImportError:
from pydantic.main import BaseModel
from pydantic.main import BaseModel
from qcelemental.models import AtomicResult


Expand Down
37 changes: 16 additions & 21 deletions qcengine/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,8 @@
import socket
from typing import Any, Dict, Optional, Union

try:
import pydantic.v1 as pydantic
except ImportError:
import pydantic
from pydantic import BaseModel, Field
from pydantic_settings import BaseSettings, SettingsConfigDict

from .extras import get_information

Expand Down Expand Up @@ -69,7 +67,7 @@ def get_global(key: Optional[str] = None) -> Union[str, Dict[str, Any]]:
return _global_values[key]


class NodeDescriptor(pydantic.BaseModel):
class NodeDescriptor(BaseModel):
"""
Description of an individual node
"""
Expand All @@ -83,7 +81,7 @@ class NodeDescriptor(pydantic.BaseModel):
memory_safety_factor: int = 10 # Percentage of memory as a safety factor

# Specifications
ncores: Optional[int] = pydantic.Field(
ncores: Optional[int] = Field(
None,
description="""Number of cores accessible to each task on this node
Expand All @@ -93,7 +91,7 @@ class NodeDescriptor(pydantic.BaseModel):
retries: int = 0

# Cluster options
is_batch_node: bool = pydantic.Field(
is_batch_node: bool = Field(
False,
help="""Whether the node running QCEngine is a batch node
Expand All @@ -108,7 +106,7 @@ class NodeDescriptor(pydantic.BaseModel):
``mpiexec_command`` must always be used even for serial jobs (e.g., getting the version number)
""",
)
mpiexec_command: Optional[str] = pydantic.Field(
mpiexec_command: Optional[str] = Field(
None,
description="""Invocation for launching node-parallel tasks with MPI
Expand Down Expand Up @@ -149,27 +147,24 @@ class Config:
extra = "forbid"


class TaskConfig(pydantic.BaseSettings):
class TaskConfig(BaseSettings):
"""Description of the configuration used to launch a task."""

# Specifications
ncores: int = pydantic.Field(None, description="Number cores per task on each node")
nnodes: int = pydantic.Field(None, description="Number of nodes per task")
memory: float = pydantic.Field(
None, description="Amount of memory in GiB (2^30 bytes; not GB = 10^9 bytes) per node."
)
ncores: int = Field(None, description="Number cores per task on each node")
nnodes: int = Field(None, description="Number of nodes per task")
memory: float = Field(None, description="Amount of memory in GiB (2^30 bytes; not GB = 10^9 bytes) per node.")
scratch_directory: Optional[str] # What location to use as scratch
retries: int # Number of retries on random failures
mpiexec_command: Optional[str] # Command used to launch MPI tasks, see NodeDescriptor
use_mpiexec: bool = False # Whether it is necessary to use MPI to run an executable
cores_per_rank: int = pydantic.Field(1, description="Number of cores per MPI rank")
scratch_messy: bool = pydantic.Field(
False, description="Leave scratch directory and contents on disk after completion."
)
cores_per_rank: int = Field(1, description="Number of cores per MPI rank")
scratch_messy: bool = Field(False, description="Leave scratch directory and contents on disk after completion.")

class Config(pydantic.BaseSettings.Config):
extra = "forbid"
env_prefix = "QCENGINE_"
model_config = SettingsConfigDict(
extra="forbid",
env_prefix="QCENGINE_",
)


def _load_defaults() -> None:
Expand Down
4 changes: 2 additions & 2 deletions qcengine/procedures/berny.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import sys
import traceback
from io import StringIO
from typing import Any, Dict, Union
from typing import Any, ClassVar, Dict, Union

import numpy as np
from qcelemental.models import FailedOperation, OptimizationInput, OptimizationResult
Expand All @@ -16,7 +16,7 @@


class BernyProcedure(ProcedureHarness):
_defaults = {"name": "Berny", "procedure": "optimization"}
_defaults: ClassVar[Dict[str, Any]] = {"name": "Berny", "procedure": "optimization"}

def found(self, raise_error: bool = False) -> bool:
return which_import(
Expand Down
7 changes: 2 additions & 5 deletions qcengine/procedures/geometric.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Any, Dict, Union
from typing import Any, ClassVar, Dict, Union

from qcelemental.models import OptimizationInput, OptimizationResult
from qcelemental.util import safe_version, which_import
Expand All @@ -8,13 +8,10 @@

class GeometricProcedure(ProcedureHarness):

_defaults = {"name": "geomeTRIC", "procedure": "optimization"}
_defaults: ClassVar[Dict[str, Any]] = {"name": "geomeTRIC", "procedure": "optimization"}

version_cache: Dict[str, str] = {}

class Config(ProcedureHarness.Config):
pass

def found(self, raise_error: bool = False) -> bool:
return which_import(
"geometric",
Expand Down
12 changes: 5 additions & 7 deletions qcengine/procedures/model.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
import abc
from typing import Any, Dict, Union

try:
from pydantic.v1 import BaseModel
except ImportError:
from pydantic import BaseModel
from pydantic import BaseModel, ConfigDict

from ..util import model_wrapper

Expand All @@ -14,9 +11,10 @@ class ProcedureHarness(BaseModel, abc.ABC):
name: str
procedure: str

class Config:
allow_mutation: False
extra: "forbid"
model_config = ConfigDict(
frozen=True,
extra="forbid",
)

def __init__(self, **kwargs):
super().__init__(**{**self._defaults, **kwargs})
Expand Down
7 changes: 2 additions & 5 deletions qcengine/procedures/nwchem_opt/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Any, Dict, Union
from typing import Any, ClassVar, Dict, Union

from qcelemental.models import AtomicInput, OptimizationInput, OptimizationResult, Provenance

Expand All @@ -12,10 +12,7 @@
class NWChemDriverProcedure(ProcedureHarness):
"""Structural relaxation using NWChem's optimizer"""

_defaults = {"name": "NWChemDriver", "procedure": "optimization"}

class Config(ProcedureHarness.Config):
pass
_defaults: ClassVar[Dict[str, Any]] = {"name": "NWChemDriver", "procedure": "optimization"}

def found(self, raise_error: bool = False) -> bool:
nwc_harness = NWChemHarness()
Expand Down
7 changes: 2 additions & 5 deletions qcengine/procedures/optking.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Any, Dict, Union
from typing import Any, ClassVar, Dict, Union

from qcelemental.models import OptimizationInput, OptimizationResult
from qcelemental.util import safe_version, which_import
Expand All @@ -8,13 +8,10 @@

class OptKingProcedure(ProcedureHarness):

_defaults = {"name": "OptKing", "procedure": "optimization"}
_defaults: ClassVar[Dict[str, Any]] = {"name": "OptKing", "procedure": "optimization"}

version_cache: Dict[str, str] = {}

class Config(ProcedureHarness.Config):
pass

def found(self, raise_error: bool = False) -> bool:
return which_import(
"optking",
Expand Down
7 changes: 2 additions & 5 deletions qcengine/procedures/torsiondrive.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import io
from collections import defaultdict
from contextlib import redirect_stderr, redirect_stdout
from typing import TYPE_CHECKING, Any, Dict, List, Tuple, Union
from typing import TYPE_CHECKING, Any, ClassVar, Dict, List, Tuple, Union

import numpy as np
from qcelemental.models import FailedOperation, Molecule
Expand All @@ -16,10 +16,7 @@

class TorsionDriveProcedure(ProcedureHarness):

_defaults = {"name": "TorsionDrive", "procedure": "torsiondrive"}

class Config(ProcedureHarness.Config):
pass
_defaults: ClassVar[Dict[str, Any]] = {"name": "TorsionDrive", "procedure": "torsiondrive"}

def found(self, raise_error: bool = False) -> bool:
return which_import(
Expand Down
7 changes: 2 additions & 5 deletions qcengine/programs/adcc.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""
Calls adcc
"""
from typing import TYPE_CHECKING, Dict
from typing import TYPE_CHECKING, Any, ClassVar, Dict

from qcelemental.models import AtomicResult, BasisSet, Provenance
from qcelemental.util import safe_version, which_import
Expand All @@ -19,7 +19,7 @@


class AdccHarness(ProgramHarness):
_defaults = {
_defaults: ClassVar[Dict[str, Any]] = {
"name": "adcc",
"scratch": False,
"thread_safe": False,
Expand All @@ -29,9 +29,6 @@ class AdccHarness(ProgramHarness):
}
version_cache: Dict[str, str] = {}

class Config(ProgramHarness.Config):
pass

@staticmethod
def found(raise_error: bool = False) -> bool:
"""Whether adcc harness is ready for operation.
Expand Down
3 changes: 0 additions & 3 deletions qcengine/programs/cfour/runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,6 @@ class CFOURHarness(ProgramHarness):
}
version_cache: Dict[str, str] = {}

class Config(ProgramHarness.Config):
pass

@staticmethod
def found(raise_error: bool = False) -> bool:
return which(
Expand Down
3 changes: 0 additions & 3 deletions qcengine/programs/dftd3.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,6 @@ class DFTD3Harness(ProgramHarness):
}
version_cache: Dict[str, str] = {}

class Config(ProgramHarness.Config):
pass

@staticmethod
def found(raise_error: bool = False) -> bool:
return which(
Expand Down
6 changes: 0 additions & 6 deletions qcengine/programs/dftd_ng.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,6 @@ class DFTD4Harness(ProgramHarness):
}
version_cache: Dict[str, str] = {}

class Config(ProgramHarness.Config):
pass

@staticmethod
def found(raise_error: bool = False) -> bool:
"""Check for the availability of the Python API of dftd4"""
Expand Down Expand Up @@ -195,9 +192,6 @@ class SDFTD3Harness(ProgramHarness):
}
version_cache: Dict[str, str] = {}

class Config(ProgramHarness.Config):
pass

@staticmethod
def found(raise_error: bool = False) -> bool:
"""Check for the availability of the Python API of dftd3"""
Expand Down
3 changes: 0 additions & 3 deletions qcengine/programs/gamess/runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,6 @@ class GAMESSHarness(ProgramHarness):
}
version_cache: Dict[str, str] = {}

class Config(ProgramHarness.Config):
pass

@staticmethod
def found(raise_error: bool = False) -> bool:
return which(
Expand Down
3 changes: 0 additions & 3 deletions qcengine/programs/gcp.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,6 @@ class GCPHarness(ProgramHarness):
}
version_cache: Dict[str, str] = {}

class Config(ProgramHarness.Config):
pass

@staticmethod
def found(raise_error: bool = False) -> bool:
return which(
Expand Down
19 changes: 8 additions & 11 deletions qcengine/programs/model.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
import abc
import logging
from typing import Any, Dict, List, Optional, Tuple, Union

try:
from pydantic.v1 import BaseModel
except ImportError:
from pydantic import BaseModel
from typing import Any, ClassVar, Dict, List, Optional, Tuple, Union

from pydantic import BaseModel, ConfigDict
from qcelemental.models import AtomicInput, AtomicResult, FailedOperation

from qcengine.config import TaskConfig
Expand All @@ -17,18 +13,19 @@

class ProgramHarness(BaseModel, abc.ABC):

_defaults: Dict[str, Any] = {}
_defaults: ClassVar[Dict[str, Any]] = {}
name: str
scratch: bool
thread_safe: bool
thread_parallel: bool
node_parallel: bool
managed_memory: bool
extras: Optional[Dict[str, Any]]
extras: Optional[Dict[str, Any]] = None

class Config:
allow_mutation: False
extra: "forbid"
model_config = ConfigDict(
frozen=True,
extra="forbid",
)

def __init__(self, **kwargs):
super().__init__(**{**self._defaults, **kwargs})
Expand Down
7 changes: 2 additions & 5 deletions qcengine/programs/molpro.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"""

import string
from typing import Any, Dict, List, Optional, Set, Tuple
from typing import Any, ClassVar, Dict, List, Optional, Set, Tuple
from xml.etree import ElementTree as ET

from qcelemental.models import AtomicResult
Expand All @@ -15,7 +15,7 @@


class MolproHarness(ProgramHarness):
_defaults: Dict[str, Any] = {
_defaults: ClassVar[Dict[str, Any]] = {
"name": "Molpro",
"scratch": True,
"thread_safe": False,
Expand Down Expand Up @@ -63,9 +63,6 @@ class MolproHarness(ProgramHarness):
# _unrestricted_post_hf_methods: Set[str] = {"UMP2", "UCCSD", "UCCSD(T)"}
_post_hf_methods: Set[str] = {*_restricted_post_hf_methods}

class Config(ProgramHarness.Config):
pass

def found(self, raise_error: bool = False) -> bool:
return which(
"molpro", return_bool=True, raise_error=raise_error, raise_msg="Please install via https://www.molpro.net/"
Expand Down
3 changes: 0 additions & 3 deletions qcengine/programs/mopac.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,6 @@ class MopacHarness(ProgramHarness):
}
version_cache: Dict[str, str] = {}

class Config(ProgramHarness.Config):
pass

def __init__(self, **kwargs):
extras = { # All units taken from within MOPAC
"bohr_to_angstroms": 0.5291772083,
Expand Down
3 changes: 0 additions & 3 deletions qcengine/programs/mp2d.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,6 @@ class MP2DHarness(ProgramHarness):
}
version_cache: Dict[str, str] = {}

class Config(ProgramHarness.Config):
pass

@staticmethod
def found(raise_error: bool = False) -> bool:
return which(
Expand Down
Loading

0 comments on commit ec2dc9d

Please sign in to comment.