/**
* 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;
import com.rapidminer.example.ExampleSet;
import com.rapidminer.example.set.HeaderExampleSet;
/**
* Abstract model is the superclass for all objects which change a data set. For example, a model
* generated by a learner might add a predicted attribute. Other models can be created during
* preprocessing, e.g. a transformation model containing the parameters for a z-transformation.
* Models can be combined by using a CombinedModel. All models can be applied with a ModelApplier
* operator.
*
* @author Ingo Mierswa
*/
public abstract class AbstractModel extends ResultObjectAdapter implements Model {
private static final long serialVersionUID = 1640348739650532634L;
/**
* This header example set contains all important nominal mappings of all training attributes.
* These mappings are necessary in order to ensure that the internally used double values
* encoding nominal values are equal for the training and application data sets.
*/
private HeaderExampleSet headerExampleSet;
/**
* This Operator will be used to check whether the currently running Process was stopped. If it
* is <code>null</code> nothing will happen else checkForStop will be called.
*/
private Operator operator = null;
/**
* This flag signalizes the apply method if progress in the {@link OperatorProgress} from {@link #getOperator()} should be shown.
*/
private boolean showProgress = false;
/**
* Created a new model which was built on the given example set. Please note that the given
* example set is automatically transformed into a {@link HeaderExampleSet} which means that no
* reference to the data itself is kept but only to the header, i.e. to the attribute meta
* descriptions.
*/
protected AbstractModel(ExampleSet exampleSet) {
if (exampleSet != null) {
this.headerExampleSet = new HeaderExampleSet(exampleSet);
}
}
/**
* Delivers the training header example set, i.e. the header of the example set (without data
* reference) which was used for creating this model. Might return null.
*/
@Override
public HeaderExampleSet getTrainingHeader() {
return this.headerExampleSet;
}
/**
* This default implementation returns false. Note that subclasses overriding this method should
* also override the method {@link #updateModel(ExampleSet)}.
*/
@Override
public boolean isUpdatable() {
return false;
}
/**
* This default implementation throws an {@link UserError}. Subclasses overriding this method to
* update the model according to the given example set should also override the method
* {@link #isUpdatable()} by delivering true.
*/
@Override
public void updateModel(ExampleSet updateExampleSet) throws OperatorException {
throw new UserError(null, 135, getClass().getName());
}
/**
* Throws a UserError since most models should not allow additional parameters during
* application. However, subclasses may overwrite this method.
*/
@Override
public void setParameter(String key, Object value) throws OperatorException {
throw new UnsupportedApplicationParameterError(null, getName(), key);
}
/**
* The default implementation returns the result of the super class. If the string ends with
* model, the substring "model" is removed.
*/
@Override
public String getName() {
String result = super.getName();
if (result.toLowerCase().endsWith("model")) {
result = result.substring(0, result.length() - "model".length());
}
return result;
}
public String getExtension() {
return "mod";
}
public String getFileDescription() {
return "model file";
}
@Override
public boolean isInTargetEncoding() {
return false;
}
/**
* If the Operator was set the Model will check for stop by calling checkForStop() at the
* Operator. If the Operator is set to null nothing will happen and the Model will no longer
* checkForStop.
*
* @param operator If {@code true} this operator will check for stop by calling checkForStop()
*/
public void setOperator(Operator operator) {
this.operator = operator;
}
/**
* If this flag is set to {@code true}, the apply method can show the progress in the {@link OperatorProgress} from {@link #getOperator()}
*
* @param boolean When {@code true} progress will be shown when applying.
*/
public void setShowProgress(boolean showProgress) {
this.showProgress = showProgress;
}
/**
* delivers the set Operator or null if no Operator was set.
*/
public Operator getOperator() {
return operator;
}
/**
* {@code true} if progress should be shown while applying this model.
*/
public boolean getShowProgress() {
return showProgress;
}
/**
* Checks whether the running Process of the given Operator was stopped.If no Operator is set,
* nothing will happen.
*
* @throws ProcessStoppedException
* if the running Process was stopped
*/
protected void checkForStop() throws ProcessStoppedException {
Operator op = getOperator();
if (op != null) {
op.checkForStop();
}
}
}