class_docstr: Class for Grassmann manifolds :math:`Gr(n, p)`.
  
  Parameters
  ----------
  n : int
      Dimension of the Euclidean space.
  p : int
      Dimension of the subspaces.
docstr: Submersion that defines the Grassmann manifold.
  
  The Grassmann manifold is defined here as embedded in the set of
  symmetric matrices, as the pre-image of the function defined around the
  projector on the space spanned by the first :math:`p` columns of the identity
  matrix by (see Exercise E.25 in [Pau07]_).
  
  .. math::
  
      \begin{pmatrix} I_p + A & B^T \\ B & D \end{pmatrix} \mapsto
          (D - B(I_p + A)^{-1}B^T, A + A^2 + B^TB)
  
  This map is a submersion and its zero space is the set of orthogonal
  rank-:math:`p` projectors.
  
  Parameters
  ----------
  point : array-like, shape=[..., n, n]
  
  Returns
  -------
  submersed_point : array-like, shape=[..., n, n]
  
  References
  ----------
  .. [Pau07] Paulin, Frédéric. “Géométrie diﬀérentielle élémentaire,” 2007.
      https://www.imo.universite-paris-saclay.fr/~paulin/notescours/
      cours_geodiff.pdf.
docstr_tok: ["Submersion","that","defines","the","Grassmann","manifold",".","The","Grassmann","manifold","is","defined","here","as","embedded","in","the","set","of","symmetric","matrices",",","as","the","pre-image","of","the","function","defined","around","the","projector","on","the","space","spanned","by","the","first",":","math",":","`","p","`","columns","of","the","identity","matrix","by","(","see","Exercise","E.25","in","[","Pau07","]","_",")",".","..","math",":",":","\\begin","{","pmatrix","}","I_p","+","A","&","B^T","\\\\","B","&","D","\\end","{","pmatrix","}","\\mapsto","(","D","-","B","(","I_p","+","A",")","^","{","-1","}","B^T",",","A","+","A^2","+","B^TB",")","This","map","is","a","submersion","and","its","zero","space","is","the","set","of","orthogonal","rank-",":","math",":","`","p","`","projectors",".","Parameters","--","--","--","--","--","point",":","array-like",",","shape=","[","...",",","n",",","n","]","Returns","--","--","--","-","submersed_point",":","array-like",",","shape=","[","...",",","n",",","n","]","References","--","--","--","--","--","..","[","Pau07","]","Paulin",",","Fr\u00e9d\u00e9ric",".","\u201c","G\u00e9om\u00e9trie","di\ufb00\u00e9rentielle","\u00e9l\u00e9mentaire",",","\u201d","2007.","https",":","\/\/www.imo.universite-paris-saclay.fr\/~paulin\/notescours\/","cours_geodiff.pdf","."]
code: def submersion(self, point):
      r"""Submersion that defines the Grassmann manifold.
  
      The Grassmann manifold is defined here as embedded in the set of
      symmetric matrices, as the pre-image of the function defined around the
      projector on the space spanned by the first :math:`p` columns of the identity
      matrix by (see Exercise E.25 in [Pau07]_).
  
      .. math::
  
          \begin{pmatrix} I_p + A & B^T \\ B & D \end{pmatrix} \mapsto
              (D - B(I_p + A)^{-1}B^T, A + A^2 + B^TB)
  
      This map is a submersion and its zero space is the set of orthogonal
      rank-:math:`p` projectors.
  
      Parameters
      ----------
      point : array-like, shape=[..., n, n]
  
      Returns
      -------
      submersed_point : array-like, shape=[..., n, n]
  
      References
      ----------
      .. [Pau07] Paulin, Frédéric. “Géométrie diﬀérentielle élémentaire,” 2007.
          https://www.imo.universite-paris-saclay.fr/~paulin/notescours/
          cours_geodiff.pdf.
      """
      p = self.p
  
      _, eigvecs = gs.linalg.eigh(point)
      eigvecs = gs.flip(eigvecs, -1)
      flipped_point = Matrices.mul(
          Matrices.transpose(eigvecs), point, eigvecs
      )
      b = flipped_point[..., p:, :p]
      d = flipped_point[..., p:, p:]
      a = flipped_point[..., :p, :p] - gs.eye(p)
      first = d - Matrices.mul(
          b, GeneralLinear.inverse(a + gs.eye(p)), Matrices.transpose(b)
      )
      second = (
          a
          + Matrices.mul(a, a)
          + Matrices.mul(Matrices.transpose(b), b)
      )
      row_1 = gs.concatenate([first, gs.zeros_like(b)], axis=-1)
      row_2 = gs.concatenate(
          [Matrices.transpose(gs.zeros_like(b)), second], axis=-1
      )
      return gs.concatenate([row_1, row_2], axis=-2)
  
imports: import geomstats.backend
  import geomstats.errors
  from geomstats.geometry.base import LevelSet
  from geomstats.geometry.general_linear import GeneralLinear
  from geomstats.geometry.matrices import Matrices, MatricesMetric
  from geomstats.geometry.symmetric_matrices import SymmetricMatrices
  from geomstats.vectorization import repeat_out
label_desc: Use image node_id 4 for calling the Grassmannian obj's underlying member method code with example usage: obj.submersion(point) and returns: gs