bdi4jade
Changes
bdi-jade-extensions/src/bdi4jade/extension/remediation/reasoning/RemediationOptionGenerationFunction.java 23(+21 -2)
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();
+ }
+ }
+ }
}