Source code for iwopy.interfaces.pymoo.factory

from . import imports


[docs] class Factory: """ A factory for pymoo components :group: interfaces.pymoo """
[docs] def __init__(self, pymoo_problem, verbosity): self.pymoo_problem = pymoo_problem self.verbosity = verbosity imports.load(verbosity)
[docs] def print(self, *args, **kwargs): if self.verbosity: print(*args, **kwargs)
[docs] def get_sampling(self, samp_name, **kwargs): """ Sampling factory function """ if samp_name is None: if self.pymoo_problem.is_intprob: samp_name = "int_random" else: samp_name = "float_random" if samp_name == "int_random": out = imports.IntegerRandomSampling(**kwargs) elif samp_name == "float_random": out = imports.FloatRandomSampling(**kwargs) elif samp_name == "binary_random": out = imports.BinaryRandomSampling(**kwargs) elif samp_name == "permutation_random": out = imports.PermutationRandomSampling(**kwargs) elif samp_name == "lhs": out = imports.LatinHypercubeSampling(**kwargs) else: raise KeyError( f"Unknown sampling '{samp_name}', please choose: int_random, float_random, binary_random, permutation_random, lhs" ) self.print(f"Selecting sampling: {samp_name} ({type(out).__name__})") return out
[docs] def get_crossover(self, cross, **pars): """ Crossover factory function """ if cross == "sbx": out = imports.SBX(**pars) else: raise KeyError(f"Unknown crossover '{cross}', please choose: sbx") self.print(f"Selecting crossover: {cross} ({type(out).__name__})") return out
[docs] def get_mutation(self, mut, **pars): """ Mutation factory function """ if mut == "pm": out = imports.PM(**pars) else: raise KeyError(f"Unknown mutation '{mut}', please choose: pm") self.print(f"Selecting mutations: {mut} ({type(out).__name__})") return out
[docs] def get_algorithm(self, pars): """ Algorithm factory function """ typ = pars["type"] # Genetic Algorithm: if typ == "GA": samp_name = pars.get("sampling", None) samp_pars = pars.get("sampling_pars", {}) if "sampling_pars" in pars: del pars["sampling_pars"] pars["sampling"] = self.get_sampling(samp_name, **samp_pars) cross_pars = pars.get("crossover_pars", {}) if "crossover_pars" in pars: del pars["crossover_pars"] if "crossover" in pars and isinstance(pars["crossover"], str): cross = pars["crossover"] pars["crossover"] = self.get_crossover(cross, **cross_pars) mut_pars = pars.get("mutation_pars", {}) if "mutation_pars" in pars: del pars["mutation_pars"] if "mutation" in pars and isinstance(pars["mutation"], str): mut = pars["mutation"] pars["mutation"] = self.get_mutation(mut, **mut_pars) out = imports.GA(**pars) # Particle Swarm: elif typ == "PSO": if "samplig" in pars: samp_name = pars.get("sampling", None) samp_pars = pars.get("sampling_pars", {}) if "sampling_pars" in pars: del pars["sampling_pars"] pars["sampling"] = self.get_sampling(samp_name, **samp_pars) cross_pars = pars.get("crossover_pars", {}) if "crossover_pars" in pars: del pars["crossover_pars"] if "crossover" in pars and isinstance(pars["crossover"], str): cross = pars["crossover"] pars["crossover"] = self.get_crossover(cross, **cross_pars) mut_pars = pars.get("mutation_pars", {}) if "mutation_pars" in pars: del pars["mutation_pars"] if "mutation" in pars and isinstance(pars["mutation"], str): mut = pars["mutation"] pars["mutation"] = self.get_mutation(mut, **mut_pars) out = imports.PSO(**pars) # NSGA2: elif typ == "NSGA2": samp_name = pars.get("sampling", None) samp_pars = pars.get("sampling_pars", {}) if "sampling_pars" in pars: del pars["sampling_pars"] pars["sampling"] = self.get_sampling(samp_name, **samp_pars) cross_pars = pars.get("crossover_pars", {}) if "crossover_pars" in pars: del pars["crossover_pars"] if "crossover" in pars and isinstance(pars["crossover"], str): cross = pars["crossover"] pars["crossover"] = self.get_crossover(cross, **cross_pars) mut_pars = pars.get("mutation_pars", {}) if "mutation_pars" in pars: del pars["mutation_pars"] if "mutation" in pars and isinstance(pars["mutation"], str): mut = pars["mutation"] pars["mutation"] = self.get_mutation(mut, **mut_pars) out = imports.NSGA2(**pars) # MixedVariableGA: elif typ == "MixedVariableGA": cross_pars = pars.get("crossover_pars", {}) if "crossover_pars" in pars: del pars["crossover_pars"] if "crossover" in pars and isinstance(pars["crossover"], str): cross = pars["crossover"] pars["crossover"] = self.get_crossover(cross, **cross_pars) mut_pars = pars.get("mutation_pars", {}) if "mutation_pars" in pars: del pars["mutation_pars"] if "mutation" in pars and isinstance(pars["mutation"], str): mut = pars["mutation"] pars["mutation"] = self.get_mutation(mut, **mut_pars) out = imports.MixedVariableGA(**pars) else: raise KeyError( f"Unknown algorithm '{typ}', please choose: GA, PSO, NSGA2, MixedVariableGA" ) self.print(f"Selecting algorithm: {typ} ({type(out).__name__})") return out
[docs] def get_termination(self, term_pars): """ Termination factory function """ if isinstance(term_pars, tuple): return term_pars elif isinstance(term_pars, list): return tuple(term_pars) typ = term_pars.pop("type", None) if typ is None: return None elif not isinstance(typ, str): self.print(f"Selecting termination: {type(typ).__name__}") return typ elif typ == "default": if self.pymoo_problem.problem.n_objectives > 1: out = imports.DefaultMultiObjectiveTermination(**term_pars) else: out = imports.DefaultSingleObjectiveTermination(**term_pars) else: raise KeyError(f"Unknown termination '{type}', please choose: default") self.print(f"Selecting termination: {typ} ({type(out).__name__})") return out