Skip to content

Commit 28653c5

Browse files
authored
Merge pull request #5 from MiriamGaus/main
distribute rules to each involved decision
2 parents 05d7f9d + 6eb4de4 commit 28653c5

110 files changed

Lines changed: 2703 additions & 2638 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/main/java/edu/kit/travart/dopler/transformation/decision/to/feature/rules/RuleHandlerImpl.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,19 @@ private void handleRule(FeatureModel featureModel, Rule rule) {
5555
Optional<Constraint> left = conditionHandler.handleCondition(rule.getCondition());
5656
Constraint right = actionHandler.createRight(featureModel.getRootFeature(), rule.getActions());
5757

58+
Constraint newConstraint;
5859
if (left.isPresent()) {
5960
// constraint: 'left -> right'
60-
featureModel.getOwnConstraints().add(new ImplicationConstraint(left.get(), right));
61+
newConstraint = new ImplicationConstraint(left.get(), right);
6162
} else {
6263
// constraint: 'right'
63-
featureModel.getOwnConstraints().add(right);
64+
newConstraint = right;
65+
}
66+
// Check if constraint already exists before adding
67+
boolean constraintExists = featureModel.getOwnConstraints().stream()
68+
.anyMatch(existingConstraint -> existingConstraint.equals(newConstraint));
69+
if (!constraintExists) {
70+
featureModel.getOwnConstraints().add(newConstraint);
6471
}
6572
}
6673
}

src/main/java/edu/kit/travart/dopler/transformation/feature/to/decision/constraint/ConstraintHandlerImpl.java

Lines changed: 62 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,26 +20,35 @@
2020
import de.vill.model.constraint.Constraint;
2121
import de.vill.model.constraint.ExpressionConstraint;
2222
import de.vill.model.constraint.NotConstraint;
23+
import edu.kit.dopler.model.AND;
2324
import edu.kit.dopler.model.BooleanDecision;
2425
import edu.kit.dopler.model.BooleanEnforce;
2526
import edu.kit.dopler.model.BooleanLiteralExpression;
2627
import edu.kit.dopler.model.BooleanValue;
2728
import edu.kit.dopler.model.Decision;
2829
import edu.kit.dopler.model.Dopler;
2930
import edu.kit.dopler.model.DoubleValue;
31+
import edu.kit.dopler.model.Equals;
32+
import edu.kit.dopler.model.GreatherThan;
3033
import edu.kit.dopler.model.IAction;
3134
import edu.kit.dopler.model.IDecision;
3235
import edu.kit.dopler.model.IExpression;
36+
import edu.kit.dopler.model.LessThan;
37+
import edu.kit.dopler.model.NOT;
3338
import edu.kit.dopler.model.NumberDecision;
3439
import edu.kit.dopler.model.NumberEnforce;
40+
import edu.kit.dopler.model.OR;
3541
import edu.kit.dopler.model.Rule;
3642
import edu.kit.dopler.model.StringDecision;
3743
import edu.kit.dopler.model.StringEnforce;
44+
import edu.kit.dopler.model.StringLiteralExpression;
3845
import edu.kit.dopler.model.StringValue;
3946
import edu.kit.dopler.model.ValueRestrictionAction;
4047
import edu.kit.travart.dopler.transformation.feature.to.decision.constraint.dnf.DnfAlwaysTrueAndFalseRemover;
4148
import edu.kit.travart.dopler.transformation.feature.to.decision.constraint.dnf.DnfToTreeConverter;
4249
import edu.kit.travart.dopler.transformation.feature.to.decision.constraint.dnf.TreeToDnfConverter;
50+
import edu.kit.travart.dopler.transformation.util.DecisionFinder;
51+
import edu.kit.travart.dopler.transformation.util.DecisionFinderImpl;
4352
import edu.kit.travart.dopler.transformation.exceptions.CanNotBeTranslatedException;
4453
import edu.kit.travart.dopler.transformation.exceptions.DecisionNotPresentException;
4554
import edu.kit.travart.dopler.transformation.exceptions.DnfAlwaysFalseException;
@@ -55,6 +64,7 @@
5564
import java.util.Optional;
5665
import java.util.Set;
5766
import java.util.Stack;
67+
import java.util.stream.Collectors;
5868

