bdi4jade

Details

diff --git a/bdi-jade-extensions/src/bdi4jade/extension/remediation/reasoning/RemediationOptionGenerationFunction.java b/bdi-jade-extensions/src/bdi4jade/extension/remediation/reasoning/RemediationOptionGenerationFunction.java
index 7bd6494..c6ecc0e 100644
--- a/bdi-jade-extensions/src/bdi4jade/extension/remediation/reasoning/RemediationOptionGenerationFunction.java
+++ b/bdi-jade-extensions/src/bdi4jade/extension/remediation/reasoning/RemediationOptionGenerationFunction.java
@@ -14,8 +14,8 @@ import bdi4jade.core.GoalUpdateSet.GoalDescription;
 import bdi4jade.event.GoalEvent;
 import bdi4jade.event.GoalListener;
 import bdi4jade.extension.remediation.goal.CauseEffectProblem;
-import bdi4jade.extension.remediation.goal.CauseFactorStatus;
 import bdi4jade.extension.remediation.goal.CauseEffectProblem.CauseEffectProblemStatus;
+import bdi4jade.extension.remediation.goal.CauseFactorStatus;
 import bdi4jade.extension.remediation.graph.AlternativeCauseSet;
 import bdi4jade.extension.remediation.graph.CauseEffectKnowledgeModel;
 import bdi4jade.extension.remediation.graph.CauseEffectRelationship;
@@ -81,6 +81,16 @@ public class RemediationOptionGenerationFunction implements OptionGenerationFunc
 			CauseEffectProblem cep = this.causeEffectProblems.get(goal);
 			CauseEffectRelationship cer = getCauseEffectKnowledgeModel().getCauseEffectRelationship(goal);
 			if (cep == null && cer != null) {
+				// TODO Here I need to create a new goal achievement metadata
+				// TODO Verify default values for GAMs
+				/*if (this.capability instanceof RevertingCapability) {
+					GoalAchievementMetadata gam = ((RevertingCapability) this.capability).createGoalAchievementMetadata(goal, null, true, 100,
+							100000);
+					Intention intention = this.getCapability.getIntentions().stream().filter(g -> g.getGoal().equals(goal))
+							.collect(Collectors.toList()).get(0);
+					gam.setIntention(intention);
+				}*/
+
 				cep = new CauseEffectProblem((PredicateGoal<?>) goal, cer, capability.getMyAgent(), parentGoal);
 				causeEffectProblems.put(cep.getEffectGoal(), cep);
 			}
