docs: def _generate_branching_index(self):
          '''
          Generates a branching index (i.e. a list indicating the number of
          branches in each branching level. Current branching levels are:
          1) Slip
          2) MSR
          3) Shear Modulus
          4) DLR
          5) MSR_Sigma
          6) Config
  
          :returns:
              * branch_index - A 2-D numpy.ndarray where each row is a pointer
              to a particular combination of values
              * number_branches - Total number of branches (int)
  
          '''
          branch_count = np.array([len(self.slip),
                                   len(self.msr),
                                   len(self.shear_modulus),
                                   len(self.disp_length_ratio),
                                   len(self.msr_sigma),
                                   len(self.config)])
          n_levels = len(branch_count)
          number_branches = np.prod(branch_count)
          branch_index = np.zeros([number_branches, n_levels], dtype=int)
          cumval = 1
          dstep = 1E-9
          for iloc in range(0, n_levels):
              idx = np.linspace(0.,
                                float(branch_count[iloc]) - dstep,
                                number_branches // cumval)
              branch_index[:, iloc] = np.reshape(np.tile(idx, [cumval, 1]),
                                                 number_branches)
              cumval *= branch_count[iloc]
  
          return branch_index.tolist(), number_branches