diff options
Diffstat (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RemainingMultiplicityCalculator.xtend')
-rw-r--r-- | Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RemainingMultiplicityCalculator.xtend | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RemainingMultiplicityCalculator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RemainingMultiplicityCalculator.xtend new file mode 100644 index 00000000..48b52d28 --- /dev/null +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RemainingMultiplicityCalculator.xtend | |||
@@ -0,0 +1,111 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality | ||
2 | |||
3 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation | ||
4 | import java.util.Iterator | ||
5 | import org.eclipse.viatra.query.runtime.api.IPatternMatch | ||
6 | import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher | ||
7 | import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor | ||
8 | |||
9 | @FinalFieldsConstructor | ||
10 | abstract class MultiplicityCalculator<Match extends IPatternMatch> { | ||
11 | val ViatraQueryMatcher<Match> matcher | ||
12 | |||
13 | def getMultiplicity() { | ||
14 | val iterator = matcher.streamAllMatches.iterator | ||
15 | getMultiplicity(iterator) | ||
16 | } | ||
17 | |||
18 | def getMultiplicity(PartialInterpretation interpretation) { | ||
19 | val partialMatch = matcher.newEmptyMatch | ||
20 | partialMatch.set(0, interpretation.problem) | ||
21 | partialMatch.set(1, interpretation) | ||
22 | val iterator = matcher.streamAllMatches(partialMatch).iterator | ||
23 | getMultiplicity(iterator) | ||
24 | } | ||
25 | |||
26 | protected def int getMultiplicity(Iterator<? extends Match> iterator) | ||
27 | } | ||
28 | |||
29 | class RemainingMultiplicityCalculator<Match extends IPatternMatch> extends MultiplicityCalculator<Match> { | ||
30 | val int bound | ||
31 | |||
32 | @FinalFieldsConstructor | ||
33 | private new() { | ||
34 | } | ||
35 | |||
36 | protected override getMultiplicity(Iterator<? extends Match> iterator) { | ||
37 | var res = 0 | ||
38 | while (iterator.hasNext) { | ||
39 | val match = iterator.next | ||
40 | val existingMultiplicity = match.get(3) as Integer | ||
41 | if (existingMultiplicity < bound) { | ||
42 | res += bound - existingMultiplicity | ||
43 | } | ||
44 | } | ||
45 | res | ||
46 | } | ||
47 | |||
48 | static def <Match extends IPatternMatch> of(ViatraQueryMatcher<Match> matcher, int bound) { | ||
49 | if (bound < 0) { | ||
50 | new RemainingInfiniteMultiplicityCalculator(matcher) | ||
51 | } else { | ||
52 | new RemainingMultiplicityCalculator(matcher, bound) | ||
53 | } | ||
54 | } | ||
55 | } | ||
56 | |||
57 | package class RemainingInfiniteMultiplicityCalculator<Match extends IPatternMatch> extends MultiplicityCalculator<Match> { | ||
58 | |||
59 | @FinalFieldsConstructor | ||
60 | package new() { | ||
61 | } | ||
62 | |||
63 | protected override getMultiplicity(Iterator<? extends Match> iterator) { | ||
64 | if (iterator.hasNext) { | ||
65 | -1 | ||
66 | } else { | ||
67 | 0 | ||
68 | } | ||
69 | } | ||
70 | } | ||
71 | |||
72 | @FinalFieldsConstructor | ||
73 | class UnrepairableMultiplicityCalculator<Match extends IPatternMatch> extends MultiplicityCalculator<Match> { | ||
74 | val int lowerBound | ||
75 | |||
76 | override protected getMultiplicity(Iterator<? extends Match> iterator) { | ||
77 | var res = 0 | ||
78 | while (iterator.hasNext) { | ||
79 | val match = iterator.next | ||
80 | val existingMultiplicity = match.get(3) as Integer | ||
81 | if (existingMultiplicity < lowerBound) { | ||
82 | val missingMultiplcity = lowerBound - existingMultiplicity | ||
83 | val numerOfRepairMatches = match.get(4) as Integer | ||
84 | val unrepairableMultiplicty = missingMultiplcity - numerOfRepairMatches | ||
85 | if (unrepairableMultiplicty > res) { | ||
86 | res = unrepairableMultiplicty | ||
87 | } | ||
88 | } | ||
89 | } | ||
90 | res | ||
91 | } | ||
92 | } | ||
93 | |||
94 | @FinalFieldsConstructor | ||
95 | class RemainingInverseMultiplicityCalculator<Match extends IPatternMatch> extends MultiplicityCalculator<Match> { | ||
96 | val int upperBound | ||
97 | |||
98 | override protected getMultiplicity(Iterator<? extends Match> iterator) { | ||
99 | var res = 0 | ||
100 | while (iterator.hasNext) { | ||
101 | val match = iterator.next | ||
102 | val existingMultiplicity = match.get(3) as Integer | ||
103 | if (existingMultiplicity < upperBound) { | ||
104 | val availableMultiplicity = upperBound - existingMultiplicity | ||
105 | val numberOfRepairMatches = match.get(4) as Integer | ||
106 | res += Math.min(availableMultiplicity, numberOfRepairMatches) | ||
107 | } | ||
108 | } | ||
109 | res | ||
110 | } | ||
111 | } | ||