/**
   * Implementation of the virtual <code>update(Observable, Object)</code> method of the <code>
   * Observer</code> interface. This method will be called automatically from an <code>Observable
   * </code> object within its <code>notifyObservers()</code> method. <br>
   * If no Object (a<code>null</code> value) is passed as arg, the actual value of the ValueSupplier
   * will be fetched with the <code>value()</code> method of the ValueSupplier. Otherwise it is
   * expected that the actual value is passed in the Object arg.
   *
   * @param o java.util.Observable : The Observable calling this method within its own <code>
   *     notifyObservers()</code> method.
   * @param arg Object : The Object with which this <code>TallyRunning</code> is updated. Normally a
   *     double number which is added to the statistics or <code>null</code>.
   */
  public void update(Observable o, Object arg) {
    if (o == null) // null was passed instead of an Observable
    {
      sendWarning(
          "Attempt to update a TallyRunning with no reference to an "
              + "Observable. The actual value of '"
              + getValueSupplier().getName()
              + "' will be fetched and processed anyway.",
          "TallyRunning: " + this.getName() + " Method: update (Observable " + "o, Object arg)",
          "The passed Observable: o in this method is only a null pointer.",
          "The update()-method was not called via notifyObservers() from an "
              + "Observable. Who was calling it? Why don't you let the Observable do"
              + " the work?");
    }

    super.update(o, arg); // call the update() method of Tally

    long obs = getObservations();
    double lastVal = getLastValue();
    int index = (int) ((obs - 1) % this._n);

    this._sumLastN += lastVal - this._valuesLastN[index];
    this._sumSquareLastN += lastVal * lastVal - this._valuesLastN[index] * this._valuesLastN[index];
    // note: in case obs < n, this.valuesLastN[index] will be zero

    this._valuesLastN[index] = lastVal;
  }
  /**
   * Updates this <code>TallyRunning</code> object by fetching the actual value of the <code>
   * ValueSupplier</code> and processing it. The <code>ValueSupplier</code> is passed in the
   * constructor of this <code>TallyRunning</code> object. This <code>update()</code> method
   * complies with the one described in DESMO, see [Page91].
   */
  public void update() {
    super.update(); // call the update() method of Tally

    long obs = getObservations();
    double lastVal = getLastValue();
    int index = (int) ((obs - 1) % this._n);

    this._sumLastN += lastVal - this._valuesLastN[index];
    this._sumSquareLastN += lastVal * lastVal - this._valuesLastN[index] * this._valuesLastN[index];
    // note: in case obs < n, this.valuesLastN[index] will be zero

    this._valuesLastN[index] = lastVal;
  }
  /** Resets this TallyRunning object by resetting all variables to 0.0 . */
  public void reset() {
    super.reset(); // reset the Tally, too.

    this._sumLastN = this._sumSquareLastN = 0.0;
  }