Source code for l2l.optimizees.functions.optimizee

import numpy as np

from l2l.optimizees.optimizee import Optimizee


[docs]class FunctionGeneratorOptimizee(Optimizee): """ Implements a simple function optimizee. Functions are generated using the FunctionGenerator. NOTE: Make sure the optimizee_fitness_weights is set to (-1,) to minimize the value of the function :param traj: The trajectory used to conduct the optimization. :param fg_instance: Instance of the FunctionGenerator class. :param seed: The random seed used for generation of optimizee individuals. It uses a copy of the fg_instance and overrides the random generator using one seeded by `seed`. Note that this random generator is also the one used by the :class:`.FunctionGeneratorOptimizee` itself. NOTE that this seed is converted to an np.uint32. """ def __init__(self, traj, fg_instance, seed): super().__init__(traj) seed = np.uint32(seed) self.random_state = np.random.RandomState(seed=seed) self.fg_instance = fg_instance self.dims = self.fg_instance.dims self.cost_fn = self.fg_instance.cost_function self.bound = self.fg_instance.bound # create_individual can be called because __init__ is complete except for traj initializtion indiv_dict = self.create_individual() for key, val in indiv_dict.items(): traj.individual.f_add_parameter(key, val) traj.individual.f_add_parameter('seed', seed) self.random_state = np.random.RandomState(seed=seed)
[docs] def create_individual(self): """ Creates a random value of parameter within given bounds """ # Define the first solution candidate randomly return {'coords': self.random_state.rand(self.dims) * (self.bound[1] - self.bound[0]) + self.bound[0]}
[docs] def bounding_func(self, individual): """ Bounds the individual within the required bounds via coordinate clipping """ return {'coords': np.clip(individual['coords'], a_min=self.bound[0], a_max=self.bound[1])}
[docs] def simulate(self, traj): """ Returns the value of the function chosen during initialization :param ~l2l.utils.trajectory.Trajectory traj: Trajectory :return: a single element :obj:`tuple` containing the value of the chosen function """ # configure_loggers(exactly_once=True) # logger configuration is here since this function is paralellised # logging is now taken care by jube for each individual individual = np.array(traj.individual.coords) return (self.cost_fn(individual, random_state=self.random_state), )