5969
/**
6070
* Implementation of {@link ConstraintHandler}.
@@ -114,7 +124,7 @@ public void handleConstraints(FeatureModel featureModel, Dopler decisionModel) {
114124
for (Constraint constraint : getSanitizedConstraints(featureModel)) {
115125
List<List<Constraint>> dnf = convertConstraintIntoDnf(featureModel, constraint);
116126
Optional<Rule> rule = createRuleFromDnf(featureModel, decisionModel, dnf);
117-
rule.ifPresent(this::distributeRule);
127+
rule.ifPresent(otherRule -> distributeRule(otherRule, decisionModel));
118128
}
119129
}
120130

@@ -197,13 +207,59 @@ private Constraint createLeft(List<List<Constraint>> leftSide) {
197207
}
198208

199209
/** Distribute the generated rule to a decision */
200-
private void distributeRule(Rule rule) {
201-
//Just take decision of first action.
202-
//The action must be a ValueRestrictionAction. Only those have decisions.
203-
rule.getActions().stream().sorted(Comparator.comparing(Object::toString))
210+
private void distributeRule(Rule rule, Dopler decisionModel) {
211+
// Add rule to the decisions of the condition
212+
DecisionFinder decisionFinder = new DecisionFinderImpl();
213+
// To keep rules like if(true) {decision=true}, they are need to restore to fm
214+
if (rule.getCondition() instanceof BooleanLiteralExpression) {
215+
rule.getActions().stream()
216+
.sorted(Comparator.comparing(Object::toString))
204217
.filter(action -> action instanceof ValueRestrictionAction)
205-
.map(action -> (ValueRestrictionAction) action).findFirst().orElseThrow().getDecision().addRule(rule);
218+
.map(action -> (ValueRestrictionAction) action).forEach(action -> action.getDecision().addRule(rule));
219+
} else {
220+
Set<String> decisionIds = getDecisionIds(rule.getCondition());
221+
for(String decisionId : decisionIds) {
222+
Optional<IDecision<?>> decisionOptional = decisionFinder.findDecisionById(decisionModel, decisionId);
223+
decisionOptional.ifPresent(decision -> decision.addRule(rule));
224+
}
225+
}
226+
}
227+
228+
private Set<String> getDecisionIds(IExpression condition) {
229+
Set<String> decisionIds = new LinkedHashSet<>();
230+
// Recursive lookUp for decisionIds
231+
if (condition instanceof StringLiteralExpression stringLiteralExpression) {
232+
decisionIds.add(stringLiteralExpression.getLiteral());
233+
} else if (condition instanceof Equals equalsExpression) {
234+
decisionIds.addAll(getDecisionIds(equalsExpression.getLeftExpression()));
235+
decisionIds.addAll(getDecisionIds(equalsExpression.getRightExpression()));
236+
} else if (condition instanceof NOT notExpression) {
237+
decisionIds.addAll(getDecisionIds(notExpression.getOperand()));
238+
} else if (condition instanceof AND andExpression) {
239+
decisionIds.addAll(getDecisionIds(andExpression.getLeftExpression()));
240+
decisionIds.addAll(getDecisionIds(andExpression.getRightExpression()));
241+
} else if (condition instanceof OR orExpression) {
242+
decisionIds.addAll(getDecisionIds(orExpression.getLeftExpression()));
243+
decisionIds.addAll(getDecisionIds(orExpression.getRightExpression()));
244+
} else if (condition instanceof GreatherThan greaterThanExpression) {
245+
decisionIds.addAll(getDecisionIds(greaterThanExpression.getLeftExpression()));
246+
decisionIds.addAll(getDecisionIds(greaterThanExpression.getRightExpression()));
247+
} else if (condition instanceof LessThan lessThanExpression) {
248+
decisionIds.addAll(getDecisionIds(lessThanExpression.getLeftExpression()));
249+
decisionIds.addAll(getDecisionIds(lessThanExpression.getRightExpression()));
206250
}
251+
// Other Expression types are ignored (e.g. Boolean, Double) and these do not contain decision IDs.
252+
253+
// Strip part after last dot to get the correct ID
254+
decisionIds = decisionIds.stream()
255+
.map(id -> {
256+
int lastIndex = id.lastIndexOf('.');
257+
return (lastIndex != -1) ? id.substring(0, lastIndex) : id;
258+
})
259+
.collect(Collectors.toSet());
260+
261+
return decisionIds;
262+
}
207263

208264
/** Creates a set of {@link IAction}s that contradict each other. */
209265
private List<IAction> createContradiction(Dopler decisionModel) {

src/test/resources/oneway/feature/to/decision/ll1/APL.csv

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ Gui;Gui?;Boolean;false | true;;;true
33
Xml;Xml?;Boolean;false | true;;;true
44
Xml*;Which Xml*?;Enumeration;xak | xc;1:1;;Xml
55
aj;aj?;Boolean;false | true;;;true
6-
bc;bc?;Boolean;false | true;;;true
6+
bc;bc?;Boolean;false | true;;"if (bc) {mmatrix = true;}";true
77
cpp;cpp?;Boolean;false | true;;;true
88
drc;drc?;Boolean;false | true;;;true
99
guidsl;guidsl?;Boolean;false | true;;;Gui
1010
jedi;jedi?;Boolean;false | true;;;true
11-
me;me?;Boolean;false | true;;;Gui
12-
mmatrix;mmatrix?;Boolean;false | true;;"if (bc) {mmatrix = true;}if (me) {mmatrix = true;}";Gui
11+
me;me?;Boolean;false | true;;"if (me) {mmatrix = true;}";Gui
12+
mmatrix;mmatrix?;Boolean;false | true;;;Gui
1313
reform;reform?;Boolean;false | true;;;true
1414
web;web?;Boolean;false | true;;;Gui

0 commit comments

Comments
 (0)