docstr: Logarithm map.
  
  Parameters
  ----------
  space : Manifold
      Equipped manifold.
  end_point : array-like, shape=[*space.shape]
      Point on the manifold.
  base_point : array-like, shape=[*space.shape]
      Point on the manifold.
  
  Returns
  -------
  tangent_vec : array-like, shape=[*space.shape]
      Tangent vector at the base point.
code: def _log_single(self, space, point, base_point):
      """Logarithm map.
  
      Parameters
      ----------
      space : Manifold
          Equipped manifold.
      end_point : array-like, shape=[*space.shape]
          Point on the manifold.
      base_point : array-like, shape=[*space.shape]
          Point on the manifold.
  
      Returns
      -------
      tangent_vec : array-like, shape=[*space.shape]
          Tangent vector at the base point.
      """
      objective = lambda velocity: self._objective(
          velocity, space, point, base_point
      )
      init_tangent_vec = self.initialization(space, point, base_point)
  
      res = self.optimizer.minimize(
          objective, gs.flatten(init_tangent_vec)
      )
  
      if space.point_ndim > 1:
          return gs.reshape(res.x, space.shape)
  
      return res.x
  
imports: import math
  from abc import ABC, abstractmethod
  import geomstats.backend
  from geomstats.numerics.bvp import ScipySolveBVP
  from geomstats.numerics.ivp import GSIVPIntegrator
  from geomstats.numerics.optimizers import ScipyMinimize
  from geomstats.vectorization import get_batch_shape
label_desc: Use image node_id 4 for calling the _LogShootingSolverUnflatten obj's underlying member method code with example usage: obj._log_single(space, point, base_point) and returns: res, gs