aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers
diff options
context:
space:
mode:
authorLibravatar Oszkar Semerath <semerath@mit.bme.hu>2020-05-09 20:33:19 +0200
committerLibravatar Oszkar Semerath <semerath@mit.bme.hu>2020-05-09 20:33:19 +0200
commit3776a7c6bc1d6fc3ebbdc9e8afb5ea99207798e0 (patch)
tree204cbd6fd1e7f439bc44e6210e684dbed8917e54 /Solvers
parentMerge branch 'master' of https://github.com/viatra/VIATRA-Generator (diff)
downloadVIATRA-Generator-3776a7c6bc1d6fc3ebbdc9e8afb5ea99207798e0.tar.gz
VIATRA-Generator-3776a7c6bc1d6fc3ebbdc9e8afb5ea99207798e0.tar.zst
VIATRA-Generator-3776a7c6bc1d6fc3ebbdc9e8afb5ea99207798e0.zip
Numeric Solver integration to exploration
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.xtend7
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternProvider.xtend1
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnitPropagationPreconditionGenerator.xtend6
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasoner.xtend2
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java32
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/NumericSolver.xtend114
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/SolutionStoreWithCopy.xtend3
7 files changed, 149 insertions, 16 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 e7342ff7..975ace2f 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
@@ -17,6 +17,8 @@ import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher
17import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery 17import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery
18import org.eclipse.viatra.transformation.runtime.emf.rules.batch.BatchTransformationRule 18import org.eclipse.viatra.transformation.runtime.emf.rules.batch.BatchTransformationRule
19import org.eclipse.xtend.lib.annotations.Data 19import org.eclipse.xtend.lib.annotations.Data
20import org.eclipse.viatra.query.runtime.matchers.psystem.PConstraint
21import java.util.Map
20 22
21class ModelGenerationStatistics { 23class ModelGenerationStatistics {
22 public var long transformationExecutionTime = 0 24 public var long transformationExecutionTime = 0
@@ -36,6 +38,8 @@ class ModelGenerationStatistics {
36 38
37 Collection<? extends IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> invalidWF 39 Collection<? extends IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> invalidWF
38 40
41 Map<PConstraint, IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> unitPropagationPreconditions
42
39 Collection<? extends IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> allPatterns 43 Collection<? extends IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> allPatterns
40} 44}
41enum TypeInferenceMethod { 45enum TypeInferenceMethod {
@@ -77,6 +81,8 @@ class ModelGenerationMethodProvider {
77 81
78 val invalidWF = queries.getInvalidWFQueries.values 82 val invalidWF = queries.getInvalidWFQueries.values
79 83
84 val unitPropagationPreconditions = queries.getUnitPropagationPreconditionPatterns
85
80 return new ModelGenerationMethod( 86 return new ModelGenerationMethod(
81 statistics, 87 statistics,
82 objectRefinementRules.values, 88 objectRefinementRules.values,
@@ -84,6 +90,7 @@ class ModelGenerationMethodProvider {
84 unfinishedMultiplicities, 90 unfinishedMultiplicities,
85 unfinishedWF, 91 unfinishedWF,
86 invalidWF, 92 invalidWF,
93 unitPropagationPreconditions,
87 queries.allQueries 94 queries.allQueries
88 ) 95 )
89 } 96 }
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternProvider.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternProvider.xtend
index f576d1a1..18e3018a 100644
--- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternProvider.xtend
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternProvider.xtend
@@ -93,7 +93,6 @@ class PatternProvider {
93 refineRelationQueries = patternGenerator.relationRefinementGenerator.getRefineRelationQueries(problem).mapValues[it.lookup(queries)] 93 refineRelationQueries = patternGenerator.relationRefinementGenerator.getRefineRelationQueries(problem).mapValues[it.lookup(queries)]
94 val Map<PConstraint, IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> 94 val Map<PConstraint, IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>>
95 unitPropagationPreconditionPatterns = unitPropagationTrace.mapValues[it.lookup(queries)] 95 unitPropagationPreconditionPatterns = unitPropagationTrace.mapValues[it.lookup(queries)]
96 unitPropagationPreconditionPatterns.entrySet.forEach[println(it.key + "->" +it.value)]
97 return new GeneratedPatterns( 96 return new GeneratedPatterns(
98 invalidWFQueries, 97 invalidWFQueries,
99 unfinishedWFQueries, 98 unfinishedWFQueries,
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnitPropagationPreconditionGenerator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnitPropagationPreconditionGenerator.xtend
index 6c68ec94..d487db64 100644
--- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnitPropagationPreconditionGenerator.xtend
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/UnitPropagationPreconditionGenerator.xtend
@@ -100,11 +100,9 @@ class UnitPropagationPreconditionGenerator {
100 val preconditions = new LinkedList 100 val preconditions = new LinkedList
101 val constraint2Precondition = new HashMap 101 val constraint2Precondition = new HashMap
102 for(entry : mainPropagationNames.entrySet) { 102 for(entry : mainPropagationNames.entrySet) {
103 val name = '''UPMUSTPropagate«res.getOrGenerateConstraintName(entry.key)»'''; 103 val name = '''UPMUSTPropagate_«res.getOrGenerateConstraintName(entry.key)»''';
104 val def = ''' 104 val def = '''
105 pattern «name»( 105 pattern «name»(«FOR index : 1..entry.key.arity SEPARATOR ", "»«canonizeName(index,PropagationModality::UP)»«ENDFOR»)
106 problem:LogicProblem, interpretation:PartialInterpretation,
107 «FOR index : 1..entry.key.arity SEPARATOR ", "»«canonizeName(index,PropagationModality::UP)»«ENDFOR»)
108 «FOR propagation : entry.value SEPARATOR " or "» 106 «FOR propagation : entry.value SEPARATOR " or "»
109 { find «propagation.key»(problem,interpretation,«FOR index : 0..<propagation.value SEPARATOR ','»_«ENDFOR»,«FOR index : 1..entry.key.arity SEPARATOR ", "»«canonizeName(index,PropagationModality::UP)»«ENDFOR»); } 107 { find «propagation.key»(problem,interpretation,«FOR index : 0..<propagation.value SEPARATOR ','»_«ENDFOR»,«FOR index : 1..entry.key.arity SEPARATOR ", "»«canonizeName(index,PropagationModality::UP)»«ENDFOR»); }
110 «ENDFOR»''' 108 «ENDFOR»'''
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 1e623823..cb73f4e8 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
@@ -77,7 +77,7 @@ class ViatraReasoner extends LogicReasoner{
77 scopePropagator, 77 scopePropagator,
78 viatraConfig.documentationLevel 78 viatraConfig.documentationLevel
79 ) 79 )
80 println("parsed") 80 //println("parsed")
81 81
82 dse.addObjective(new ModelGenerationCompositeObjective( 82 dse.addObjective(new ModelGenerationCompositeObjective(
83 new ScopeObjective, 83 new ScopeObjective,
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java
index 60f46033..1cd61e9a 100644
--- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java
@@ -17,10 +17,12 @@ import java.util.Comparator;
17import java.util.Iterator; 17import java.util.Iterator;
18import java.util.LinkedList; 18import java.util.LinkedList;
19import java.util.List; 19import java.util.List;
20import java.util.Map;
20import java.util.PriorityQueue; 21import java.util.PriorityQueue;
21import java.util.Random; 22import java.util.Random;
22 23
23import org.apache.log4j.Logger; 24import org.apache.log4j.Logger;
25import org.eclipse.emf.ecore.EObject;
24import org.eclipse.emf.ecore.util.EcoreUtil; 26import org.eclipse.emf.ecore.util.EcoreUtil;
25import org.eclipse.viatra.dse.api.strategy.interfaces.IStrategy; 27import org.eclipse.viatra.dse.api.strategy.interfaces.IStrategy;
26import org.eclipse.viatra.dse.base.ThreadContext; 28import org.eclipse.viatra.dse.base.ThreadContext;
@@ -38,6 +40,7 @@ import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem;
38import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.InconsistencyResult; 40import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.InconsistencyResult;
39import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.LogicResult; 41import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.LogicResult;
40import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.ModelResult; 42import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.ModelResult;
43import hu.bme.mit.inf.dslreasoner.viatra2logic.NumericProblemSolver;
41import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.ModelGenerationMethod; 44import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.ModelGenerationMethod;
42import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretation2logic.PartialInterpretation2Logic; 45import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretation2logic.PartialInterpretation2Logic;
43import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation; 46import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation;
@@ -80,12 +83,14 @@ public class BestFirstStrategyForModelGeneration implements IStrategy {
80 private volatile boolean isInterrupted = false; 83 private volatile boolean isInterrupted = false;
81 private ModelResult modelResultByInternalSolver = null; 84 private ModelResult modelResultByInternalSolver = null;
82 private Random random = new Random(); 85 private Random random = new Random();
83 private Collection<ViatraQueryMatcher<? extends IPatternMatch>> matchers; 86 //private Collection<ViatraQueryMatcher<? extends IPatternMatch>> matchers;
84 87
85 // Statistics 88 // Statistics
86 private int numberOfStatecoderFail = 0; 89 private int numberOfStatecoderFail = 0;
87 private int numberOfPrintedModel = 0; 90 private int numberOfPrintedModel = 0;
88 private int numberOfSolverCalls = 0; 91 private int numberOfSolverCalls = 0;
92
93 private NumericSolver numericSolver = null;
89 94
90 public BestFirstStrategyForModelGeneration( 95 public BestFirstStrategyForModelGeneration(
91 ReasonerWorkspace workspace, 96 ReasonerWorkspace workspace,
@@ -112,14 +117,14 @@ public class BestFirstStrategyForModelGeneration implements IStrategy {
112 this.context = context; 117 this.context = context;
113 this.solutionStore = context.getGlobalContext().getSolutionStore(); 118 this.solutionStore = context.getGlobalContext().getSolutionStore();
114 119
115 ViatraQueryEngine engine = context.getQueryEngine(); 120// ViatraQueryEngine engine = context.getQueryEngine();
116// // TODO: visualisation 121// // TODO: visualisation
117 matchers = new LinkedList<ViatraQueryMatcher<? extends IPatternMatch>>(); 122// matchers = new LinkedList<ViatraQueryMatcher<? extends IPatternMatch>>();
118 for(IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>> p : this.method.getAllPatterns()) { 123// for(IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>> p : this.method.getAllPatterns()) {
119 //System.out.println(p.getSimpleName()); 124// //System.out.println(p.getSimpleName());
120 ViatraQueryMatcher<? extends IPatternMatch> matcher = p.getMatcher(engine); 125// ViatraQueryMatcher<? extends IPatternMatch> matcher = p.getMatcher(engine);
121 matchers.add(matcher); 126// matchers.add(matcher);
122 } 127// }
123 128
124 this.solutionStoreWithCopy = new SolutionStoreWithCopy(); 129 this.solutionStoreWithCopy = new SolutionStoreWithCopy();
125 this.solutionStoreWithDiversityDescriptor = new SolutionStoreWithDiversityDescriptor(configuration.diversityRequirement); 130 this.solutionStoreWithDiversityDescriptor = new SolutionStoreWithDiversityDescriptor(configuration.diversityRequirement);
@@ -131,6 +136,8 @@ public class BestFirstStrategyForModelGeneration implements IStrategy {
131 return objectiveComparatorHelper.compare(o2.fitness, o1.fitness); 136 return objectiveComparatorHelper.compare(o2.fitness, o1.fitness);
132 } 137 }
133 }; 138 };
139
140 this.numericSolver = new NumericSolver(context, method);
134 141
135 trajectoiresToExplore = new PriorityQueue<TrajectoryWithFitness>(11, comparator); 142 trajectoiresToExplore = new PriorityQueue<TrajectoryWithFitness>(11, comparator);
136 } 143 }
@@ -140,6 +147,9 @@ public class BestFirstStrategyForModelGeneration implements IStrategy {
140 if (!context.checkGlobalConstraints()) { 147 if (!context.checkGlobalConstraints()) {
141 logger.info("Global contraint is not satisifed in the first state. Terminate."); 148 logger.info("Global contraint is not satisifed in the first state. Terminate.");
142 return; 149 return;
150 } else if(!numericSolver.isSatisfiable()) {
151 logger.info("Numeric contraints are not satisifed in the first state. Terminate.");
152 return;
143 } 153 }
144 if (configuration.searchSpaceConstraints.maxDepth == 0) { 154 if (configuration.searchSpaceConstraints.maxDepth == 0) {
145 logger.info("Maximal depth is reached in the initial solution. Terminate."); 155 logger.info("Maximal depth is reached in the initial solution. Terminate.");
@@ -218,6 +228,9 @@ public class BestFirstStrategyForModelGeneration implements IStrategy {
218 } else if (!context.checkGlobalConstraints()) { 228 } else if (!context.checkGlobalConstraints()) {
219 logger.debug("Global contraint is not satisifed."); 229 logger.debug("Global contraint is not satisifed.");
220 context.backtrack(); 230 context.backtrack();
231 } else if (!numericSolver.isSatisfiable()) {
232 logger.debug("Numeric constraints are not satisifed.");
233 context.backtrack();
221 } else { 234 } else {
222 final Fitness nextFitness = context.calculateFitness(); 235 final Fitness nextFitness = context.calculateFitness();
223 checkForSolution(nextFitness); 236 checkForSolution(nextFitness);
@@ -272,7 +285,8 @@ public class BestFirstStrategyForModelGeneration implements IStrategy {
272 private void checkForSolution(final Fitness fittness) { 285 private void checkForSolution(final Fitness fittness) {
273 if (fittness.isSatisifiesHardObjectives()) { 286 if (fittness.isSatisifiesHardObjectives()) {
274 if (solutionStoreWithDiversityDescriptor.isDifferent(context)) { 287 if (solutionStoreWithDiversityDescriptor.isDifferent(context)) {
275 solutionStoreWithCopy.newSolution(context); 288 Map<EObject, EObject> trace = solutionStoreWithCopy.newSolution(context);
289 numericSolver.fillSolutionCopy(trace);
276 solutionStoreWithDiversityDescriptor.newSolution(context); 290 solutionStoreWithDiversityDescriptor.newSolution(context);
277 solutionStore.newSolution(context); 291 solutionStore.newSolution(context);
278 configuration.progressMonitor.workedModelFound(configuration.solutionScope.numberOfRequiredSolution); 292 configuration.progressMonitor.workedModelFound(configuration.solutionScope.numberOfRequiredSolution);
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/NumericSolver.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/NumericSolver.xtend
new file mode 100644
index 00000000..b72bdb44
--- /dev/null
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/NumericSolver.xtend
@@ -0,0 +1,114 @@
1package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse
2
3import hu.bme.mit.inf.dslreasoner.viatra2logic.NumericProblemSolver
4import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.ModelGenerationMethod
5import java.util.HashMap
6import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine
7import org.eclipse.viatra.query.runtime.api.IPatternMatch
8import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher
9import org.eclipse.viatra.query.runtime.matchers.psystem.PConstraint
10import hu.bme.mit.inf.dslreasoner.viatra2logic.NumericTranslator
11import org.eclipse.viatra.dse.base.ThreadContext
12import org.eclipse.emf.ecore.EObject
13import java.util.Map
14import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation
15import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PrimitiveElement
16import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.BooleanElement
17import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.IntegerElement
18import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.StringElement
19import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.RealElement
20import java.util.List
21import java.math.BigDecimal
22
23class NumericSolver {
24 val ThreadContext threadContext;
25 val constraint2UnitPropagationPrecondition = new HashMap<PConstraint,ViatraQueryMatcher<? extends IPatternMatch>>
26 NumericTranslator t = new NumericTranslator
27
28 new(ThreadContext threadContext, ModelGenerationMethod method) {
29 this.threadContext = threadContext
30 val engine = threadContext.queryEngine
31 for(entry : method.unitPropagationPreconditions.entrySet) {
32 val constraint = entry.key
33 val querySpec = entry.value
34 val matcher = querySpec.getMatcher(engine);
35 constraint2UnitPropagationPrecondition.put(constraint,matcher)
36 }
37 }
38
39 def boolean isSatisfiable() {
40 if(constraint2UnitPropagationPrecondition.empty) return true
41 else {
42 val propagatedConstraints = new HashMap
43 for(entry : constraint2UnitPropagationPrecondition.entrySet) {
44 val constraint = entry.key
45 //println(constraint)
46 val allMatches = entry.value.allMatches.map[it.toArray]
47 //println(allMatches.toList)
48 propagatedConstraints.put(constraint,allMatches)
49 }
50
51 if(propagatedConstraints.values.forall[empty]) {
52 return true
53 } else {
54 val res = t.delegateIsSatisfiable(propagatedConstraints)
55 //println(res)
56 return res
57 }
58 }
59 }
60
61 def fillSolutionCopy(Map<EObject, EObject> trace) {
62 val model = threadContext.getModel as PartialInterpretation
63 val dataObjects = model.newElements.filter(PrimitiveElement).filter[!model.openWorldElements.contains(it)].toList
64 if(constraint2UnitPropagationPrecondition.empty) {
65 fillWithDefaultValues(dataObjects,trace)
66 } else {
67 val propagatedConstraints = new HashMap
68 for(entry : constraint2UnitPropagationPrecondition.entrySet) {
69 val constraint = entry.key
70 val allMatches = entry.value.allMatches.map[it.toArray]
71 propagatedConstraints.put(constraint,allMatches)
72 }
73
74 if(propagatedConstraints.values.forall[empty]) {
75 fillWithDefaultValues(dataObjects,trace)
76 } else {
77 val solution = t.delegateGetSolution(dataObjects,propagatedConstraints)
78 fillWithSolutions(dataObjects,solution,trace)
79 }
80 }
81 }
82
83 def protected fillWithDefaultValues(List<PrimitiveElement> elements, Map<EObject, EObject> trace) {
84 for(element : elements) {
85 if(element.valueSet==false) {
86 val value = getDefaultValue(element)
87 val target = trace.get(element) as PrimitiveElement
88 target.fillWithValue(value)
89 }
90 }
91 }
92
93 def protected dispatch getDefaultValue(BooleanElement e) {false}
94 def protected dispatch getDefaultValue(IntegerElement e) {0}
95 def protected dispatch getDefaultValue(RealElement e) {0.0}
96 def protected dispatch getDefaultValue(StringElement e) {""}
97
98 def protected fillWithSolutions(List<PrimitiveElement> elements, Map<PrimitiveElement, Integer> solution, Map<EObject, EObject> trace) {
99 for(element : elements) {
100 if(element.valueSet==false) {
101 if(solution.containsKey(element)) {
102 val value = solution.get(element)
103 val target = trace.get(element) as PrimitiveElement
104 target.fillWithValue(value)
105 }
106 }
107 }
108 }
109
110 def protected dispatch fillWithValue(BooleanElement e, Object value) {e.valueSet=true e.value=value as Boolean}
111 def protected dispatch fillWithValue(IntegerElement e, Object value) {e.valueSet=true e.value=value as Integer}
112 def protected dispatch fillWithValue(RealElement e, Object value) {e.valueSet=true e.value=BigDecimal.valueOf(value as Double) }
113 def protected dispatch fillWithValue(StringElement e, Object value) {e.valueSet=true e.value=value as String}
114} \ No newline at end of file
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/SolutionStoreWithCopy.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/SolutionStoreWithCopy.xtend
index a8b7301e..21867a4e 100644
--- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/SolutionStoreWithCopy.xtend
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/SolutionStoreWithCopy.xtend
@@ -25,7 +25,7 @@ class SolutionStoreWithCopy {
25 newSolution(context) 25 newSolution(context)
26 }*/ 26 }*/
27 27
28 def newSolution(ThreadContext context) { 28 def Map<EObject,EObject> newSolution(ThreadContext context) {
29 //print(System.nanoTime-initTime + ";") 29 //print(System.nanoTime-initTime + ";")
30 val copyStart = System.nanoTime 30 val copyStart = System.nanoTime
31 val solution = context.model as PartialInterpretation 31 val solution = context.model as PartialInterpretation
@@ -36,6 +36,7 @@ class SolutionStoreWithCopy {
36 copyTraces.add(copier) 36 copyTraces.add(copier)
37 runtime += System.nanoTime - copyStart 37 runtime += System.nanoTime - copyStart
38 solutionTimes.add(System.nanoTime-sartTime) 38 solutionTimes.add(System.nanoTime-sartTime)
39 return copier
39 } 40 }
40 def getSumRuntime() { 41 def getSumRuntime() {
41 return runtime 42 return runtime