class_docstr: The Gaussian likelihood is appropriate where uncertainties associated with
  the data are believed to follow a normal distribution, with constant
  variance.
  
  Very small uncertainties can lead to numerical instability during the
  optimization process. A lower bound of 1e-6 is therefore imposed on the
  likelihood variance by default.
class_docstr_tok: ["The","Gaussian","likelihood","is","appropriate","where","uncertainties","associated","with","the","data","are","believed","to","follow","a","normal","distribution",",","with","constant","variance",".","Very","small","uncertainties","can","lead","to","numerical","instability","during","the","optimization","process",".","A","lower","bound","of","1e-6","is","therefore","imposed","on","the","likelihood","variance","by","default","."]
docstr: :param variance: The noise variance; must be greater than
      ``variance_lower_bound``. This is mutually exclusive with `scale`.
  :param scale: The noise scale; must be greater than
      ``sqrt(variance_lower_bound)``. This is mutually exclusive with `variance`.
  :param variance_lower_bound: The lower (exclusive) bound of ``variance``.
  :param kwargs: Keyword arguments forwarded to :class:`ScalarLikelihood`.
docstr_tok: [":","param","variance",":","The","noise","variance",";","must","be","greater","than","``","variance_lower_bound","``",".","This","is","mutually","exclusive","with","`","scale","`",".",":","param","scale",":","The","noise","scale",";","must","be","greater","than","``","sqrt","(","variance_lower_bound",")","``",".","This","is","mutually","exclusive","with","`","variance","`",".",":","param","variance_lower_bound",":","The","lower","(","exclusive",")","bound","of","``","variance","``",".",":","param","kwargs",":","Keyword","arguments","forwarded","to",":","class",":","`","ScalarLikelihood","`","."]
code: def __init__(
      self,
      variance: Optional[ConstantOrFunction] = None,
      *,
      scale: Optional[ConstantOrFunction] = None,
      variance_lower_bound: Optional[float] = None,
      **kwargs: Any,
  ) -> None:
      """
      :param variance: The noise variance; must be greater than
          ``variance_lower_bound``. This is mutually exclusive with `scale`.
      :param scale: The noise scale; must be greater than
          ``sqrt(variance_lower_bound)``. This is mutually exclusive with `variance`.
      :param variance_lower_bound: The lower (exclusive) bound of ``variance``.
      :param kwargs: Keyword arguments forwarded to :class:`ScalarLikelihood`.
      """
      super().__init__(**kwargs)
  
      self.variance_lower_bound = _lower_bound(variance_lower_bound)
      self.scale_lower_bound = sqrt(self.variance_lower_bound)
      if scale is None:
          if variance is None:
              variance = 1.0
          self.variance: Optional[
              ParameterOrFunction
          ] = prepare_parameter_or_function(
              variance, lower_bound=self.variance_lower_bound
          )
          self.scale: Optional[ParameterOrFunction] = None
      else:
          if variance is None:
              self.variance = None
              self.scale = prepare_parameter_or_function(
                  scale, lower_bound=self.scale_lower_bound
              )
          else:
              assert False, "Cannot set both `variance` and `scale`."
  
imports: from math import sqrt
  from typing import Any, Callable, Optional
  import numpy
  import tensorflow
  from check_shapes import check_shapes, inherit_check_shapes
  from ..None import logdensities
  from ..base import MeanAndVariance, TensorType
  from ..config import default_likelihood_positive_minimum
  from ..utilities.parameter_or_function import ConstantOrFunction, ParameterOrFunction, evaluate_parameter_or_function, prepare_parameter_or_function
  from .base import ScalarLikelihood
  from .utils import inv_probit
label_desc: Use image node_id 1 to create a new Gaussian object from inherited base classes: ScalarLikelihood with example: obj = Gaussian(variance)