Source code for ribs.emitters.operators._iso_line

"""Iso Line Operator"""
import numpy as np

from ribs.emitters.operators._operator_base import OperatorBase


[docs]class IsoLineOperator(OperatorBase): """Adds Isotropic Gaussian noise and directional noise to parents. This operator was introduced in `Vassiliades 2018 <https://arxiv.org/abs/1804.03906>`_. Args: iso_sigma (float): Scale factor for the isotropic distribution used to generate solutions. line_sigma (float): Scale factor for the line distribution used when generating solutions. sigma (float or array-like): Standard deviation of the Gaussian distribution. Note we assume the Gaussian is diagonal, so if this argument is an array, it must be 1D. lower_bounds (array-like): Upper bounds of the solution space. Passed in by emitter upper_bounds (array-like): Upper bounds of the solution space. Passed in by emitter seed (int): Value to seed the random number generator. Set to None to avoid a fixed seed. """ def __init__(self, lower_bounds, upper_bounds, iso_sigma, line_sigma, seed=None): self._iso_sigma = iso_sigma self._line_sigma = line_sigma self._lower_bounds = lower_bounds self._upper_bounds = upper_bounds self._rng = np.random.default_rng(seed) @property def parent_type(self): """int: Parent Type to be used by selector.""" return 2
[docs] def ask(self, parents): """ Adds Isotropic Guassian noise and directional noise to parents. Args: parents (array-like): (2, batch_size, solution_dim) parents[0] array of solutions selected by emitter parents[1] array of second batch of solutions passed by emitter. Used for calculating directional correlation. Returns: numpy.ndarray: ``(batch_size, solution_dim)`` array that contains ``batch_size`` mutated solutions. """ parents = np.asarray(parents) elites = parents[0] directions = parents[1] - parents[0] iso_gaussian = self._rng.normal( scale=self._iso_sigma, size=(elites.shape[0], elites.shape[1]), ).astype(elites.dtype) line_gaussian = self._rng.normal( scale=self._line_sigma, size=(elites.shape[0], 1), ).astype(elites.dtype) solution_batch = elites + iso_gaussian + line_gaussian * directions return np.clip(solution_batch, self._lower_bounds, self._upper_bounds)