docs: def split_param_vec(param_vec, rows_to_alts, design, return_all_types=False):
      """
      Parameters
      ----------
      param_vec : 1D ndarray.
          Elements should all be ints, floats, or longs. Should have as many
          elements as there are parameters being estimated.
      rows_to_alts : 2D scipy sparse matrix.
          There should be one row per observation per available alternative and
          one column per possible alternative. This matrix maps the rows of the
          design matrix to the possible alternatives for this dataset. All
          elements should be zeros or ones.
      design : 2D ndarray.
          There should be one row per observation per available alternative.
          There should be one column per utility coefficient being estimated. All
          elements should be ints, floats, or longs.
      return_all_types : bool, optional.
          Determines whether or not a tuple of 4 elements will be returned (with
          one element for the nest, shape, intercept, and index parameters for
          this model). If False, a tuple of 3 elements will be returned, as
          described below.
  
      Returns
      -------
      `(None, intercepts, betas)` : tuple.
          The first element will be None since the clog-log model has no shape
          parameters. The second element will either be a 1D array of "outside"
          intercept parameters for this model or None, depending on whether
          outside intercepts are being estimated or not. The third element will
          be a 1D array of the index coefficients.
  
      Note
      ----
      If `return_all_types == True` then the function will return a tuple of four
      objects. In order, these objects will either be None or the arrays
      representing the arrays corresponding to the nest, shape, intercept, and
      index parameters.
      """
      # Figure out how many parameters are in the index
      num_index_coefs = design.shape[1]
  
      # Isolate the initial shape parameters from the betas
      betas = param_vec[-1 * num_index_coefs:]
  
      # Get the remaining outside intercepts if there are any
      remaining_idx = param_vec.shape[0] - num_index_coefs
      if remaining_idx > 0:
          intercepts = param_vec[:remaining_idx]
      else:
          intercepts = None
  
      if return_all_types:
          return None, None, intercepts, betas
      else:
          return None, intercepts, betas