code: def coarse_grain(coarse_grain):
      
      partition(coarse_grain.partition)
  
      if len(coarse_grain.partition) != len(coarse_grain.grouping):
          raise ValueError('output and state groupings must be the same size')
  
      for part, group in zip(coarse_grain.partition, coarse_grain.grouping):
          if set(range(len(part) + 1)) != set(group[0] + group[1]):
              # Check that all elements in the partition are in one of the two
              # state groupings
              raise ValueError('elements in output grouping {0} do not match '
                               'elements in state grouping {1}'.format(
                                   part, group))
docs: Validate a macro coarse-graining.