Source code for femagtools.moproblem

"""
    femagtools.moproblem
    ~~~~~~~~~~~~~~~~~~~~

    Creating and managing multi-objective problems



"""
from .moo.problem import Problem
import logging

logger = logging.getLogger(__name__)


[docs]class FemagMoProblem(Problem): """ A multi-objective optimization problem with Femag. """ def __init__(self, decision_vars, objective_vars): Problem.__init__(self, len(decision_vars), 0, len(objective_vars)) lbounds, ubounds = zip(*[d['bounds'] for d in decision_vars]) self.set_bounds(lbounds, ubounds) self.decision_vars = decision_vars logger.info("Decision Vars: %s", [d['name'] for d in decision_vars]) logger.info("bounds lower: %s upper: %s", lbounds, ubounds) self.objective_vars = objective_vars # prepare model
[docs] def prepare(self, x, model): # list of dicts (model, feaModel) if isinstance(model, list): for o in model: try: self.prepare(x, o) except: pass # ignore silently return # simple dict for d, v in zip(self.decision_vars, x): logger.info("Prepare: %s = %s", d['name'], v) model.set_value(d['name'].split('.'), v)
[docs] def setResult(self, result): self.result = result
[docs] def objfun(self, x): for o in self.objective_vars: logger.debug("%d=====> %s", len(self.objective_vars), str(o)) return [f[0] * f[1] if f[1] is not None else None for f in [(o.get('sign', 1), self.result.get(o['name'].split('.'))) for o in self.objective_vars]]
# Add some output to __repr__ def __str__(self): return "\n\tMulti-Objective optimization problem"