aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kris7topher@gmail.com>2019-04-08 00:58:00 +0200
committerLibravatar Kristóf Marussy <kris7topher@gmail.com>2019-04-08 00:58:00 +0200
commitc1f185fd8fc2c3dfc123d9271726c588963c7c01 (patch)
tree88a5bb94017e7d3f0fbce0a51a78c2549b0977bd /Solvers
parentInfrastructure for objective functions (diff)
downloadVIATRA-Generator-c1f185fd8fc2c3dfc123d9271726c588963c7c01.tar.gz
VIATRA-Generator-c1f185fd8fc2c3dfc123d9271726c588963c7c01.tar.zst
VIATRA-Generator-c1f185fd8fc2c3dfc123d9271726c588963c7c01.zip
Objective POC implementation
Diffstat (limited to 'Solvers')
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/ModelGenerationMethodProvider.xtend85
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternGenerator.xtend4
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/META-INF/MANIFEST.MF3
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasoner.xtend33
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasonerConfiguration.xtend32
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/DseUtils.xtend1
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ModelGenerationCompositeObjective.xtend1
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/optimization/AbstractThreeValuedObjective.xtend102
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/optimization/IThreeValuedObjective.xtend (renamed from Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/IThreeValuedObjective.xtend)2
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/optimization/ObjectiveKind.java36
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/optimization/ThreeValuedCostObjective.xtend86
11 files changed, 339 insertions, 46 deletions
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/ModelGenerationMethodProvider.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/ModelGenerationMethodProvider.xtend
index f43ab96d..b6918294 100644
--- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/ModelGenerationMethodProvider.xtend
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/ModelGenerationMethodProvider.xtend
@@ -1,8 +1,10 @@
1package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra 1package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra
2 2
3import com.google.common.collect.ImmutableMap
3import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel 4import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel
4import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem 5import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem
5import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.TransfomedViatraQuery 6import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.TransfomedViatraQuery
7import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.ModalPatternQueries
6import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.PatternProvider 8import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.PatternProvider
7import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.rules.GoalConstraintProvider 9import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.rules.GoalConstraintProvider
8import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.rules.RefinementRuleProvider 10import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.rules.RefinementRuleProvider
@@ -10,6 +12,7 @@ import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.par
10import hu.bme.mit.inf.dslreasoner.workspace.ReasonerWorkspace 12import hu.bme.mit.inf.dslreasoner.workspace.ReasonerWorkspace
11import java.util.Collection 13import java.util.Collection
12import java.util.List 14import java.util.List
15import java.util.Map
13import java.util.Set 16import java.util.Set
14import org.eclipse.viatra.query.runtime.api.IPatternMatch 17import org.eclipse.viatra.query.runtime.api.IPatternMatch
15import org.eclipse.viatra.query.runtime.api.IQuerySpecification 18import org.eclipse.viatra.query.runtime.api.IQuerySpecification
@@ -20,34 +23,41 @@ import org.eclipse.xtend.lib.annotations.Data
20 23
21class ModelGenerationStatistics { 24class ModelGenerationStatistics {
22 public var long transformationExecutionTime = 0 25 public var long transformationExecutionTime = 0
26
23 synchronized def addExecutionTime(long amount) { 27 synchronized def addExecutionTime(long amount) {
24 transformationExecutionTime+=amount 28 transformationExecutionTime += amount
25 } 29 }
30
26 public var long PreliminaryTypeAnalisisTime = 0 31 public var long PreliminaryTypeAnalisisTime = 0
27} 32}
33
28@Data class ModelGenerationMethod { 34@Data class ModelGenerationMethod {
29 ModelGenerationStatistics statistics 35 ModelGenerationStatistics statistics
30 36
31 Collection<? extends BatchTransformationRule<?,?>> objectRefinementRules 37 Collection<? extends BatchTransformationRule<?, ?>> objectRefinementRules
32 Collection<? extends BatchTransformationRule<?,?>> relationRefinementRules 38 Collection<? extends BatchTransformationRule<?, ?>> relationRefinementRules
33 39
34 List<MultiplicityGoalConstraintCalculator> unfinishedMultiplicities 40 List<MultiplicityGoalConstraintCalculator> unfinishedMultiplicities
35 Collection<? extends IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> unfinishedWF 41 Collection<? extends IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> unfinishedWF
36 42
37 Collection<? extends IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> invalidWF 43 Collection<? extends IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> invalidWF
38 44
39 Collection<? extends IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> allPatterns 45 Map<String, ModalPatternQueries> modalRelationQueries
46
47 Collection<? extends IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> allPatterns
40} 48}
49
41enum TypeInferenceMethod { 50enum TypeInferenceMethod {
42 Generic, PreliminaryAnalysis 51 Generic,
52 PreliminaryAnalysis
43} 53}
44 54
45class ModelGenerationMethodProvider { 55class ModelGenerationMethodProvider {
46 private val PatternProvider patternProvider = new PatternProvider 56 val PatternProvider patternProvider = new PatternProvider
47 private val RefinementRuleProvider refinementRuleProvider = new RefinementRuleProvider 57 val RefinementRuleProvider refinementRuleProvider = new RefinementRuleProvider
48 private val GoalConstraintProvider goalConstraintProvider = new GoalConstraintProvider 58 val GoalConstraintProvider goalConstraintProvider = new GoalConstraintProvider
49 59
50 public def ModelGenerationMethod createModelGenerationMethod( 60 def ModelGenerationMethod createModelGenerationMethod(
51 LogicProblem logicProblem, 61 LogicProblem logicProblem,
52 PartialInterpretation emptySolution, 62 PartialInterpretation emptySolution,
53 ReasonerWorkspace workspace, 63 ReasonerWorkspace workspace,
@@ -58,25 +68,31 @@ class ModelGenerationMethodProvider {
58 ) { 68 ) {
59 val statistics = new ModelGenerationStatistics 69 val statistics = new ModelGenerationStatistics
60 val writeFiles = (debugLevel === DocumentationLevel.NORMAL || debugLevel === DocumentationLevel.FULL) 70 val writeFiles = (debugLevel === DocumentationLevel.NORMAL || debugLevel === DocumentationLevel.FULL)
61 71
62 val Set<PQuery> existingQueries = logicProblem 72 val Set<PQuery> existingQueries = logicProblem.relations.map[annotations].flatten.filter(TransfomedViatraQuery).
63 .relations 73 map[it.patternPQuery as PQuery].toSet
64 .map[annotations] 74
65 .flatten 75 val queries = patternProvider.generateQueries(logicProblem, emptySolution, statistics, existingQueries,
66 .filter(TransfomedViatraQuery) 76 workspace, typeInferenceMethod, writeFiles)
67 .map[it.patternPQuery as PQuery] 77 val // LinkedHashMap<Pair<Relation, ? extends Type>, BatchTransformationRule<GenericPatternMatch, ViatraQueryMatcher<GenericPatternMatch>>>
68 .toSet 78 objectRefinementRules = refinementRuleProvider.createObjectRefinementRules(queries, scopePropagator,
69 79 nameNewElements, statistics)
70 val queries = patternProvider.generateQueries(logicProblem,emptySolution,statistics,existingQueries,workspace,typeInferenceMethod,writeFiles) 80 val relationRefinementRules = refinementRuleProvider.createRelationRefinementRules(queries, statistics)
71 val //LinkedHashMap<Pair<Relation, ? extends Type>, BatchTransformationRule<GenericPatternMatch, ViatraQueryMatcher<GenericPatternMatch>>> 81
72 objectRefinementRules = refinementRuleProvider.createObjectRefinementRules(queries,scopePropagator,nameNewElements,statistics)
73 val relationRefinementRules = refinementRuleProvider.createRelationRefinementRules(queries,statistics)
74
75 val unfinishedMultiplicities = goalConstraintProvider.getUnfinishedMultiplicityQueries(queries) 82 val unfinishedMultiplicities = goalConstraintProvider.getUnfinishedMultiplicityQueries(queries)
76 val unfinishedWF = queries.getUnfinishedWFQueries.values 83 val unfinishedWF = queries.getUnfinishedWFQueries.values
77 84
85 val modalRelationQueriesBuilder = ImmutableMap.builder
86 for (entry : queries.modalRelationQueries.entrySet) {
87 val annotation = entry.key.annotations.filter(TransfomedViatraQuery).head
88 if (annotation !== null) {
89 modalRelationQueriesBuilder.put(annotation.patternFullyQualifiedName, entry.value)
90 }
91 }
92 val modalRelationQueries = modalRelationQueriesBuilder.build
93
78 val invalidWF = queries.getInvalidWFQueries.values 94 val invalidWF = queries.getInvalidWFQueries.values
79 95
80 return new ModelGenerationMethod( 96 return new ModelGenerationMethod(
81 statistics, 97 statistics,
82 objectRefinementRules.values, 98 objectRefinementRules.values,
@@ -84,6 +100,7 @@ class ModelGenerationMethodProvider {
84 unfinishedMultiplicities, 100 unfinishedMultiplicities,
85 unfinishedWF, 101 unfinishedWF,
86 invalidWF, 102 invalidWF,
103 modalRelationQueries,
87 queries.allQueries 104 queries.allQueries
88 ) 105 )
89 } 106 }
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternGenerator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternGenerator.xtend
index a2b11632..c9e64a9d 100644
--- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternGenerator.xtend
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternGenerator.xtend
@@ -55,7 +55,7 @@ class PatternGenerator {
55 typeIndexer.requiresTypeAnalysis || typeRefinementGenerator.requiresTypeAnalysis 55 typeIndexer.requiresTypeAnalysis || typeRefinementGenerator.requiresTypeAnalysis
56 } 56 }
57 57
58 public dispatch def referRelation( 58 public dispatch def CharSequence referRelation(
59 RelationDeclaration referred, 59 RelationDeclaration referred,
60 String sourceVariable, 60 String sourceVariable,
61 String targetVariable, 61 String targetVariable,
@@ -64,7 +64,7 @@ class PatternGenerator {
64 { 64 {
65 return this.relationDeclarationIndexer.referRelation(referred,sourceVariable,targetVariable,modality) 65 return this.relationDeclarationIndexer.referRelation(referred,sourceVariable,targetVariable,modality)
66 } 66 }
67 public dispatch def referRelation( 67 public dispatch def CharSequence referRelation(
68 RelationDefinition referred, 68 RelationDefinition referred,
69 String sourceVariable, 69 String sourceVariable,
70 String targetVariable, 70 String targetVariable,
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/META-INF/MANIFEST.MF b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/META-INF/MANIFEST.MF
index 2a271acf..4ad61ccb 100644
--- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/META-INF/MANIFEST.MF
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/META-INF/MANIFEST.MF
@@ -3,7 +3,8 @@ Bundle-ManifestVersion: 2
3Bundle-Name: Reasoner 3Bundle-Name: Reasoner
4Bundle-SymbolicName: hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner 4Bundle-SymbolicName: hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner
5Bundle-Version: 1.0.0.qualifier 5Bundle-Version: 1.0.0.qualifier
6Export-Package: hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner 6Export-Package: hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner,
7 hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization
7Require-Bundle: hu.bme.mit.inf.dslreasoner.ecore2logic;bundle-version="1.0.0", 8Require-Bundle: hu.bme.mit.inf.dslreasoner.ecore2logic;bundle-version="1.0.0",
8 hu.bme.mit.inf.dslreasoner.logic.model;bundle-version="1.0.0", 9 hu.bme.mit.inf.dslreasoner.logic.model;bundle-version="1.0.0",
9 hu.bme.mit.inf.dslreasoner.viatra2logic;bundle-version="1.0.0", 10 hu.bme.mit.inf.dslreasoner.viatra2logic;bundle-version="1.0.0",
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasoner.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasoner.xtend
index 8831b0ff..6898550d 100644
--- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasoner.xtend
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasoner.xtend
@@ -1,5 +1,7 @@
1package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner 1package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner
2 2
3import com.google.common.collect.ImmutableList
4import com.google.common.collect.Lists
3import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel 5import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel
4import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicReasoner 6import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicReasoner
5import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicReasonerException 7import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicReasonerException
@@ -25,6 +27,8 @@ import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.SurelyViolatedObject
25import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.UnfinishedMultiplicityObjective 27import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.UnfinishedMultiplicityObjective
26import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.ViatraReasonerSolutionSaver 28import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.ViatraReasonerSolutionSaver
27import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.WF2ObjectiveConverter 29import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.WF2ObjectiveConverter
30import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization.ThreeValuedCostElement
31import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization.ThreeValuedCostObjective
28import hu.bme.mit.inf.dslreasoner.workspace.ReasonerWorkspace 32import hu.bme.mit.inf.dslreasoner.workspace.ReasonerWorkspace
29import java.util.List 33import java.util.List
30import java.util.Map 34import java.util.Map
@@ -84,9 +88,36 @@ class ViatraReasoner extends LogicReasoner {
84 wf2ObjectiveConverter.createCompletenessObjective(method.unfinishedWF) 88 wf2ObjectiveConverter.createCompletenessObjective(method.unfinishedWF)
85 )) 89 ))
86 90
91 val extermalObjectives = Lists.newArrayListWithExpectedSize(viatraConfig.costObjectives.size)
92 for (entry : viatraConfig.costObjectives.indexed) {
93 val objectiveName = '''costObjective«entry.key»'''
94 val objectiveConfig = entry.value
95 val elementsBuilder = ImmutableList.builder
96 for (elementConfig : objectiveConfig.elements) {
97 val relationName = elementConfig.patternQualifiedName
98 val modalQueries = method.modalRelationQueries.get(relationName)
99 if (modalQueries === null) {
100 throw new IllegalArgumentException("Unknown relation: " + relationName)
101 }
102 elementsBuilder.add(new ThreeValuedCostElement(
103 modalQueries.currentQuery,
104 modalQueries.mayQuery,
105 modalQueries.mustQuery,
106 elementConfig.weight
107 ))
108 }
109 val costElements = elementsBuilder.build
110 val costObjective = new ThreeValuedCostObjective(objectiveName, costElements, objectiveConfig.kind,
111 objectiveConfig.threshold, 3)
112 dse.addObjective(costObjective)
113 if (objectiveConfig.findExtremum) {
114 extermalObjectives += costObjective
115 }
116 }
117
87 val solutionStore = new SolutionStore(configuration.solutionScope.numberOfRequiredSolutions) 118 val solutionStore = new SolutionStore(configuration.solutionScope.numberOfRequiredSolutions)
88 solutionStore.registerSolutionFoundHandler(new LoggerSolutionFoundHandler(viatraConfig)) 119 solutionStore.registerSolutionFoundHandler(new LoggerSolutionFoundHandler(viatraConfig))
89 val solutionSaver = new ViatraReasonerSolutionSaver(newArrayOfSize(0, 0)) 120 val solutionSaver = new ViatraReasonerSolutionSaver(newArrayList(extermalObjectives))
90 val solutionCopier = solutionSaver.solutionCopier 121 val solutionCopier = solutionSaver.solutionCopier
91 solutionStore.withSolutionSaver(solutionSaver) 122 solutionStore.withSolutionSaver(solutionSaver)
92 dse.solutionStore = solutionStore 123 dse.solutionStore = solutionStore
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasonerConfiguration.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasonerConfiguration.xtend
index 9ef23c59..e6aee20c 100644
--- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasonerConfiguration.xtend
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasonerConfiguration.xtend
@@ -7,18 +7,22 @@ import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDeclaration
7import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.ModelGenerationMethod 7import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.ModelGenerationMethod
8import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeInferenceMethod 8import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeInferenceMethod
9import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.visualisation.PartialInterpretationVisualiser 9import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.visualisation.PartialInterpretationVisualiser
10import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization.ObjectiveKind
11import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization.ObjectiveThreshold
10import java.util.LinkedList 12import java.util.LinkedList
11import java.util.List 13import java.util.List
12import java.util.Set 14import java.util.Set
13import org.eclipse.xtext.xbase.lib.Functions.Function1 15import org.eclipse.xtext.xbase.lib.Functions.Function1
14 16
15enum StateCoderStrategy { 17enum StateCoderStrategy {
16 Neighbourhood, NeighbourhoodWithEquivalence, IDBased, DefinedByDiversity 18 Neighbourhood,
19 NeighbourhoodWithEquivalence,
20 IDBased,
21 DefinedByDiversity
17} 22}
18 23
19class ViatraReasonerConfiguration extends LogicSolverConfiguration{ 24class ViatraReasonerConfiguration extends LogicSolverConfiguration {
20 //public var Iterable<PQuery> existingQueries 25 // public var Iterable<PQuery> existingQueries
21
22 public var nameNewElements = false 26 public var nameNewElements = false
23 public var StateCoderStrategy stateCoderStrategy = StateCoderStrategy.Neighbourhood 27 public var StateCoderStrategy stateCoderStrategy = StateCoderStrategy.Neighbourhood
24 public var TypeInferenceMethod typeInferenceMethod = TypeInferenceMethod.PreliminaryAnalysis 28 public var TypeInferenceMethod typeInferenceMethod = TypeInferenceMethod.PreliminaryAnalysis
@@ -26,7 +30,7 @@ class ViatraReasonerConfiguration extends LogicSolverConfiguration{
26 * Once per 1/randomBacktrackChance the search selects a random state. 30 * Once per 1/randomBacktrackChance the search selects a random state.
27 */ 31 */
28 public var int randomBacktrackChance = 20; 32 public var int randomBacktrackChance = 20;
29 33
30 /** 34 /**
31 * Describes the required diversity between the solutions. 35 * Describes the required diversity between the solutions.
32 * Null means that the solutions have to have different state codes only. 36 * Null means that the solutions have to have different state codes only.
@@ -44,7 +48,9 @@ class ViatraReasonerConfiguration extends LogicSolverConfiguration{
44 /** 48 /**
45 * Configuration for cutting search space. 49 * Configuration for cutting search space.
46 */ 50 */
47 public var SearchSpaceConstraint searchSpaceConstraints = new SearchSpaceConstraint 51 public var SearchSpaceConstraint searchSpaceConstraints = new SearchSpaceConstraint
52
53 public var List<CostObjectiveConfiguration> costObjectives = newArrayList
48} 54}
49 55
50class DiversityDescriptor { 56class DiversityDescriptor {
@@ -73,4 +79,16 @@ class SearchSpaceConstraint {
73 public static val UNLIMITED_MAXDEPTH = Integer.MAX_VALUE 79 public static val UNLIMITED_MAXDEPTH = Integer.MAX_VALUE
74 public var int maxDepth = UNLIMITED_MAXDEPTH 80 public var int maxDepth = UNLIMITED_MAXDEPTH
75 public var List<Function1<ModelGenerationMethod, ModelGenerationMethodBasedGlobalConstraint>> additionalGlobalConstraints = new LinkedList 81 public var List<Function1<ModelGenerationMethod, ModelGenerationMethodBasedGlobalConstraint>> additionalGlobalConstraints = new LinkedList
76} \ No newline at end of file 82}
83
84class CostObjectiveConfiguration {
85 public var List<CostObjectiveElementConfiguration> elements = newArrayList
86 public var ObjectiveKind kind
87 public var ObjectiveThreshold threshold
88 public var boolean findExtremum
89}
90
91class CostObjectiveElementConfiguration {
92 public var String patternQualifiedName
93 public var int weight
94}
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/DseUtils.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/DseUtils.xtend
index 3a897aa3..3c2e3319 100644
--- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/DseUtils.xtend
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/DseUtils.xtend
@@ -1,5 +1,6 @@
1package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse 1package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse
2 2
3import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization.IThreeValuedObjective
3import org.eclipse.viatra.dse.base.ThreadContext 4import org.eclipse.viatra.dse.base.ThreadContext
4import org.eclipse.viatra.dse.objectives.Comparators 5import org.eclipse.viatra.dse.objectives.Comparators
5import org.eclipse.viatra.dse.objectives.Fitness 6import org.eclipse.viatra.dse.objectives.Fitness
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ModelGenerationCompositeObjective.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ModelGenerationCompositeObjective.xtend
index af6d1bbd..9a33753c 100644
--- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ModelGenerationCompositeObjective.xtend
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ModelGenerationCompositeObjective.xtend
@@ -1,6 +1,7 @@
1package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse 1package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse
2 2
3import com.google.common.collect.ImmutableList 3import com.google.common.collect.ImmutableList
4import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization.IThreeValuedObjective
4import java.util.Comparator 5import java.util.Comparator
5import java.util.List 6import java.util.List
6import org.eclipse.viatra.dse.base.ThreadContext 7import org.eclipse.viatra.dse.base.ThreadContext
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/optimization/AbstractThreeValuedObjective.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/optimization/AbstractThreeValuedObjective.xtend
new file mode 100644
index 00000000..241bef2a
--- /dev/null
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/optimization/AbstractThreeValuedObjective.xtend
@@ -0,0 +1,102 @@
1package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization
2
3import java.util.Comparator
4import org.eclipse.viatra.dse.base.ThreadContext
5import org.eclipse.xtend.lib.annotations.Accessors
6import org.eclipse.xtend.lib.annotations.Data
7
8abstract class ObjectiveThreshold {
9 public static val NO_THRESHOLD = new hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization.ObjectiveThreshold {
10 override isHard() {
11 false
12 }
13
14 override satisfiesThreshold(double cost, Comparator<Double> comparator) {
15 true
16 }
17 }
18
19 private new() {
20 }
21
22 def boolean isHard() {
23 true
24 }
25
26 def boolean satisfiesThreshold(double cost, Comparator<Double> comparator)
27
28 @Data
29 static class Exclusive extends ObjectiveThreshold {
30 val double threshold
31
32 override satisfiesThreshold(double cost, Comparator<Double> comparator) {
33 comparator.compare(threshold, cost) > 0
34 }
35 }
36
37 @Data
38 static class Inclusive extends ObjectiveThreshold {
39 val double threshold
40
41 override satisfiesThreshold(double cost, Comparator<Double> comparator) {
42 comparator.compare(threshold, cost) >= 0
43 }
44 }
45}
46
47abstract class AbstractThreeValuedObjective implements IThreeValuedObjective {
48 @Accessors val String name
49 @Accessors ObjectiveKind kind
50 @Accessors ObjectiveThreshold threshold
51 @Accessors int level
52
53 protected new(String name, ObjectiveKind kind, ObjectiveThreshold threshold, int level) {
54 this.name = name
55 this.kind = kind
56 this.threshold = threshold
57 this.level = level
58 }
59
60 abstract def double getLowestPossibleFitness(ThreadContext threadContext)
61
62 abstract def double getHighestPossibleFitness(ThreadContext threadContext)
63
64 override getWorstPossibleFitness(ThreadContext threadContext) {
65 switch (kind) {
66 case LOWER_IS_BETTER:
67 getHighestPossibleFitness(threadContext)
68 case HIGHER_IS_BETTER:
69 getLowestPossibleFitness(threadContext)
70 default:
71 throw new IllegalStateException("Unknown three valued objective kind: " + kind)
72 }
73 }
74
75 override getBestPossibleFitness(ThreadContext threadContext) {
76 switch (kind) {
77 case LOWER_IS_BETTER:
78 getLowestPossibleFitness(threadContext)
79 case HIGHER_IS_BETTER:
80 getHighestPossibleFitness(threadContext)
81 default:
82 throw new IllegalStateException("Unknown three valued objective kind: " + kind)
83 }
84 }
85
86 override isHardObjective() {
87 threshold.hard
88 }
89
90 override satisifiesHardObjective(Double fitness) {
91 threshold.satisfiesThreshold(fitness, comparator)
92 }
93
94 override getComparator() {
95 kind.comparator
96 }
97
98 override setComparator(Comparator<Double> comparator) {
99 kind = ObjectiveKind.fromComparator(comparator)
100 }
101
102}
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/IThreeValuedObjective.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/optimization/IThreeValuedObjective.xtend
index 8c93d4ec..4a870a3e 100644
--- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/IThreeValuedObjective.xtend
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/optimization/IThreeValuedObjective.xtend
@@ -1,4 +1,4 @@
1package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse 1package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization
2 2
3import org.eclipse.viatra.dse.base.ThreadContext 3import org.eclipse.viatra.dse.base.ThreadContext
4import org.eclipse.viatra.dse.objectives.IObjective 4import org.eclipse.viatra.dse.objectives.IObjective
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/optimization/ObjectiveKind.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/optimization/ObjectiveKind.java
new file mode 100644
index 00000000..f65428fe
--- /dev/null
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/optimization/ObjectiveKind.java
@@ -0,0 +1,36 @@
1package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization;
2
3import java.util.Comparator;
4
5import org.eclipse.viatra.dse.objectives.Comparators;
6
7public enum ObjectiveKind {
8 LOWER_IS_BETTER {
9
10 @Override
11 public Comparator<Double> getComparator() {
12 return Comparators.LOWER_IS_BETTER;
13 }
14
15 },
16 HIGHER_IS_BETTER {
17
18 @Override
19 public Comparator<Double> getComparator() {
20 return Comparators.HIGHER_IS_BETTER;
21 }
22
23 };
24
25 public abstract Comparator<Double> getComparator();
26
27 public static ObjectiveKind fromComparator(Comparator<Double> comparator) {
28 if (Comparators.LOWER_IS_BETTER.equals(comparator)) {
29 return ObjectiveKind.LOWER_IS_BETTER;
30 } else if (Comparators.HIGHER_IS_BETTER.equals(comparator)) {
31 return ObjectiveKind.HIGHER_IS_BETTER;
32 } else {
33 throw new IllegalStateException("Only LOWER_IS_BETTER and HIGHER_IS_BETTER comparators are supported.");
34 }
35 }
36}
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/optimization/ThreeValuedCostObjective.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/optimization/ThreeValuedCostObjective.xtend
new file mode 100644
index 00000000..362ef4a3
--- /dev/null
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/optimization/ThreeValuedCostObjective.xtend
@@ -0,0 +1,86 @@
1package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization
2
3import com.google.common.collect.ImmutableList
4import java.util.Collection
5import org.eclipse.viatra.dse.base.ThreadContext
6import org.eclipse.viatra.query.runtime.api.IPatternMatch
7import org.eclipse.viatra.query.runtime.api.IQuerySpecification
8import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher
9import org.eclipse.xtend.lib.annotations.Data
10
11@Data
12class ThreeValuedCostElement {
13 val IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>> currentMatchQuery
14 val IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>> mayMatchQuery
15 val IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>> mustMatchQuery
16 val int weight
17}
18
19class ThreeValuedCostObjective extends AbstractThreeValuedObjective {
20 val Collection<ThreeValuedCostElement> costElements
21 Collection<CostElementMatchers> matchers
22
23 new(String name, Collection<ThreeValuedCostElement> costElements, ObjectiveKind kind, ObjectiveThreshold threshold,
24 int level) {
25 super(name, kind, threshold, level)
26 this.costElements = costElements
27 }
28
29 override createNew() {
30 new ThreeValuedCostObjective(name, costElements, kind, threshold, level)
31 }
32
33 override init(ThreadContext context) {
34 val queryEngine = context.queryEngine
35 matchers = ImmutableList.copyOf(costElements.map [ element |
36 new CostElementMatchers(
37 queryEngine.getMatcher(element.currentMatchQuery),
38 queryEngine.getMatcher(element.mayMatchQuery),
39 queryEngine.getMatcher(element.mustMatchQuery),
40 element.weight
41 )
42 ])
43 }
44
45 override getFitness(ThreadContext context) {
46 var int cost = 0
47 for (matcher : matchers) {
48 cost += matcher.weight * matcher.currentMatcher.countMatches
49 }
50 cost as double
51 }
52
53 override getLowestPossibleFitness(ThreadContext threadContext) {
54 var int cost = 0
55 for (matcher : matchers) {
56 if (matcher.weight >= 0) {
57 cost += matcher.weight * matcher.mustMatcher.countMatches
58 } else if (matcher.mayMatcher.countMatches > 0) {
59 // TODO Count may matches.
60 return Double.NEGATIVE_INFINITY
61 }
62 }
63 cost as double
64 }
65
66 override getHighestPossibleFitness(ThreadContext threadContext) {
67 var int cost = 0
68 for (matcher : matchers) {
69 if (matcher.weight <= 0) {
70 cost += matcher.weight * matcher.mustMatcher.countMatches
71 } else if (matcher.mayMatcher.countMatches > 0) {
72 // TODO Count may matches.
73 return Double.POSITIVE_INFINITY
74 }
75 }
76 cost as double
77 }
78
79 @Data
80 private static class CostElementMatchers {
81 val ViatraQueryMatcher<? extends IPatternMatch> currentMatcher
82 val ViatraQueryMatcher<? extends IPatternMatch> mayMatcher
83 val ViatraQueryMatcher<? extends IPatternMatch> mustMatcher
84 val int weight
85 }
86}