Source code for glyph.utils.break_condition

import time

import numpy as np


[docs]class SoftTimeOut: def __init__(self, ttl): """Break condition based on a soft time out. Start a new generation as long as there is some time left. :param ttl: time to live in seconds """ self.soft_ttl = ttl self.start = time.time() @property def now(self): return time.time() - self.start @property def alive(self): return bool(self.soft_ttl - self.now > 0) or self.soft_ttl == 0 def __call__(self, *args, **kwargs): return self.alive
[docs]def soft_max_iter(app, max_iter=np.infty): """Soft breaking condition. Will check after each generation weather maximum number of iterations is exceeded. :type app: `glyph.application.Application` :param max_iter: maximum number of function evaluations :return: bool(iter) > max_iter """ return sum(app.gp_runner.logbook.select("evals")) >= max_iter
[docs]def soft_target(app, target=0, error_index=0): """Soft breaking condition. Will check after each generation minimum error is reached. :type app: `glyph.application.Application` :param target: value of desired error metric :param error_index: index in fitness tuple :return: bool(min_error) <= target """ return app.gp_runner.logbook.chapters["fit{}".format(error_index)].select("min")[-1] <= target
[docs]def break_condition(target=0, error_index=0, ttl=0, max_iter=np.infty): """Combined breaking condition based on time to live, minimum target and maximum number of iterations. :param target: value of desired error metric :param error_index: index in fitness tuple :param ttl: time to live in seconds :param max_iter: maximum number of iterations """ sto = SoftTimeOut(ttl) def cb(app): return ( soft_max_iter(app, max_iter=max_iter) or sto(app) or soft_target(app, target=target, error_index=error_index) ) return cb