aboutsummaryrefslogtreecommitdiffstats
path: root/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/Ecore2LogicTraceBasedHint.xtend
blob: dc2de30cabebb54490966a4ae16dfc4d42d1d879 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package hu.bme.mit.inf.dslreasoner.run

import com.google.common.collect.ImmutableMap
import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic
import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace
import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDeclaration
import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type
import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.LinearTypeConstraintHint
import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation
import java.util.Map
import org.eclipse.viatra.query.runtime.api.IPatternMatch
import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher

abstract class Ecore2LogicTraceBasedHint implements LinearTypeConstraintHint {
	val Map<String, Type> nameToType
	val Map<String, Map<String, RelationDeclaration>> nameToRelation

	protected new(Ecore2Logic ecore2Logic, Ecore2Logic_Trace trace) {
		nameToType = ImmutableMap.copyOf(ecore2Logic.allClassesInScope(trace).toMap[name].mapValues [ eClass |
			ecore2Logic.TypeofEClass(trace, eClass)
		])
		nameToRelation = ImmutableMap.copyOf(ecore2Logic.allReferencesInScope(trace).groupBy[EContainingClass.name].
			mapValues [ references |
				ImmutableMap.copyOf(references.toMap[name].mapValues [ reference |
					ecore2Logic.relationOfReference(trace, reference)
				])
			])
	}

	protected def getType(String name) {
		nameToType.get(name)
	}

	protected def relation(String typeName, String relationName) {
		nameToRelation.get(typeName).get(relationName)
	}

	protected static def <T extends IPatternMatch> int countMatches(ViatraQueryMatcher<T> matcher, PartialInterpretation p) {
		val match = matcher.newEmptyMatch
		match.set(0, p.problem)
		match.set(1, p)
		matcher.countMatches(match)
	}

	protected static def <T extends IPatternMatch> int getCount(ViatraQueryMatcher<T> matcher, PartialInterpretation p) {
		val match = matcher.newEmptyMatch
		match.set(0, p.problem)
		match.set(1, p)
		val realMatch = matcher.getOneArbitraryMatch(match)
		if (realMatch.present) {
			realMatch.get.get(2) as Integer
		} else {
			0
		}
	}
}