class_docstr: Class for the Fisher information metric on Dirichlet distributions.
class_docstr_tok: ["Class","for","the","Fisher","information","metric","on","Dirichlet","distributions","."]
docstr: Compute the Jacobian of the Christoffel symbols.
  
  Compute the Jacobian of the Christoffel symbols of the
  Fisher information metric.
  
  Parameters
  ----------
  base_point : array-like, shape=[..., dim]
      Base point.
  
  Returns
  -------
  jac : array-like, shape=[..., dim, dim, dim, dim]
      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",".","Parameters","--","--","--","--","--","base_point",":","array-like",",","shape=","[","...",",","dim","]","Base","point",".","Returns","--","--","--","-","jac",":","array-like",",","shape=","[","...",",","dim",",","dim",",","dim",",","dim","]","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.
  
      Parameters
      ----------
      base_point : array-like, shape=[..., dim]
          Base point.
  
      Returns
      -------
      jac : array-like, shape=[..., dim, dim, dim, dim]
          Jacobian of the Christoffel symbols.
          :math:`jac[..., i, j, k, l] = dGamma^i_{jk} / dx_l`
      """
      dim = self._space.dim
      n_dim = base_point.ndim
      param = gs.transpose(base_point)
      sum_param = gs.sum(param, 0)
      term_1 = 1 / gs.polygamma(1, param)
      term_2 = 1 / gs.polygamma(1, sum_param)
      term_3 = -gs.polygamma(2, param) / gs.polygamma(1, param) ** 2
      term_4 = (
          -gs.polygamma(2, sum_param) / gs.polygamma(1, sum_param) ** 2
      )
      term_5 = term_3 / term_1
      term_6 = term_4 / term_2
      term_7 = (
          gs.polygamma(2, param) ** 2
          - gs.polygamma(1, param) * gs.polygamma(3, param)
      ) / gs.polygamma(1, param) ** 2
      term_8 = (
          gs.polygamma(2, sum_param) ** 2
          - gs.polygamma(1, sum_param) * gs.polygamma(3, sum_param)
      ) / gs.polygamma(1, sum_param) ** 2
      term_9 = term_2 - gs.sum(term_1, 0)
  
      jac_1 = term_1 * term_8 / term_9
      jac_1_mat = gs.squeeze(gs.tile(jac_1, (dim, dim, dim, 1, 1)))
      jac_2 = (
          -term_6
          / term_9**2
          * gs.einsum("j...,i...->ji...", term_4 - term_3, term_1)
      )
      jac_2_mat = gs.squeeze(gs.tile(jac_2, (dim, dim, 1, 1, 1)))
      jac_3 = term_3 * term_6 / term_9
      jac_3_mat = gs.transpose(
          from_vector_to_diagonal_matrix(gs.transpose(jac_3))
      )
      jac_3_mat = gs.squeeze(gs.tile(jac_3_mat, (dim, dim, 1, 1, 1)))
      jac_4 = (
          1
          / term_9**2
          * gs.einsum(
              "k...,j...,i...->kji...", term_5, term_4 - term_3, term_1
          )
      )
      jac_4_mat = gs.transpose(
          from_vector_to_diagonal_matrix(gs.transpose(jac_4))
      )
      jac_5 = -gs.einsum("j...,i...->ji...", term_7, term_1) / term_9
      jac_5_mat = from_vector_to_diagonal_matrix(gs.transpose(jac_5))
      jac_5_mat = gs.transpose(
          from_vector_to_diagonal_matrix(jac_5_mat)
      )
      jac_6 = -gs.einsum("k...,j...->kj...", term_5, term_3) / term_9
      jac_6_mat = gs.transpose(
          from_vector_to_diagonal_matrix(gs.transpose(jac_6))
      )
      jac_6_mat = (
          gs.transpose(
              from_vector_to_diagonal_matrix(
                  gs.transpose(jac_6_mat, [0, 1, 3, 2])
              ),
              [0, 1, 3, 4, 2],
          )
          if n_dim > 1
          else from_vector_to_diagonal_matrix(jac_6_mat)
      )
      jac_7 = -from_vector_to_diagonal_matrix(gs.transpose(term_7))
      jac_7_mat = from_vector_to_diagonal_matrix(jac_7)
      jac_7_mat = gs.transpose(
          from_vector_to_diagonal_matrix(jac_7_mat)
      )
  
      jac = (
          1
          / 2
          * (
              jac_1_mat
              + jac_2_mat
              + jac_3_mat
              + jac_4_mat
              + jac_5_mat
              + jac_6_mat
              + jac_7_mat
          )
      )
  
      return (
          gs.transpose(jac, [3, 1, 0, 2])
          if n_dim == 1
          else gs.transpose(jac, [4, 3, 1, 0, 2])
      )
  
imports: import math
  import numpy
  from scipy.optimize import minimize
  from scipy.stats import dirichlet
  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, ScipyMultivariateRandomVariable
  from geomstats.numerics.bvp import ScipySolveBVP
  from geomstats.numerics.geodesic import ExpODESolver, LogODESolver
  from geomstats.numerics.ivp import ScipySolveIVP
  from geomstats.vectorization import repeat_out
label_desc: Use image node_id 4 for calling the DirichletMetric obj's underlying member method code with example usage: obj.jacobian_christoffels(base_point) and returns: unknown