from ..utils import wrap_untrustworthy, final, ExhaustedTrialsError import numpy as np def make_evolopy(optimizer_name, popsize=None): from ..external.evolopy.BAT import BAT from ..external.evolopy.CS import CS from ..external.evolopy.DE import DE from ..external.evolopy.FFA import FFA from ..external.evolopy.GA import GA from ..external.evolopy.GWO import GWO from ..external.evolopy.HHO import HHO from ..external.evolopy.JAYA import JAYA from ..external.evolopy.MFO import MFO from ..external.evolopy.MVO import MVO from ..external.evolopy.PSO import PSO from ..external.evolopy.SCA import SCA from ..external.evolopy.SSA import SSA from ..external.evolopy.WOA import WOA from unittest.mock import patch def no_print(*args, **kwargs): pass optimizers = dict( BAT=BAT, CS=CS, DE=DE, FFA=FFA, GA=GA, GWO=GWO, HHO=HHO, JAYA=JAYA, MFO=MFO, MVO=MVO, PSO=PSO, SCA=SCA, SSA=SSA, WOA=WOA, ) optimizers = { k: patch("builtins.print", no_print)(v) for k, v in optimizers.items() } optimizer = optimizers[optimizer_name.upper()] def f(objective, n_trials, n_dim, with_count): # ps = n_dim if popsize is None else popsize # ps = max(4, ps) if optimizer_name.upper() == "DE" else ps ps = int(4 + 3 * np.log(n_dim)) if popsize is None else popsize if optimizer_name.upper() == "GA" and ps & 1: ps += 1 # force popsize to be even _objective = wrap_untrustworthy( objective, n_trials, bounding="sine", raising=True ) try: optimizer(_objective, 0.0, 1.0, n_dim, ps, n_trials) except ExhaustedTrialsError: pass fopt, xopt, feval_count = _objective(final) return (fopt, xopt, feval_count) if with_count else (fopt, xopt) name = f"evolopy_{optimizer.__name__.lower()}" name += f"_auto" if popsize is None else f"_ps{popsize:02}" f.__name__ = name + "_cube" return f