package de.tud.inf.operator.fingerprints.ch;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.rapidminer.example.Attribute;
import com.rapidminer.example.Example;
import com.rapidminer.example.table.AttributeFactory;
import com.rapidminer.example.table.PolynominalMapping;
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.ParameterTypeString;
import com.rapidminer.tools.Ontology;
import de.tud.inf.example.set.ComplexExampleSet;
import de.tud.inf.example.set.attributevalues.ComplexValueFactory;
import de.tud.inf.example.set.attributevalues.DataMapValue;
import de.tud.inf.example.set.attributevalues.MapValue;
import de.tud.inf.example.table.DataMapAttribute;
import de.tud.inf.operator.capabilites.Capability;
import de.tud.inf.operator.capabilites.CapabilityBuilder;
public class ColorHistogram extends Operator{
private static final String PARA_MAP_NAME = "map attribute name";
public ColorHistogram(OperatorDescription description) {
super(description);
}
@Override
public IOObject[] apply() throws OperatorException {
ComplexExampleSet input = getInput(ComplexExampleSet.class);
Attribute mapAttr = input.getAttributes().get(getParameterAsString(PARA_MAP_NAME));
DataMapAttribute histAttr = (DataMapAttribute)AttributeFactory.createAttribute("hist",Ontology.DATA_MAP_STRING);
DataMapValue dmValue = (DataMapValue)ComplexValueFactory.getComplexValueFunction(histAttr);
input.addComplexAttribute(histAttr);
Iterator<Example> it = input.iterator();
while (it.hasNext()){
Example ex = it.next();
MapValue mapVal = ex.getMapValue(mapAttr);
Map<String, Integer> absoluteHist = new HashMap<String, Integer>();
int numPix = mapVal.getMapSize();
for(int i=0;i<numPix;i++){
String currentSymbol = mapVal.getStringValueAt(i);
if(absoluteHist.containsKey(currentSymbol)) {
// increment
absoluteHist.put(currentSymbol, (absoluteHist.get(currentSymbol) + 1));
} else {
// init
absoluteHist.put(currentSymbol,1);
}
}
//write back histogram
//line 52
Map<Integer,Double> result = new HashMap<Integer,Double>();
PolynominalMapping keyMapping = new PolynominalMapping();
//change type of data map
for (Map.Entry<String, Integer> mapEntry: absoluteHist.entrySet()) {
result.put(keyMapping.mapString(mapEntry.getKey()), mapEntry.getValue().doubleValue());
}
dmValue.setStringIntMap(absoluteHist);
ex.setComplexValue(histAttr, dmValue);
}
return new IOObject[] {input};
}
@Override
public List<ParameterType> getParameterTypes() {
List<ParameterType> types = super.getParameterTypes();
ParameterTypeString map_name = new ParameterTypeString(PARA_MAP_NAME, "name of the map attribute", "map_quantization");
map_name.setExpert(false);
types.add(map_name);
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.DATA_MAP}, true)};
return list;
}
}