docs: def _apply(self, a, return_Ya=False):
          r'''Single application of the projection.
  
          :param a: array with ``a.shape==(N,m)``.
          :param return_inner: (optional) should the inner product
            :math:`\langle Y,a\rangle` be returned?
          :return:
  
            * :math:`P_{\mathcal{X},\mathcal{Y}^\perp} a =
              X \langle Y,X\rangle^{-1} \langle Y, a\rangle`.
            * :math:`\langle Y,a\rangle` if ``return_inner==True``.
          '''
          # is projection the zero operator?
          if self.V.shape[1] == 0:
              Pa = numpy.zeros(a.shape)
              if return_Ya:
                  return Pa, numpy.zeros((0, a.shape[1]))
              return Pa
          c = inner(self.W, a, ip_B=self.ip_B)
  
          if return_Ya:
              Ya = c.copy()
              if self.WR is not None:
                  Ya = self.WR.T.conj().dot(Ya)
  
          if self.Q is not None and self.R is not None:
              c = scipy.linalg.solve_triangular(self.R, self.Q.T.conj().dot(c))
          Pa = self.V.dot(c)
          if return_Ya:
              return Pa, Ya
          return Pa