package de.tud.inf.operator.fingerprints.lnf;
import java.util.List;
import com.rapidminer.example.Example;
import com.rapidminer.example.table.AttributeFactory;
import com.rapidminer.operator.IOObject;
import com.rapidminer.operator.Operator;
import com.rapidminer.operator.OperatorDescription;
import com.rapidminer.operator.OperatorException;
import com.rapidminer.parameter.ParameterType;
import com.rapidminer.parameter.ParameterTypeDouble;
import com.rapidminer.parameter.ParameterTypeString;
import com.rapidminer.tools.Ontology;
import de.tud.inf.example.set.ComplexExampleSet;
import de.tud.inf.example.set.attributevalues.MapValue;
import de.tud.inf.example.table.ComplexAttribute;
import de.tud.inf.example.table.MapAttribute;
import de.tud.inf.operator.capabilites.Capability;
import de.tud.inf.operator.capabilites.CapabilityBuilder;
public class Quantization extends Operator {
public static final String PARAMETER_MAP_NAME = "map_attribute_name";
public Quantization(OperatorDescription description) {
super(description);
}
@Override
public IOObject[] apply() throws OperatorException {
// get input
ComplexExampleSet exampleSet = getInput(ComplexExampleSet.class);
// get input attribute for quantization according to parameters
ComplexAttribute mapInAttr = (ComplexAttribute)exampleSet.getAttributes().get(getParameterAsString(PARAMETER_MAP_NAME));
if(mapInAttr == null) throw new OperatorException("map attribute \"" + getParameterAsString(PARAMETER_MAP_NAME) + "\" misses.");
//create output attribute
MapAttribute mapOutAttr = (MapAttribute)AttributeFactory.createAttribute(mapInAttr.getName() + "_quantization", Ontology.MAP_STRING);
exampleSet.addComplexAttribute(mapOutAttr);
// z discretization
double stepSize = getParameterAsDouble("step size");
char startSymbol = getParameterAsString("start letter").charAt(0);
for (Example example: exampleSet)
{
MapValue map = example.getMapValue(mapInAttr);
map.createMapping();
double[] zValues = map.getZValues();
for (int h=0; h<zValues.length;h++){
int quantile = (int) Math.ceil(Math.abs(zValues[h])/stepSize);
char symbol = startSymbol;
if (zValues[h] >= 0) {
for (int i=0; i<quantile-1; i++)
symbol++;
}
else if (zValues[h] < 0) {
for (int i=0; i<quantile; i++)
symbol--;
}
//write symbol into map (-> zValue will be modified)
map.mapValueAt(h, "" + symbol);
} //end processing one map
//write back
example.setComplexValue(mapOutAttr, map);
}
// some statistics
exampleSet.recalculateAllAttributeStatistics();
// ProcessStatistics.getInstance().addNumLetters((int)((Math.ceil(exampleSet.getStatistics(zAttr, Statistics.MAXIMUM) / stepSize)) + (Math.ceil(Math.abs(exampleSet.getStatistics(zAttr, Statistics.MINIMUM)) / stepSize))));
return new IOObject[] {exampleSet};
}
/** Returns a list of ParameterTypes describing the parameters of this operator. */
public List<ParameterType> getParameterTypes() {
List<ParameterType> types = super.getParameterTypes();
types.add(new ParameterTypeString(PARAMETER_MAP_NAME, "", "map"));
types.add(new ParameterTypeDouble("step size", "", 0,10,1));
types.add(new ParameterTypeString("start letter", "", "M"));
return types;
}
@Override
public Class<?>[] getInputClasses() {
return new Class[] {ComplexExampleSet.class};
}
@Override
public Class<?>[] getOutputClasses() {
return new Class[] {ComplexExampleSet.class};
}
@Override
public Capability[] getInputCapabilities() {
Capability[] list = new Capability[]{
CapabilityBuilder.buildCapability(new int[]{Ontology.MAP}, true)};
return list;
}
@Override
public Capability[] getOutputCapabilities() {
Capability[] list = new Capability[]{
CapabilityBuilder.buildCapability(new int[]{Ontology.MAP_STRING}, true)};
return list;
}
}