diff options
Diffstat (limited to 'subprojects/store-dse/src/test/java/tools/refinery/store/dse/transition/TransitionTests.java')
-rw-r--r-- | subprojects/store-dse/src/test/java/tools/refinery/store/dse/transition/TransitionTests.java | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/subprojects/store-dse/src/test/java/tools/refinery/store/dse/transition/TransitionTests.java b/subprojects/store-dse/src/test/java/tools/refinery/store/dse/transition/TransitionTests.java new file mode 100644 index 00000000..42a0f89b --- /dev/null +++ b/subprojects/store-dse/src/test/java/tools/refinery/store/dse/transition/TransitionTests.java | |||
@@ -0,0 +1,149 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> | ||
3 | * | ||
4 | * SPDX-License-Identifier: EPL-2.0 | ||
5 | */ | ||
6 | package tools.refinery.store.dse.transition; | ||
7 | |||
8 | import org.junit.jupiter.api.Test; | ||
9 | import tools.refinery.store.dse.modification.ModificationAdapter; | ||
10 | import tools.refinery.store.dse.transition.objectives.Criteria; | ||
11 | import tools.refinery.store.dse.transition.objectives.Objectives; | ||
12 | import tools.refinery.store.model.Model; | ||
13 | import tools.refinery.store.model.ModelStore; | ||
14 | import tools.refinery.store.query.ModelQueryAdapter; | ||
15 | import tools.refinery.store.query.dnf.FunctionalQuery; | ||
16 | import tools.refinery.store.query.dnf.Query; | ||
17 | import tools.refinery.store.query.dnf.RelationalQuery; | ||
18 | import tools.refinery.store.query.term.Variable; | ||
19 | import tools.refinery.store.query.term.int_.IntTerms; | ||
20 | import tools.refinery.store.query.viatra.ViatraModelQueryAdapter; | ||
21 | import tools.refinery.store.query.view.AnySymbolView; | ||
22 | import tools.refinery.store.query.view.KeyOnlyView; | ||
23 | import tools.refinery.store.representation.Symbol; | ||
24 | import tools.refinery.store.statecoding.StateCoderAdapter; | ||
25 | import tools.refinery.store.tuple.Tuple; | ||
26 | |||
27 | import java.util.List; | ||
28 | |||
29 | import static org.junit.jupiter.api.Assertions.*; | ||
30 | import static tools.refinery.store.query.literal.Literals.check; | ||
31 | import static tools.refinery.store.query.literal.Literals.not; | ||
32 | |||
33 | class TransitionBuildTests { | ||
34 | Symbol<Boolean> person = new Symbol<>("Person", 1, Boolean.class, false); | ||
35 | Symbol<Boolean> friend = new Symbol<>("friend", 2, Boolean.class, false); | ||
36 | |||
37 | AnySymbolView personView = new KeyOnlyView<>(person); | ||
38 | AnySymbolView friendView = new KeyOnlyView<>(friend); | ||
39 | |||
40 | RelationalQuery moreThan3Friends = Query.of("moreThan3Friends", (builder, tooMuchFriends) -> builder | ||
41 | .clause(Integer.class, (numberOfFriends) -> List.of( | ||
42 | numberOfFriends.assign(friendView.count(tooMuchFriends, Variable.of())), | ||
43 | check(IntTerms.less(IntTerms.constant(3), numberOfFriends)), | ||
44 | personView.call(tooMuchFriends) | ||
45 | ))); | ||
46 | |||
47 | RelationalQuery somebodyHasNoFriend = Query.of("somebodyHasNoFriend", (builder, lonely) -> builder | ||
48 | .clause( | ||
49 | personView.call(lonely), | ||
50 | not(friendView.call(lonely, Variable.of())) | ||
51 | )); | ||
52 | |||
53 | FunctionalQuery<Integer> numberOfFriends = Query.of(Integer.class, (builder, output) -> builder | ||
54 | .clause( | ||
55 | output.assign(friendView.count(Variable.of(), Variable.of())) | ||
56 | )); | ||
57 | |||
58 | @Test | ||
59 | void acceptTest() { | ||
60 | Model model = getModel(); | ||
61 | |||
62 | var dse = model.getAdapter(DesignSpaceExplorationAdapter.class); | ||
63 | var query = model.getAdapter(ModelQueryAdapter.class); | ||
64 | var personI = model.getInterpretation(person); | ||
65 | var friendI = model.getInterpretation(friend); | ||
66 | |||
67 | assertTrue(dse.checkAccept()); | ||
68 | personI.put(Tuple.of(1), true); | ||
69 | personI.put(Tuple.of(2), true); | ||
70 | |||
71 | query.flushChanges(); | ||
72 | |||
73 | assertFalse(dse.checkAccept()); | ||
74 | friendI.put(Tuple.of(1, 2), true); | ||
75 | friendI.put(Tuple.of(2, 1), true); | ||
76 | |||
77 | query.flushChanges(); | ||
78 | |||
79 | assertTrue(dse.checkAccept()); | ||
80 | } | ||
81 | |||
82 | @Test | ||
83 | void includeTest() { | ||
84 | Model model = getModel(); | ||
85 | |||
86 | var dse = model.getAdapter(DesignSpaceExplorationAdapter.class); | ||
87 | var query = model.getAdapter(ModelQueryAdapter.class); | ||
88 | var personI = model.getInterpretation(person); | ||
89 | var friendI = model.getInterpretation(friend); | ||
90 | |||
91 | assertFalse(dse.checkExclude()); | ||
92 | |||
93 | personI.put(Tuple.of(1), true); | ||
94 | friendI.put(Tuple.of(1, 2), true); | ||
95 | friendI.put(Tuple.of(1, 3), true); | ||
96 | friendI.put(Tuple.of(1, 4), true); | ||
97 | |||
98 | query.flushChanges(); | ||
99 | assertFalse(dse.checkExclude()); | ||
100 | |||
101 | personI.put(Tuple.of(5), true); | ||
102 | friendI.put(Tuple.of(1, 5), true); | ||
103 | |||
104 | query.flushChanges(); | ||
105 | assertTrue(dse.checkExclude()); | ||
106 | |||
107 | friendI.put(Tuple.of(1, 2), false); | ||
108 | |||
109 | query.flushChanges(); | ||
110 | assertFalse(dse.checkExclude()); | ||
111 | } | ||
112 | |||
113 | @Test | ||
114 | void objectiveTest() { | ||
115 | Model model = getModel(); | ||
116 | |||
117 | var dse = model.getAdapter(DesignSpaceExplorationAdapter.class); | ||
118 | var query = model.getAdapter(ModelQueryAdapter.class); | ||
119 | var friendI = model.getInterpretation(friend); | ||
120 | |||
121 | assertEquals(0.0, dse.getObjectiveValue().get(0), 0.01); | ||
122 | |||
123 | friendI.put(Tuple.of(1, 2), true); | ||
124 | |||
125 | query.flushChanges(); | ||
126 | assertEquals(1.0, dse.getObjectiveValue().get(0), 0.01); | ||
127 | |||
128 | friendI.put(Tuple.of(1, 3), true); | ||
129 | friendI.put(Tuple.of(1, 4), true); | ||
130 | |||
131 | query.flushChanges(); | ||
132 | assertEquals(3.0, dse.getObjectiveValue().get(0), 0.01); | ||
133 | } | ||
134 | |||
135 | private Model getModel() { | ||
136 | var store = ModelStore.builder() | ||
137 | .symbols(person, friend) | ||
138 | .with(ViatraModelQueryAdapter.builder()) | ||
139 | .with(StateCoderAdapter.builder()) | ||
140 | .with(ModificationAdapter.builder()) | ||
141 | .with(DesignSpaceExplorationAdapter.builder() | ||
142 | .objective(Objectives.value(numberOfFriends)) | ||
143 | .exclude(Criteria.whenHasMatch(moreThan3Friends)) | ||
144 | .accept(Criteria.whenNoMatch(somebodyHasNoFriend))) | ||
145 | .build(); | ||
146 | |||
147 | return store.createEmptyModel(); | ||
148 | } | ||
149 | } | ||