package mikera.vectorz;
import mikera.vectorz.impl.APrimitiveVector;
import mikera.vectorz.util.ErrorMessages;
/**
* Specialised 1D vector
*
* @author Mike
*/
public final class Vector1 extends APrimitiveVector {
private static final long serialVersionUID = -6312801771839902928L;
public double x;
public Vector1() {
super();
}
public Vector1(double x) {
this.x=x;
}
public Vector1(double... values) {
if (values.length!=length()) throw new IllegalArgumentException("Can't create "+length()+"D vector from values with length: "+values.length);
this.x=values[0];
}
public static Vector1 of(double x) {
return new Vector1(x);
}
public static Vector1 of(double... values) {
return new Vector1(values);
}
@Override
public double dotProduct(AVector a) {
a.checkLength(1);
return x*a.unsafeGet(0);
}
@Override
public double dotProduct(Vector v) {
v.checkLength(1);
double[] data=v.getArray();
return x*data[0];
}
@Override
public double dotProduct(double[] data, int offset) {
return x*data[offset+0];
}
@Override
public int length() {
return 1;
}
@Override
public double elementSum() {
return x;
}
@Override
public double elementProduct() {
return x;
}
@Override
public double elementMax(){
return x;
}
@Override
public double elementMin(){
return x;
}
@Override
public void applyOp(Op op) {
x=op.apply(x);
}
@Override
public double get(int i) {
if (i==0) {
return x;
}
throw new IndexOutOfBoundsException(ErrorMessages.invalidIndex(this, i));
}
@Override
public double unsafeGet(int i) {
return x;
}
@Override
public void set(int i, double value) {
if (i==0) {
x=value;
} else {
throw new IndexOutOfBoundsException(ErrorMessages.invalidIndex(this, i));
}
}
@Override
public void unsafeSet(int i, double value) {
x=value;
}
@Override
public void fill(double v) {
x=v;
}
@Override
public void getElements(double[] data, int offset) {
data[offset]=x;
}
@Override
public void add(AVector v) {
if (v.length()!=1) {
throw new IllegalArgumentException(ErrorMessages.incompatibleShapes(this, v));
}
x+=v.unsafeGet(0);
}
@Override
public void addAt(int i, double value) {
switch (i) {
case 0: x+=value; return;
default: throw new IndexOutOfBoundsException(ErrorMessages.invalidIndex(this, i));
}
}
public void setValues(double x) {
this.x=x;
}
@Override
public void negate() {
x=-x;
}
@Override
public Vector1 clone() {
return new Vector1(x);
}
@Override
public double[] toDoubleArray() {
return new double[] {x};
}
@Override
public double getX() {
return x;
}
@Override
public Vector1 exactClone() {
return clone();
}
}