code: def _diagonalize(self):
          
          L0 = spd_inv_split(self.C00, epsilon=self.epsilon)
          self._rank0 = L0.shape[1] if L0.ndim == 2 else 1
          Lt = spd_inv_split(self.Ctt, epsilon=self.epsilon)
          self._rankt = Lt.shape[1] if Lt.ndim == 2 else 1
  
          W = np.dot(L0.T, self.C0t).dot(Lt)
          from scipy.linalg import svd
          A, s, BT = svd(W, compute_uv=True, lapack_driver='gesvd')
  
          self._singular_values = s
  
          # don't pass any values in the argument list that call _diagonalize again!!!
          m = VAMPModel._dimension(self._rank0, self._rankt, self.dim, self._singular_values)
  
          U = np.dot(L0, A[:, :m])
          V = np.dot(Lt, BT[:m, :].T)
  
          # scale vectors
          if self.scaling is not None:
              U *= s[np.newaxis, 0:m]  # scaled left singular functions induce a kinetic map
              V *= s[np.newaxis, 0:m]  # scaled right singular functions induce a kinetic map wrt. backward propagator
  
          self._U = U
          self._V = V
          self._svd_performed = True
docs: Performs SVD on covariance matrices and save left, right singular vectors and values in the model.
  
          Parameters
          ----------
          scaling : None or string, default=None
              Scaling to be applied to the VAMP modes upon transformation
              * None: no scaling will be applied, variance of the singular
                functions is 1
              * 'kinetic map' or 'km': singular functions are scaled by
                singular value. Note that only the left singular functions
                induce a kinetic map.