package mikera.vectorz.impl;
import mikera.indexz.Index;
import mikera.vectorz.AVector;
import mikera.vectorz.Vector1;
import mikera.vectorz.util.IntArrays;
/**
* Abstract base classes for 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
protected abstract double value();
protected final int index() {
return index;
}
// =============================================
// Generic implementations
@Override
public double dotProduct(AVector v) {
return value()*v.unsafeGet(index());
}
@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 boolean equals(AVector v) {
int len=v.length();
if (len!=this.length) return false;
if (v.unsafeGet(index)!=value()) return false;
if (!v.isRangeZero(0, index)) return false;
if (!(v.isRangeZero(index+1, len-(index+1)))) return false;
return true;
}
@Override
public int[] nonZeroIndices() {
if (value()==0.0) {
return IntArrays.EMPTY_INT_ARRAY;
} else {
return new int[]{index};
}
}
}