docstr: Compute the Riemannian logarithm of a point.
  
  When p=n, the space St(n,n)~O(n) has two non connected sheets: the
  log is only defined for data from the same sheet.
  For p<n, the space St(n,p)~O(n)/O(n-p)~SO(n)/SO(n-p) is connected.
  Based on [ZR2017]_.
  
  References
  ----------
  .. [ZR2017] Zimmermann, Ralf. "A Matrix-Algebraic Algorithm for the
      Riemannian Logarithm on the Stiefel Manifold under the Canonical
      Metric" SIAM J. Matrix Anal. & Appl., 38(2), 322–342, 2017.
      https://arxiv.org/pdf/1604.05054.pdf
  
  Parameters
  ----------
  point : array-like, shape=[..., n, p]
      Point in the Stiefel manifold.
  base_point : array-like, shape=[..., n, p]
      Point in the Stiefel manifold.
  max_iter: int
      Maximum number of iterations to perform during the algorithm.
      Optional, default: 30.
  tol: float
      Tolerance to reach convergence. The matrix 2-norm is used as
      criterion.
      Optional, default: 1e-6.
  
  Returns
  -------
  log : array-like, shape=[..., n, p]
      Tangent vector at the base point equal to the Riemannian logarithm
      of point at the base point.
code: def log(self, space, point, base_point):
      """Compute the Riemannian logarithm of a point.
  
      When p=n, the space St(n,n)~O(n) has two non connected sheets: the
      log is only defined for data from the same sheet.
      For p<n, the space St(n,p)~O(n)/O(n-p)~SO(n)/SO(n-p) is connected.
      Based on [ZR2017]_.
  
      References
      ----------
      .. [ZR2017] Zimmermann, Ralf. "A Matrix-Algebraic Algorithm for the
          Riemannian Logarithm on the Stiefel Manifold under the Canonical
          Metric" SIAM J. Matrix Anal. & Appl., 38(2), 322–342, 2017.
          https://arxiv.org/pdf/1604.05054.pdf
  
      Parameters
      ----------
      point : array-like, shape=[..., n, p]
          Point in the Stiefel manifold.
      base_point : array-like, shape=[..., n, p]
          Point in the Stiefel manifold.
      max_iter: int
          Maximum number of iterations to perform during the algorithm.
          Optional, default: 30.
      tol: float
          Tolerance to reach convergence. The matrix 2-norm is used as
          criterion.
          Optional, default: 1e-6.
  
      Returns
      -------
      log : array-like, shape=[..., n, p]
          Tangent vector at the base point equal to the Riemannian logarithm
          of point at the base point.
      """
      n, p = space.n, space.p
      if p == n:
          det_point = gs.linalg.det(point)
          det_base_point = gs.linalg.det(base_point)
          if not gs.all(det_point * det_base_point > 0.0):
              raise ValueError("Points from different sheets in log")
  
      transpose_base_point = Matrices.transpose(base_point)
      matrix_m = gs.matmul(transpose_base_point, point)
  
      matrix_q, matrix_n = self._normal_component_qr(
          point, base_point, matrix_m
      )
  
      matrix_v = self._orthogonal_completion(matrix_m, matrix_n)
      matrix_v = self._procrustes_preprocessing(
          p, matrix_v, matrix_m, matrix_n
      )
  
      matrix_lv = (
          self._iter_log(p, matrix_v)
          if gs.ndim(matrix_v) == 2
          else gs.stack([self._iter_log(p, x) for x in matrix_v])
      )
  
      matrix_xv = gs.matmul(base_point, matrix_lv[..., :p, :p])
      matrix_qv = gs.matmul(matrix_q, matrix_lv[..., p:, :p])
  
      return matrix_xv + matrix_qv
  
imports: import warnings
  import geomstats.backend
  import geomstats.errors
  from geomstats import algebra_utils
  from geomstats.geometry.base import LevelSet
  from geomstats.geometry.hermitian_matrices import powermh
  from geomstats.geometry.matrices import Matrices
  from geomstats.geometry.riemannian_metric import RiemannianMetric
  from geomstats.vectorization import repeat_out
label_desc: Use image node_id 5 for calling the _StiefelLogSolver obj's underlying member method code with example usage: obj.log(space, point, base_point) and returns: unknown