class_docstr: Class that defines operations using a Poincare ball.
class_docstr_tok: ["Class","that","defines","operations","using","a","Poincare","ball","."]
docstr: Return normalization factor of the Gaussian distribution.
  
  Parameters
  ----------
  variances : array-like, shape=[n,]
      Array of equally distant values of the
      variance precision time.
  
  Returns
  -------
  norm_func : array-like, shape=[n,]
      Normalisation factor for all given variances.
docstr_tok: ["Return","normalization","factor","of","the","Gaussian","distribution",".","Parameters","--","--","--","--","--","variances",":","array-like",",","shape=","[","n",",","]","Array","of","equally","distant","values","of","the","variance","precision","time",".","Returns","--","--","--","-","norm_func",":","array-like",",","shape=","[","n",",","]","Normalisation","factor","for","all","given","variances","."]
code: def normalization_factor(self, variances):
      """Return normalization factor of the Gaussian distribution.
  
      Parameters
      ----------
      variances : array-like, shape=[n,]
          Array of equally distant values of the
          variance precision time.
  
      Returns
      -------
      norm_func : array-like, shape=[n,]
          Normalisation factor for all given variances.
      """
      dim = self._space.dim
      binomial_coefficient = None
      n_samples = variances.shape[0]
  
      expand_variances = gs.expand_dims(variances, axis=0)
      expand_variances = gs.repeat(expand_variances, dim, axis=0)
  
      if binomial_coefficient is None:
          dim_range = gs.arange(dim)
          dim_range[0] = 1
          n_fact = dim_range.prod()
  
          k_fact = gs.concatenate(
              [
                  gs.expand_dims(dim_range[:i].prod(), 0)
                  for i in range(1, dim_range.shape[0] + 1)
              ],
              0,
          )
  
          nmk_fact = gs.flip(k_fact, 0)
  
          binomial_coefficient = n_fact / (k_fact * nmk_fact)
  
      binomial_coefficient = gs.expand_dims(binomial_coefficient, -1)
      binomial_coefficient = gs.repeat(
          binomial_coefficient, n_samples, axis=1
      )
  
      range_ = gs.expand_dims(gs.arange(dim), -1)
      range_ = gs.repeat(range_, n_samples, axis=1)
  
      ones_ = gs.expand_dims(gs.ones(dim), -1)
      ones_ = gs.repeat(ones_, n_samples, axis=1)
  
      alternate_neg = (-ones_) ** (range_)
  
      erf_arg = (((dim - 1) - 2 * range_) * expand_variances) / gs.sqrt(
          2
      )
      exp_arg = (
          (((dim - 1) - 2 * range_) * expand_variances) / gs.sqrt(2)
      ) ** 2
      norm_func_1 = (1 + gs.erf(erf_arg)) * gs.exp(exp_arg)
      norm_func_2 = binomial_coefficient * norm_func_1
      norm_func_3 = alternate_neg * norm_func_2
  
      norm_func = (
          NORMALIZATION_FACTOR_CST
          * variances
          * norm_func_3.sum(0)
          * (1 / (2 ** (dim - 1)))
      )
  
      return norm_func
  
imports: import math
  import geomstats.algebra_utils
  import geomstats.backend
  from geomstats.geometry._hyperbolic import _Hyperbolic
  from geomstats.geometry.base import VectorSpaceOpenSet
  from geomstats.geometry.euclidean import Euclidean
  from geomstats.geometry.riemannian_metric import RiemannianMetric
  from geomstats.vectorization import repeat_out
label_desc: Use image node_id 8 for calling the PoincareBallMetric obj's underlying member method code with example usage: obj.normalization_factor(variances) and returns: norm_func