package mikera.transformz.impl;
import mikera.transformz.ATransform;
import mikera.vectorz.AVector;
import mikera.vectorz.Op;
import mikera.vectorz.util.ErrorMessages;
/**
* A transform the represents the application of an operator to all elements of a vector
*
* @author Mike
*
*/
public class AOpTransform extends ATransform {
private final Op op;
private final int dims;
public AOpTransform(Op op, int dims) {
this.op=op;
this.dims=dims;
}
@Override
public void transform(AVector source, AVector dest) {
if ((source.length()!=dims)) throw new IllegalArgumentException(ErrorMessages.wrongSourceLength(source));
if ((dest.length()!=dims)) throw new IllegalArgumentException(ErrorMessages.wrongDestLength(source));
for (int i=0; i<dims; i++) {
dest.unsafeSet(i, op.apply(source.unsafeGet(i)));
}
}
@Override
public double calculateElement(int i, AVector inputVector) {
return op.apply(inputVector.get(i));
}
@Override
public int inputDimensions() {
return dims;
}
@Override
public int outputDimensions() {
return dims;
}
}