@@ -97,6 +107,15 @@ public class RemediationOptionGenerationFunction implements OptionGenerationFunc
 			// Algorithm 1 - lines 18-35
 			if (cep.getEffectGoalStatus() != null) {
 				if (knownCause(cep, cep.getCauseEffectRelationship())) {
+					/*if (this.capability instanceof RevertingCapability) {
+						ArrayList<Predicate> reversionTrigger = new ArrayList<>();
+						for (CauseFactorStatus causeFactor : cep.getCauseFactorStatus()) {
+							reversionTrigger.add(causeFactor.getFact().getPredicate());
+						}
+						GoalAchievementMetadata gam = ((RevertingCapability) this.capability).getGoalAchievementMetadata().get(cep.getEffectGoal());
+						gam.setReversionTrigger(reversionTrigger);
+					}*/
+					
 					if (causeFinished(cep.getCauseFactorStatus())) {
 						setEndState(cep);
 						causeEffectProblems.remove(cep.getEffectGoal());
@@ -118,7 +137,7 @@ public class RemediationOptionGenerationFunction implements OptionGenerationFunc
 					}
 				} else if (causeNotFound(cep.getCauseFactorStatus())) {
 					setEndState(cep);
-					causeEffectProblems.remove(cep);
+					causeEffectProblems.remove(cep.getEffectGoal());
 				} else {
 					for (CauseFactorStatus causeFactor : cep.getCauseFactorStatus()) {
 						if (causeFactor.getInitialStatus() == null && causeFactor.getTestGoal() == null) {
diff --git a/bdi-jade-extensions/src/bdi4jade/extension/undo/GoalAchievementMetadata.java b/bdi-jade-extensions/src/bdi4jade/extension/undo/GoalAchievementMetadata.java
index f6c4033..d4b4125 100644
--- a/bdi-jade-extensions/src/bdi4jade/extension/undo/GoalAchievementMetadata.java
+++ b/bdi-jade-extensions/src/bdi4jade/extension/undo/GoalAchievementMetadata.java
@@ -59,17 +59,6 @@ public class GoalAchievementMetadata {
 		return filteredBeliefs;
 	}
 
-	public ArrayList<PredicateGoal<?>> generateReversionGoals(ArrayList<Predicate> predicates, BeliefBase beliefBase) {
-		ArrayList<PredicateGoal<?>> reversionGoals = new ArrayList<>();
-
-		for (Predicate predicate : predicates) {
-			PredicateGoal<?> goal = new PredicateGoal<Predicate>(predicate, !predicate.getValue(beliefBase));
-			reversionGoals.add(goal);
-		}
-
-		return reversionGoals;
-	}
-
 	public Long getAddedTime() {
 		return addedTime;
 	}
@@ -111,26 +100,9 @@ public class GoalAchievementMetadata {
 	}
 
 	public Boolean isReversionActivated(BeliefBase beliefBase) {
-		Boolean activated = true;
-
-		for (Predicate predicate : this.reversionTrigger) {
-			Boolean value = predicate.getValue(beliefBase);
-			if (value == null || value == false) {
-				activated = false;
-			}
-		}
-
-		if (this.rollback == true) {
-			if (this.intention != null && this.intention.getStatus().equals(GoalStatus.PLAN_FAILED)) {
-				activated = true;
-			}
-		} else {
-			activated = false;
-		}
-
-		return activated;
+		return isReversionTriggered(beliefBase) || isRollbackTriggered();
 	}
-
+	
 	public Boolean isReversionDeactivated() {
 		if (this.maxExecutedPlans != null) {
 			if (this.planCounter > this.maxExecutedPlans) {
@@ -144,11 +116,32 @@ public class GoalAchievementMetadata {
 		}
 		return false;
 	}
+	
+	public Boolean isReversionTriggered(BeliefBase beliefBase) {
+		Boolean triggered = true;
+
+		for (Predicate predicate : this.reversionTrigger) {
+			Boolean value = predicate.getValue(beliefBase);
+			if (value == null || value == false) {
+				triggered = false;
+			}
+		}
+		
+		return triggered;
+	}
+
+	public Boolean isRollbackTriggered() {
+		return this.rollback && this.intention != null && this.intention.getStatus().equals(GoalStatus.PLAN_FAILED);
+	}
 
 	public void setIntention(Intention intention) {
 		this.intention = intention;
 	}
 
+	public void setReversionTrigger(List<Predicate> reversionTrigger) {
+		this.reversionTrigger = reversionTrigger;
+	}
+
 	public void trackBeliefChange(Predicate predicate, Boolean value) {
 		if (!this.beliefChangeTrace.containsKey(predicate)) {
 			this.beliefChangeTrace.put(predicate, new LinkedList<Pair<Boolean, Long>>());
diff --git a/bdi-jade-extensions/src/bdi4jade/extension/undo/reasoning/RevertingOptionGenerationFunction.java b/bdi-jade-extensions/src/bdi4jade/extension/undo/reasoning/RevertingOptionGenerationFunction.java
index 19823fb..7784da3 100644
--- a/bdi-jade-extensions/src/bdi4jade/extension/undo/reasoning/RevertingOptionGenerationFunction.java
+++ b/bdi-jade-extensions/src/bdi4jade/extension/undo/reasoning/RevertingOptionGenerationFunction.java
@@ -3,12 +3,14 @@ package bdi4jade.extension.undo.reasoning;
 import java.util.ArrayList;
 import java.util.Map;
 
+import bdi4jade.belief.BeliefBase;
 import bdi4jade.core.Capability;
 import bdi4jade.core.GoalUpdateSet;
 import bdi4jade.extension.remediation.logics.Predicate;
 import bdi4jade.extension.undo.GoalAchievementMetadata;
 import bdi4jade.extension.undo.RevertingCapability;
 import bdi4jade.goal.Goal;
+import bdi4jade.goal.PredicateGoal;
 import bdi4jade.reasoning.OptionGenerationFunction;
 
 public class RevertingOptionGenerationFunction implements OptionGenerationFunction {
@@ -29,9 +31,21 @@ public class RevertingOptionGenerationFunction implements OptionGenerationFuncti
 					gams.remove(gam.getGoal());
 				} else {
 					if (gam.isReversionActivated(this.capability.getBeliefBase())) {
-						ArrayList<Predicate> beliefChanges = gam.filterBeliefChanges(this.capability.getBeliefBase());
-						if (!beliefChanges.isEmpty()) {
-							gam.generateReversionGoals(beliefChanges, this.capability.getBeliefBase());
+						ArrayList<Predicate> filteredChanges = gam.filterBeliefChanges(this.capability.getBeliefBase());
+
+						ArrayList<PredicateGoal<?>> reversionGoals = generateReversionGoals(filteredChanges,
+								this.capability.getBeliefBase());
+						
+						for (PredicateGoal<?> predicateGoal : reversionGoals) {
+							goalUpdateSet.generateGoal(predicateGoal, capability);
+						}
+						
+						for (Predicate predicate : filteredChanges) {
+							gam.getBeliefChangeTrace().remove(predicate);
+						}
+
+						if (!gam.isRollbackTriggered()) {
+							gams.remove(gam.getGoal());
 						}
 					}
 				}
@@ -39,6 +53,17 @@ public class RevertingOptionGenerationFunction implements OptionGenerationFuncti
 		}
 	}
 
+	public ArrayList<PredicateGoal<?>> generateReversionGoals(ArrayList<Predicate> predicates, BeliefBase beliefBase) {
+		ArrayList<PredicateGoal<?>> reversionGoals = new ArrayList<>();
+
+		for (Predicate predicate : predicates) {
+			PredicateGoal<?> goal = new PredicateGoal<Predicate>(predicate, !predicate.getValue(beliefBase));
+			reversionGoals.add(goal);
+		}
+
+		return reversionGoals;
+	}
+
 	@Override
 	public void setCapability(Capability capability) {
 		if (this.capability != null) {
diff --git a/bdi-jade-extensions/src/bdi4jade/extension/undo/RevertingBDIAgent.java b/bdi-jade-extensions/src/bdi4jade/extension/undo/RevertingBDIAgent.java
index 86db64b..6bfb36d 100644
--- a/bdi-jade-extensions/src/bdi4jade/extension/undo/RevertingBDIAgent.java
+++ b/bdi-jade-extensions/src/bdi4jade/extension/undo/RevertingBDIAgent.java
@@ -24,10 +24,9 @@ public class RevertingBDIAgent extends AbstractBDIAgent {
 					Intention intention = this.getIntentions().stream().filter(g -> g.getGoal().equals(goal))
 							.collect(Collectors.toList()).get(0);
 
-					GoalAchievementMetadata gam = new GoalAchievementMetadata((PredicateGoal<?>) goal, reversionTrigger,
-							rollback, maxExecutedPlans, maxTime);
+					GoalAchievementMetadata gam = ((RevertingCapability) dispatcher).createGoalAchievementMetadata(goal,
+							reversionTrigger, rollback, maxExecutedPlans, maxTime);
 					gam.setIntention(intention);
-					((RevertingCapability) dispatcher).getGoalAchievementMetadata().put(goal, gam);
 				}
 			}
 			return true;
diff --git a/bdi-jade-extensions/src/bdi4jade/extension/undo/RevertingCapability.java b/bdi-jade-extensions/src/bdi4jade/extension/undo/RevertingCapability.java
index 0ef0301..be0f6ef 100644
--- a/bdi-jade-extensions/src/bdi4jade/extension/undo/RevertingCapability.java
+++ b/bdi-jade-extensions/src/bdi4jade/extension/undo/RevertingCapability.java
@@ -1,6 +1,7 @@
 package bdi4jade.extension.undo;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import bdi4jade.belief.PredicateBelief;
@@ -8,27 +9,37 @@ import bdi4jade.core.Capability;
 import bdi4jade.event.BeliefEvent;
 import bdi4jade.event.BeliefEvent.Action;
 import bdi4jade.event.BeliefListener;
+import bdi4jade.event.GoalEvent;
+import bdi4jade.event.GoalListener;
+import bdi4jade.extension.remediation.logics.Predicate;
 import bdi4jade.extension.undo.reasoning.RevertingOptionGenerationFunction;
 import bdi4jade.goal.Goal;
+import bdi4jade.goal.GoalStatus;
 import bdi4jade.goal.PredicateGoal;
 
-public class RevertingCapability extends Capability implements BeliefListener {
+public class RevertingCapability extends Capability implements BeliefListener, GoalListener {
 
-	private static final long serialVersionUID = 1L;
+	private static final long serialVersionUID = -5556551069331273755L;
 
 	private final Map<Goal, GoalAchievementMetadata> gams;
 
 	public RevertingCapability() {
 		this.gams = new HashMap<>();
 		setOptionGenerationFunction(new RevertingOptionGenerationFunction(this));
+		this.getMyAgent().addGoalListener(this);
+		this.getBeliefBase().addBeliefListener(this);
 	}
 
 	public void addGoalAchievementMetadata(Goal goal, GoalAchievementMetadata gam) {
 		this.gams.put(goal, gam);
 	}
 
-	public Map<Goal, GoalAchievementMetadata> getGoalAchievementMetadata() {
-		return gams;
+	public GoalAchievementMetadata createGoalAchievementMetadata(Goal goal, List<Predicate> reversionTrigger,
+			Boolean rollback, Integer maxExecutedPlans, Integer maxTime) {
+		GoalAchievementMetadata gam = new GoalAchievementMetadata((PredicateGoal<?>) goal, reversionTrigger, rollback,
+				maxExecutedPlans, maxTime);
+		addGoalAchievementMetadata(goal, gam);
+		return gam;
 	}
 
 	@Override
@@ -40,10 +51,24 @@ public class RevertingCapability extends Capability implements BeliefListener {
 				if (beliefEvent.getBelief() instanceof PredicateBelief<?>) {
 					PredicateBelief<?> belief = (PredicateBelief<?>) beliefEvent.getBelief();
 					if (this.gams.containsKey(goal)) {
-						//this.gams.get(goal).trackBeliefChange();
+						this.gams.get(goal).trackBeliefChange((Predicate) belief.getName(), belief.getValue());
 					}
 				}
 			}
 		}
 	}
+
+	public Map<Goal, GoalAchievementMetadata> getGoalAchievementMetadata() {
+		return gams;
+	}
+
+	@Override
+	public void goalPerformed(GoalEvent event) {
+		for (GoalAchievementMetadata gam : gams.values()) {
+			if (gam.getIntention().getStatus().equals(GoalStatus.ACHIEVED) && !event.getGoal().equals(gam.getGoal())
+					&& event.getStatus().equals(GoalStatus.ACHIEVED)) {
+				gam.incrementPlanCounter();
+			}
+		}
+	}
 }