/*
* RapidMiner
*
* Copyright (C) 2001-2008 by Rapid-I and the contributors
*
* Complete list of developers available at our web site:
*
* http://rapid-i.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 java.io.Serializable;
import java.util.LinkedList;
import com.rapidminer.example.Attribute;
import com.rapidminer.example.Example;
/** Abstract superclass for all possible kinds of hypothesis.
*
* @author Dirk Dach
* @version $Id: Hypothesis.java,v 1.5 2008/07/31 17:43:41 ingomierswa Exp $
*/
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. */
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();
}