Source code for cosapp.drivers.abstractsetofcases
import abc
from typing import Any, Iterable, Optional
from cosapp.drivers.driver import Driver, System
# TODO
# [ ] Quid for vector variables
[docs]
class AbstractSetOfCases(Driver):
"""
This driver builds a set of cases from a list
Parameters
----------
name : str
Name of the driver
owner : System, optional
:py:class:`~cosapp.systems.system.System` to which driver belongs; defaults to `None`
**kwargs : Any
Keyword arguments will be used to set driver options
"""
__slots__ = ('cases')
def __init__(
self,
name: str,
owner: Optional[System] = None,
**options
) -> None:
"""Initialize driver
Parameters
----------
name: str, optional
Name of the `Module`
owner: System, optional
:py:class:`~cosapp.systems.system.System` to which driver belongs; defaults to `None`
**kwargs:
Additional keywords arguments forwarded to base class.
"""
super().__init__(name, owner, **options)
# TODO Fred - is this not too much oriented for MonteCarlo or DoE? What about a mission for which input
# variables may not be the same on all points.
self.cases = None # type: Optional[Iterable[Any]]
# desc="List of cases to be carried out."
def _precase(self, case_idx: int, case: Any):
"""Hook to be called before running each case.
Parameters
----------
case_idx : int
Index of the case
case : Any
Parameters for this case
"""
self.status = ""
self.error_code = "0"
@abc.abstractmethod
def _build_cases(self) -> None:
"""Generator of cases."""
pass
def _postcase(self, case_idx: int, case: Any):
"""Hook to be called after running each case.
Parameters
----------
case_idx : int
Index of the case
case : Any
Parameters for this case
"""
if self._recorder is not None:
self._recorder.record_state(case_idx, self.status, self.error_code)
[docs]
def setup_run(self):
"""Actions performed prior to the `Module.compute` call."""
super().setup_run()
self._build_cases()
[docs]
def run_children(self) -> None:
"""Runs all driver children.
"""
for child in self.children.values():
child.run_once()
if len(child.status) > 0:
self.status = child.status
if child.error_code != "0":
self.error_code = child.error_code
[docs]
def compute(self) -> None:
"""Contains the customized `Module` calculation, to execute after children.
"""
for case_idx, case in enumerate(self.cases):
if len(case) > 0:
self._precase(case_idx, case)
self.run_children()
self._postcase(case_idx, case)