aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/UnfinishedWFObjective.xtend
blob: b5b44254eeb5d734e8b65330befd12e4e2aed270 (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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse

import java.util.ArrayList
import java.util.Collection
import java.util.Comparator
import java.util.List
import org.eclipse.viatra.dse.base.ThreadContext
import org.eclipse.viatra.dse.objectives.Comparators
import org.eclipse.viatra.dse.objectives.IObjective
import org.eclipse.viatra.query.runtime.api.IPatternMatch
import org.eclipse.viatra.query.runtime.api.IQuerySpecification
import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher

class UnfinishedWFObjective implements IObjective {
	Collection<? extends IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> unfinishedWFs
	val List<ViatraQueryMatcher<?>> matchers

	new(
		Collection<? extends IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> unfinishedWFs) {
		this.unfinishedWFs = unfinishedWFs
		matchers = new ArrayList(unfinishedWFs.size)
	}

	override getName() '''unfinishedWFs'''

	override createNew() {
		return new UnfinishedWFObjective(unfinishedWFs)
	}

	override init(ThreadContext context) {
		val engine = context.queryEngine // ViatraQueryEngine.on(new EMFScope(context.model))
		for (unfinishedWF : unfinishedWFs) {
			matchers += unfinishedWF.getMatcher(engine)
		}
	}

	override getComparator() { Comparators.LOWER_IS_BETTER }

	override getFitness(ThreadContext context) {
//		//MEGA ASSUMPTION Below TODO
//		//if has no unfilled variables, return 0
//		val model = context.getModel as PartialInterpretation
//		val unfilledDataObjects = model.newElements.filter(PrimitiveElement).filter[!model.openWorldElements.contains(it)].filter[!it.isValueSet].toList
//		if (unfilledDataObjects.isEmpty) return 0.0
		
		var sumOfMatches = 0
		for (matcher : matchers) {
			val number = matcher.countMatches
//			if (number > 0) {
//				println('''«matcher.patternName» = «number»''')
//			}
			sumOfMatches += number
		}
		return sumOfMatches.doubleValue
	}

	override getLevel() { 2 }

	override isHardObjective() { true }

	override satisifiesHardObjective(Double fitness) { return fitness <= 0.01 }

	override setComparator(Comparator<Double> comparator) {
		throw new UnsupportedOperationException()
	}

	override setLevel(int level) {
		throw new UnsupportedOperationException()
	}
}