def METHOD_NAME(train_p,
                     train_input_p,
                     exp_start_epoch,
                     total_epoch,
                     warmup_epoch=0,
                     limit_epoch=None,
                     multiplier_min=0.01,
                     warmup_init=0.):
  """Sets a linear rampup and exponential decay LR schedule on train_p.
  This is a wrapper around LinearRampupExponentialDecayScaledByNumSplitSchedule
  that sets the steps using epochs and the training statistics.
  Args:
    train_p: train parameters.
    train_input_p: The training set input parameters.
    exp_start_epoch: The start epoch of exponential annealing.
    total_epoch: Total number of epoch to train.
    warmup_epoch: Epoch for the warm up ramp to end at. Note that the learning
      rate will be fixed between the end of the warmup phase and the beginning
      of the exponential annealing phase.
    limit_epoch: Epoch to end exponential annealing. If None, this will be set
      to 0.95 * total_epoch, that is, the last 5% of training time will be at
      the minimum learning rate.
    multiplier_min: The multiplier minimum at the end of exponential decay.
    warmup_init: Initial value for the warmup phase. Note that warm up can be
      disabled by either setting warmup_init to 1 or setting warmup_epoch to 0.
  """
  # Determine steps based on the training statistics, since the number of steps
  # depends on the number of examples per step.
  train_stats = _GetTrainingStatistics(train_input_p)
  warmup_steps, exp_start_steps, total_steps = _GetSteps(
      train_stats, warmup_epoch, exp_start_epoch, total_epoch)
  if limit_epoch is None:
    limit_epoch = 0.95 * total_epoch
  limit_steps = limit_epoch * train_stats.steps_per_epoch
  tf.logging.info('limit_steps = %d', limit_steps)
  assert 0. <= warmup_steps <= exp_start_steps <= limit_steps <= total_steps
  # Ensure that warmup is disabled by also setting warmup_init to 1 if
  # warmup_epoch is set to 0.
  if warmup_epoch == 0.:
    warmup_init = 1.
  train_p.max_steps = math.ceil(total_epoch * train_stats.steps_per_epoch)
  train_p.lr_schedule = (
      schedule.LinearRampupExponentialDecayScaledByNumSplitSchedule.Params())
  train_p.lr_schedule.Set(
      warmup=warmup_steps,
      decay_start=exp_start_steps,
      decay_end=limit_steps,
      min=multiplier_min,
      warmup_init=warmup_init,
      # Set num_splits to 1 so that no further scaling is done.
      num_splits=1)