code: def add_ornstein_uhlenbeck_noise(
      key: Array,
      action: Array,
      noise_tm1: Array,
      damping: float,
      stddev: float,
  ) -> Array:
      """Returns continuous action with noise from Ornstein-Uhlenbeck process.
  
      See "On the theory of Brownian Motion" by Uhlenbeck and Ornstein.
      (https://journals.aps.org/pr/abstract/10.1103/PhysRev.36.823).
  
      Args:
        key: a key from `jax.random`.
        action: continuous action scalar or vector.
        noise_tm1: noise sampled from OU process in previous timestep.
        damping: parameter for controlling autocorrelation of OU process.
        stddev: standard deviation of noise distribution.
  
      Returns:
        noisy action, of the same shape as input action.
      """
      chex.assert_rank([action, noise_tm1], 1)
      chex.assert_type([action, noise_tm1], float)
  
      noise_t = (1.0 - damping) * noise_tm1 + jax.random.normal(
          key, shape=action.shape
      ) * stddev
  
      return action + noise_t
  
file_path: rlax/rlax/_src/exploration.py
imports: from typing import Optional, Union
  import chex
  import jax
  import jax.numpy
  from rlax._src import episodic_memory
label_desc: Use image node_id 2 for calling a global function with example usage: add_ornstein_uhlenbeck_noise(key, action, noise_tm1, damping, stddev) and returns: unknown