code: import numpy as np
  
  
  class OrnsteinUhlenbeckNoiseProcess:
      """
      Taken from https://github.com/openai/baselines/blob/master/baselines/ddpg/noise.py
      """
      def __init__(self, mu, sigma, theta=.15, dt=1e-2, x0=None):
          self.theta = theta
          self.mu = mu
          self.sigma = sigma
          self.dt = dt
          self.x0 = x0
          self.x_prev = None
          self.reset()
  
      def __call__(self):
          x = self.x_prev + self.theta * (self.mu - self.x_prev) * self.dt + self.sigma * np.sqrt(self.dt) * np.random.normal(size=self.mu.shape)
          self.x_prev = x
          return x
  
      def reset(self):
          self.x_prev = self.x0 if self.x0 is not None else np.zeros_like(self.mu)
  
      def __repr__(self):
          return 'OrnsteinUhlenbeckActionNoise(mu={}, sigma={})'.format(self.mu, self.sigma)
  
  
  class NormalActionNoise:
      def __init__(self, mu, sigma):
          self.mu = mu
          self.sigma = sigma
  
      def __call__(self):
          return np.random.normal(self.mu, self.sigma)
  
      def __repr__(self):
          return 'NormalActionNoise(mu={}, sigma={})'.format(self.mu, self.sigma)
  
apis: numpy.random.normal numpy.zeros_like numpy.sqrt