Source code for ribs.emitters.operators._gaussian
"""Provides GaussianOperator."""
from __future__ import annotations
import numpy as np
from numpy.typing import ArrayLike
from ribs.emitters.operators._operator_base import OperatorBase
from ribs.typing import Float, Int
[docs]
class GaussianOperator(OperatorBase):
"""Adds Gaussian noise to solutions.
Args:
sigma: Standard deviation of the Gaussian distribution. Note we assume the
Gaussian is diagonal, so if this argument is an array, it must be 1D.
seed: Value to seed the random number generator. Set to None to avoid a fixed
seed.
"""
def __init__(self, sigma: Float | ArrayLike, seed: Int | None = None) -> None:
self._sigma = sigma
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: ArrayLike) -> np.ndarray:
"""Adds Gaussian noise to parents.
Args:
parents: (batch_size, solution_dim) array of solutions to be mutated.
Returns:
``(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 parents + noise