Source code for cosapp.drivers.iterativecase
import abc
import logging
from typing import Optional
from cosapp.drivers.runonce import RunOnce
logger = logging.getLogger(__name__)
[docs]class IterativeCase(RunOnce):
"""Abstract interface to children cases for a :py:class:`~cosapp.drivers.abstractsolver.AbstractSolver`.
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 : Dict[str, Any]
Optional keywords arguments
"""
__slots__ = ()
def __init__(self,
name: str,
owner: Optional["cosapp.systems.System"] = None,
**kwargs
) -> None:
"""Initialize a driver
Parameters
----------
name: str, optional
Name of the `Driver`.
owner: System, optional
:py:class:`~cosapp.systems.system.System` to which this driver belong; defaults to `None`.
**kwargs:
Additional keywords arguments forwarded to base class.
"""
super().__init__(name, owner, **kwargs)
self.reset_problem()
def _set_owner(self, system: Optional["cosapp.systems.System"]) -> bool:
defined = self.owner is not None
changed = super()._set_owner(system)
if changed:
self.reset_problem()
if defined:
logger.warning(
f"System owner of Driver {self.name!r} has changed. Mathematical problem has been cleared."
)
[docs] @abc.abstractmethod
def reset_problem(self) -> None:
"""Reset mathematical problem(s) defined on case."""
pass
def _postcompute(self) -> None:
"""Actions to carry out after the :py:meth:`~cosapp.drivers.runonce.RunOnce.compute` method call.
This gathers the residues for this point and undo the variable status changes
"""
# Request the residues of the current case to be updated
for residue in self.get_problem().residues.values():
residue.update()
super()._postcompute()
# TODO No longer needed after the suppression of RunOptim -> integrate with RunSingleCase