# Source code for ribs.emitters.operators._gaussian

"""Gaussian Operator"""
import numpy as np
from ribs.emitters.operators._operator_base import OperatorBase
[docs]class GaussianOperator(OperatorBase):
"""Adds Gaussian noise to solutions.
Args:
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, sigma, lower_bounds, upper_bounds, seed=None):
self._sigma = 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 1
[docs] def ask(self, parents):
"""Adds Gaussian noise to parents.
Args:
parents (array-like): (batch_size, solution_dim) array of
solutions to be mutated.
Returns:
numpy.ndarray: ``(batch_size, solution_dim)`` array that contains
``batch_size`` mutated solutions.
"""
parents = np.asarray(parents)
noise = self._rng.normal(
scale=self._sigma,
size=(parents.shape[0], parents.shape[1]),
).astype(parents.dtype)
return np.clip(parents + noise, self._lower_bounds, self._upper_bounds)