code: def uncertainty_eigenvalues(self):
          
          if self.reversible_type is None:
              raise NotImplementedError('reversible_type must be "mle" or "transpose"')
  
          n_timescales = min(self.n_timescales if self.n_timescales is not None
                             else self.n_states_ - 1, self.n_states_ - 1)
  
          u, lv, rv = self._get_eigensystem()
  
          sigma2 = np.zeros(n_timescales + 1)
          for k in range(n_timescales + 1):
              dLambda_dT = np.outer(lv[:, k], rv[:, k])
              for i in range(self.n_states_):
                  ui = self.countsmat_[:, i]
                  wi = np.sum(ui)
                  cov = wi*np.diag(ui) - np.outer(ui, ui)
                  quad_form = dLambda_dT[i].dot(cov).dot(dLambda_dT[i])
                  sigma2[k] += quad_form / (wi**2*(wi+1))
          return np.sqrt(sigma2)
docs: Estimate of the element-wise asymptotic standard deviation
          in the model eigenvalues.
  
          Returns
          -------
          sigma_eigs : np.array, shape=(n_timescales+1,)
              The estimated symptotic standard deviation in the eigenvalues.
  
          References
          ----------
          .. [1] Hinrichs, Nina Singhal, and Vijay S. Pande. "Calculation of
             the distribution of eigenvalues and eigenvectors in Markovian state
             models for molecular dynamics." J. Chem. Phys. 126.24 (2007): 244101.