class_docstr: Class to solve the boundary value problem (BVP) for exp.
class_docstr_tok: ["Class","to","solve","the","boundary","value","problem","(","BVP",")","for","exp","."]
docstr: Compute logarithm map associated to the Riemannian metric.
  
  Solve the boundary value problem associated to the geodesic equation
  using path straightening.
  
  Parameters
  ----------
  point : array-like, shape=[..., n_vertices,3]
      Point on the manifold.
  base_point : array-like, shape=[..., n_vertices,3]
      Point on the manifold.
  
  Returns
  -------
  logs : array-like, shape=[..., n_vertices, 3]
      Tangent vector at the base point.
docstr_tok: ["Compute","logarithm","map","associated","to","the","Riemannian","metric",".","Solve","the","boundary","value","problem","associated","to","the","geodesic","equation","using","path","straightening",".","Parameters","--","--","--","--","--","point",":","array-like",",","shape=","[","...",",","n_vertices,3","]","Point","on","the","manifold",".","base_point",":","array-like",",","shape=","[","...",",","n_vertices,3","]","Point","on","the","manifold",".","Returns","--","--","--","-","logs",":","array-like",",","shape=","[","...",",","n_vertices",",","3","]","Tangent","vector","at","the","base","point","."]
code: def log(self, space, point, base_point):
      """Compute logarithm map associated to the Riemannian metric.
  
      Solve the boundary value problem associated to the geodesic equation
      using path straightening.
  
      Parameters
      ----------
      point : array-like, shape=[..., n_vertices,3]
          Point on the manifold.
      base_point : array-like, shape=[..., n_vertices,3]
          Point on the manifold.
  
      Returns
      -------
      logs : array-like, shape=[..., n_vertices, 3]
          Tangent vector at the base point.
      """
      if gs.__name__.endswith("autograd"):
          return (
              "This LogSolver works for the pytorch backend."
              "Change backend via the command "
              "export GEOMSTATS_BACKEND=pytorch in a terminal"
          )
  
      logs = []
      need_squeeze = False
      if point.ndim == 2:
          point = gs.expand_dims(point, axis=0)
          need_squeeze = True
      if base_point.ndim == 2:
          base_point = gs.expand_dims(base_point, axis=0)
          need_squeeze = True
      n_logs = gs.maximum(point.shape[0], base_point.shape[0])
      point = gs.broadcast_to(point, (n_logs,) + point.shape[1:])
      base_point = gs.broadcast_to(
          base_point, (n_logs,) + base_point.shape[1:]
      )
  
      for one_point, one_base_point in zip(point, base_point):
          geod = self._bvp(space, one_base_point, one_point)
          logs.append((geod[1] - geod[0]) * self.n_steps)
  
      logs = gs.array(logs)
      if need_squeeze:
          logs = gs.squeeze(logs, axis=0)
      return logs
  
imports: import math
  import geomstats.backend
  from geomstats.geometry.euclidean import Euclidean
  from geomstats.geometry.manifold import Manifold
  from geomstats.geometry.riemannian_metric import RiemannianMetric
  from geomstats.numerics.optimizers import ScipyMinimize
label_desc: Use image node_id 2 for calling the _LogSolver obj's underlying member method code with example usage: obj.log(space, point, base_point) and returns: logs, str