Source code for airsspy.jf.documents
"""
Output document models for AIRSS jobflow jobs.
Defines pydantic models following the atomate2 TaskDoc pattern.
One ``AirssJobDoc`` contains N ``AirssResultDoc`` entries, supporting
multi-structure jobs (e.g., 50 random structures per search job).
"""
from datetime import datetime
from enum import Enum
from typing import Optional
from pydantic import BaseModel, Field
from pymatgen.core import Structure
[docs]
class RelaxOutcome(str, Enum):
"""Outcome of a single structure relaxation."""
FINISHED = "finished"
TIMEDOUT = "timedout"
ERRORED = "errored"
FAILED = "failed"
UNDETERMINED = "undetermined"
CYCLE_EXCEEDED = "cycle_exceeded"
[docs]
class AirssResultDoc(BaseModel):
"""Single relaxed structure result from an AIRSS job."""
struct_name: str
seed_name: str
project_name: str
# Structures
structure: Optional[Structure] = None
initial_structure: Optional[Structure] = None
# Computed properties
energy: Optional[float] = None
energy_per_atom: Optional[float] = None
volume: Optional[float] = None
pressure: Optional[float] = None
spin: float = 0.0
mod_spin: float = 0.0
symmetry: Optional[str] = None
formula: Optional[str] = None
reduced_formula: Optional[str] = None
natoms: Optional[int] = None
# Raw RES content
res_content: Optional[str] = None
# Computational metadata
parallel_efficiency: Optional[float] = None
total_time: Optional[float] = None
relax_status: RelaxOutcome = RelaxOutcome.FINISHED
error_message: Optional[str] = None
# REM block content (raw lines for .res reconstruction)
rem_lines: Optional[list[str]] = None
[docs]
class AirssJobDoc(BaseModel):
"""Output document from any AIRSS job (search or relax).
Contains N results from a single job execution. For
``AirssSearchMaker``, this holds N randomly-generated-then-relaxed
structures. For ``AirssRelaxMaker``, this holds N
pre-existing-now-relaxed structures.
"""
project_name: str
seed_name: str
job_type: str = "search" # "search", "relax", "singlepoint"
# Seed info (present for search jobs)
seed_content: Optional[str] = None
seed_hash: Optional[str] = None
param_content: Optional[str] = None
results: list[AirssResultDoc] = Field(default_factory=list)
# Summary
n_structures: int = 0
n_finished: int = 0
n_errored: int = 0
n_failed: int = 0
n_timedout: int = 0
created_on: Optional[datetime] = None