package ch.akuhn.hapax.linalg;
import java.util.Iterator;
import java.util.NoSuchElementException;
/** An ordered list of floating point numbers.
*
* @author Adrian Kuhn
*
*/
public abstract class Vector {
public final class Entry {
public int index;
public double value;
}
public double add(int index, double value) {
return put(index, get(index) + value);
}
public double density() {
return ((double) used()) / size();
}
public abstract double get(int index);
public abstract double put(int index, double value);
public abstract int size();
public double sum() {
double sum = 0;
for (Entry each: entries()) sum += each.value;
return sum;
}
public double length() {
double sum = 0;
for (Entry each: entries()) sum += each.value * each.value;
return Math.sqrt(sum);
}
/** Returns number of non-zero-valued entries.
*
* @return a positive integer.
*/
public int used() {
int count = 0;
for (Entry each: entries()) if (each.value != 0) count++;
return count;
}
/** Iterates over all entries. Some vectors omit zero-valued entries.
*
* @return value and index of each entry.
*/
public Iterable<Entry> entries() {
return new Iterable<Entry>() {
@Override
public Iterator<Entry> iterator() {
return new Iterator<Entry>() {
private Entry each = new Entry();
private int index = 0;
@Override
public boolean hasNext() {
return index < size();
}
@Override
public Entry next() {
if (!hasNext()) throw new NoSuchElementException();
each.value = get(index);
each.index = index++;
return each;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
};
}
}