Source code for pymoo.core.termination
"""Termination criteria for optimization algorithms."""
from abc import abstractmethod
[docs]
class Termination:
"""Base class for termination criteria."""
def __init__(self) -> None:
"""Initialize termination criterion."""
super().__init__()
self.force_termination = False
self.perc = 0.0
[docs]
def update(self, algorithm: object) -> float:
"""Update progress and check termination condition.
Args:
algorithm: Algorithm instance.
Returns:
Progress value in [0, 1].
"""
if self.force_termination:
progress = 1.0
else:
progress = self._update(algorithm)
assert progress >= 0.0, (
"Invalid progress was set by the TerminationCriterion."
)
self.perc = progress
return self.perc
[docs]
def has_terminated(self) -> bool:
"""Check whether termination criterion is satisfied."""
return self.perc >= 1.0
[docs]
def do_continue(self) -> bool:
"""Check whether optimization should continue."""
return not self.has_terminated()
[docs]
def terminate(self) -> None:
"""Force termination."""
self.force_termination = True
@abstractmethod
def _update(self, algorithm: object) -> float:
"""Update progress (to be implemented by subclasses)."""
class NoTermination(Termination):
"""Termination criterion that never terminates."""
def _update(self, algorithm: object) -> float:
"""Never terminate."""
return 0.0
class MultipleCriteria(Termination):
"""Base class for combining multiple termination criteria."""
def __init__(self, *args: Termination) -> None:
"""Initialize with multiple criteria.
Args:
args: Termination criteria to combine.
"""
super().__init__()
self.criteria = args
class TerminateIfAny(MultipleCriteria):
"""Terminate if any criterion is satisfied."""
def _update(self, algorithm: object) -> float:
"""Terminate if any criterion is met."""
return max([termination.update(algorithm) for termination in self.criteria])
class TerminateIfAll(MultipleCriteria):
"""Terminate only if all criteria are satisfied."""
def _update(self, algorithm: object) -> float:
"""Terminate only if all criteria are met."""
return min([termination.update(algorithm) for termination in self.criteria])