docs: def extract_default_init_vals(orig_model_obj, mnl_point_series, num_params):
      """
      Get the default initial values for the desired model type, based on the
      point estimate of the MNL model that is 'closest' to the desired model.
  
      Parameters
      ----------
      orig_model_obj : an instance or sublcass of the MNDC class.
          Should correspond to the actual model that we want to bootstrap.
      mnl_point_series : pandas Series.
          Should denote the point estimate from the MNL model that is 'closest'
          to the desired model.
      num_params : int.
          Should denote the number of parameters being estimated (including any
          parameters that are being constrained during estimation).
  
      Returns
      -------
      init_vals : 1D ndarray of initial values for the MLE of the desired model.
      """
      # Initialize the initial values
      init_vals = np.zeros(num_params, dtype=float)
      # Figure out which values in mnl_point_series are the index coefficients
      no_outside_intercepts = orig_model_obj.intercept_names is None
      if no_outside_intercepts:
          init_index_coefs = mnl_point_series.values
          init_intercepts = None
      else:
          init_index_coefs =\
              mnl_point_series.loc[orig_model_obj.ind_var_names].values
          init_intercepts =\
              mnl_point_series.loc[orig_model_obj.intercept_names].values
  
      # Add any mixing variables to the index coefficients.
      if orig_model_obj.mixing_vars is not None:
          num_mixing_vars = len(orig_model_obj.mixing_vars)
          init_index_coefs = np.concatenate([init_index_coefs,
                                             np.zeros(num_mixing_vars)],
                                            axis=0)
  
      # Account for the special transformation of the index coefficients that is
      # needed for the asymmetric logit model.
      if orig_model_obj.model_type == model_type_to_display_name["Asym"]:
          multiplier = np.log(len(np.unique(orig_model_obj.alt_IDs)))
          # Cast the initial index coefficients to a float dtype to ensure
          # successful broadcasting
          init_index_coefs = init_index_coefs.astype(float)
          # Adjust the scale of the index coefficients for the asymmetric logit.
          init_index_coefs /= multiplier
  
      # Combine the initial interept values with the initial index coefficients
      if init_intercepts is not None:
          init_index_coefs =\
              np.concatenate([init_intercepts, init_index_coefs], axis=0)
  
      # Add index coefficients (and mixing variables) to the total initial array
      num_index = init_index_coefs.shape[0]
      init_vals[-1 * num_index:] = init_index_coefs
  
      # Note that the initial values for the transformed nest coefficients and
      # the shape parameters is zero so we don't have to change anything
      return init_vals