package org.apache.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%
 */

/**
 * Page-Hinkley Test with more weight for recent instances.
 * 
 */

public class PageHinkleyFading extends PageHinkleyTest {
  /**
	 * 
	 */
  private static final long serialVersionUID = 7110953184708812339L;
  private double fadingFactor = 0.99;

  public PageHinkleyFading() {
    super();
  }

  public PageHinkleyFading(double threshold, double alpha) {
    super(threshold, alpha);
  }

  protected double instancesSeen;

  @Override
  public void reset() {

    super.reset();
    this.instancesSeen = 0;

  }

  @Override
  public boolean update(double error) {
    this.instancesSeen = 1 + fadingFactor * this.instancesSeen;
    double absolutError = Math.abs(error);

    this.sumAbsolutError = fadingFactor * this.sumAbsolutError + absolutError;
    if (this.instancesSeen > 30) {
      double mT = absolutError - (this.sumAbsolutError / this.instancesSeen) - 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;
  }

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

  @Override
  protected void copyFields(PageHinkleyTest newTest) {
    super.copyFields(newTest);
    PageHinkleyFading newFading = (PageHinkleyFading) newTest;
    newFading.fadingFactor = this.fadingFactor;
    newFading.instancesSeen = this.instancesSeen;
  }
}
