package cc.mallet.util.tests;
import cc.mallet.util.search.*;
import junit.framework.*;
/**
* Created by IntelliJ IDEA.
* User: pereira
* Date: Jun 19, 2005
* Time: 2:36:10 PM
* Test A* search.
*/
public class TestAStar extends TestCase {
private class State implements AStarState {
private double to;
private State next[];
private double cost[];
private int id;
private boolean sink;
private State(int id, int numEdges, double to, boolean sink) {
this.id = id;
next = new State[numEdges];
cost = new double[numEdges];
this.to = to;
this.sink = sink;
}
public boolean isFinal() { return sink; }
public double completionCost() { return to; }
private class NextStates extends SearchState.NextStateIterator {
private int i;
private NextStates() {
i = 0;
}
public boolean hasNext() { return i < next.length; }
public SearchState nextState() { return next[i++]; }
public double cost() { return cost[i-1]; }
}
public SearchState.NextStateIterator getNextStates() {
return new NextStates();
}
public String toString() { return "node " + id; }
}
public TestAStar(String name) {
super(name);
}
public void testSmall() {
State node5 = new State(5, 0, 0, true);
State node6 = new State(6, 0, 0, true);
State node2 = new State(2, 1, 6, false);
node2.next[0] = node5; node2.cost[0] = 6;
State node3 = new State(3, 2, 2, false);
node3.next[0] = node5; node3.cost[0] = 4;
node3.next[1] = node6; node3.cost[1] = 2;
State node4 = new State(4, 1, 6, false);
node4.next[0] = node6; node4.cost[0] = 6;
State node0 = new State(0, 2, 4, false);
node0.next[0] = node2; node0.cost[0] = 2;
node0.next[1] = node3; node0.cost[1] = 2;
State node1 = new State(1, 2, 3, false);
node1.next[0] = node3; node1.cost[0] = 1;
node1.next[1] = node4; node1.cost[1] = 1;
State[][] paths = new State[6][];
double[] costs = new double[6];
paths[0] = new State[] { node6, node3, node1 };
costs[0] = 3;
paths[1] = new State[] { node6, node3, node0 };
costs[1] = 4;
paths[2] = new State[] { node5, node3, node1 };
costs[2] = 5;
paths[3] = new State[] { node5, node3, node0 };
costs[3] = 6;
paths[4] = new State[] { node6, node4, node1 };
costs[4] = 7;
paths[5] = new State[] { node5, node2, node0 };
costs[5] = 8;
AStar s = new AStar(new State[] {node0, node1}, 7);
int i = 0;
while (s.hasNext()) {
assertTrue("number of answers > " + i, i < 6);
SearchNode n = s.nextAnswer();
assertEquals("costs[" + i + "] != " + n.getPriority(), costs[i],
n.getPriority(), 1e-5);
int j = 0;
while (n != null) {
assertTrue("path length > " + j, j < 3);
assertTrue("path[" + i + "][" + j + "] != " + n,
paths[i][j] == n.getState());
j++;
n = (SearchNode)n.getParent();
}
assertTrue("path length != " + j, j == 3);
i++;
}
assertTrue("number of answers != " + i, i == 6);
}
public static Test suite() {
return new TestSuite(TestAStar.class);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
}