/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.apache.samoa.moa.classifiers.rules.driftdetection;

import java.io.Serializable;

/**
 * Page-Hinkley Test with equal weights for all instances.
 * 
 */
public class PageHinkleyTest implements Serializable {

  private static final long serialVersionUID = 1L;
  protected double cumulativeSum;

  public double getCumulativeSum() {
    return cumulativeSum;
  }

  public double getMinimumValue() {
    return minimumValue;
  }

  protected double minimumValue;
  protected double sumAbsolutError;
  protected long phinstancesSeen;
  protected double threshold;
  protected double alpha;

  public PageHinkleyTest() {
    this(0, 0);
  }

  public PageHinkleyTest(double threshold, double alpha) {
    this.threshold = threshold;
    this.alpha = alpha;
    this.reset();
  }

  public void reset() {
    this.cumulativeSum = 0.0;
    this.minimumValue = Double.MAX_VALUE;
    this.sumAbsolutError = 0.0;
    this.phinstancesSeen = 0;
  }

  // Compute Page-Hinkley test
  public boolean update(double error) {

    this.phinstancesSeen++;
    double absolutError = Math.abs(error);
    this.sumAbsolutError = this.sumAbsolutError + absolutError;
    if (this.phinstancesSeen > 30) {
      double mT = absolutError - (this.sumAbsolutError / this.phinstancesSeen) - this.alpha;
      this.cumulativeSum = this.cumulativeSum + mT; // Update the cumulative mT sum
      if (this.cumulativeSum < this.minimumValue) { // Update the minimum mT value if the new mT is smaller than the current minimum
        this.minimumValue = this.cumulativeSum;
      }
      return (((this.cumulativeSum - this.minimumValue) > this.threshold));
    }
    return false;
  }

  public PageHinkleyTest getACopy() {
    PageHinkleyTest newTest = new PageHinkleyTest(this.threshold, this.alpha);
    this.copyFields(newTest);
    return newTest;
  }

  protected void copyFields(PageHinkleyTest newTest) {
    newTest.cumulativeSum = this.cumulativeSum;
    newTest.minimumValue = this.minimumValue;
    newTest.sumAbsolutError = this.sumAbsolutError;
    newTest.phinstancesSeen = this.phinstancesSeen;
  }

}
