/**
   * Used to initialize the time based model. This method must be called before any other method in
   * the class. Since the time based model does not derive any equation for forecasting, this method
   * uses the input DataSet to calculate forecast values for all values of the independent time
   * variable within the initial data set.
   *
   * @param dataSet a data set of observations that can be used to initialize the forecasting
   *     parameters of the forecasting model.
   */
  public void init(DataSet dataSet) {
    initTimeVariable(dataSet);
    String timeVariable = getTimeVariable();

    if (dataSet.getPeriodsPerYear() <= 1)
      throw new IllegalArgumentException(
          "Data set passed to init in the triple exponential smoothing model does not contain seasonal data. Don't forget to call setPeriodsPerYear on the data set to set this.");

    periodsPerYear = dataSet.getPeriodsPerYear();

    // Calculate initial values for base and trend
    initBaseAndTrendValues(dataSet);

    // Initialize seasonal indices using data for all complete years
    initSeasonalIndices(dataSet);

    Iterator it = dataSet.iterator();
    maxObservedTime = Double.NEGATIVE_INFINITY;
    while (it.hasNext()) {
      DataPoint dp = (DataPoint) it.next();
      if (dp.getIndependentValue(timeVariable) > maxObservedTime)
        maxObservedTime = dp.getIndependentValue(timeVariable);
    }

    super.init(dataSet);
  }