package edu.cmu.graphchi.walks;
/**
* @author Aapo Kyrola
*/
import org.junit.Test;
import java.io.IOException;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNull;
public class TestWalkManager {
// There's a lot of duplicated code in here to separately test the int and long versions of
// WalkManager; that could probably be fixed, to just test the parts that are necessary for
// each one... TODO
@Test
public void testIntWalkEncodings() {
IntWalkManager wmgr = new IntWalkManager(1000, 10000);
int x = wmgr.encode(3, true, 114);
System.out.println("X = " + x);
boolean trackBit = wmgr.trackBit(x);
int src = wmgr.sourceIdx(x);
int off = wmgr.off(x);
assertEquals(3, src);
assertEquals(true, trackBit);
assertEquals(114, off);
x = wmgr.encode(16777200, false, 126);
trackBit = wmgr.trackBit(x);
src = wmgr.sourceIdx(x);
off = wmgr.off(x);
assertEquals(16777200, src);
assertEquals(false, trackBit);
assertEquals(126, off);
for(int v=0; v<15000000; v+=29) {
for (int o=0; o<128; o++) {
x = wmgr.encode(v, true, o);
int y = wmgr.encode(v, false, o);
assertEquals(v, wmgr.sourceIdx(x));
assertEquals(v, wmgr.sourceIdx(y));
assertEquals(o, wmgr.off(x));
assertEquals(o, wmgr.off(y));
assertEquals(true, wmgr.trackBit(x));
assertEquals(false, wmgr.trackBit(y));
}
}
x = wmgr.encode(16367, true, 0);
trackBit = wmgr.trackBit(x);
src = wmgr.sourceIdx(x);
off = wmgr.off(x);
assertEquals(16367, src);
assertEquals(true, trackBit);
assertEquals(0, off);
}
@Test
public void testLongWalkEncodings() {
LongWalkManager wmgr = new LongWalkManager(1000, 10000);
long x = wmgr.encode(3, true, 114);
System.out.println("X = " + x);
boolean trackBit = wmgr.trackBit(x);
int src = wmgr.sourceIdx(x);
int off = wmgr.off(x);
assertEquals(3, src);
assertEquals(true, trackBit);
assertEquals(114, off);
x = wmgr.encode(16777200, false, 126);
trackBit = wmgr.trackBit(x);
src = wmgr.sourceIdx(x);
off = wmgr.off(x);
assertEquals(16777200, src);
assertEquals(false, trackBit);
assertEquals(126, off);
for(int v=0; v<15000000; v+=29) {
for (int o=0; o<128; o++) {
x = wmgr.encode(v, true, o);
long y = wmgr.encode(v, false, o);
assertEquals(v, wmgr.sourceIdx(x));
assertEquals(v, wmgr.sourceIdx(y));
assertEquals(o, wmgr.off(x));
assertEquals(o, wmgr.off(y));
assertEquals(true, wmgr.trackBit(x));
assertEquals(false, wmgr.trackBit(y));
}
}
x = wmgr.encode(16367, true, 0);
trackBit = wmgr.trackBit(x);
src = wmgr.sourceIdx(x);
off = wmgr.off(x);
assertEquals(16367, src);
assertEquals(true, trackBit);
assertEquals(0, off);
}
@Test
public void testIntWalkManager() throws IOException {
int nvertices = 33333;
IntWalkManager wmgr = new IntWalkManager(nvertices, 40000);
int tot = 0;
for(int j=877; j < 3898; j++) {
wmgr.addWalkBatch(j, (j % 100) + 10);
tot += (j % 100) + 10;
}
wmgr.initializeWalks();
assertEquals(tot, wmgr.getTotalWalks());
// Now get two snapshots
WalkSnapshot snapshot1 = wmgr.grabSnapshot(890, 1300);
for(int j=890; j <= 1300; j++) {
WalkArray vertexwalks = snapshot1.getWalksAtVertex(j, true);
assertEquals((j % 100) + 10, wmgr.getWalkLength(vertexwalks));
for(int w : ((IntWalkArray)vertexwalks).getArray()) {
if (w != -1)
assertEquals(false, wmgr.trackBit(w));
}
}
assertEquals(890, snapshot1.getFirstVertex());
assertEquals(1300, snapshot1.getLastVertex());
// Next snapshot should be empty
WalkSnapshot snapshot2 = wmgr.grabSnapshot(890, 1300);
for(int j=890; j <= 1300; j++) {
WalkArray vertexwalks = snapshot2.getWalksAtVertex(j, true);
assertNull(vertexwalks);
}
WalkSnapshot snapshot3 = wmgr.grabSnapshot(877, 889);
for(int j=877; j <= 889; j++) {
WalkArray vertexwalks = snapshot3.getWalksAtVertex(j, true);
assertEquals((j % 100) + 10, wmgr.getWalkLength(vertexwalks));
}
WalkSnapshot snapshot4 = wmgr.grabSnapshot(877, 889);
for(int j=877; j <= 889; j++) {
WalkArray vertexwalks = snapshot4.getWalksAtVertex(j, true);
assertNull(vertexwalks);
}
WalkSnapshot snapshot5 = wmgr.grabSnapshot(1301, 3898);
for(int j=1301; j < 3898; j++) {
WalkArray vertexwalks = snapshot5.getWalksAtVertex(j, true);
assertEquals((j % 100) + 10, wmgr.getWalkLength(vertexwalks));
}
// wmgr.dumpToFile(snapshot5, "tmp/snapshot5");
WalkSnapshot snapshot6 = wmgr.grabSnapshot(1301, 3898);
for(int j=1301; j < 3898; j++) {
WalkArray vertexwalks = snapshot6.getWalksAtVertex(j, true);
assertNull(vertexwalks);
}
/* Then update some walks */
int w = wmgr.encode(41, false, 0);
wmgr.moveWalk(w, 76, false);
w = wmgr.encode(88, false, 0);
wmgr.moveWalk(w, 22098, true);
WalkSnapshot snapshot7 = wmgr.grabSnapshot(76, 22098);
WalkArray w1 = snapshot7.getWalksAtVertex(76, true);
assertEquals(1, wmgr.getWalkLength(w1));
w = ((IntWalkArray)w1).getArray()[0];
assertEquals(41, wmgr.sourceIdx(w));
assertEquals(false, wmgr.trackBit(w));
WalkArray w2 = snapshot7.getWalksAtVertex(22098, true);
w = ((IntWalkArray)w2).getArray()[0];
assertEquals(88, wmgr.sourceIdx(w));
assertEquals(true, wmgr.trackBit(w));
}
@Test
public void testLongWalkManager() throws IOException {
int nvertices = 33333;
LongWalkManager wmgr = new LongWalkManager(nvertices, 40000);
int tot = 0;
for(int j=877; j < 3898; j++) {
wmgr.addWalkBatch(j, (j % 100) + 10);
tot += (j % 100) + 10;
}
wmgr.initializeWalks();
assertEquals(tot, wmgr.getTotalWalks());
// Now get two snapshots
WalkSnapshot snapshot1 = wmgr.grabSnapshot(890, 1300);
for(int j=890; j <= 1300; j++) {
WalkArray vertexwalks = snapshot1.getWalksAtVertex(j, true);
assertEquals((j % 100) + 10, wmgr.getWalkLength(vertexwalks));
for(long w : ((LongWalkArray)vertexwalks).getArray()) {
if (w != -1)
assertEquals(false, wmgr.trackBit(w));
}
}
assertEquals(890, snapshot1.getFirstVertex());
assertEquals(1300, snapshot1.getLastVertex());
// Next snapshot should be empty
WalkSnapshot snapshot2 = wmgr.grabSnapshot(890, 1300);
for(int j=890; j <= 1300; j++) {
WalkArray vertexwalks = snapshot2.getWalksAtVertex(j, true);
assertNull(vertexwalks);
}
WalkSnapshot snapshot3 = wmgr.grabSnapshot(877, 889);
for(int j=877; j <= 889; j++) {
WalkArray vertexwalks = snapshot3.getWalksAtVertex(j, true);
assertEquals((j % 100) + 10, wmgr.getWalkLength(vertexwalks));
}
WalkSnapshot snapshot4 = wmgr.grabSnapshot(877, 889);
for(int j=877; j <= 889; j++) {
WalkArray vertexwalks = snapshot4.getWalksAtVertex(j, true);
assertNull(vertexwalks);
}
WalkSnapshot snapshot5 = wmgr.grabSnapshot(1301, 3898);
for(int j=1301; j < 3898; j++) {
WalkArray vertexwalks = snapshot5.getWalksAtVertex(j, true);
assertEquals((j % 100) + 10, wmgr.getWalkLength(vertexwalks));
}
// wmgr.dumpToFile(snapshot5, "tmp/snapshot5");
WalkSnapshot snapshot6 = wmgr.grabSnapshot(1301, 3898);
for(int j=1301; j < 3898; j++) {
WalkArray vertexwalks = snapshot6.getWalksAtVertex(j, true);
assertNull(vertexwalks);
}
/* Then update some walks */
long w = wmgr.encode(41, false, 0);
wmgr.moveWalk(w, 76, false);
w = wmgr.encode(88, false, 0);
wmgr.moveWalk(w, 22098, true);
WalkSnapshot snapshot7 = wmgr.grabSnapshot(76, 22098);
WalkArray w1 = snapshot7.getWalksAtVertex(76, true);
assertEquals(1, wmgr.getWalkLength(w1));
w = ((LongWalkArray)w1).getArray()[0];
assertEquals(41, wmgr.sourceIdx(w));
assertEquals(false, wmgr.trackBit(w));
WalkArray w2 = snapshot7.getWalksAtVertex(22098, true);
w = ((LongWalkArray)w2).getArray()[0];
assertEquals(88, wmgr.sourceIdx(w));
assertEquals(true, wmgr.trackBit(w));
}
}