code: def _do_lumping(self):
          
  
          # Extract non-perron eigenvectors
          right_eigenvectors = self.right_eigenvectors_[:, 1:]
  
          assert self.n_states_ > 0
          microstate_mapping = np.zeros(self.n_states_, dtype=int)
  
          def spread(x):
              return x.max() - x.min()
  
          for i in range(self.n_macrostates - 1):
              v = right_eigenvectors[:, i]
              all_spreads = np.array([spread(v[microstate_mapping == k])
                                      for k in range(i + 1)])
              state_to_split = np.argmax(all_spreads)
              inds = ((microstate_mapping == state_to_split) &
                      (v >= self.pcca_tolerance))
              microstate_mapping[inds] = i + 1
  
          self.microstate_mapping_ = microstate_mapping
docs: Do the PCCA lumping.
  
          Notes
          -------
          1.  Iterate over the eigenvectors, starting with the slowest.
          2.  Calculate the spread of that eigenvector within each existing
              macrostate.
          3.  Pick the macrostate with the largest eigenvector spread.
          4.  Split the macrostate based on the sign of the eigenvector.