Source code for iwopy.interfaces.pygmo.optimizer
import numpy as np
from iwopy.core import Optimizer
from iwopy.utils import suppress_stdout
from .problem import UDP
from .algos import AlgoFactory
from . import imports
[docs]
class Optimizer_pygmo(Optimizer):
"""
Interface to the pygmo optimizers
for serial runs.
Attributes
----------
problem_pars: dict
Parameters for the problem
algo_pars: dict
Parameters for the alorithm
setup_pars: dict
Parameters for the calculation setup
udp: iwopy.interfaces.imports.pygmo.UDA
The pygmo problem
algo: imports.pygmo.algo
The pygmo algorithm
:group: interfaces.pygmo
"""
[docs]
def __init__(self, problem, problem_pars={}, algo_pars={}, setup_pars={}):
"""
Constructor
Parameters
----------
problem: iwopy.Problem
The problem to optimize
problem_pars: dict
Parameters for the problem
algo_pars: dict
Parameters for the alorithm
setup_pars: dict
Parameters for the calculation setup
"""
super().__init__(problem)
imports.load()
self.problem_pars = problem_pars
self.algo_pars = algo_pars
self.setup_pars = setup_pars
self.udp = None
self.algo = None
[docs]
def initialize(self, verbosity=1):
"""
Initialize the object.
Parameters
----------
verbosity: int
The verbosity level, 0 = silent
"""
# create pygmo problem:
pop = self.problem_pars.get("pop", False)
self.udp = UDP(self.problem, **self.problem_pars)
# create algorithm:
self.algo = AlgoFactory.new(pop=pop, **self.algo_pars)
# create population:
psize = self.setup_pars.get("pop_size", 1)
pseed = self.setup_pars.get("seed", None)
pnrfi = self.setup_pars.get("norandom_first", psize == 1)
self.pop = imports.pygmo.population(self.udp, size=psize, seed=pseed)
self.pop.problem.c_tol = [
self.setup_pars.get("c_tol", 1e-4)
] * self.pop.problem.get_nc()
# memorize verbosity level:
self.verbosity = self.setup_pars.get("verbosity", 1)
# set first indiviual to initial values:
if pnrfi:
x = np.zeros(self.udp.n_vars_all)
if self.problem.n_vars_float:
x[: self.problem.n_vars_float] = self.problem.initial_values_float()
if self.problem.n_vars_int:
x[self.problem.n_vars_float :] = self.problem.initial_values_int()
# xf = x[: self.problem.n_vars_float]
# xi = x[self.problem.n_vars_float :].astype(np.int64)
self.udp._active = True
self.pop.set_x(0, x)
super().initialize(verbosity)
[docs]
def print_info(self):
"""
Print solver info, called before solving
"""
super().print_info()
if self.algo is not None:
print()
print(self.algo)
[docs]
def solve(self, verbosity=1):
"""
Run the optimization solver.
Parameters
----------
verbosity: int
The verbosity level, 0 = silent
Returns
-------
results: iwopy.SingleObjOptResults
The optimization results object
"""
# try pygmo silencing:
if self.algo.has_set_verbosity():
self.algo.set_verbosity(verbosity)
# general silencing for Python prints:
silent = verbosity <= 0
with suppress_stdout(silent):
# Run solver:
pop = self.algo.evolve(self.pop)
return self.udp.finalize(pop, verbosity)