package quickml.supervised.dataProcessing; import com.google.common.collect.Lists; import quickml.data.instances.Instance; import quickml.supervised.dataProcessing.instanceTranformer.InstanceTransformer; import java.util.List; /** * Created by alexanderhawk on 10/14/15. */ public class ElementaryDataTransformer<I extends Instance, R extends Instance> { List<InstanceTransformer<I, I>> input2InputTypeTransformers = Lists.newArrayList(); InstanceTransformer<I, R> input2ReturnTypeTransformer; List<InstanceTransformer<R, R>> returnType2ReturnTypeTransformer = Lists.newArrayList(); public ElementaryDataTransformer(List<InstanceTransformer<I, I>> input2InputTypeTransformers) { this.input2InputTypeTransformers = input2InputTypeTransformers; } public ElementaryDataTransformer(List<InstanceTransformer<I, I>> input2InputTypeTransformers, InstanceTransformer<I, R> input2ReturnTypeTransformer) { this(input2InputTypeTransformers); this.input2ReturnTypeTransformer = input2ReturnTypeTransformer; } public ElementaryDataTransformer(List<InstanceTransformer<I, I>> input2InputTypeTransformers, InstanceTransformer<I, R> input2ReturnTypeTransformer, List<InstanceTransformer<R, R>> returnType2ReturnTypeTransformer) { this(input2InputTypeTransformers, input2ReturnTypeTransformer); this.returnType2ReturnTypeTransformer = returnType2ReturnTypeTransformer; } public List<R> transformInstances(List<I> inputInstances) { I transformedInput; R transformedOutput; List<R> outputInstances = Lists.newArrayList(); for (I instance : inputInstances) { transformedInput = doInput2InputTransformations(instance); if (input2ReturnTypeTransformer == null) { transformedOutput = (R) transformedInput; } else { transformedOutput = doInput2ReturnTypeTransformation(transformedInput); transformedOutput = doReturnType2ReturnTypeTransformations(transformedOutput); } outputInstances.add(transformedOutput); } return outputInstances; } private R doReturnType2ReturnTypeTransformations(R transformedOutput) { for (InstanceTransformer<R, R> output2Output : returnType2ReturnTypeTransformer) { transformedOutput = output2Output.transformInstance(transformedOutput); } return transformedOutput; } private R doInput2ReturnTypeTransformation(I transformedInput) { return input2ReturnTypeTransformer.transformInstance(transformedInput); } private I doInput2InputTransformations(I instance) { I transformedInput = instance; for (InstanceTransformer<I, I> input2Input : input2InputTypeTransformers) { transformedInput = input2Input.transformInstance(transformedInput); } return transformedInput; } }