Skip to content

Commit fe6d374

Browse files
committed
PlanningTestSuite and additional tests added.
1 parent 3859e6c commit fe6d374

File tree

7 files changed

+104
-51
lines changed

7 files changed

+104
-51
lines changed

aima-core/src/main/java/aima/core/logic/planning/Graph.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package aima.core.logic.planning;
22

3-
import aima.core.agent.Action;
43
import aima.core.logic.fol.kb.data.Literal;
54

65
import java.util.ArrayList;
@@ -20,13 +19,13 @@
2019
* @author Ruediger Lunde
2120
*/
2221
public class Graph {
23-
private final List<Level<Literal, ActionSchema>> literalLevels;
24-
private final List<Level<ActionSchema, Literal>> actionLevels;
22+
private final List<Level<Literal, ActionSchema>> literalLevels; // size: numLevels()
23+
private final List<Level<ActionSchema, Literal>> actionLevels; // size: numLevels()-1
2524

2625
public Graph(Problem problem) {
2726
literalLevels = new ArrayList<>();
28-
literalLevels.add(createLiteralLevel(null, problem));
2927
actionLevels = new ArrayList<>();
28+
literalLevels.add(createLiteralLevel(null, problem));
3029
}
3130

3231
public Level<Literal, ActionSchema> getLiteralLevel(int i) {
@@ -37,10 +36,6 @@ public Level<ActionSchema, Literal> getActionLevel(int i) {
3736
return actionLevels.get(i);
3837
}
3938

40-
public List<Level<Literal, ActionSchema>> getLiteralLevels() {
41-
return literalLevels;
42-
}
43-
4439
public int numLevels() {
4540
return literalLevels.size();
4641
}
@@ -165,10 +160,10 @@ private void calculateMutexLinksForLiteralLevel(Level<Literal, ActionSchema> lev
165160
List<ActionSchema> possibleActionsFirst, possibleActionsSecond;
166161
for (int i = 0; i < literals.size(); i++) {
167162
firstLiteral = literals.get(i);
168-
possibleActionsFirst = level.getPrevLinks().get(firstLiteral);
163+
possibleActionsFirst = level.getLinkedPrevObjects(firstLiteral);
169164
for (int j = i; j < literals.size(); j++) {
170165
secondLiteral = literals.get(j);
171-
possibleActionsSecond = level.getPrevLinks().get(secondLiteral);
166+
possibleActionsSecond = level.getLinkedPrevObjects(secondLiteral);
172167
if (firstLiteral.getAtomicSentence().getSymbolicName().equals
173168
(secondLiteral.getAtomicSentence().getSymbolicName()) &&
174169
((firstLiteral.isNegativeLiteral() && secondLiteral.isPositiveLiteral()) ||

aima-core/src/main/java/aima/core/logic/planning/GraphPlanAlgorithm.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public List<List<ActionSchema>> graphPlan(Problem problem) {
5151
// for tl = 0 to ∞ do
5252
for (int tl = 0; ; tl++) {
5353
// St
54-
state = graph.getLiteralLevels().get(tl);
54+
state = graph.getLiteralLevel(tl);
5555
// if goals all non-mutex in St of graph then
5656
if (checkAllGoalsNonMutex(state, goals)) {
5757
// solution ← EXTRACT-SOLUTION(graph, goals, NUMLEVELS(graph), nogoods)
@@ -101,11 +101,11 @@ private List<List<ActionSchema>> extractSolution(Graph graph, List<Literal> goal
101101
if (nogoods.containsKey(level) && nogoods.get(level).contains(goals))
102102
return null;
103103

104-
Level<Literal, ActionSchema> currLevel = graph.getLiteralLevels().get(level);
104+
Level<Literal, ActionSchema> currLevel = graph.getLiteralLevel(level);
105105
List<List<ActionSchema>> setOfPossibleActions = new ArrayList<>();
106106
HashMap<ActionSchema, List<ActionSchema>> mutexLinks = currLevel.getPrevLevel().getMutexLinks();
107107
for (Literal literal : goals) {
108-
List<ActionSchema> possibleActionsPerLiteral = new ArrayList<>(currLevel.getPrevLinks().get(literal));
108+
List<ActionSchema> possibleActionsPerLiteral = new ArrayList<>(currLevel.getLinkedPrevObjects(literal));
109109
setOfPossibleActions.add(possibleActionsPerLiteral);
110110
}
111111
List<List<ActionSchema>> allPossibleSubSets = generateCombinations(setOfPossibleActions);

aima-core/src/main/java/aima/core/logic/planning/Level.java

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package aima.core.logic.planning;
22

3-
import aima.core.logic.fol.kb.data.Literal;
4-
53
import java.util.*;
64

75
/**
@@ -28,7 +26,7 @@ public Level(List<CURR> levelObjects, Problem problem) {
2826
public Level(Level<PREV, CURR> prevLevel, Problem problem) {
2927
// store level objects and prevLinks
3028
this.prevLevel = prevLevel;
31-
HashMap<PREV, List<CURR>> linksFromPreviousLevel = prevLevel.getNextLinks();
29+
HashMap<PREV, List<CURR>> linksFromPreviousLevel = prevLevel.nextLinks;
3230
for (PREV obj : linksFromPreviousLevel.keySet()) {
3331
List<CURR> thisLevelObjects = linksFromPreviousLevel.get(obj);
3432
for (CURR nextObj : thisLevelObjects) {
@@ -41,43 +39,25 @@ public Level(Level<PREV, CURR> prevLevel, Problem problem) {
4139
}
4240
}
4341

44-
/*
45-
// for testing only...
46-
public Level(Level<PREV, CURR> prevLevel, Problem problem, String extraLiterals) {
47-
this(prevLevel, problem);
48-
for (Literal literal : Utils.parse(extraLiterals)) {
49-
if(!levelObjects.contains(literal))
50-
levelObjects.add(literal);
51-
}
52-
calculateNextLinks(problem);
53-
calculateMutexLinks(getPrevLevel());
54-
addPersistenceActions();
55-
}
56-
*/
57-
5842
public List<CURR> getLevelObjects() {
5943
return levelObjects;
6044
}
6145

62-
public HashMap<CURR, List<CURR>> getMutexLinks() {
63-
return mutexLinks;
64-
}
65-
66-
public HashMap<CURR, List<PREV>> getNextLinks() {
67-
return nextLinks;
46+
public List<PREV> getLinkedPrevObjects(CURR obj) {
47+
return prevLinks.get(obj);
6848
}
6949

70-
public HashMap<CURR, List<PREV>> getPrevLinks() {
71-
return prevLinks;
50+
// for testing
51+
public List<PREV> getLinkedNextObjects(CURR obj) {
52+
return nextLinks.get(obj);
7253
}
7354

7455
public Level<PREV, CURR> getPrevLevel() {
7556
return prevLevel;
7657
}
7758

78-
public void addToPrevLinks(CURR currObject, PREV prevObject) {
79-
List<PREV> list = prevLinks.computeIfAbsent(currObject, k -> new ArrayList<>());
80-
list.add(prevObject);
59+
public HashMap<CURR, List<CURR>> getMutexLinks() {
60+
return mutexLinks;
8161
}
8262

8363
public void addToNextLinks(CURR currObject, PREV nextObject) {
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package aima.test.core.unit.logic;
22

3+
import aima.test.core.unit.logic.planning.PlanningTestSuite;
34
import org.junit.runner.RunWith;
45
import org.junit.runners.Suite;
56

67
import aima.test.core.unit.logic.fol.FOLTestSuite;
78
import aima.test.core.unit.logic.propositional.PropositionalTestSuite;
89

910
@RunWith(Suite.class)
10-
@Suite.SuiteClasses({ FOLTestSuite.class, PropositionalTestSuite.class })
11+
@Suite.SuiteClasses({PlanningTestSuite.class, FOLTestSuite.class, PropositionalTestSuite.class })
1112
public class LogicTestSuite {
1213

1314
}
Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
package aima.test.core.unit.logic.planning;
22

3-
import aima.core.logic.planning.Graph;
4-
import aima.core.logic.planning.Level;
5-
import aima.core.logic.planning.PlanningProblemFactory;
6-
import aima.core.logic.planning.Problem;
3+
import aima.core.logic.fol.kb.data.Literal;
4+
import aima.core.logic.planning.*;
75
import org.junit.Assert;
86
import org.junit.Before;
97
import org.junit.Test;
108

9+
import java.util.ArrayList;
10+
import java.util.Arrays;
11+
import java.util.List;
12+
1113
/**
12-
* @author samagra
1314
* @author Ruediger Lunde
1415
*/
1516
public class GraphTest {
@@ -23,7 +24,53 @@ public void setup() {
2324
@Test
2425
public void expandTest() {
2526
Graph graph = new Graph(problem);
27+
Assert.assertEquals(1, graph.numLevels());
28+
// test literal level 0
29+
Level<Literal, ActionSchema> litLevel = graph.getLiteralLevel(0);
30+
Assert.assertNull(litLevel.getPrevLevel());
31+
List<Literal> expectedLevelObjects = Utils.parse(
32+
"Tire(Flat)^Tire(Spare)^At(Spare,Trunk)^At(Flat,Axle)"
33+
);
34+
List<Integer> expectedNextObjects = Arrays.asList(1, 1, 2, 2);
35+
Assert.assertTrue(litLevel.getLevelObjects().containsAll(expectedLevelObjects));
36+
for (int i = 0; i < expectedLevelObjects.size(); i++) {
37+
List<ActionSchema> linkedActions = litLevel.getLinkedPrevObjects(expectedLevelObjects.get(i));
38+
Assert.assertTrue(linkedActions != null && linkedActions.size() == 0);
39+
linkedActions = litLevel.getLinkedNextObjects(expectedLevelObjects.get(i));
40+
Assert.assertTrue(linkedActions != null && linkedActions.size() == expectedNextObjects.get(i));
41+
}
42+
Assert.assertTrue(litLevel.getMutexLinks() != null && litLevel.getMutexLinks().size() == 0);
43+
2644
graph.expand(problem);
27-
Assert.assertEquals(3, graph.getLiteralLevels().size());
45+
Assert.assertEquals(2, graph.numLevels());
46+
47+
// test action level 0
48+
Level<ActionSchema, Literal> actLevel = graph.getActionLevel(0);
49+
Assert.assertNotNull(actLevel.getPrevLevel());
50+
List<ActionSchema> actions = actLevel.getLevelObjects();
51+
Assert.assertEquals(7, actions.size()); // 4 NO-OP, 2 Remove, 1 LeaveOvernight
52+
int prevNull = 0;
53+
int nextNull = 0;
54+
for (ActionSchema action : actions) {
55+
if (actLevel.getLinkedPrevObjects(action) == null)
56+
prevNull++;
57+
if (actLevel.getLinkedNextObjects(action) == null)
58+
nextNull++;
59+
}
60+
Assert.assertEquals(1, prevNull); // currently, no prev links for actions without preconditions
61+
Assert.assertEquals(0, nextNull); // next links must be complete!
62+
Assert.assertEquals(5, actLevel.getMutexLinks().size());
63+
64+
// test literal level 1
65+
litLevel = graph.getLiteralLevel(1);
66+
Assert.assertNotNull(litLevel.getPrevLevel());
67+
68+
List<Literal> literals = litLevel.getLevelObjects();
69+
Assert.assertEquals(12, literals.size());
70+
for (Literal literal : literals) {
71+
Assert.assertNotNull(litLevel.getLinkedPrevObjects(literal));
72+
Assert.assertNotNull(litLevel.getLinkedNextObjects(literal));
73+
}
74+
Assert.assertEquals(10, litLevel.getMutexLinks().size());
2875
}
2976
}

aima-core/src/test/java/aima/test/core/unit/logic/planning/LevelTest.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,34 @@
1010

1111
/**
1212
* @author samagra
13+
* @author Ruediger Lunde
1314
*/
1415
public class LevelTest {
15-
Problem spareTireProblem;
16+
Problem problem;
1617

1718
@Before
1819
public void setup() {
19-
spareTireProblem = PlanningProblemFactory.spareTireProblem();
20+
problem = PlanningProblemFactory.spareTireProblem();
2021
}
2122

22-
/*
23+
24+
@Test
25+
public void levelCreationTest() {
26+
Level<Literal, ActionSchema> level = new Level<>(problem.getInitialState().getFluents(), problem);
27+
List<Literal> expectedLevelObjects = Utils.parse(
28+
"Tire(Flat)^Tire(Spare)^At(Spare,Trunk)^At(Flat,Axle)"
29+
);
30+
Assert.assertTrue(level.getLevelObjects().containsAll(expectedLevelObjects));
31+
for (Literal literal : expectedLevelObjects) {
32+
List<ActionSchema> linkedActions = level.getLinkedPrevObjects(literal);
33+
Assert.assertTrue(linkedActions != null && linkedActions.size() == 0);
34+
linkedActions = level.getLinkedNextObjects(literal);
35+
Assert.assertNull(linkedActions);
36+
}
37+
Assert.assertTrue(level.getMutexLinks() != null && level.getMutexLinks().size() == 0);
38+
}
39+
40+
/* currently not supported...(RLu)
2341
@Test
2442
public void firstLevelTest() {
2543
Level firstLevel = new Level(null, spareTireProblem, "At(Spare,Trunk)^At(Flat,Axle) ^~At(Spare,Axle)^~At(Flat,Ground)^~At(Spare,Ground)");
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package aima.test.core.unit.logic.planning;
2+
3+
import org.junit.runner.RunWith;
4+
import org.junit.runners.Suite;
5+
6+
@RunWith(Suite.class)
7+
@Suite.SuiteClasses({ActionSchemaTest.class, GraphPlanAlgorithmTest.class, GraphTest.class, LevelTest.class,
8+
ProblemTest.class, StateTest.class, UtilsTest.class})
9+
10+
public class PlanningTestSuite {
11+
12+
}

0 commit comments

Comments
 (0)