package org.apache.samoa.moa.streams.clustering;

/*
 * #%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 org.apache.samoa.moa.options.AbstractOptionHandler;
import org.apache.samoa.moa.streams.InstanceStream;

import com.github.javacliparser.FloatOption;
import com.github.javacliparser.IntOption;

public abstract class ClusteringStream extends AbstractOptionHandler implements InstanceStream {
  public IntOption decayHorizonOption = new IntOption("decayHorizon", 'h',
      "Decay horizon", 1000, 0, Integer.MAX_VALUE);

  public FloatOption decayThresholdOption = new FloatOption("decayThreshold", 't',
      "Decay horizon threshold", 0.01, 0, 1);

  public IntOption evaluationFrequencyOption = new IntOption("evaluationFrequency", 'e',
      "Evaluation frequency", 1000, 0, Integer.MAX_VALUE);

  public IntOption numAttsOption = new IntOption("numAtts", 'a',
      "The number of attributes to generate.", 2, 0, Integer.MAX_VALUE);

  public int getDecayHorizon() {
    return decayHorizonOption.getValue();
  }

  public double getDecayThreshold() {
    return decayThresholdOption.getValue();
  }

  public int getEvaluationFrequency() {
    return evaluationFrequencyOption.getValue();
  }

}
