def METHOD_NAME(
    self,
    fun: Union[Callable[..., tf.Tensor], Iterable[Callable[..., tf.Tensor]]],
    mean: TensorType,
    var: TensorType,
    *args: Any,
    **kwargs: Any,
) -> tf.Tensor:
    r"""
    Compute the Gaussian log-Expectation of a the exponential of a function f::
        X ~ N(mean, var)
        log E[exp[f(X)]] = log ∫exp[f(x, *args, **kwargs)]p(x)dx
    Using the formula::
        log E[exp[f(X)]] = log sum_{i=1}^{N_quad_points} exp[f(x_i) + log w_i]
    where x_i, w_i must be provided by the inheriting class through self._build_X_W.
    The computations broadcast along batch-dimensions, represented by [batch...].
    :param fun: Callable or Iterable of Callables that operates elementwise, with
        signature f(X, \*args, \*\*kwargs). Moreover, it must satisfy the shape-mapping::
            X shape: [N_quad_points, batch..., d].
            f(X) shape: [N_quad_points, batch..., broadcast d].
        In most cases, f should only operate over the last dimension of X
    :param mean: Array/Tensor representing the mean of a d-Variate Gaussian distribution
    :param var: Array/Tensor representing the variance of a d-Variate Gaussian distribution
    :param args: Passed to fun
    :param kwargs: Passed to fun
    :return: Gaussian log-expectation of the exponential of a function f
    """
    X, W = self._build_X_W(mean, var)
    logW = tf.math.log(W)
    if isinstance(fun, Iterable):
        return [tf.reduce_logsumexp(f(X, *args, **kwargs) + logW, axis=0) for f in fun]
    return tf.reduce_logsumexp(fun(X, *args, **kwargs) + logW, axis=0)