/**
* Copyright (C) 2001-2017 by RapidMiner and the contributors
*
* Complete list of developers available at our web site:
*
* http://rapidminer.com
*
* This program is free software: you can redistribute it and/or modify it under the terms of the
* GNU Affero General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License along with this program.
* If not, see http://www.gnu.org/licenses/.
*/
package com.rapidminer.operator.learner.igss.hypothesis;
import com.rapidminer.example.Attribute;
import com.rapidminer.example.Example;
import java.io.Serializable;
import java.util.LinkedList;
/**
* Abstract superclass for all possible kinds of hypothesis.
*
* @author Dirk Dach
*/
public abstract class Hypothesis implements Serializable {
/**
*
*/
private static final long serialVersionUID = 2081084133296284530L;
public static final String[] HYPOTHESIS_SPACE_TYPES = { "rule" };
public static final int FIRST_TYPE_INDEX = 0;
public static final int TYPE_RULE = 0;
public static final int LAST_TYPE_INDEX = 0;
public static final int POSITIVE_CLASS = 1;
public static final int NEGATIVE_CLASS = 0;
/** The label attribute. */
private Attribute label;
/**
* Indicates if rejection sampling is used to draw the examples that this rule is applied to. In
* this case (positive)example counter is incremented by one for every (positive)example the
* rule is applicable to. In the other case(weights are used directly) the weight of the example
* is added to the counters.
*/
protected boolean rejectionSampling;
/** Stores the total weight of all examples covered by this hypothesis. */
protected double coveredWeight;
/** Stores the weight of examples covered by this hypothesis with correct prediction. */
protected double positiveWeight;
/** Create h->Y+/Y- or h->Y+ only. */
protected boolean createAllHypothesis;
/**
* Create a new dummy hypothesis to allow calling the 'init' method, initialize the
* regularAttributes, label and p0 fields.
*/
public Hypothesis(Attribute[] regulars, Attribute l, boolean rs, boolean createAll) {
rejectionSampling = rs;
createAllHypothesis = createAll;
label = l;
}
public Hypothesis() {
this.coveredWeight = 0.0d;
this.positiveWeight = 0.0d;
}
/** Clone method. */
@Override
public abstract Hypothesis clone();
/** Returns the label index the hypothesis predicts. */
public abstract int getPrediction();
/** Returns the label. */
public Attribute getLabel() {
return label;
}
/** Sets 'coveredWeight' and 'positiveWeight' back to 0.0d. */
public void reset() {
this.coveredWeight = 0.0d;
this.positiveWeight = 0.0d;
}
/** Returns the covered weight of this hypothesis. */
public double getCoveredWeight() {
return this.coveredWeight;
}
/** Sets the covered weight of this hypothesis. */
public void setCoveredWeight(double value) {
this.coveredWeight = value;
}
/** Returns the covered positive weight of this hypothesis. */
public double getPositiveWeight() {
return this.positiveWeight;
}
/** Sets the covered positive weight of this hypothesis. */
public void setPositiveWeight(double value) {
this.positiveWeight = value;
}
/** Hypothesis is applied to the example and internal statistics of the hypothesis are updated. */
public abstract void apply(Example e);
/**
* Tests if the hypothesis is applicable to the example without updating the internal statistics
* of the hypothesis.
*/
public abstract boolean applicable(Example e);
/**
* Generates new hypothesis by adding one degree of complexity and creating all rules that are
* possible now. Classes extending this abstract class define the way the hypothesis are
* generated by the IGSS alsgorithm by implementing the refine() method. Be sure to avoid the
* creation of duplicate hypothesis, for example by overwriting and using the equals method. For
* example refine could increase the allowed depth of a decision tree or the number of literals
* of a conjunctive rule. Must return null if the hypothesis cannot be refined any more.
* */
public abstract LinkedList<Hypothesis> refine();
/** Returns true only if this hypothesis can still be refined. */
public abstract boolean canBeRefined();
/** Used to generate the first hypothesis or the first group of hypothesis. */
public abstract LinkedList<Hypothesis> init(int minComplexity);
/** Returns complexity of the hypothesis. */
public abstract int getComplexity();
}