Source code for qcportal.manybody.dataset_models
from typing import Dict, Any, Union, Optional, Iterable
try:
from pydantic.v1 import BaseModel, Extra
except ImportError:
from pydantic import BaseModel, Extra
from typing_extensions import Literal
from qcportal.dataset_models import BaseDataset
from qcportal.manybody.record_models import ManybodyRecord, ManybodySpecification
from qcportal.metadata_models import InsertMetadata
from qcportal.molecules import Molecule
[docs]
class ManybodyDatasetNewEntry(BaseModel):
class Config:
extra = Extra.forbid
name: str
initial_molecule: Union[Molecule, int]
additional_singlepoint_keywords: Dict[str, Any] = {}
attributes: Dict[str, Any] = {}
comment: Optional[str] = None
[docs]
class ManybodyDatasetEntry(ManybodyDatasetNewEntry):
initial_molecule: Molecule
[docs]
class ManybodyDatasetSpecification(BaseModel):
class Config:
extra = Extra.forbid
name: str
specification: ManybodySpecification
description: Optional[str] = None
[docs]
class ManybodyDatasetRecordItem(BaseModel):
entry_name: str
specification_name: str
record_id: int
record: Optional[ManybodyRecord]
[docs]
class ManybodyDataset(BaseDataset):
dataset_type: Literal["manybody"] = "manybody"
# Needed by the base class
_entry_type = ManybodyDatasetEntry
_new_entry_type = ManybodyDatasetNewEntry
_specification_type = ManybodyDatasetSpecification
_record_item_type = ManybodyDatasetRecordItem
_record_type = ManybodyRecord
[docs]
def add_specification(
self, name: str, specification: ManybodySpecification, description: Optional[str] = None
) -> InsertMetadata:
spec = ManybodyDatasetSpecification(name=name, specification=specification, description=description)
return self._add_specifications(spec)
[docs]
def add_entries(self, entries: Union[ManybodyDatasetNewEntry, Iterable[ManybodyDatasetNewEntry]]) -> InsertMetadata:
return self._add_entries(entries)
[docs]
def add_entry(
self,
name: str,
initial_molecule: Union[int, Molecule],
additional_singlepoint_keywords: Optional[Dict[str, Any]] = None,
attributes: Optional[Dict[str, Any]] = None,
comment: Optional[str] = None,
):
if additional_singlepoint_keywords is None:
additional_singlepoint_keywords = {}
if attributes is None:
attributes = {}
ent = ManybodyDatasetNewEntry(
name=name,
initial_molecule=initial_molecule,
additional_singlepoint_keywords=additional_singlepoint_keywords,
attributes=attributes,
comment=comment,
)
return self.add_entries(ent)