package hapax.test;
import static org.junit.Assert.assertEquals;
import java.util.Iterator;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import ch.akuhn.hapax.linalg.SparseVector;
import ch.akuhn.hapax.linalg.Vector.Entry;
import ch.unibe.jexample.Given;
import ch.unibe.jexample.JExample;
@RunWith(JExample.class)
public class SparseVectorTest {
double BIG_DELTA = 0.0000001;
@Test
public SparseVector empty() {
SparseVector v = new SparseVector(10, 3);
assertEquals(10, v.size());
assertEquals(0, v.used());
assertEquals(0, v.get(0), Double.MIN_VALUE);
assertEquals(0, v.get(1), Double.MIN_VALUE);
assertEquals(0, v.get(2), Double.MIN_VALUE);
assertEquals(0, v.get(3), Double.MIN_VALUE);
assertEquals(0, v.get(4), Double.MIN_VALUE);
assertEquals(0, v.get(5), Double.MIN_VALUE);
assertEquals(0, v.get(6), Double.MIN_VALUE);
assertEquals(0, v.get(7), Double.MIN_VALUE);
assertEquals(0, v.get(8), Double.MIN_VALUE);
assertEquals(0, v.get(9), Double.MIN_VALUE);
return v;
}
@Test @Given("#empty")
public void putBeyondCapacity(SparseVector v) {
v.put(1,0.1);
assertEquals(1, v.used());
v.put(2,0.2);
assertEquals(2, v.used());
v.put(3,0.3);
assertEquals(3, v.used());
v.put(4,0.4);
assertEquals(4, v.used());
assertEquals(0.1, v.get(1), BIG_DELTA);
assertEquals(0.2, v.get(2), BIG_DELTA);
assertEquals(0.3, v.get(3), BIG_DELTA);
assertEquals(0.4, v.get(4), BIG_DELTA);
}
@Test @Given("#empty")
public SparseVector putOneValue(SparseVector v) {
v.put(4, 404);
assertEquals(10, v.size());
assertEquals(1, v.used());
assertEquals(0, v.get(0), Double.MIN_VALUE);
assertEquals(0, v.get(1), Double.MIN_VALUE);
assertEquals(0, v.get(2), Double.MIN_VALUE);
assertEquals(0, v.get(3), Double.MIN_VALUE);
assertEquals(404, v.get(4), Double.MIN_VALUE);
assertEquals(0, v.get(5), Double.MIN_VALUE);
assertEquals(0, v.get(6), Double.MIN_VALUE);
assertEquals(0, v.get(7), Double.MIN_VALUE);
assertEquals(0, v.get(8), Double.MIN_VALUE);
assertEquals(0, v.get(9), Double.MIN_VALUE);
return v;
}
@Test @Given("#putMoreValues")
public SparseVector preprendValue(SparseVector v) {
v.put(2, 202);
assertEquals(10, v.size());
assertEquals(5, v.used());
assertEquals(0, v.get(0), Double.MIN_VALUE);
assertEquals(0, v.get(1), Double.MIN_VALUE);
assertEquals(202, v.get(2), Double.MIN_VALUE);
assertEquals(303, v.get(3), Double.MIN_VALUE);
assertEquals(404, v.get(4), Double.MIN_VALUE);
assertEquals(505, v.get(5), Double.MIN_VALUE);
assertEquals(0, v.get(6), Double.MIN_VALUE);
assertEquals(707, v.get(7), Double.MIN_VALUE);
assertEquals(0, v.get(8), Double.MIN_VALUE);
assertEquals(0, v.get(9), Double.MIN_VALUE);
return v;
}
@Test @Given("#putMoreValues")
public SparseVector appendValue(SparseVector v) {
v.put(8, 808);
assertEquals(10, v.size());
assertEquals(5, v.used());
assertEquals(0, v.get(0), Double.MIN_VALUE);
assertEquals(0, v.get(1), Double.MIN_VALUE);
assertEquals(0, v.get(2), Double.MIN_VALUE);
assertEquals(303, v.get(3), Double.MIN_VALUE);
assertEquals(404, v.get(4), Double.MIN_VALUE);
assertEquals(505, v.get(5), Double.MIN_VALUE);
assertEquals(0, v.get(6), Double.MIN_VALUE);
assertEquals(707, v.get(7), Double.MIN_VALUE);
assertEquals(808, v.get(8), Double.MIN_VALUE);
assertEquals(0, v.get(9), Double.MIN_VALUE);
return v;
}
@Test @Given("#putMoreValues")
public SparseVector insertValue(SparseVector v) {
v.put(6, 606);
assertEquals(10, v.size());
assertEquals(5, v.used());
assertEquals(0, v.get(0), Double.MIN_VALUE);
assertEquals(0, v.get(1), Double.MIN_VALUE);
assertEquals(0, v.get(2), Double.MIN_VALUE);
assertEquals(303, v.get(3), Double.MIN_VALUE);
assertEquals(404, v.get(4), Double.MIN_VALUE);
assertEquals(505, v.get(5), Double.MIN_VALUE);
assertEquals(606, v.get(6), Double.MIN_VALUE);
assertEquals(707, v.get(7), Double.MIN_VALUE);
assertEquals(0, v.get(8), Double.MIN_VALUE);
assertEquals(0, v.get(9), Double.MIN_VALUE);
return v;
}
@Test @Given("#putMoreValues")
public SparseVector replaceValue(SparseVector v) {
v.put(4, 414);
assertEquals(10, v.size());
assertEquals(4, v.used());
assertEquals(0, v.get(0), Double.MIN_VALUE);
assertEquals(0, v.get(1), Double.MIN_VALUE);
assertEquals(0, v.get(2), Double.MIN_VALUE);
assertEquals(303, v.get(3), Double.MIN_VALUE);
assertEquals(414, v.get(4), Double.MIN_VALUE);
assertEquals(505, v.get(5), Double.MIN_VALUE);
assertEquals(0, v.get(6), Double.MIN_VALUE);
assertEquals(707, v.get(7), Double.MIN_VALUE);
assertEquals(0, v.get(8), Double.MIN_VALUE);
assertEquals(0, v.get(9), Double.MIN_VALUE);
return v;
}
@Test @Given("#putOneValue")
public SparseVector putMoreValues(SparseVector v) {
v.put(3, 303);
v.put(5, 505);
v.put(7, 707);
assertEquals(10, v.size());
assertEquals(4, v.used());
assertEquals(0, v.get(0), Double.MIN_VALUE);
assertEquals(0, v.get(1), Double.MIN_VALUE);
assertEquals(0, v.get(2), Double.MIN_VALUE);
assertEquals(303, v.get(3), Double.MIN_VALUE);
assertEquals(404, v.get(4), Double.MIN_VALUE);
assertEquals(505, v.get(5), Double.MIN_VALUE);
assertEquals(0, v.get(6), Double.MIN_VALUE);
assertEquals(707, v.get(7), Double.MIN_VALUE);
assertEquals(0, v.get(8), Double.MIN_VALUE);
assertEquals(0, v.get(9), Double.MIN_VALUE);
return v;
}
@Test @Given("#putMoreValues")
public void trim(SparseVector v) {
assertEquals(10, v.size());
assertEquals(4, v.used());
v.trim();
assertEquals(10, v.size());
assertEquals(4, v.used());
assertEquals(0, v.get(0), Double.MIN_VALUE);
assertEquals(0, v.get(1), Double.MIN_VALUE);
assertEquals(0, v.get(2), Double.MIN_VALUE);
assertEquals(303, v.get(3), Double.MIN_VALUE);
assertEquals(404, v.get(4), Double.MIN_VALUE);
assertEquals(505, v.get(5), Double.MIN_VALUE);
assertEquals(0, v.get(6), Double.MIN_VALUE);
assertEquals(707, v.get(7), Double.MIN_VALUE);
assertEquals(0, v.get(8), Double.MIN_VALUE);
assertEquals(0, v.get(9), Double.MIN_VALUE);
}
@Test @Given("putMoreValues")
public SparseVector replaceWithZero(SparseVector v) {
v.put(4, 0.0);
assertEquals(10, v.size());
//assertEquals(3, v.used());
assertEquals(0, v.get(0), Double.MIN_VALUE);
assertEquals(0, v.get(1), Double.MIN_VALUE);
assertEquals(0, v.get(2), Double.MIN_VALUE);
assertEquals(303, v.get(3), Double.MIN_VALUE);
assertEquals(0, v.get(4), Double.MIN_VALUE);
assertEquals(505, v.get(5), Double.MIN_VALUE);
assertEquals(0, v.get(6), Double.MIN_VALUE);
assertEquals(707, v.get(7), Double.MIN_VALUE);
assertEquals(0, v.get(8), Double.MIN_VALUE);
assertEquals(0, v.get(9), Double.MIN_VALUE);
return v;
}
@Test @Given("replaceWithZero")
@Ignore // TODO deal with putting 0.0 in SparseVector#put
public void replaceWithZeroDecreasesUsedCount(SparseVector v) {
assertEquals(3, v.used());
}
@Test @Given("#putMoreValues")
public void entries(SparseVector v) {
Iterator<Entry> it = v.entries().iterator();
Entry e;
assertEquals(true, it.hasNext());
e = it.next();
assertEquals(3, e.index);
assertEquals(303, e.value, Double.MIN_VALUE);
assertEquals(true, it.hasNext());
e = it.next();
assertEquals(4, e.index);
assertEquals(404, e.value, Double.MIN_VALUE);
assertEquals(true, it.hasNext());
e = it.next();
assertEquals(5, e.index);
assertEquals(505, e.value, Double.MIN_VALUE);
assertEquals(true, it.hasNext());
e = it.next();
assertEquals(7, e.index);
assertEquals(707, e.value, Double.MIN_VALUE);
assertEquals(false, it.hasNext());
}
}