package mikera.vectorz.impl;
import java.util.Arrays;
import mikera.indexz.Index;
import mikera.vectorz.AScalar;
import mikera.vectorz.AVector;
import mikera.vectorz.Vector1;
import mikera.vectorz.util.IntArrays;
/**
* Abstract base classes for immutable sparse vectors that have a single potentially non-zero element
*
* @author Mike
*
*/
public abstract class ASingleElementVector extends ASparseVector {
private static final long serialVersionUID = -5246190958486810285L;
protected final int index;
protected ASingleElementVector(int index, int length) {
super(length);
this.index=index;
}
// =============================================
// Abstract / standard methods
/**
* Gets the single element value from this single element vector.
* All other elements can be assumed to be zero.
* @return
*/
protected abstract double value();
protected final int index() {
return index;
}
// =============================================
// Generic implementations
@Override
public final boolean isMutable() {
return false;
}
@Override
public final boolean isElementConstrained() {
return true;
}
@Override
public abstract double dotProduct(AVector v);
@Override
public double dotProduct(double[] data, int offset) {
return value()*data[offset+index()];
}
@Override
public int nonSparseElementCount() {
return 1;
}
@Override
public AVector nonSparseValues() {
return Vector1.of(value());
}
@Override
public Index nonSparseIndex() {
return Index.of(index);
}
@Override
public long nonZeroCount() {
return (value()==0.0)?0:1;
}
@Override
public void getElements(double[] dest, int offset) {
Arrays.fill(dest, offset,offset+length, 0.0);
dest[offset+index()]=value();
}
@Override
public AScalar slice(int i) {
checkIndex(i);
if (i==index) return ImmutableScalar.create(value());
return ImmutableScalar.ZERO;
}
@Override
public abstract boolean equals(AVector v);
@Override
public int[] nonZeroIndices() {
if (value()==0.0) {
return IntArrays.EMPTY_INT_ARRAY;
} else {
return new int[]{index};
}
}
}
Ads help maintain this website.