class_docstr: Class for the Fisher information metric on Gamma distributions.
  
  References
  ----------
  .. [AD2008] Arwini, K. A., & Dodson, C. T. (2008).
      Information geometry (pp. 31-54). Springer Berlin Heidelberg.
class_docstr_tok: ["Class","for","the","Fisher","information","metric","on","Gamma","distributions",".","References","--","--","--","--","--","..","[","AD2008","]","Arwini",",","K.","A.",",","&","Dodson",",","C.","T.","(","2008",")",".","Information","geometry","(","pp",".","31-54",")",".","Springer","Berlin","Heidelberg","."]
docstr: Compute the Jacobian of the Christoffel symbols.
  
  Compute the Jacobian of the Christoffel symbols of the
  Fisher information metric.
  
  For computation purposes, we replace the value of
  (gs.polygamma(1, x) - 1/x) and (gs.polygamma(2,x) + 1/x**2) by an equivalent
  (close bounds) when they become too difficult to compute.
  
  References
  ----------
  ..[GQ2015] Guo, B. N., Qi, F., Zhao, J. L., & Luo, Q. M. (2015).
      Sharp inequalities for polygamma functions.
      Mathematica Slovaca, 65(1), 103-120.
  
  Parameters
  ----------
  base_point : array-like, shape=[..., 2]
      Base point.
  
  Returns
  -------
  jac : array-like, shape=[..., 2, 2, 2, 2]
      Jacobian of the Christoffel symbols.
      :math:`jac[..., i, j, k, l] = dGamma^i_{jk} / dx_l`
docstr_tok: ["Compute","the","Jacobian","of","the","Christoffel","symbols",".","Compute","the","Jacobian","of","the","Christoffel","symbols","of","the","Fisher","information","metric",".","For","computation","purposes",",","we","replace","the","value","of","(","gs.polygamma","(","1",",","x",")","-","1\/x",")","and","(","gs.polygamma","(","2",",","x",")","+","1\/x","*","*","2",")","by","an","equivalent","(","close","bounds",")","when","they","become","too","difficult","to","compute",".","References","--","--","--","--","--","..","[","GQ2015","]","Guo",",","B.","N.",",","Qi",",","F.",",","Zhao",",","J.","L.",",","&","Luo",",","Q.","M.","(","2015",")",".","Sharp","inequalities","for","polygamma","functions",".","Mathematica","Slovaca",",","65","(","1",")",",","103-120",".","Parameters","--","--","--","--","--","base_point",":","array-like",",","shape=","[","...",",","2","]","Base","point",".","Returns","--","--","--","-","jac",":","array-like",",","shape=","[","...",",","2",",","2",",","2",",","2","]","Jacobian","of","the","Christoffel","symbols",".",":","math",":","`","jac","[","...",",","i",",","j",",","k",",","l","]","=","dGamma^i_","{","jk","}","\/","dx_l","`"]
code: def jacobian_christoffels(self, base_point):
      """Compute the Jacobian of the Christoffel symbols.
  
      Compute the Jacobian of the Christoffel symbols of the
      Fisher information metric.
  
      For computation purposes, we replace the value of
      (gs.polygamma(1, x) - 1/x) and (gs.polygamma(2,x) + 1/x**2) by an equivalent
      (close bounds) when they become too difficult to compute.
  
      References
      ----------
      ..[GQ2015] Guo, B. N., Qi, F., Zhao, J. L., & Luo, Q. M. (2015).
          Sharp inequalities for polygamma functions.
          Mathematica Slovaca, 65(1), 103-120.
  
      Parameters
      ----------
      base_point : array-like, shape=[..., 2]
          Base point.
  
      Returns
      -------
      jac : array-like, shape=[..., 2, 2, 2, 2]
          Jacobian of the Christoffel symbols.
          :math:`jac[..., i, j, k, l] = dGamma^i_{jk} / dx_l`
      """
      base_point = gs.to_ndarray(base_point, 2)
  
      n_points = base_point.shape[0]
  
      kappa, gamma = base_point[:, 0], base_point[:, 1]
  
      term_0 = gs.zeros((n_points))
      term_1 = 1 / gamma**2
      term_2 = gs.where(
          gs.polygamma(1, kappa) - 1 / kappa > gs.atol,
          kappa / (gamma**3 * (kappa * gs.polygamma(1, kappa) - 1)),
          kappa**2 / gamma**3,
      )
      term_3 = -1 / (2 * kappa**2)
      term_4 = gs.where(
          gs.polygamma(1, kappa) - 1 / kappa > gs.atol,
          (kappa**2 * gs.polygamma(2, kappa) + 1)
          / (
              2 * gamma**2 * (kappa * gs.polygamma(1, kappa) - 1) ** 2
          ),
          (kappa**4 * gs.polygamma(2, kappa) + kappa**2)
          / (2 * gamma**2),
      )
      term_5 = gs.where(
          gs.polygamma(1, kappa) - 1 / kappa > gs.atol,
          (
              kappa**4
              * (
                  gs.polygamma(1, kappa) * gs.polygamma(3, kappa)
                  - gs.polygamma(2, kappa) ** 2
              )
              - kappa**3 * gs.polygamma(3, kappa)
              - 2 * kappa**2 * gs.polygamma(2, kappa)
              - 2 * kappa * gs.polygamma(1, kappa)
              + 1
          )
          / (2 * (kappa**2 * gs.polygamma(1, kappa) - kappa) ** 2),
          0.5
          * (
              kappa**4
              * (
                  gs.polygamma(1, kappa) * gs.polygamma(3, kappa)
                  - gs.polygamma(2, kappa) ** 2
              )
              - kappa**3 * gs.polygamma(3, kappa)
              - 2 * kappa**2 * gs.polygamma(2, kappa)
              - 2 * kappa * gs.polygamma(1, kappa)
              + 1
          ),
      )
  
      jac = gs.array(
          [
              [
                  [[term_5, term_0], [term_0, term_0]],
                  [[term_0, term_0], [term_4, term_2]],
              ],
              [
                  [[term_0, term_0], [term_3, term_0]],
                  [[term_3, term_0], [term_0, term_1]],
              ],
          ]
      )
  
      if n_points > 1:
          jac = gs.transpose(jac, [4, 0, 1, 2, 3])
  
      return gs.squeeze(jac)
  
imports: from scipy.stats import gamma
  import geomstats.backend
  from geomstats.algebra_utils import from_vector_to_diagonal_matrix
  from geomstats.geometry.base import VectorSpaceOpenSet
  from geomstats.geometry.euclidean import Euclidean
  from geomstats.geometry.riemannian_metric import RiemannianMetric
  from geomstats.information_geometry.base import InformationManifoldMixin, ScipyUnivariateRandomVariable
  from geomstats.numerics.bvp import ScipySolveBVP
  from geomstats.numerics.geodesic import ExpODESolver, LogODESolver
  from geomstats.numerics.ivp import ScipySolveIVP
  from geomstats.vectorization import check_is_batch
label_desc: Use image node_id 4 for calling the GammaMetric obj's underlying member method code with example usage: obj.jacobian_christoffels(base_point) and returns: gs