Support for plan methods

This commit is contained in:
Naveen Sundar Govindarajulu 2017-12-22 17:44:24 -08:00
parent 381bbc60af
commit 9bdf4fe029
39 changed files with 1539 additions and 229 deletions

View file

@ -14,7 +14,7 @@
<dependency>
<groupId>logic</groupId>
<artifactId>prover</artifactId>
<version>0.09</version>
<version>0.84</version>
</dependency>
<dependency>

View file

@ -91,7 +91,7 @@
(snark:initialize :verbose verbose)
(if (not verbose) (snark-deverbose) )
(temp-sorts)
(snark:run-time-limit 0.05)
(snark:run-time-limit 1)
(snark:assert-supported t)
(snark:assume-supported t)
(snark:prove-supported t)

View file

@ -1,13 +1,13 @@
package edu.rpi.rair;
import com.naveensundarg.shadow.prover.core.Logic;
import com.naveensundarg.shadow.prover.representations.formula.And;
import com.naveensundarg.shadow.prover.representations.formula.Formula;
import com.naveensundarg.shadow.prover.representations.value.Compound;
import com.naveensundarg.shadow.prover.representations.value.Value;
import com.naveensundarg.shadow.prover.representations.value.Variable;
import com.naveensundarg.shadow.prover.utils.CollectionUtils;
import com.naveensundarg.shadow.prover.utils.Logic;
import com.naveensundarg.shadow.prover.utils.Sets;
import com.naveensundarg.shadow.prover.utils.Sets;
import java.util.List;
import java.util.Map;
@ -159,6 +159,11 @@ public class Action {
return trivial;
}
public Compound getShorthand() {
return shorthand;
}
@Override
public String toString() {
return shorthand.getArguments().length == 0? name: shorthand.toString();

View file

@ -3,6 +3,8 @@ package edu.rpi.rair;
import com.naveensundarg.shadow.prover.representations.formula.Formula;
import com.naveensundarg.shadow.prover.utils.Pair;
import com.naveensundarg.shadow.prover.utils.Sets;
import edu.rpi.rair.utils.PlanningProblem;
import edu.rpi.rair.utils.Visualizer;
import java.util.*;
import java.util.stream.Collectors;
@ -13,8 +15,8 @@ import java.util.stream.Collectors;
public class DepthFirstPlanner implements Planner {
private static int MAX_DEPTH = 4;
private static boolean EXHAUSTIVE_TILL_MAX_DEPTH = false;
private static int MAX_DEPTH = 5;
private static boolean EXHAUSTIVE_TILL_MAX_DEPTH = true;
public static int getMaxDepth() {
return MAX_DEPTH;
@ -59,6 +61,61 @@ public class DepthFirstPlanner implements Planner {
}
@Override
public Optional<Set<Plan>> plan(PlanningProblem problem, Set<Formula> background, Set<Action> actions, State start, State goal) {
if (!EXHAUSTIVE_TILL_MAX_DEPTH) {
return planInternal(Sets.newSet(), 0, MAX_DEPTH, background, actions, start, goal);
} else {
Set<Plan> possiblePlans = Sets.newSet();
for (int i = 1; i <= MAX_DEPTH; i++) {
Optional<Set<Plan>> plansOpt = planInternal(Sets.newSet(), 0, i, background, actions, start, goal);
if (plansOpt.isPresent()) {
Set<Plan> complyingPlans = plansOpt.get().stream().
filter(plan-> plan.getActions().stream().
map(Action::getShorthand).
noneMatch(shortHand-> {
return problem.getAvoidIfPossible().
stream().map(Object::toString).
collect(Collectors.toSet()).
contains(shortHand.getName());
})).
collect(Collectors.toSet());
if(!complyingPlans.isEmpty()){
return Optional.of(complyingPlans);
}
else{
possiblePlans.addAll(plansOpt.get());
}
}
}
//
if(possiblePlans.isEmpty()){
return Optional.empty();
} else{
return Optional.of(possiblePlans);
}
}
}
private Optional<Set<Plan>> planInternal(Set<Pair<State, Action>> history, int currentDepth, int maxDepth, Set<Formula> background, Set<Action> actions, State start, State goal) {
@ -83,9 +140,11 @@ public class DepthFirstPlanner implements Planner {
for (Pair<State, Action> stateActionPair : nextStateActionPairs.get()) {
Visualizer.push();
Optional<Set<Plan>> planOpt = planInternal(history, currentDepth + 1, maxDepth, background, actions, stateActionPair.first(), goal);
Visualizer.pop();
if (planOpt.isPresent()) {
atleastOnePlanFound = true;
@ -100,6 +159,8 @@ public class DepthFirstPlanner implements Planner {
allPlans.addAll(augmentedPlans);
// return Optional.of(allPlans);
//TODO: store different plans and return the best plan.
}
}

View file

@ -10,6 +10,8 @@ public class Goal {
private final State goalState;
private final double priority;
private final String name;
private final String description;
private static final AtomicInteger nameCounter;
static {
@ -19,12 +21,22 @@ public class Goal {
this.goalState = goalState;
this.priority = priority;
this.name = "G" + nameCounter.incrementAndGet();
this.description = goalState.toString();
}
private Goal(State goalState, double priority, String name) {
this.goalState = goalState;
this.priority = priority;
this.name = name;
this.description = goalState.toString();
}
private Goal(State goalState, double priority, String name, String description) {
this.goalState = goalState;
this.priority = priority;
this.name = name;
this.description = description;
}
public static Goal makeGoal(State goalState, double priority){
@ -32,9 +44,9 @@ public class Goal {
}
public static Goal makeGoal(State goalState, double priority, String name){
public static Goal makeGoal(State goalState, double priority, String name, String description){
return new Goal(goalState, priority, name);
return new Goal(goalState, priority, name, description);
}
@ -51,13 +63,12 @@ public class Goal {
return name;
}
public String getDescription() {
return description;
}
@Override
public String toString() {
return "Goal{" +
"goalState=" + goalState +
", priority=" + priority +
", name='" + name + '\'' +
'}';
return "(" + name + ": " + description + ": " + priority+ ")";
}
@Override

View file

@ -4,6 +4,7 @@ import com.naveensundarg.shadow.prover.representations.formula.Formula;
import com.naveensundarg.shadow.prover.utils.CollectionUtils;
import com.naveensundarg.shadow.prover.utils.Pair;
import com.naveensundarg.shadow.prover.utils.Sets;
import edu.rpi.rair.utils.PlanningProblem;
import java.util.Comparator;
import java.util.List;
@ -24,14 +25,16 @@ public class GoalTracker {
private final Set<Goal> currentGoals;
private final Planner planner;
private final Set<Action> actions;
public GoalTracker(Set<Formula> background, State startState, Set<Action> actions) {
private final PlanningProblem problem;
public GoalTracker(PlanningProblem problem, Set<Formula> background, State startState, Set<Action> actions) {
this.background = background;
this.currentState = startState;
this.currentGoals = CollectionUtils.newEmptySet();
this.planner = new DepthFirstPlanner();
this.actions = actions;
this.problem = problem;
Operations.reset();
}
@ -68,7 +71,7 @@ public class GoalTracker {
Optional<Set<Plan>> possiblePlans = planner.plan(background, actions, currentState, goal.getGoalState());
Optional<Set<Plan>> possiblePlans = planner.plan(problem, background, actions, currentState, goal.getGoalState());
if (!possiblePlans.isPresent()) {
@ -151,6 +154,18 @@ public class GoalTracker {
}
public Set<Formula> getBackground() {
return background;
}
public State getCurrentState() {
return currentState;
}
public PlanningProblem getProblem() {
return problem;
}
public Set<Goal> getCurrentGoals() {
return currentGoals;
}

View file

@ -0,0 +1,13 @@
package edu.rpi.rair;
import edu.rpi.rair.Plan;
import edu.rpi.rair.utils.PlanningProblem;
/**
* Created by naveensundarg on 12/19/17.
*/
public interface Inducer {
Plan induce(PlanningProblem planningProblem, State start, Goal goal, Plan plan);
}

View file

@ -3,7 +3,6 @@ package edu.rpi.rair;
import com.naveensundarg.shadow.prover.core.Prover;
import com.naveensundarg.shadow.prover.core.SnarkWrapper;
import com.naveensundarg.shadow.prover.core.proof.Justification;
import com.naveensundarg.shadow.prover.core.proof.TrivialJustification;
import com.naveensundarg.shadow.prover.representations.formula.BiConditional;
import com.naveensundarg.shadow.prover.representations.formula.Formula;
import com.naveensundarg.shadow.prover.representations.formula.Predicate;
@ -12,7 +11,9 @@ import com.naveensundarg.shadow.prover.representations.value.Variable;
import com.naveensundarg.shadow.prover.utils.CollectionUtils;
import com.naveensundarg.shadow.prover.utils.ImmutablePair;
import com.naveensundarg.shadow.prover.utils.Pair;
import com.naveensundarg.shadow.prover.utils.Sets;
import edu.rpi.rair.utils.Visualizer;
import org.apache.commons.lang3.tuple.Triple;
import java.util.List;
@ -30,7 +31,7 @@ import static edu.rpi.rair.State.FALSE;
public class Operations {
private static boolean DEEP_EQUIVALENCE = false;
private static boolean THROW_AWAY_EMPTY_BINDINGS = false;
private static boolean THROW_AWAY_EMPTY_BINDINGS = true;
private static Prover prover;
@ -46,7 +47,8 @@ public class Operations {
applyCache.clear();
}
static {
prover = new SnarkWrapper();
prover = SnarkWrapper.getInstance();
}
@ -110,7 +112,7 @@ public class Operations {
if(room1.equals(room2)){
return Optional.of(Justification.trivial(goal));
return Optional.of(Justification.trivial(assumptions, goal));
}
}
@ -172,8 +174,15 @@ public class Operations {
public static synchronized Optional<Set<Map<Variable, Value>>> proveAndGetMultipleBindings(Set<Formula> givens, Formula goal, List<Variable> variables) {
return prover.proveAndGetMultipleBindings(givens, goal, variables);
Optional<org.apache.commons.lang3.tuple.Pair<Justification, Set<Map<Variable, Value>>>> ans = prover.proveAndGetMultipleBindings(givens, goal, variables);
if(ans.isPresent()){
return Optional.of(ans.get().getRight());
}else {
return Optional.empty();
}
/* Future<Optional<Set<Map<Variable, Value>>>> future = new FutureTask<>(()-> prover.proveAndGetMultipleBindings(givens, goal, variables));
Optional<Set<Map<Variable, Value>>> answer;
@ -192,9 +201,14 @@ public class Operations {
public static Optional<Set<Pair<State, Action>>> apply(Set<Formula> background, Action action, State state) {
if(applyCache.containsKey(Triple.of(background, action, state))){
return applyCache.get(Triple.of(background, action, state));
Optional<Set<Pair<State, Action>>> ans = applyCache.get(Triple.of(background, action, state));
if(ans.isPresent()){
return applyCache.get(Triple.of(background, action, state));
}
}
Set<Formula> givens = Sets.union(background, state.getFormulae());
@ -206,11 +220,14 @@ public class Operations {
if (!bindingsOpt.isPresent()) {
applyCache.put(Triple.of(background, action ,state), Optional.empty());
return Optional.empty();
}
Visualizer.nested(action.getName());
Set<Pair<State, Action>> nexts = Sets.newSet();
for (Map<Variable, Value> binding : bindingsOpt.get()) {
@ -222,7 +239,7 @@ public class Operations {
Set<Formula> instantiatedDeletions = action.instantiateDeletions(binding);
Set<Formula> formulaeToRemove = state.getFormulae().stream().
filter(f -> instantiatedDeletions.stream().anyMatch(d -> equivalent(background, f, d))).collect(Collectors.toSet());
filter(f -> instantiatedDeletions.stream().anyMatch(d -> equivalent(Sets.union(background, state.getFormulae()), f, d))).collect(Collectors.toSet());
Set<Formula> newFormulae = Sets.union(background, state.getFormulae());
@ -239,6 +256,7 @@ public class Operations {
}
if (nexts.isEmpty()) {
Map<Variable, Value> emptyBinding = CollectionUtils.newMap();
@ -262,6 +280,10 @@ public class Operations {
}
nexts = nexts.stream().filter(n-> !n.first().getFormulae().equals(state.getFormulae())).collect(Collectors.toSet());;
applyCache.put(Triple.of(background, action ,state), Optional.of(nexts));
return Optional.of(nexts);

View file

@ -2,6 +2,7 @@ package edu.rpi.rair;
import com.naveensundarg.shadow.prover.representations.formula.Formula;
import com.naveensundarg.shadow.prover.utils.CollectionUtils;
import edu.rpi.rair.utils.Visualizer;
import java.util.List;
import java.util.Set;
@ -63,15 +64,32 @@ public class Plan {
public boolean noConflicts(Set<Goal> goals){
return getConflictingGoals(goals).isEmpty();
Set<Goal> conflicts = getConflictingGoals(goals);
if(!conflicts.isEmpty()){
Visualizer.print(this.toString()) ;
Visualizer.printRed(" CONFLICTS WITH ");
Visualizer.print(conflicts.stream().map(x-> x.getDescription()).collect(Collectors.toSet()).toString());
System.out.println();
}
return conflicts.isEmpty();
}
public static Plan cleanUp(Plan plan){
List<Action> actions = plan.getActions();
List<State> states = plan.getExpectedStates();
return null;
}
@Override
public String toString() {
return "Plan{" +
"actions=" + actions +
'}';
return actions.stream().map(x-> x.toString() + " ").reduce((x,y) -> x + y).get();
}
@Override

View file

@ -0,0 +1,123 @@
package edu.rpi.rair;
import com.naveensundarg.shadow.prover.representations.formula.And;
import com.naveensundarg.shadow.prover.representations.formula.Formula;
import com.naveensundarg.shadow.prover.representations.value.Compound;
import com.naveensundarg.shadow.prover.representations.value.Value;
import com.naveensundarg.shadow.prover.representations.value.Variable;
import com.naveensundarg.shadow.prover.utils.CollectionUtils;
import com.naveensundarg.shadow.prover.utils.Reader;
import com.naveensundarg.shadow.prover.utils.Sets;
import edu.rpi.rair.utils.PlanningProblem;
import us.bpsm.edn.Keyword;
import us.bpsm.edn.Symbol;
import us.bpsm.edn.parser.Parseable;
import us.bpsm.edn.parser.Parser;
import us.bpsm.edn.parser.Parsers;
import java.io.StringReader;
import java.util.*;
import java.util.stream.Collector;
import java.util.stream.Collectors;
/**
* Created by naveensundarg on 12/22/17.
*/
public class PlanMethod {
private final Set<Formula> backGroundStatePreconditions;
private final Set<Formula> goalPreconditions;
private final List<Variable> freeVariables;
private final List<Compound> actionCompounds;
public PlanMethod(Set<Formula> goalPreconditions, Set<Formula> backGroundStatePreconditions, List<Variable> freeVariables, List<Compound> actionCompounds) {
this.goalPreconditions = goalPreconditions;
this.backGroundStatePreconditions = backGroundStatePreconditions;
this.freeVariables = freeVariables;
this.actionCompounds = actionCompounds;
}
public PlanMethod(Set<Formula> goalPreconditions, List<Variable> freeVariables, List<Compound> actionCompounds) {
this.goalPreconditions = goalPreconditions;
this.backGroundStatePreconditions = Sets.newSet();
this.freeVariables = freeVariables;
this.actionCompounds = actionCompounds;
}
public Optional<List<PlanSketch>> apply(Set<Formula> background, Set<Formula> start, Set<Formula> goal, Set<Action> actionSpecs) {
Optional<Set<Map<Variable, Value>>> mappingsOpt = Operations.proveAndGetMultipleBindings(goal, new And(new ArrayList<>(goalPreconditions)), freeVariables);
if (mappingsOpt.isPresent()) {
Set<Map<Variable, Value>> mappings = mappingsOpt.get();
List<PlanSketch> planSketches = CollectionUtils.newEmptyList();
mappings.forEach(mapping ->{
Formula whileCondition = (new And(new ArrayList<>(backGroundStatePreconditions))).apply(mapping);
boolean whileHolds = Operations.proveCached(Sets.union(background, start), whileCondition).isPresent();
if(whileHolds){
List<Compound> instantiatedActionCompounds = actionCompounds.stream().map(compound -> (Compound) compound.apply(mapping)).collect(Collectors.toList());
List<Action> actions = CollectionUtils.newEmptyList();
for (Compound compound : instantiatedActionCompounds) {
try {
actions.add(PlanningProblem.readInstantiatedAction(actionSpecs, compound.toString()));
} catch (Reader.ParsingException e) {
e.printStackTrace();
}
}
planSketches.add(new PlanSketch(actions, background));
}
});
return Optional.of(planSketches);
} else {
return Optional.empty();
}
}
@Override
public String toString() {
return "PlanMethod{" +
"backGroundStatePreconditions=" + backGroundStatePreconditions +
", goalPreconditions=" + goalPreconditions +
", freeVariables=" + freeVariables +
", actionCompounds=" + actionCompounds +
'}';
}
}

View file

@ -0,0 +1,14 @@
package edu.rpi.rair;
import com.naveensundarg.shadow.prover.representations.formula.Formula;
import com.naveensundarg.shadow.prover.utils.CollectionUtils;
import com.naveensundarg.shadow.prover.utils.Sets;
import java.util.List;
import java.util.Set;
public class PlanSketch extends Plan{
public PlanSketch(List<Action> actions, Set<Formula> background) {
super(actions, CollectionUtils.newEmptyList(), background);
}
}

View file

@ -1,6 +1,7 @@
package edu.rpi.rair;
import com.naveensundarg.shadow.prover.representations.formula.Formula;
import edu.rpi.rair.utils.PlanningProblem;
import java.util.List;
import java.util.Optional;
@ -12,5 +13,6 @@ import java.util.Set;
public interface Planner {
Optional<Set<Plan>> plan(Set<Formula> background, Set<Action> actions, State start, State goal);
Optional<Set<Plan>> plan(PlanningProblem problem, Set<Formula> background, Set<Action> actions, State start, State goal);
}

View file

@ -17,7 +17,7 @@ import java.util.stream.Collectors;
public class State {
final Set<Formula> formulae;
private static final Prover prover = new SnarkWrapper();
private static final Prover prover = SnarkWrapper.getInstance();
static Formula FALSE;
static{

View file

@ -0,0 +1,63 @@
package edu.rpi.rair.inducers;
import com.naveensundarg.shadow.prover.representations.formula.Formula;
import com.naveensundarg.shadow.prover.representations.value.Compound;
import com.naveensundarg.shadow.prover.representations.value.Value;
import com.naveensundarg.shadow.prover.representations.value.Variable;
import com.naveensundarg.shadow.prover.utils.Pair;
import com.naveensundarg.shadow.prover.utils.Sets;
import edu.rpi.rair.*;
import edu.rpi.rair.utils.Commons;
import edu.rpi.rair.utils.PlanningProblem;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* Created by naveensundarg on 12/19/17.
*/
public class SimpleInducer implements Inducer{
@Override
public Plan induce(PlanningProblem planningProblem, State start, Goal goal, Plan plan) {
List<Action> actionList = plan.getActions();
List<Compound> actionCompounds = actionList.stream().map(Action::getShorthand).collect(Collectors.toList());
Set<Formula> backgroundFormula = planningProblem.getBackground().stream().collect(Collectors.toSet());
Set<Formula> initFormula = start.getFormulae().stream().collect(Collectors.toSet());
Set<Formula> goalFormula = goal.getGoalState().getFormulae().stream().collect(Collectors.toSet());
Set<Value> values = actionCompounds.stream().
map(Compound::getArguments).map(Arrays::stream).map(x->x.collect(Collectors.toSet()))
.reduce(Sets.newSet(), Sets::union)
.stream().filter(Value::isConstant).collect(Collectors.toSet());
Map<Value, Variable> valueVariableMap = Commons.makeVariables(values);
Function<Set<Formula>,Set<Formula>> getRelevantFormula = formulae -> formulae.stream().
filter(formula -> !Sets.intersection(values, formula.valuesPresent()).isEmpty()).
collect(Collectors.toSet());
Set<Formula> relevantBackgroundFormula = getRelevantFormula.apply(backgroundFormula);
Set<Formula> relevantInitFormula = getRelevantFormula.apply(initFormula);
Set<Formula> relevantGoalFormula = getRelevantFormula.apply(goalFormula);
Commons.generalize(valueVariableMap, relevantBackgroundFormula);
Commons.generalize(valueVariableMap, relevantInitFormula);
Commons.generalize(valueVariableMap, relevantGoalFormula);
System.out.println(relevantBackgroundFormula);
System.out.println(relevantInitFormula);
System.out.println(relevantGoalFormula);
return null;
}
}

View file

@ -1,12 +1,108 @@
package edu.rpi.rair.utils;
import clojure.lang.Obj;
import com.naveensundarg.shadow.prover.representations.formula.And;
import com.naveensundarg.shadow.prover.representations.formula.Existential;
import com.naveensundarg.shadow.prover.representations.formula.Formula;
import com.naveensundarg.shadow.prover.representations.formula.Universal;
import com.naveensundarg.shadow.prover.representations.value.Value;
import com.naveensundarg.shadow.prover.representations.value.Variable;
import com.naveensundarg.shadow.prover.utils.CollectionUtils;
import com.naveensundarg.shadow.prover.utils.Sets;
import edu.rpi.rair.State;
import us.bpsm.edn.parser.Parseable;
import java.util.Map;
import java.util.Set;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* Created by naveensundarg on 1/15/17.
*/
public class Commons {
public static Map<Value, Variable> makeVariables(Set<Value> values){
return makeVariables(values, 1);
}
public static Map<Value, Variable> makeVariables(Set<Value> values, int startValue){
int n = startValue;
Map<Value, Variable> valueVariableMap = CollectionUtils.newMap();
for(Value value: values){
Variable variable = new Variable("?" +value);
valueVariableMap.put(value, variable);
n = n +1;
}
return valueVariableMap;
}
public static Formula generalize(Map<Value, Variable> universalValueVariableMap, Set<Formula> formulae){
Set<Value> allValues = formulae.stream().map(Formula::valuesPresent).reduce(Sets.newSet(), Sets::union).stream().filter(x->x.isConstant()).collect(Collectors.toSet());
Map<Value, Variable> existentialValueVariableMap = makeVariables(Sets.difference(allValues, universalValueVariableMap.keySet()), universalValueVariableMap.size() + 1);
Map<Value, Variable> combinedMap = combine((universalValueVariableMap), (existentialValueVariableMap));
Formula f = (new And(formulae.stream().collect(Collectors.toList()))).generalize(combinedMap);
Variable[] universalVars = new Variable[universalValueVariableMap.values().size()];
universalVars = universalValueVariableMap.values().toArray(universalVars);
Variable[] existentialVars = new Variable[existentialValueVariableMap.values().size()];
existentialVars = existentialValueVariableMap.values().toArray(existentialVars);
System.out.println(new Universal(universalVars, new Existential(existentialVars, f)));
return new Universal(universalVars, new Existential(existentialVars, f));
}
public static <U, V> Map<V, U> reverse(Map<U, V> map){
Map<V, U> reverseMap = CollectionUtils.newMap();
map.forEach((u, v) -> reverseMap.put(v, u));
return reverseMap;
}
public static <U, V> Map<U, V> combine(Map<U, V> map1, Map<U, V> map2){
Map<U, V> combinedMap = CollectionUtils.newMap();
map1.forEach(combinedMap::put);
map2.forEach(combinedMap::put);
return combinedMap;
}
public static<U, V, W> Object runAndTime(BiFunction<U, V, W> function, U u, V v, String message){
long start, end;
start = System.currentTimeMillis();
Object w = function.apply(u, v);
end = System.currentTimeMillis();
System.out.println("Timing for: " + message + (end - start)/1000 + " s");
return w;
}
}

View file

@ -0,0 +1,18 @@
package edu.rpi.rair.utils;
import com.diogonunes.jcdp.color.ColoredPrinter;
import com.diogonunes.jcdp.color.api.AbstractColoredPrinter;
/**
* Created by naveensundarg on 9/29/17.
*/
public class FrozenPrinter extends ColoredPrinter {
public FrozenPrinter(Builder b) {
super(b);
}
}

View file

@ -27,6 +27,7 @@ public class GoalTrackingProblem {
private static final Keyword DEFINITIONS = Keyword.newKeyword("definitions");
private static final Keyword GOALS = Keyword.newKeyword("goals");
private static final Keyword DESCRIPTION = Keyword.newKeyword("description");
private static final Keyword PRIORITY = Keyword.newKeyword("priority");
private static final Keyword STATE = Keyword.newKeyword("state");
@ -69,7 +70,8 @@ public class GoalTrackingProblem {
double priority = ((Double) goalSpec.get(PRIORITY));
Set<Formula> stateFormulae = PlanningProblem.readFrom((List<?>) goalSpec.get(STATE));
goals.add(Goal.makeGoal(State.initializeWith(stateFormulae), priority, name));
String description = goalSpec.get(DESCRIPTION)!=null? goalSpec.get(DESCRIPTION).toString(): stateFormulae.toString();
goals.add(Goal.makeGoal(State.initializeWith(stateFormulae), priority, name, description));
}

View file

@ -0,0 +1,77 @@
package edu.rpi.rair.utils;
import com.diogonunes.jcdp.color.ColoredPrinter;
import com.diogonunes.jcdp.color.api.Ansi;
import com.google.common.collect.Sets;
import com.naveensundarg.shadow.prover.core.Prover;
import com.naveensundarg.shadow.prover.core.SnarkWrapper;
import com.naveensundarg.shadow.prover.utils.Reader;
import edu.rpi.rair.*;
import edu.rpi.rair.inducers.SimpleInducer;
import org.apache.commons.lang3.tuple.Triple;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* Created by naveensundarg on 1/15/17.
*/
public class LearningSystem {
static ColoredPrinter cp = new ColoredPrinter.Builder(1, false).build();
static List<Triple<BiConsumer<String, String>, String, String>> printQueue = new ArrayList<>();
public static void main(String[] args) throws Reader.ParsingException, InterruptedException {
System.out.println();
RunDemo.planningProblemWarmUp();
Visualizer.setShouldVisualize(false);
List<GoalTrackingProblem> goalTrackingProblemList1 = (GoalTrackingProblem.readFromFile(Planner.class.getResourceAsStream("seriated_challenge_1.clj")));
List<GoalTrackingProblem> goalTrackingProblemList2 = (GoalTrackingProblem.readFromFile(Planner.class.getResourceAsStream("seriated_challenge_2.clj")));
GoalTrackingProblem goalTrackingProblem1 = goalTrackingProblemList1.get(0);
GoalTrackingProblem goalTrackingProblem2 = goalTrackingProblemList2.get(0);
PlanningProblem planningProblem1 = goalTrackingProblem1.getPlanningProblem();
PlanningProblem planningProblem2 = goalTrackingProblem2.getPlanningProblem();
Planner planner = new DepthFirstPlanner();
// GoalTracker(PlanningProblem problem, Set<Formula> background, State startState, Set<Action> actions)
GoalTracker goalTracker1 = new GoalTracker(planningProblem1, planningProblem1.getBackground(), planningProblem1.getStart(), planningProblem1.getActions());
GoalTracker goalTracker2 = new GoalTracker(planningProblem2, planningProblem2.getBackground(), planningProblem2.getStart(), planningProblem2.getActions());
long start, end;
// Plan plan1 = goalTracker1.adoptGoal(goalTrackingProblem1.getGoalNamed("G1")).get();
//Plan plan2 = goalTracker2.adoptGoal(goalTrackingProblem2.getGoalNamed("G1")).get();
BiFunction<GoalTracker, GoalTrackingProblem, Plan> run = (goalTracker, goalTrackingProblem) -> goalTracker.adoptGoal(goalTrackingProblem.getGoalNamed("G1")).get();
System.out.println(Commons.runAndTime(run, goalTracker1, goalTrackingProblem1, "Problem 1"));
System.out.println(Commons.runAndTime(run, goalTracker2, goalTrackingProblem2, "Problem 2"));
}
}

View file

@ -2,10 +2,12 @@ package edu.rpi.rair.utils;
import clojure.lang.Obj;
import com.naveensundarg.shadow.prover.representations.formula.Formula;
import com.naveensundarg.shadow.prover.representations.value.Compound;
import com.naveensundarg.shadow.prover.representations.value.Value;
import com.naveensundarg.shadow.prover.representations.value.Variable;
import com.naveensundarg.shadow.prover.utils.CollectionUtils;
import com.naveensundarg.shadow.prover.utils.Reader;
import com.naveensundarg.shadow.prover.utils.Sets;
import edu.rpi.rair.Action;
import edu.rpi.rair.State;
import us.bpsm.edn.Keyword;
@ -17,6 +19,7 @@ import us.bpsm.edn.parser.Token;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.security.Key;
import java.util.*;
import java.util.stream.Collectors;
@ -34,11 +37,14 @@ public class PlanningProblem {
private Optional<Set<List<Action>>> expectedActionSequencesOpt;
private Map<String, Action> actionMap;
private Set<Value> avoidIfPossible;
private static final Keyword BACKGROUND = Keyword.newKeyword("background");
private static final Keyword START = Keyword.newKeyword("start");
private static final Keyword GOAL = Keyword.newKeyword("goal");
private static final Keyword NAME = Keyword.newKeyword("name");
private static final Keyword ACTION = Keyword.newKeyword("actions");
private static final Keyword AVOID_IF_POSSIBLE = Keyword.newKeyword("avoid-if-possible");
private static final Keyword PRECONDITIONS = Keyword.newKeyword("preconditions");
private static final Keyword ADDITIONS = Keyword.newKeyword("additions");
@ -48,7 +54,7 @@ public class PlanningProblem {
private static final Keyword EXPECTED_PLANS = Keyword.newKeyword("expected-plans");
public PlanningProblem(String name, Set<Formula> background, State start, State goal, Set<Action> actions) {
private PlanningProblem(String name, Set<Formula> background, State start, State goal, Set<Action> actions, Set<Value> avoidIfPossible) {
this.background = background;
this.start = start;
@ -56,10 +62,13 @@ public class PlanningProblem {
this.goal = goal;
this.name = name;
this.actionMap = CollectionUtils.newMap();
this.avoidIfPossible = avoidIfPossible;
this.expectedActionSequencesOpt = Optional.empty();
}
public PlanningProblem(String name, Set<Formula> background, State start, State goal, Set<Action> actions, Set<List<Action>> expectedActionSequences) {
private PlanningProblem(String name, Set<Formula> background, State start, State goal, Set<Action> actions, Set<Value> avoidIfPossible, Set<List<Action>>expectedActionSequences) {
this.background = background;
this.start = start;
@ -67,6 +76,8 @@ public class PlanningProblem {
this.goal = goal;
this.name = name;
this.actionMap = CollectionUtils.newMap();
this.avoidIfPossible = avoidIfPossible;
this.expectedActionSequencesOpt = Optional.of(expectedActionSequences);
}
@ -100,6 +111,7 @@ public class PlanningProblem {
Set<Formula> goal = readFrom((List<?>) planningProblemSpec.get(GOAL));
Set<Value> avoidIfPossible = readValuesFrom((List<?>) planningProblemSpec.get(AVOID_IF_POSSIBLE));
List<?> actionDefinitions = (List<?>) planningProblemSpec.get(ACTION);
@ -110,6 +122,7 @@ public class PlanningProblem {
actions.stream().forEach(action->{
actionMap.put(action.getName(), action);
});
if(planningProblemSpec.containsKey(EXPECTED_PLANS)){
List<?> plans = (List<?>) planningProblemSpec.get(EXPECTED_PLANS);
@ -135,15 +148,32 @@ public class PlanningProblem {
return new PlanningProblem(name, background, State.initializeWith(start),
State.initializeWith(goal), actions, expectedActions);
State.initializeWith(goal), actions, avoidIfPossible, expectedActions);
} else {
return new PlanningProblem(name, background, State.initializeWith(start),
State.initializeWith(goal), actions);
State.initializeWith(goal),actions, avoidIfPossible);
}
}
public static Action readInstantiatedAction(Set<Action> actions, String instantiatedActionSpecString) throws Reader.ParsingException {
Parseable parseable = Parsers.newParseable(new StringReader(instantiatedActionSpecString));
Parser parser = Parsers.newParser(Parsers.defaultConfiguration());
Object instantiatedActionSpec = parser.nextValue(parseable);
Map<String, Action> actionMap = CollectionUtils.newMap();
actions.stream().forEach(action->{
actionMap.put(action.getName(), action);
});
return readInstantiatedAction(actionMap, instantiatedActionSpec);
}
private static Action readInstantiatedAction(Map<String, Action> actionMap, Object instantiatedActionSpec) throws Reader.ParsingException {
if(instantiatedActionSpec instanceof List<?>){
@ -229,6 +259,10 @@ public class PlanningProblem {
public static Set<Formula> readFrom(List<?> objects) throws Reader.ParsingException {
if(objects==null){
return Sets.newSet();
}
Set<Formula> formulae = objects.stream().map(x -> {
try {
return Reader.readFormula(x);
@ -249,6 +283,31 @@ public class PlanningProblem {
}
public static Set<Value> readValuesFrom(List<?> objects) throws Reader.ParsingException {
if(objects==null){
return Sets.newSet();
}
Set<Value> values = objects.stream().map(x -> {
try {
return Reader.readLogicValue(x);
} catch (Reader.ParsingException e) {
e.printStackTrace();
return null;
}
}).collect(Collectors.toSet());
if (values.stream().anyMatch(Objects::isNull)) {
throw new Reader.ParsingException("Couldn't read formulae: " + objects);
}
return values;
}
public Set<Formula> getBackground() {
return background;
}
@ -277,6 +336,10 @@ public class PlanningProblem {
return actionMap;
}
public Set<Value> getAvoidIfPossible() {
return avoidIfPossible;
}
@Override
public String toString() {
return "PlanningProblem{" +

View file

@ -0,0 +1,112 @@
package edu.rpi.rair.utils;
import com.naveensundarg.shadow.prover.representations.formula.Formula;
import com.naveensundarg.shadow.prover.representations.value.Compound;
import com.naveensundarg.shadow.prover.representations.value.Variable;
import com.naveensundarg.shadow.prover.utils.CollectionUtils;
import edu.rpi.rair.PlanMethod;
import us.bpsm.edn.Keyword;
import us.bpsm.edn.Symbol;
import us.bpsm.edn.parser.Parseable;
import us.bpsm.edn.parser.Parser;
import us.bpsm.edn.parser.Parsers;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
public class Reader {
private static final Keyword GOAL = Keyword.newKeyword("goal");
private static final Keyword ACTIONS = Keyword.newKeyword("actions");
private static final Keyword WHILE = Keyword.newKeyword("while");
public static List<PlanMethod> readPlanMethodsFrom(InputStream inputStream) throws com.naveensundarg.shadow.prover.utils.Reader.ParsingException {
Parseable parseable = Parsers.newParseable(new InputStreamReader(inputStream));
Parser parser = Parsers.newParser(Parsers.defaultConfiguration());
List<PlanMethod> planMethods = CollectionUtils.newEmptyList();
Object current = parser.nextValue(parseable);
while(current!=Parser.END_OF_INPUT){
planMethods.add(readPlanMethodFrom((List<?>) current));
current = parser.nextValue(parseable);
}
return planMethods;
}
// (def planMethod [?x ?y ?z] {:goal [...] :action [....])
public static PlanMethod readPlanMethodFromString(String stringSpec) throws com.naveensundarg.shadow.prover.utils.Reader.ParsingException {
Parseable parseable = Parsers.newParseable(new StringReader(stringSpec));
Parser parser = Parsers.newParser(Parsers.defaultConfiguration());
Object specObj = parser.nextValue(parseable);
return readPlanMethodFrom((List<?>) specObj);
}
// (def planMethod [?x ?y ?z] {:goal [...] :action [....])
public static PlanMethod readPlanMethodFrom(List<?> planMethodSpec) throws com.naveensundarg.shadow.prover.utils.Reader.ParsingException {
Object command = planMethodSpec.get(0);
if(!command.toString().equals("define-method")){
throw new AssertionError("Malformed method definition. Was expecting a 'define-method' but got "+ command);
}
Object name = planMethodSpec.get(1);
List<Symbol> variableObjs = (List<Symbol>) planMethodSpec.get(2);
List<Variable> variables = CollectionUtils.newEmptyList();
for(Symbol varSym : variableObjs){
variables.add((Variable) com.naveensundarg.shadow.prover.utils.Reader.readLogicValueFromString(varSym.toString()));
}
Map<?, ? > body = (Map<?, ?>) planMethodSpec.get(3);
Set<Formula> goalPreconds = CollectionUtils.newEmptySet();
Set<Formula> whilePreconds = CollectionUtils.newEmptySet();
List<Compound> actionCompounds = CollectionUtils.newEmptyList();
List<?> goalPrecondSpecs = (List<?>) body.get(GOAL);
for(Object goalPrecondSpec : goalPrecondSpecs){
goalPreconds.add(com.naveensundarg.shadow.prover.utils.Reader.readFormula(goalPrecondSpec));
}
List<?> whilePrecondSpecs = (List<?>) body.get(WHILE);
for(Object whilePrecondSpec : whilePrecondSpecs){
whilePreconds.add(com.naveensundarg.shadow.prover.utils.Reader.readFormula(whilePrecondSpec));
}
List<?> actionPrecondSpecs = (List<?>) body.get(ACTIONS);
for(Object actionPrecondSpec : actionPrecondSpecs){
actionCompounds.add((Compound) com.naveensundarg.shadow.prover.utils.Reader.readLogicValue(actionPrecondSpec));
}
return new PlanMethod(goalPreconds, whilePreconds, variables, actionCompounds);
}
}

View file

@ -1,22 +1,26 @@
package edu.rpi.rair.utils;
import com.diogonunes.jcdp.color.ColoredPrinter;
import com.diogonunes.jcdp.color.api.Ansi;
import com.google.common.collect.Sets;
import com.naveensundarg.shadow.prover.Sandbox;
import com.naveensundarg.shadow.prover.core.Problem;
import com.naveensundarg.shadow.prover.core.Prover;
import com.naveensundarg.shadow.prover.core.Prover;
import com.naveensundarg.shadow.prover.core.SnarkWrapper;
import com.naveensundarg.shadow.prover.sandboxes.Sandbox;
import com.naveensundarg.shadow.prover.utils.Problem;
import com.naveensundarg.shadow.prover.utils.ProblemReader;
import com.naveensundarg.shadow.prover.utils.Reader;
import edu.rpi.rair.Goal;
import edu.rpi.rair.GoalTracker;
import edu.rpi.rair.Plan;
import edu.rpi.rair.Planner;
import edu.rpi.rair.*;
import edu.rpi.rair.inducers.SimpleInducer;
import edu.rpi.rair.utils.GoalTrackingProblem;
import org.apache.commons.lang3.tuple.Triple;
import javax.swing.*;
import java.awt.*;
import java.lang.reflect.Method;
import java.util.*;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.stream.Collectors;
/**
@ -27,84 +31,100 @@ public class RunDemo {
static ColoredPrinter cp = new ColoredPrinter.Builder(1, false).build();
static List<Triple<BiConsumer<String, String>, String, String>> printQueue = new ArrayList<>();
static {
Prover prover = new SnarkWrapper();
try {
List<Problem> problems = ProblemReader.readFrom(Sandbox.class.getResourceAsStream("firstorder-completness-tests.clj"));
Prover prover = SnarkWrapper.getInstance();
/* try {
List<Problem> problems = ProblemReader.readFrom(Sandbox.class.getResourceAsStream("../firstorder-completness-tests.clj"));
problems.forEach(problem -> {
for (int i = 0; i < 30; i++) {
for (int i = 0; i < 100; i++) {
prover.prove(problem.getAssumptions(), problem.getGoal());
}
});
planningProblemWarmUp();
planningProblemWarmUp();
System.out.println("\nWARM UP DONE");
} catch (Reader.ParsingException e) {
e.printStackTrace();
}
*/
}
public static void main(String[] args) throws Reader.ParsingException, InterruptedException {
planningProblemWarmUp();
System.out.println();
Visualizer.setShouldVisualize(false);
runProblem("seriated_challenge_1.clj");
// runProblem("seriated_challenge_2.clj");
}
public static void main(String[] args) throws Reader.ParsingException {
private static void runProblem(String name) throws Reader.ParsingException {
List<GoalTrackingProblem> goalTrackingProblemList = (GoalTrackingProblem.readFromFile(Planner.class.getResourceAsStream(name)));
GoalTrackingProblem goalTrackingProblem = goalTrackingProblemList.get(0);
System.out.println();
GoalTracker goalTracker = new GoalTracker(goalTrackingProblem.getPlanningProblem(), goalTrackingProblem.getPlanningProblem().getBackground(),
goalTrackingProblem.getPlanningProblem().getStart(),
goalTrackingProblem.getPlanningProblem().getActions());
List<GoalTrackingProblem> goalTrackingProblemList = (GoalTrackingProblem.readFromFile(Planner.class.getResourceAsStream("seriated_challenge_1.clj")));
long start = System.currentTimeMillis();
Goal g1 = goalTrackingProblem.getGoalNamed("G1");
GoalTrackingProblem goalTrackingProblem = goalTrackingProblemList.get(0);
GoalTracker goalTracker = new GoalTracker(goalTrackingProblem.getPlanningProblem().getBackground(),
goalTrackingProblem.getPlanningProblem().getStart(),
goalTrackingProblem.getPlanningProblem().getActions());
long start = System.currentTimeMillis();
Goal g1 = goalTrackingProblem.getGoalNamed("G1");
/*
Goal g2 = goalTrackingProblem.getGoalNamed("G2");
tryAndAddGoal(g1, goalTracker);
Goal g3 = goalTrackingProblem.getGoalNamed("G3");
Goal g4 = goalTrackingProblem.getGoalNamed("G4");
Goal g5 = goalTrackingProblem.getGoalNamed("G5");
*/
tryAndAddGoal(g1, goalTracker);
/* tryAndAddGoal(g2, goalTracker);
long end = System.currentTimeMillis();
tryAndAddGoal(g2, goalTracker);
System.out.println("***************************");
cp.setAttribute(Ansi.Attribute.BOLD);
cp.println("AVAILABLE GOALS AND CONSTRAINTS");
cp.clear();
System.out.println("------------------------------");
tryAndAddGoal(g3, goalTracker);
goalTrackingProblem.getGoals().forEach(goal->{
System.out.println(goal);
tryAndAddGoal(g4, goalTracker);
});
tryAndAddGoal(g5, goalTracker);
*/
System.out.println("***************************");
long end = System.currentTimeMillis();
Visualizer.unspool(200);
for (int i = 0; i < printQueue.size(); i++) {
cp.println("--------------------------");
cp.setForegroundColor(Ansi.FColor.CYAN);
Triple<BiConsumer<String, String>, String, String> task = printQueue.get(i);
cp.print("Time Taken:");
cp.clear();
cp.print(" ");
cp.setAttribute(Ansi.Attribute.BOLD);
cp.print((end - start) / 1000.0 + "s");
task.getLeft().accept(task.getMiddle(), task.getRight());
}
cp.println("--------------------------");
cp.setForegroundColor(Ansi.FColor.CYAN);
cp.print("Time Taken:");
cp.clear();
cp.print(" ");
cp.setAttribute(Ansi.Attribute.BOLD);
cp.print((end - start) / 1000.0 + "s");
cp.println(" ");
cp.println("--------------------------");
cp.println(" ");
cp.println(" ");
cp.println(" ");
}
public static void planningProblemWarmUp() throws Reader.ParsingException {
@ -118,7 +138,7 @@ public class RunDemo {
GoalTrackingProblem goalTrackingProblem = goalTrackingProblemList.get(0);
GoalTracker goalTracker = new GoalTracker(goalTrackingProblem.getPlanningProblem().getBackground(),
GoalTracker goalTracker = new GoalTracker(goalTrackingProblem.getPlanningProblem(), goalTrackingProblem.getPlanningProblem().getBackground(),
goalTrackingProblem.getPlanningProblem().getStart(),
goalTrackingProblem.getPlanningProblem().getActions());
@ -154,34 +174,47 @@ public class RunDemo {
static void tryAndAddGoal(Goal g, GoalTracker goalTracker) {
System.out.println("========================");
printInfo("Trying to Add Goal:", g.getName());
Inducer simpleInducer = new SimpleInducer();
Set<String> oldGoals = goalTracker.getCurrentGoals().stream().map(Goal::getName).collect(Collectors.toSet());
System.out.println("========================");
printInfoLater("Trying to Add Goal or Constraint:", "");
printInfoLater(" ", g.toString());
Set<Goal> oldGoals = goalTracker.getCurrentGoals().stream().collect(Collectors.toSet());
Optional<Plan> possibleGoalPlan = goalTracker.adoptGoal(g);
if (possibleGoalPlan.isPresent()) {
printSuccess("Successfully added:", g.getName());
printDebug1("Current Goals:", goalTracker.getCurrentGoals().stream().map(Goal::getName).collect(Collectors.toSet()).toString());
simpleInducer.induce(goalTracker.getProblem(), goalTracker.getProblem().getStart(), g, possibleGoalPlan.get());
Set<String> newGoals = goalTracker.getCurrentGoals().stream().map(Goal::getName).collect(Collectors.toSet());
printSuccessLater("Successfully added:", g.getName());
printDebug1Later("Current Goals and Constraint:", "\n" + goalTracker.getCurrentGoals().stream().collect(Collectors.toSet()).toString());
if(!Sets.difference(oldGoals, newGoals).isEmpty()){
printDropped("Dropped Goals:" + Sets.difference(oldGoals, newGoals));
Set<Goal> newGoals = goalTracker.getCurrentGoals().stream().collect(Collectors.toSet());
if (!Sets.difference(oldGoals, newGoals).isEmpty()) {
printDroppedLater("", "Dropped Goals and Contraints:" + Sets.difference(oldGoals, newGoals));
}
Plan plan = possibleGoalPlan.get();
printDebug2("Plan:", plan.getActions().isEmpty() ? "No plan needed. Already satisfied." : plan.getActions().toString());
printDebug2Later("Plan:", plan.getActions().isEmpty() ? "No plan needed. Already satisfied." : "\n" + plan.toString());
} else {
printFailure("Could not add " + g.getName());
printDebug1("Current Goals: ", goalTracker.getCurrentGoals().stream().map(Goal::getName).collect(Collectors.toSet()).toString());
printFailureLater("", "Could not add " + g);
printDebug1Later("Current Goals and Contraints: ", goalTracker.getCurrentGoals().stream().map(Goal::getName).collect(Collectors.toSet()).toString());
}
}
static void printInfoLater(String header, String message) {
printQueue.add(Triple.of((x, y) -> RunDemo.printInfo(x, y), header, message));
}
static void printInfo(String header, String message) {
cp.setForegroundColor(Ansi.FColor.WHITE);
@ -195,6 +228,14 @@ public class RunDemo {
cp.clear();
}
static void printSuccessLater(String header, String message) {
printQueue.add(Triple.of((x, y) -> RunDemo.printSuccess(x, y), header, message));
}
static void printSuccess(String header, String message) {
cp.setForegroundColor(Ansi.FColor.BLACK);
@ -209,6 +250,14 @@ public class RunDemo {
}
static void printDebug1Later(String header, String message) {
printQueue.add(Triple.of((x, y) -> RunDemo.printDebug1(x, y), header, message));
}
static void printDebug1(String header, String message) {
cp.setForegroundColor(Ansi.FColor.BLACK);
@ -222,6 +271,13 @@ public class RunDemo {
cp.clear();
}
static void printDebug2Later(String header, String message) {
printQueue.add(Triple.of((x, y) -> RunDemo.printDebug2(x, y), header, message));
}
static void printDebug2(String header, String message) {
cp.setForegroundColor(Ansi.FColor.BLACK);
@ -235,7 +291,14 @@ public class RunDemo {
cp.clear();
}
static void printFailure(String message) {
static void printFailureLater(String header, String message) {
printQueue.add(Triple.of((x, y) -> RunDemo.printFailure(x, y), header, message));
}
static void printFailure(String header, String message) {
cp.setForegroundColor(Ansi.FColor.WHITE);
cp.setBackgroundColor(Ansi.BColor.RED); //setting format
@ -245,7 +308,16 @@ public class RunDemo {
cp.clear();
}
static void printDropped(String message) {
static void printDroppedLater(String header, String message) {
printQueue.add(Triple.of((x, y) -> RunDemo.printDropped(x, y), header, message));
}
static void printDropped(String header, String message) {
cp.setForegroundColor(Ansi.FColor.WHITE);
cp.setBackgroundColor(Ansi.BColor.RED); //setting format

View file

@ -0,0 +1,31 @@
package edu.rpi.rair.utils;
import edu.rpi.rair.PlanMethod;
import edu.rpi.rair.Planner;
import java.util.List;
/**
* Created by naveensundarg on 12/22/17.
*/
public class Sandbox {
public static void main(String[] args) throws com.naveensundarg.shadow.prover.utils.Reader.ParsingException {
PlanMethod seriatedPlanMethod = (Reader.readPlanMethodsFrom(Sandbox.class.getResourceAsStream("../problems/seriated/methods.clj"))).get(0);
List<GoalTrackingProblem> goalTrackingProblemList1 = (GoalTrackingProblem.readFromFile(Sandbox.class.getResourceAsStream("../problems/seriated/seriated_challenge_1.clj")));
System.out.println(seriatedPlanMethod.apply(goalTrackingProblemList1.get(0).getPlanningProblem().getBackground(),
goalTrackingProblemList1.get(0).getPlanningProblem().getStart().getFormulae(),
goalTrackingProblemList1.get(0).getGoalNamed("G1").getGoalState().getFormulae(),
goalTrackingProblemList1.get(0).getPlanningProblem().getActions()
));
}
}

View file

@ -0,0 +1,177 @@
package edu.rpi.rair.utils;
import com.diogonunes.jcdp.color.ColoredPrinter;
import com.diogonunes.jcdp.color.api.Ansi;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* Created by naveensundarg on 9/29/17.
*/
public class Visualizer {
private Visualizer(){
throw new AssertionError("Cannot instantiate the Visualizer");
}
static ColoredPrinter cp = new ColoredPrinter.Builder(1, false).build();
static Queue<String> spool = new ArrayDeque<>();
private static final AtomicBoolean shouldVisualize;
private static int depth = 0;
static {
shouldVisualize = new AtomicBoolean(true);
}
public static boolean getShouldVisualize() {
return shouldVisualize.get();
}
public static void setShouldVisualize(boolean visualize) {
shouldVisualize.set(visualize);
}
public static void nested(String name){
StringBuffer stringBuffer = new StringBuffer("");
if(shouldVisualize.get()){
for(int i = 0; i<depth+1; i++){
stringBuffer.append("");
}
stringBuffer.append(name);
}
spool.add(stringBuffer.toString());
}
public static void unspool(long delay){
spool.forEach(x->{
// try {
// Thread.sleep(delay);
cp.println(x);
/* } catch (InterruptedException e) {
e.printStackTrace();
}*/
});
}
public static void push(){
depth = depth + 1;
}
public static void pop(){
depth = depth - 1;
}
public static void reset(){
depth = 0;
}
public static void print(String message) {
cp.print(message);
cp.clear();
}
public static void printRed(String message) {
cp.setForegroundColor(Ansi.FColor.RED);
cp.setAttribute(Ansi.Attribute.BOLD);
cp.print(message);
cp.clear();
}
public static void printInfo(String header, String message) {
cp.setForegroundColor(Ansi.FColor.WHITE);
cp.setBackgroundColor(Ansi.BColor.BLUE); //setting format
cp.print(header);
cp.clear();
cp.print(" ");
cp.setAttribute(Ansi.Attribute.BOLD);
cp.print(message);
cp.println("");
cp.clear();
}
public static void printSuccess(String header, String message) {
cp.setForegroundColor(Ansi.FColor.BLACK);
cp.setBackgroundColor(Ansi.BColor.GREEN); //setting format
cp.print(header);
cp.clear();
cp.print(" ");
cp.setAttribute(Ansi.Attribute.BOLD);
cp.print(message);
cp.println("");
cp.clear();
}
public static void printDebug1(String header, String message) {
cp.setForegroundColor(Ansi.FColor.BLACK);
cp.setBackgroundColor(Ansi.BColor.YELLOW); //setting format
cp.print(header);
cp.clear();
cp.print(" ");
cp.setAttribute(Ansi.Attribute.BOLD);
cp.print(message);
cp.println("");
cp.clear();
}
public static void printDebug2(String header, String message) {
cp.setForegroundColor(Ansi.FColor.BLACK);
cp.setBackgroundColor(Ansi.BColor.MAGENTA); //setting format
cp.print(header);
cp.clear();
cp.print(" ");
cp.setAttribute(Ansi.Attribute.BOLD);
cp.print(message);
cp.println("");
cp.clear();
}
public static void printFailure(String message) {
cp.setForegroundColor(Ansi.FColor.WHITE);
cp.setBackgroundColor(Ansi.BColor.RED); //setting format
cp.print(message);
cp.clear();
cp.println("");
cp.clear();
}
public static void printDropped(String message) {
cp.setForegroundColor(Ansi.FColor.WHITE);
cp.setBackgroundColor(Ansi.BColor.RED); //setting format
cp.print("Dropped Goals:");
cp.clear();
cp.print(" ");
cp.setAttribute(Ansi.Attribute.BOLD);
cp.print(message);
cp.println("");
cp.clear();
}
}

View file

@ -2,15 +2,12 @@
:background [p]
:start [q]
:goal [r]
:actions
[(define-action a1 ()
{:preconditions [(or q r)]
:additions [r]
:deletions [q]})]
:expected-plans ([a1])
}
:actions [(define-action a1 ()
{:preconditions [(or q r)]
:additions [r]
:deletions [q]})]
:expected-plans ([a1])}
{:name "simple killing"
@ -18,14 +15,12 @@
:start [(forall ?x (alive ?x))]
:goal [(forall ?x (dead ?x))]
:actions
[(define-action kill ()
{:preconditions [(alive ?x)]
:additions [(dead ?x)]
:deletions [(alive ?x)]})]
[(define-action kill ()
{:preconditions [(alive ?x)]
:additions [(dead ?x)]
:deletions [(alive ?x)]})]
:expected-plans ([kill])
}
:expected-plans ([kill])}
{:name "thirsty"
@ -33,18 +28,16 @@
:start [thirsty]
:goal [(not thirsty)]
:actions
[(define-action drink ()
{:preconditions [thirsty]
:additions [(not thirsty)]
:deletions [thirsty]})
(define-action eat ()
{:preconditions [hungry]
:additions [(not hungry)]
:deletions [hungry]})]
[(define-action drink ()
{:preconditions [thirsty]
:additions [(not thirsty)]
:deletions [thirsty]})
(define-action eat ()
{:preconditions [hungry]
:additions [(not hungry)]
:deletions [hungry]})]
:expected-plans ([drink])
}
:expected-plans ([drink])}
{:name "hungry"
@ -53,18 +46,17 @@
:goal [(not hungry)]
:actions
[(define-action drink ()
{:preconditions [thirsty]
:additions [(not thirsty)]
:deletions [thirsty]})
[(define-action drink ()
{:preconditions [thirsty]
:additions [(not thirsty)]
:deletions [thirsty]})
(define-action eat ()
{:preconditions [hungry]
:additions [(not hungry)]
:deletions [hungry]})]
(define-action eat ()
{:preconditions [hungry]
:additions [(not hungry)]
:deletions [hungry]})]
:expected-plans ([eat])
}
:expected-plans ([eat])}
{:name "hungry and thirsty"
@ -72,19 +64,18 @@
:start [hungry thirsty]
:goal [(not (or hungry thirsty))]
:actions
[(define-action drink ()
{:preconditions [thirsty]
:additions [(not thirsty)]
:deletions [thirsty]})
[(define-action drink ()
{:preconditions [thirsty]
:additions [(not thirsty)]
:deletions [thirsty]})
(define-action eat ()
{:preconditions [hungry]
:additions [(not hungry)]
:deletions [hungry]})]
(define-action eat ()
{:preconditions [hungry]
:additions [(not hungry)]
:deletions [hungry]})]
:expected-plans ([eat drink]
[drink eat])
}
[drink eat])}
{:name "hungry and thirsty"
:background []
@ -92,94 +83,141 @@
:goal [work-finished]
:actions
[(define-action drink ()
{:preconditions [thirsty]
:additions [(not thirsty)]
:deletions [thirsty]})
[(define-action drink ()
{:preconditions [thirsty]
:additions [(not thirsty)]
:deletions [thirsty]})
(define-action eat ()
{:preconditions [hungry]
:additions [(not hungry)]
:deletions [hungry]})
(define-action eat ()
{:preconditions [hungry]
:additions [(not hungry)]
:deletions [hungry]})
(define-action work ()
{:preconditions [(and (not hungry) (not thirsty))]
:additions [work-finished]
:deletions [work-unfinished]})]
(define-action work ()
{:preconditions [(and (not hungry) (not thirsty))]
:additions [work-finished]
:deletions [work-unfinished]})]
:expected-plans ([eat drink work]
[drink eat work])}
{:name "demo 1"
:background [
(not (= room1 room2))
(not (= prisoner commander))
(not (= self prisoner))
(not (= self commander))
(person prisoner)
(person commander)
]
:start [(in self room1)
(in commander room2)
(in prisoner room1)
(open (door room2))
(not (open (door room1)))]
:goal [(interrogates commander prisoner)]
{:name "Heinz Dilemma"
:background [(cures radium-drug-x cancerx)]
:start [(sick (wife heinz) cancerx)
(= 5000 (cost radium-drug-x))
(not (can-spend 5000))
(not (possess radium-drug-x))]
:goal [(healthy (wife heinz))]
:actions
[(define-action open-door [?room]
{:preconditions [(not (open (door ?room)))]
:additions [(open (door ?room))]
:deletions [(not (open (door ?room)))]})
[(define-action administer-medicine [?medicine ?condition ?person]
{:preconditions [(sick ?person ?condition)
(cures ?medicine ?condition)
(possess ?medicine)]
:additions [(healthy ?person)]
:deletions [(sick ?person ?condition)]})
(define-action buy-medicine [?medicine]
{:preconditions [(can-spend (cost ?medicine))]
:additions [(possess ?medicine)]
:deletions [(not (possess ?medicine))]})
(define-action steal-medicine [?medicine]
{:preconditions [(not (possess ?medicine))]
:additions [(possess ?medicine)]
:deletions [(not (possess ?medicine))]})
(define-action accompany [?person ?room1 ?room2]
{:preconditions [(not (= ?room1 ?room2))
(in ?person ?room1)
(in self ?room1)
(open (door ?room1))
(open (door ?room2))]
:additions [(in ?person ?room2)
(in self ?room2)]
(define-action finance [?amount]
{:preconditions [(not (can-spend ?amount))]
:additions [(can-spend ?amount)]
:deletions [(not (can-spend ?amount))]})]
:deletions [(in ?person ?room1)
(in self ?room1)]})
:expected-plans ([buy-medicine administer-medicine])}
(define-action move [?person ?room2 ?room1]
{:preconditions [(not (= ?room1 ?room2))
(in ?person ?room2)
(open (door ?room1))
(open (door ?room2))]
:additions [(in ?person ?room1)]
{:name "belief intro"
:background [(Proposition god-exists)
(forall [?p] (if (Proposition ?p) (or (True ?p) (False ?p))))
(forall [?p] (iff (True ?p) (not (False ?p))))
(forall [?p] (iff (True ?p) (HasSupport ?p)))
(False god-exists)]
:start []
:goal [(Declaration god-exists)]
:actions
[(define-action declare-P [?p]
{:preconditions [(Belief ?p)]
:additions [(Declaration ?p)]
:deletions [(Private ?p)]})
:deletions [(in ?person ?room2)]})
(define-action believe-with-support [?p]
{:preconditions [(Proposition ?p)
(HasSupport ?p)]
:additions [(Belief ?p)]
:deletions []})
(define-action get-interrogated [?room]
{:preconditions [(in commander ?room)
(in prisoner ?room)]
(define-action believe-without-support [?p]
{:preconditions [(Proposition ?p)]
:additions [(Belief ?p)]
:deletions []})]
:additions [(interrogates commander prisoner)]
:expected-plans ([believe-P declare-P])}
:deletions []})
{:name "reasoning 1"
:background []
:start [(! p) (! q)]
:goal [(! (and p q))]
:actions [(define-action and-intro [?p ?q]
{:preconditions [(! ?p) (! ?q)]
:additions [(! (and ?p ?q))]
:deletions []})
(define-action cond-elim [?p ?q]
{:preconditions [(! (if ?p ?q)) (! ?p)]
:additions [(! ?q)]
:deletions []})]
:expected-plans ([and-intro])}
{:name "reasoning 2"
:background []
:start [(! p) (! q)
(! (if (and p q) r))]
:goal [(! r)]
:actions [(define-action and-intro [?p ?q]
{:preconditions [(! ?p) (! ?q)]
:additions [(! (and ?p ?q))]
:deletions []})
(define-action cond-elim [?p ?q]
{:preconditions [(! (if ?p ?q)) (! ?p)]
:additions [(! ?q)]
:deletions []})]
:expected-plans ([and-intro])}
{:name "reasoning 3"
:background []
:start [(! A) (! B)
(Prop S)
(! (if (and A B) C))
]
:goal [(! (if S C) )]
:expected-plans ([(open-door room1)
(move commander room2 room1)
(get-interrogated room1)]
[(open-door room1)
(move prisoner room1 room2)
(get-interrogated room2)]
[(open-door room1)
(accompany prisoner room1 room2)
(get-interrogated room2)])}
:actions [(define-action and-intro [?p ?q]
{:preconditions [(! ?p) (! ?q)]
:additions [(! (and ?p ?q))]
:deletions []})
(define-action cond-elim [?p ?q]
{:preconditions [(! (if ?p ?q)) (! ?p)]
:additions [(! ?q)]
:deletions []})
(define-action cond-intro [?p ?q]
{:preconditions [ (Prop ?p) (! ?q)]
:additions [(! (if ?p ?q))]
:deletions []})]
:expected-plans ([and-intro])}

View file

@ -0,0 +1,36 @@
{:definitions
{:name "Blockworld"
:background []
:start [(Clear A)
(Clear B)
(Clear C)
(On A Table)
(On B Table)
(On C Table)]
:goal []
:actions [(define-action stack [?x ?y]
{:preconditions [(On ?x Table)
(On ?y Table)
(Clear ?x)
(Clear ?y)]
:additions [(On ?x ?y)]
:deletions [(Clear ?y)
(On ?x Table)]})
(define-action unstack [?x ?y]
{:preconditions [(On ?x ?y)
(Clear ?x)]
:additions [(On ?x Table)
(Clear ?y)]
:deletions [(On ?x ?y)]})]
}
:goals {G1 {:priority 1.0
:state [(On A B)]}
G2 {:priority 1.0
:state [(On C A)]}}
}

View file

@ -0,0 +1,60 @@
{:definitions
{:name "Heinz Dilemma"
:background [(cures radium-drug-x cancerx)]
:start [(not steal)
(collateral income)
(sick (wife heinz) cancerx)
(= 5000 (cost radium-drug-x))
(not (can-spend 5000))
(not (possess radium-drug-x))]
:actions
[(define-action administer-medicine [?medicine ?condition ?person]
{:preconditions [(sick ?person ?condition)
(cures ?medicine ?condition)
(possess ?medicine)]
:additions [(healthy ?person)]
:deletions [(sick ?person ?condition)]})
(define-action buy-medicine [?medicine]
{:preconditions [(not (possess ?medicine))
(can-spend (cost ?medicine))]
:additions [(possess ?medicine)]
:deletions [(not (possess ?medicine))]})
(define-action steal-medicine [?medicine]
{:preconditions [(not (can-spend (cost ?medicine)))
(not (possess ?medicine))]
:additions [(possess ?medicine)
steal]
:deletions [(not steal)
(not (possess ?medicine))]})
(define-action apply-loan [?amount]
{:preconditions [ (not (can-spend ?amount))]
:additions [(approved (loan ?amount))]
:deletions []})
(define-action finance [?amount ?with-collateral]
{:preconditions [(collateral ?with-collateral)
(approved (loan ?amount)) (not (can-spend ?amount))]
:additions [(can-spend ?amount)
have-loan]
:deletions [(not (can-spend ?amount))]})]}
:goals {G1 {:priority 1.0
:description "Don't steal."
:state [(not steal)]}
G2 {:priority 2.0
:description "My wife should be healthy"
:state [(healthy (wife heinz))]}}}

View file

@ -0,0 +1,9 @@
;; (removeFrom ?x ?y) => "Remove ?x from ?y"
;; (placeInside ?x ?y) ==> "Place ?x inside ?y"
(define-method planMethod [?b ?c ?d]
{:goal [(In ?b ?c) (In ?c ?d)]
:while [(In ?b ?d) (Empty ?c)
(< (size ?c) (size ?d))
(< (size ?b) (size ?c))]
:actions [(removeFrom ?b ?d) (placeInside ?b ?c) (placeInside ?c ?d)]})

View file

@ -21,16 +21,18 @@
(< (size a) (size b))
(< (size b) (size c))
(< (size c) (size d))
(< (size d) (size e))]
(< (size d) (size e))
(< (size e) (size f))
(< (size f) (size g))
(< (size g) (size h))]
:start [(In a b)
(In b d)
(In d e)
(Empty c)]
(Empty c)]
:goal []
:goal [ ]
:actions [(define-action placeInside [?x ?y]
{:preconditions [(< (size ?x) (size ?y))
@ -41,20 +43,15 @@
(define-action removeFrom [?x ?y]
{:preconditions [(In ?x ?y)]
:additions [(Empty ?y)]
:deletions [(In ?x ?y)]} )]
}
:deletions [(In ?x ?y)]})]}
:goals {G1 {:priority 1.0
:state [(In a b)
(In b c)
(In c d)
(In d e)]}}
(In c d)]}}
;;(removeFrom b d) (placeInside b c) (placeInside c d)
}

View file

@ -0,0 +1,70 @@
{:definitions
{:name "Seriated Cup Challenge 1"
:background [ ;; Transitivity of <
(forall [?x ?y ?z]
(if (and (< (size ?x) (size ?y))
(< (size ?y) (size ?z)))
(< (size ?x) (size ?z))))
;; Asymmetry of <
(forall [?x ?y]
(iff (< (size ?x) (size ?y))
(not (< (size ?y) (size ?x)))))
;; If there is something inside a cup, it is not empty.
(forall [?y]
(if (exists [?x] (In ?x ?y))
(not (Empty ?y))))
;;; Sizes of cups
(< (size a) (size b))
(< (size b) (size c))
(< (size c) (size d))
(< (size d) (size e))
(< (size e) (size f))
(< (size f) (size g))
(< (size g) (size h))]
:start [(In a b)
(In b d)
(In d e)
(In e f)
(In f g)
(In g h)
(Empty c)]
:goal [ ]
:actions [(define-action placeInside [?x ?y]
{:preconditions [(< (size ?x) (size ?y))
(Empty ?y)]
:additions [(In ?x ?y)]
:deletions [(Empty ?y)]})
(define-action removeFrom [?x ?y]
{:preconditions [(In ?x ?y)]
:additions [(Empty ?y)]
:deletions [(In ?x ?y)]} )]
}
:goals {G1 {:priority 1.0
:state [(In a b)
(In b c)
(In c d)
(In d e)
(In e f)
(In f g)
(In g h)
]}}
;;(removeFrom b d) (placeInside b c) (placeInside c d)
}

View file

@ -0,0 +1,62 @@
{:definitions
{:name "belief intro"
:background [(forall [?p] (if (Proposition ?p) (or (True ?p) (False ?p))))
(forall [?p] (iff (True ?p) (not (False ?p))))
(forall [?p] (if (True ?p) (HasSupport ?p)))
(Proposition (healthy salad))
(Proposition (healthy ice-cream))
(True (healthy salad))
(False (healthy ice-cream))
(Be Healthy)
(iff (Be Healthy) (not (Eat ice-cream)))
(Source dubious-science-journal)
(Read (healthy ice-cream) dubious-science-journal)]
:start []
:avoid-if-possible [believe-without-support]
:actions [(define-action declare-P [?p]
{:preconditions [(Belief ?p)]
:additions [(Declaration ?p)]
:deletions [(Private ?p)]})
(define-action believe-with-support [?p]
{:preconditions [(Proposition ?p)
(HasSupport ?p)]
:additions [(Belief ?p)]
:deletions []})
(define-action add-support [?p]
{:preconditions [(Proposition ?p)
(Read ?p ?source)
(Trusted ?source)]
:additions [(HasSupport ?p)]
:deletions []})
(define-action assume-trust [?source]
{:preconditions [(Source ?source)]
:additions [(Trusted ?source)]
:deletions []})
(define-action believe-without-support [?p]
{:preconditions [(Proposition ?p)]
:additions [(Belief ?p)]
:deletions []})
(define-action eat [?p]
{:preconditions [(Belief (healthy ?p))]
:additions [(Eat ?p)]
:deletions []})]}
:avoid-if-possible [believe-without-support]
:goals {G1 {:priority 1.0
:description "Be Healthy"
:state [(Be Healthy)]}
G2 {:priority 2.0
:description "Eat Ice Cream"
:state [(Eat ice-cream)]}}}

View file

@ -33,7 +33,9 @@ public class DepthFirstPlannerTest {
Planner depthFirstPlanner = new DepthFirstPlanner();
PlanningProblem planningProblem = planningProblemList.get(5);
PlanningProblem planningProblem = planningProblemList.stream().filter(problem -> problem.getName().equals("reasoning 3")).findFirst().get();
depthFirstPlanner.plan(planningProblem.getBackground(), planningProblem.getActions(), planningProblem.getStart(), planningProblem.getGoal()).get().forEach(System.out::println);
}

View file

@ -17,12 +17,12 @@ public class GoalTrackerTest {
public static void main(String[] args) throws Reader.ParsingException {
List<GoalTrackingProblem> goalTrackingProblemList = (GoalTrackingProblem.readFromFile(Planner.class.getResourceAsStream("goal_management_1.clj")));
List<GoalTrackingProblem> goalTrackingProblemList = (GoalTrackingProblem.readFromFile(Planner.class.getResourceAsStream("goal_management_6.clj")));
GoalTrackingProblem goalTrackingProblem = goalTrackingProblemList.get(0);
GoalTracker goalTracker = new GoalTracker(goalTrackingProblem.getPlanningProblem().getBackground(),
GoalTracker goalTracker = new GoalTracker(goalTrackingProblem.getPlanningProblem(), goalTrackingProblem.getPlanningProblem().getBackground(),
goalTrackingProblem.getPlanningProblem().getStart(),
goalTrackingProblem.getPlanningProblem().getActions());

View file

@ -0,0 +1,41 @@
package edu.rpi.rair;
import com.diogonunes.jcdp.color.ColoredPrinter;
import com.diogonunes.jcdp.color.api.Ansi;
import com.naveensundarg.shadow.prover.utils.Reader;
import edu.rpi.rair.utils.GoalTrackingProblem;
import java.util.List;
/**
* Created by naveensundarg on 1/15/17.
*/
public class HeinzGoalTrackerTest {
public static void main(String[] args) throws Reader.ParsingException {
List<GoalTrackingProblem> goalTrackingProblemList = (GoalTrackingProblem.readFromFile(Planner.class.getResourceAsStream("heinz_challenge.clj")));
GoalTrackingProblem goalTrackingProblem = goalTrackingProblemList.get(0);
GoalTracker goalTracker = new GoalTracker(goalTrackingProblem.getPlanningProblem(), goalTrackingProblem.getPlanningProblem().getBackground(),
goalTrackingProblem.getPlanningProblem().getStart(),
goalTrackingProblem.getPlanningProblem().getActions());
ColoredPrinter cp = new ColoredPrinter.Builder(1, false).build();
cp.setForegroundColor(Ansi.FColor.WHITE);
cp.setBackgroundColor(Ansi.BColor.BLUE); //setting format
cp.println("Adding goal G1");
cp.clear();
goalTracker.adoptGoal(goalTrackingProblem.getGoalNamed("G1"));
}
}