code: def coarsegrain(F, sets):
      r
      if issparse(F):
          return sparse.tpt.coarsegrain(F, sets)
      elif isdense(F):
          return dense.tpt.coarsegrain(F, sets)
      else:
          raise _type_not_supported
docs: r"""Coarse-grains the flux to the given sets.
  
      Parameters
      ----------
      F : (n, n) ndarray or scipy.sparse matrix
          Matrix of flux values between pairs of states.
      sets : list of array-like of ints
          The sets of states onto which the flux is coarse-grained.
  
      Notes
      -----
      The coarse grained flux is defined as
  
      .. math:: fc_{I,J} = \sum_{i \in I,j \in J} f_{i,j}
  
      Note that if you coarse-grain a net flux, it does n ot necessarily
      have a net flux property anymore. If want to make sure you get a
      netflux, use to_netflux(coarsegrain(F,sets)).
  
      References
      ----------
      .. [1] F. Noe, Ch. Schuette, E. Vanden-Eijnden, L. Reich and
          T. Weikl: Constructing the Full Ensemble of Folding Pathways
          from Short Off-Equilibrium Simulations.
          Proc. Natl. Acad. Sci. USA, 106, 19011-19016 (2009)