package com.yahoo.labs.samoa.moa.classifiers.rules.driftdetection;

/*
 * #%L
 * SAMOA
 * %%
 * Copyright (C) 2014 - 2015 Apache Software Foundation
 * %%
 * Licensed 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.
 * #L%
 */

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;
  }

}
