optimization algorithms automatically save and store the values of the objective function and knobs whenever the objective function is measured.
the objective function output has its shape determined by the shape of the input position-array and by the nature of the optimization problem at hand (multi- or single-objective). For single-objective, single-individual algorithms, such as RCDS, a scalar value is returned by default.
the concept of the accumulated optima found during the evaluations is introduced by storing indices of the optima along the evaluations history
bugs related to the duplicated evaluation of the objective function when nans are present in the positions were fixed.
a default visualization method for accompanying the history of optimization was introduced to be re-derived in child classes, suiting the specific needs for different optimization algorithms. Also added was a method for displaying slices of the parameter space for a given knob (see example for RCDS below).
RCDS
Introduced properties to keep track of RCDS iterations and the number of evaluations during a given iteration
fixed a minor issue with breaking the iterations loop, ensuring correct calculation of relevant quantities prior to finalization
introduced plotting methods for accompanying the optimization history, as shown below:
and a plotting method to display slices of the parameter space during evaluations
Other files
mostly conforming other optimization the algorithms to the changes in the base class
I saw no need to propagate these changes to the experiment classes derived from RCDS. It is true that some functionalities are now duplicated (storing objective function values and knobs positions every evaluation), however, I see these things as separate: RCDS will only be aware of the state of the knobs & objective function at each evaluation, while in the experiments we are usually interested in the state of the system at hand as a whole, storing the state in the data dict.
Snippet to reproduce these plots
Create params and optimization problem classes
class ParaboloidOptimizationParams(RCDSParams):
def __init__(self):
super().__init__()`
class ParaboloidOptimization(RCDS):
"""Minimize a noisy paraboloid."""
def __init__(self, use_thread=False, isonline=False):
super().__init__(use_thread, isonline)
self.params = ParaboloidOptimizationParams()
def objective_function(self, pos):
return np.dot(pos, pos) + self.params.noise_level * np.random.randn()
With these changes:
Base optimization class
nan
s are present in the positions were fixed.RCDS
Other files
data
dict.Snippet to reproduce these plots
Create params and optimization problem classes
Instantiate, set params,
Run optimzation
Plot