aboutsummaryrefslogtreecommitdiffstats
path: root/Tests/MODELS2020-CaseStudies/case.study.pledge.run/archives/sources
diff options
context:
space:
mode:
authorLibravatar ArenBabikian <aren.babikian@mail.mcgill.ca>2020-05-17 01:58:13 -0400
committerLibravatar ArenBabikian <aren.babikian@mail.mcgill.ca>2020-05-17 01:58:13 -0400
commit48871e1be75169e4e3768a7c0c47791e02c7e634 (patch)
treecfcd4e4fdc0dea4f4b0102a610459ed7509f47f8 /Tests/MODELS2020-CaseStudies/case.study.pledge.run/archives/sources
parentAdjust Taxation model. (diff)
downloadVIATRA-Generator-48871e1be75169e4e3768a7c0c47791e02c7e634.tar.gz
VIATRA-Generator-48871e1be75169e4e3768a7c0c47791e02c7e634.tar.zst
VIATRA-Generator-48871e1be75169e4e3768a7c0c47791e02c7e634.zip
update measurements setup. make archives.
Diffstat (limited to 'Tests/MODELS2020-CaseStudies/case.study.pledge.run/archives/sources')
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.run/archives/sources/ConfigGenerator.java_13
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.run/archives/sources/GenerateFromConfig.xtend_196
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.run/archives/sources/GeneratePledgeModels.xtend_358
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.run/archives/sources/case_study_A.vql_356
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.run/archives/sources/case_study_short.vql_51
5 files changed, 974 insertions, 0 deletions
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/archives/sources/ConfigGenerator.java_ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/archives/sources/ConfigGenerator.java_
new file mode 100644
index 00000000..26b99895
--- /dev/null
+++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/archives/sources/ConfigGenerator.java_
@@ -0,0 +1,13 @@
1package run;
2
3import hu.bme.mit.inf.dslreasoner.application.execution.StandaloneScriptExecutor;
4
5public class ConfigGenerator {
6 public static void main(String[] args) {
7 String errorMessages = StandaloneScriptExecutor.executeScript("config/taxation.vsconfig");
8 if(errorMessages!=null) {
9 System.out.println(errorMessages);
10 }
11 }
12
13}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/archives/sources/GenerateFromConfig.xtend_ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/archives/sources/GenerateFromConfig.xtend_
new file mode 100644
index 00000000..1f7f85c1
--- /dev/null
+++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/archives/sources/GenerateFromConfig.xtend_
@@ -0,0 +1,196 @@
1package run
2
3import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigSpecification
4import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigurationScript
5import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.FileSpecification
6import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.GenerationTask
7import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.IntervallNumber
8import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ObjectTypeScope
9import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.RuntimeEntry
10import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ScopeSpecification
11import hu.bme.mit.inf.dslreasoner.application.execution.ScriptExecutor
12import hu.bme.mit.inf.dslreasoner.application.execution.StandaloneScriptExecutor
13import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic
14import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace
15import hu.bme.mit.inf.dslreasoner.ecore2logic.EcoreMetamodelDescriptor
16import hu.bme.mit.inf.dslreasoner.logic.model.builder.TracedOutput
17import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type
18import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem
19import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.LogicResult
20import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.ModelResult
21import hu.bme.mit.inf.dslreasoner.logic2ecore.Logic2Ecore
22import hu.bme.mit.inf.dslreasoner.viatra2logic.ViatraQuerySetDescriptor
23import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation
24import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.visualisation.PartialInterpretation2Gml
25import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasoner
26import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration
27import hu.bme.mit.inf.dslreasoner.visualisation.pi2graphviz.GraphvizVisualiser
28import hu.bme.mit.inf.dslreasoner.workspace.FileSystemWorkspace
29import hu.bme.mit.inf.dslreasoner.workspace.ReasonerWorkspace
30import java.io.PrintWriter
31import java.math.BigDecimal
32import java.text.SimpleDateFormat
33import java.util.ArrayList
34import java.util.Date
35import java.util.HashMap
36import java.util.List
37import java.util.Map
38import org.eclipse.core.runtime.NullProgressMonitor
39import org.eclipse.emf.ecore.EAttribute
40import org.eclipse.emf.ecore.EClass
41import org.eclipse.emf.ecore.EEnum
42import org.eclipse.emf.ecore.EEnumLiteral
43import org.eclipse.emf.ecore.EObject
44import org.eclipse.emf.ecore.EPackage
45import org.eclipse.emf.ecore.EReference
46import org.eclipse.emf.ecore.resource.Resource
47import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl
48import org.eclipse.viatra.query.runtime.api.IQueryGroup
49
50class GenerateFromConfig {
51 static val SIZE_LB = 200
52 static val SIZE_UB = 200
53 static val SIZE_MUL = 1
54 static val SIZE_INC = 5
55
56 static var REPS = 3
57 static val RUNTIME = 600
58
59 static val DOMAIN = "FamilyTree" // "FamilyTree", "Taxation", "Satellite"
60 static val QUERIES = true
61 static val INITIAL = true
62 static val INDIV_WRT = false
63 static val GLOBAL_WRT = false
64 static val q2t = if(QUERIES) "Y" else "N"
65
66 def static void main(String[] args) {
67 Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("xmi", new XMIResourceFactoryImpl)
68
69 // Workspace setup
70 val Date date = new Date(System.currentTimeMillis)
71 val SimpleDateFormat format = new SimpleDateFormat("dd-HHmm");
72 val formattedDate = DOMAIN + "/" + format.format(date)
73
74 val workspace = new FileSystemWorkspace('''output/''' + formattedDate + '''/''', "")
75 workspace.initAndClear
76
77 println("Input and output workspaces are created")
78
79 val executor = new ScriptExecutor
80 val path = "config//generic" + DOMAIN + ".vsconfig"
81 var ConfigurationScript config = StandaloneScriptExecutor.loadScript(path)
82
83 println("Config File loaded")
84
85 // /////////////////////////
86 // BEGIN RUN
87 var PrintWriter global_writer = null
88 val header = "domain, queries?,size,model?,timeout,measuredTime,TransformatonTime,SolverTime\n"
89 if (GLOBAL_WRT) {
90 global_writer = new PrintWriter(
91 workspace.workspaceURI + "//_" + DOMAIN + SIZE_LB + "to" + SIZE_UB + "x" + REPS + "q" + q2t + "-" +
92 formattedDate + ".csv")
93 global_writer.append(header)
94 }
95
96 var NEXT_INC = SIZE_INC
97 for (var size = SIZE_LB; size <= SIZE_UB; size += NEXT_INC) {
98 NEXT_INC *= SIZE_MUL
99
100 var PrintWriter indiv_writer = null
101 if (INDIV_WRT) {
102 indiv_writer = new PrintWriter( // TODO
103 workspace.workspaceURI + "//__" + DOMAIN + "Sz" + size + "x" + REPS + "q" + q2t + "-" + formattedDate +
104 ".csv")
105 indiv_writer.append(header)
106 }
107
108 println()
109 println("<<DOMAIN: " + DOMAIN + ", SIZE=" + size + ">>")
110
111// for (var i = 0; i < REPS; i++) {
112//
113// print("<<Run number " + i + ">> : ")
114 // /////////////////////////////////////////////////////
115 // Define Config File
116// val knownIntegers = new ArrayList<Integer>
117// knownIntegers.addAll(0, 10, 20, 30, 40, 50)
118//
119// val knownReals = new ArrayList<BigDecimal>
120// knownReals.addAll(new BigDecimal("0.0"))
121//
122// val knownStrings = new ArrayList<String>
123// knownStrings.addAll("r0", "r1", "r2", "r3", "r4", "r5", "r6")
124
125 val outputPath = "output/" + formattedDate + "/size" + size + "/models/"
126 val debugPath = "output/" + formattedDate + "/size" + size + "/debug/"
127 val logPath = debugPath + "log.txt"
128 val statsPath = debugPath + "statistics.csv"
129
130 // Adjust configuration
131 val genTask = config.commands.get(0) as GenerationTask
132 if(!QUERIES) genTask.patterns = null
133 if(!INITIAL) genTask.partialModel = null
134 genTask.runs = REPS
135
136 val scopeSpec = genTask.scope as ScopeSpecification
137 val objScope = scopeSpec.scopes.get(0) as ObjectTypeScope
138 val interval = objScope.number as IntervallNumber
139 interval.min = size
140 interval.maxUnlimited = true
141
142 val configScope = genTask.config as ConfigSpecification
143 val runtimeEntry = configScope.entries.get(0) as RuntimeEntry
144 runtimeEntry.millisecLimit = RUNTIME
145
146 // TODO add known ints, reals, string...
147 val debug = genTask.debugFolder as FileSpecification
148 debug.path = debugPath
149 val output = genTask.tagetFolder as FileSpecification
150 output.path = outputPath
151 val log = genTask.targetLogFile as FileSpecification
152 log.path = logPath
153 val stats = genTask.targetStatisticsFile as FileSpecification
154 stats.path = statsPath
155
156// workspace.writeModel(config, '''x.xmi''')
157 val startTime = System.currentTimeMillis
158 executor.executeScript(config, new NullProgressMonitor)
159 val measuredTime = System.currentTimeMillis - startTime
160
161 println("<<END ->" + measuredTime / 1000.0 + "s >>\n")
162
163// val toAddtoCSV = DOMAIN + "," + QUERIES + "," + size + "," +
164// (solution.class == ModelResultImpl).toString + "," + RUNTIME + "," + measuredTime / 1000.0 + "," +
165// solution.statistics.transformationTime / 1000.0 + "," + solution.statistics.solverTime / 1000.0 +
166// "\n"
167//
168// if(GLOBAL_WRT) global_writer.append(toAddtoCSV)
169// if(INDIV_WRT) indiv_writer.append(toAddtoCSV)
170// solution.writeStats(totalTime, solverConfig)
171 // Run Garbage Collector
172// val Runtime r = Runtime.getRuntime();
173// r.gc();
174// r.gc();
175// r.gc();
176// Thread.sleep(3000)
177// }
178 if(INDIV_WRT) indiv_writer.close
179 }
180 if(GLOBAL_WRT) global_writer.close
181 }
182
183 def static writeStats(LogicResult solution, long time, ViatraReasonerConfiguration config) {
184 val stats = solution.statistics
185 println(" Statistics:")
186// for (e : stats.entries.filter[name.substring(0, 9) == "_Solution"]) {
187// println(" " + e.name + ": " + (e as IntStatisticEntry).value + " ms")
188// }
189 println(
190 " #new nodes : [" + config.typeScopes.minNewElements + ".." +
191 (if(config.typeScopes.maxNewElements == 2147483647) "*" else config.typeScopes.maxNewElements) + "]")
192 println(" \"solve\" time: " + time as double / 1000 + " s")
193
194// println("<<End Statistics>>")
195 }
196}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/archives/sources/GeneratePledgeModels.xtend_ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/archives/sources/GeneratePledgeModels.xtend_
new file mode 100644
index 00000000..6279a6f8
--- /dev/null
+++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/archives/sources/GeneratePledgeModels.xtend_
@@ -0,0 +1,358 @@
1package run
2
3import Taxation.TaxationPackage
4import familytree.FamilytreePackage
5import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic
6import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2LogicConfiguration
7import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace
8import hu.bme.mit.inf.dslreasoner.ecore2logic.EcoreMetamodelDescriptor
9import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel
10import hu.bme.mit.inf.dslreasoner.logic.model.builder.TracedOutput
11import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type
12import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem
13import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.LogicResult
14import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.ModelResult
15import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.impl.ModelResultImpl
16import hu.bme.mit.inf.dslreasoner.logic2ecore.Logic2Ecore
17import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2Logic
18import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2LogicConfiguration
19import hu.bme.mit.inf.dslreasoner.viatra2logic.ViatraQuerySetDescriptor
20import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretation2logic.InstanceModel2Logic
21import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation
22import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.visualisation.PartialInterpretation2Gml
23import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasoner
24import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration
25import hu.bme.mit.inf.dslreasoner.visualisation.pi2graphviz.GraphvizVisualiser
26import hu.bme.mit.inf.dslreasoner.workspace.FileSystemWorkspace
27import hu.bme.mit.inf.dslreasoner.workspace.ReasonerWorkspace
28import java.io.PrintWriter
29import java.math.BigDecimal
30import java.text.SimpleDateFormat
31import java.util.Date
32import java.util.HashMap
33import java.util.List
34import java.util.Map
35import java.util.TreeSet
36import org.eclipse.emf.common.util.EList
37import org.eclipse.emf.ecore.EAttribute
38import org.eclipse.emf.ecore.EClass
39import org.eclipse.emf.ecore.EEnum
40import org.eclipse.emf.ecore.EEnumLiteral
41import org.eclipse.emf.ecore.EObject
42import org.eclipse.emf.ecore.EPackage
43import org.eclipse.emf.ecore.EReference
44import org.eclipse.emf.ecore.resource.Resource
45import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl
46import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandaloneSetup
47import org.eclipse.viatra.query.runtime.api.IQueryGroup
48import org.eclipse.viatra.query.runtime.rete.matcher.ReteEngine
49
50class GeneratePledgeModels {
51static val SIZE_LB = 20
52static val SIZE_UB = 20
53static val SIZE_MUL = 1
54static val SIZE_INC = 5
55
56static var REPS = 1
57static val RUNTIME = 600
58
59static val DOMAIN = "FamilyTree" // "FamilyTree", "Taxation"
60static val QUERIES = false
61static val INDIV_WRT = true
62static val GLOBAL_WRT = true
63static val q2t = if(QUERIES) "Y" else "N"
64
65def static void main(String[] args) {
66 (new EMFPatternLanguageStandaloneSetup).createInjectorAndDoEMFRegistration
67 Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("xmi", new XMIResourceFactoryImpl)
68 Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("logicproblem", new XMIResourceFactoryImpl)
69 Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("partialmodel", new XMIResourceFactoryImpl)
70 ReteEngine.getClass
71 val Ecore2Logic ecore2Logic = new Ecore2Logic
72 val Logic2Ecore logic2Ecore = new Logic2Ecore(ecore2Logic)
73 val Viatra2Logic viatra2Logic = new Viatra2Logic(ecore2Logic)
74 val InstanceModel2Logic instanceModel2Logic = new InstanceModel2Logic
75
76 // Workspace setup
77 val Date date = new Date(System.currentTimeMillis)
78 val SimpleDateFormat format = new SimpleDateFormat("dd-HHmm");
79 val formattedDate = format.format(date)
80
81 val inputs = new FileSystemWorkspace('''inputs/''', "")
82 val dataws = new FileSystemWorkspace('''output/''', "")
83 val modelsws = new FileSystemWorkspace('''output/''' + formattedDate + '''/models/''', "")
84 val workspace = new FileSystemWorkspace('''output/''' + formattedDate + '''/''', "")
85 val debug = new FileSystemWorkspace('''output/''' + DOMAIN + "-" + formattedDate + '''/debug/''', "")
86 workspace.initAndClear
87 modelsws.initAndClear
88
89 println("Input and output workspaces are created")
90
91 // //////////////////////////
92 // DOMAIN
93 var EcoreMetamodelDescriptor metamodel = null
94 var EList<EObject> partialModel = null
95 var ViatraQuerySetDescriptor queries = null
96 switch DOMAIN {
97 case "Taxation": {
98 metamodel = loadMetamodel(TaxationPackage.eINSTANCE)
99 partialModel = loadPartialModel(inputs, "Household.xmi")
100// queries = loadQueries(metamodel, Case_study_A.instance)
101 }
102 case "FamilyTree": {
103 metamodel = loadMetamodel(FamilytreePackage.eINSTANCE)
104 partialModel = loadPartialModel(inputs, "FamilyTree.xmi")
105// queries = loadQueries(metamodel, FamilyTreeConstraints.instance)
106 }
107 default: {
108 System.err.println("Unsupported Domain")
109 throw new Exception
110 }
111 }
112 println("DSL loaded")
113
114 // /////////////////////////
115 // Prepare Problem
116 val modelGenerationProblem = ecore2Logic.transformMetamodel(metamodel, new Ecore2LogicConfiguration())
117 var problem = modelGenerationProblem.output
118 val modelExtensionProblem = instanceModel2Logic.transform(modelGenerationProblem, partialModel)
119 problem = modelExtensionProblem.output
120 if (QUERIES) {
121 val validModelExtensionProblem = viatra2Logic.transformQueries(queries, modelExtensionProblem,
122 new Viatra2LogicConfiguration)
123 problem = validModelExtensionProblem.output
124 }
125 // debug.writeModel(problem, "problem.logicproblem")
126 println("Problem created")
127 // /////////////////////////
128 // BEGIN RUN
129 var PrintWriter global_writer = null
130 val header = "domain, queries?,size,model?,timeout,measuredTime,TransformatonTime,SolverTime\n"
131 if (GLOBAL_WRT) {
132 global_writer = new PrintWriter(
133 workspace.workspaceURI + "//_" + DOMAIN + SIZE_LB + "to" + SIZE_UB + "x" + REPS + "q" + q2t + "-" +
134 formattedDate + ".csv")
135 global_writer.append(header)
136 }
137
138 var NEXT_INC = SIZE_INC
139 for (var size = SIZE_LB; size <= SIZE_UB; size += NEXT_INC) {
140 NEXT_INC *= SIZE_MUL
141
142 var PrintWriter indiv_writer = null
143 if (INDIV_WRT) {
144 indiv_writer = new PrintWriter( // TODO
145 workspace.workspaceURI + "//__" + DOMAIN + "Sz" + size + "x" + REPS + "q" + q2t + "-" + formattedDate +
146 ".csv")
147 indiv_writer.append(header)
148 }
149
150 println()
151 println("DOMAIN: " + DOMAIN + ", SIZE=" + size)
152
153 for (var i = 0; i < REPS; i++) {
154
155 print("<<Run number " + i + ">> : ")
156
157 var ViatraReasoner reasoner = new ViatraReasoner
158
159 // /////////////////////////////////////////////////////
160 // Define Config File
161 val knownIntegers = new TreeSet<Integer>
162 knownIntegers.addAll(0, 10, 20, 30, 40, 50)
163
164 val knownReals = new TreeSet<BigDecimal>
165 knownReals.addAll(new BigDecimal("0.0"))
166
167 val knownStrings = new TreeSet<String>
168 knownStrings.addAll("r0", "r1", "r2", "r3", "r4", "r5", "r6")
169
170 val curSize = size
171 val solverConfig = new ViatraReasonerConfiguration => [
172 it.documentationLevel = DocumentationLevel::NONE
173// it.debugCongiguration = new DebugConfiguration => [logging = true]
174 it.runtimeLimit = RUNTIME
175 // it.typeScopes.maxNewElements = SIZE
176 it.typeScopes.minNewElements = curSize
177
178// if(!knownIntegers.isEmpty) it.typeScopes.knownIntegers = knownIntegers
179 if(!knownReals.isEmpty) it.typeScopes.knownReals = knownReals
180 // if(!knownStrings.isEmpty) it.typeScopes.knownStrings = knownStrings
181 ]
182
183 val startTime = System.currentTimeMillis
184 var solution = reasoner.solve(problem, solverConfig, debug)
185 val measuredTime = System.currentTimeMillis - startTime
186
187 print("<<END")
188
189 val toAddtoCSV = DOMAIN + "," + QUERIES + "," + size + "," + (solution.class == ModelResultImpl).toString +
190 "," + RUNTIME + "," + measuredTime / 1000.0 + "," + solution.statistics.transformationTime / 1000.0 +
191 "," + solution.statistics.solverTime / 1000.0 + "\n"
192
193 if (GLOBAL_WRT) global_writer.append(toAddtoCSV)
194// {
195// global_writer.append(DOMAIN + ",")
196// global_writer.append(QUERIES + ",")
197// global_writer.append(size + ",")
198// global_writer.append((solution.class == ModelResultImpl).toString + ",")
199// global_writer.append(RUNTIME + ",")
200// global_writer.append(measuredTime / 1000.0 + ",")
201//
202// global_writer.append(solution.statistics.transformationTime / 1000.0 + ",")
203// global_writer.append(solution.statistics.solverTime / 1000.0 + "")
204// global_writer.append("\n")
205// }
206 if (INDIV_WRT) indiv_writer.append(toAddtoCSV)
207// {
208// indiv_writer.append(DOMAIN + ",")
209// indiv_writer.append(QUERIES + ",")
210// indiv_writer.append(size + ",")
211// indiv_writer.append((solution.class == ModelResultImpl).toString + ",")
212// global_writer.append(RUNTIME + ",")
213// indiv_writer.append(measuredTime / 1000.0 + ",")
214//
215// indiv_writer.append(solution.statistics.transformationTime / 1000.0 + ",")
216// indiv_writer.append(solution.statistics.solverTime / 1000.0 + "")
217// indiv_writer.append("\n")
218// }
219
220 println("->" + measuredTime / 1000.0 + "s")
221
222// solution.writeStats(totalTime, solverConfig)
223 try {
224 if (solution instanceof ModelResult) {
225 solution.writeInterpretation(logic2Ecore, modelsws, size + "_" + i, reasoner, modelGenerationProblem)
226 println(" (XMI Success)")
227 }
228 } catch (Exception e) {
229 System.err.println(" (XMI Error)" + e.message)
230 }
231
232 try {
233 if (solution instanceof ModelResult) {
234 solution.writeRepresentation(modelsws, size + "_" + i)
235 println(" (VIZ Success) >>")
236 }
237 } catch (Exception e) {
238 System.err.println(" (VIZ Error)" + e.message + ">>")
239 }
240
241 println()
242 // Run Garbage Collector
243 val Runtime r = Runtime.getRuntime();
244 r.gc();
245 r.gc();
246 r.gc();
247 Thread.sleep(3000)
248 }
249 if(INDIV_WRT) indiv_writer.close
250}
251if(GLOBAL_WRT) global_writer.close
252 }
253
254 def
255
256static Map<Type, Integer> getTypeMap(Map<Class, Integer> classMap, EcoreMetamodelDescriptor metamodel,
257 Ecore2Logic e2l, Ecore2Logic_Trace trace) {
258 val typeMap = new HashMap<Type, Integer>
259 val listMap = metamodel.classes.toMap[s|s.name]
260
261 for (Class elem : classMap.keySet) {
262 typeMap.put(e2l.TypeofEClass(
263 trace,
264 listMap.get(elem.simpleName)
265 ), classMap.get(elem))
266 }
267 return typeMap
268 }
269
270 def
271
272static loadMetamodel(EPackage pckg) {
273 val List<EClass> classes = pckg.getEClassifiers.filter(EClass).toList
274 val List<EEnum> enums = pckg.getEClassifiers.filter(EEnum).toList
275 val List<EEnumLiteral> literals = enums.map[getELiterals].flatten.toList
276 val List<EReference> references = classes.map[getEReferences].flatten.toList
277 val List<EAttribute> attributes = classes.map[getEAttributes].flatten.toList
278 return new EcoreMetamodelDescriptor(classes, #{}, false, enums, literals, references, attributes)
279 }
280
281 def
282
283static loadPartialModel(ReasonerWorkspace inputs, String path) {
284 Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("*", new XMIResourceFactoryImpl())
285 inputs.readModel(EObject, path).eResource.contents
286// inputs.readModel(EObject,"FamInstance.xmi").eResource.allContents.toList
287 }
288
289 def
290
291static loadQueries(EcoreMetamodelDescriptor metamodel, IQueryGroup i) {
292 val patterns = i.specifications.toList
293 val wfPatterns = patterns.filter[it.allAnnotations.exists[it.name == "Constraint"]].toSet
294 val derivedFeatures = emptyMap
295 // NO DERIVED FEATURES
296// val derivedFeatures = new LinkedHashMap
297// derivedFeatures.put(i.type,metamodel.attributes.filter[it.name == "type"].head)
298// derivedFeatures.put(i.model,metamodel.references.filter[it.name == "model"].head)
299 val res = new ViatraQuerySetDescriptor(
300 patterns,
301 wfPatterns,
302 derivedFeatures
303 )
304 return res
305 }
306
307 def
308
309static writeInterpretation(LogicResult solution, Logic2Ecore logic2Ecore, ReasonerWorkspace workspace,
310 String id, ViatraReasoner reasoner, TracedOutput<LogicProblem, Ecore2Logic_Trace> mgProb) {
311 val interpretations = reasoner.getInterpretations(solution as ModelResult)
312 for (interpIndex : 0 ..< interpretations.size) {
313// val extension b = new LogicStructureBuilder
314// val extension a = new LogicProblemBuilder
315 val interpretation = interpretations.get(interpIndex)
316 val model = logic2Ecore.transformInterpretation(interpretation, mgProb.trace)
317// println(model)
318 workspace.writeModel(model, '''sol-«id»_«interpIndex».xmi''')
319 }
320 }
321
322 def
323
324static writeRepresentation(LogicResult solution, ReasonerWorkspace workspace, String id) {
325 val representations = solution.representation
326 for (representationIndex : 0 ..< representations.size) {
327 val representation = representations.get(representationIndex)
328 if (representation instanceof PartialInterpretation) {
329 val gml = (new PartialInterpretation2Gml).transform(representation)
330 workspace.writeText('''sol-«id»_«representationIndex».gml''', gml)
331
332 val png = (new GraphvizVisualiser).visualiseConcretization(representation)
333// println(png)
334 png.writeToFile(workspace, '''sol-«id»_«representationIndex».png''')
335
336// workspace.writeModel(representation, '''solution«representationIndex».partialintrpretation''')
337 } else {
338 workspace.writeText('''sol-«representationIndex».txt''', representation.toString)
339 }
340 }
341 }
342
343 def
344
345static writeStats(LogicResult solution, long time, ViatraReasonerConfiguration config) {
346 val stats = solution.statistics
347 println(" Statistics:")
348// for (e : stats.entries.filter[name.substring(0, 9) == "_Solution"]) {
349// println(" " + e.name + ": " + (e as IntStatisticEntry).value + " ms")
350// }
351 println(
352 " #new nodes : [" + config.typeScopes.minNewElements + ".." +
353 (if(config.typeScopes.maxNewElements == 2147483647) "*" else config.typeScopes.maxNewElements) + "]")
354 println(" \"solve\" time: " + time as double / 1000 + " s")
355
356// println("<<End Statistics>>")
357 }
358}
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/archives/sources/case_study_A.vql_ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/archives/sources/case_study_A.vql_
new file mode 100644
index 00000000..9de1cdaf
--- /dev/null
+++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/archives/sources/case_study_A.vql_
@@ -0,0 +1,356 @@
1package queries
2
3import "http:///TaxCard.ecore"
4
5//AttributeRemoved -> DF
6
7//inv1-External_Allowance.amount is a derived feature (TODOcheck)
8//inv2-Tax_Card.income.taxPayer.taxesDue is a derived feature (TODOcheck)
9
10//inv3-multiplicity adjusted
11@Constraint(message = "inv03", severity = "error", key = {dep})
12pattern inv03(dep : Dependent) {
13 find x_inv03_eligAll(dep);
14 neg find x_inv03_hasAll(dep);
15} or {
16 Dependent.birth_year(dep, by);
17 check(2018-by > 21);
18 Dependent.continued_studies(dep, false);
19 Dependent.allowances(dep, _);
20}
21pattern x_inv03_eligAll(dep : Dependent) {
22 Dependent.birth_year(dep, by);
23 check(2018-by <= 21);
24} or {
25 Dependent.continued_studies(dep, true);
26}
27pattern x_inv03_hasAll(dep : Dependent) {
28 Dependent.allowances(dep, _);
29}
30
31//inv5 - oclIsTypeOf - handled here
32@Constraint(message = "inv05", severity = "error", key = {inc})
33pattern inv05(inc : Income) {
34 //income_type: None
35 neg find x_inv08_noType(inc);
36 Income.details.worked_days(inc, wd);
37 check(wd != 0);
38} or {
39 //income_type: Not Employment_Income
40 Income.income_type(inc, type);
41 neg find x_inv08_notEI(type);
42 Income.details.worked_days(inc, wd);
43 check(wd != 0);
44} or {
45 //income_type: Employment Income
46 Income.income_type(inc, type);
47 Employment_Income(type);
48 find x_inv05_inRange(inc);
49}
50pattern x_inv05_inRange(inc : Income) {
51 Income.details.worked_days(inc, wd);
52 check(wd < 1);
53} or {
54 Income.details.worked_days(inc, wd);
55 check(wd > 25);
56}
57
58//inv6-Does not make sens, but directly from OCL
59//first part of or from definition of getAge()
60@Constraint(message = "inv06", severity = "error", key = {tp})
61pattern inv06(tp : Tax_Payer) {
62 Tax_Payer.dependents(tp, _);
63 Tax_Payer.birth_year(tp, TPBy);
64 check(2018 - TPBy > 2018-16);
65} or {
66 Tax_Payer.birth_year(tp, TPBy);
67 Tax_Payer.dependents(tp, dep);
68 Dependent.birth_year(dep, DepBy);
69 check(2018-DepBy <= 2018-TPBy-16);
70}
71
72//inv7-OrderedSet
73@Constraint(message = "inv07", severity = "error", key = {inc})
74pattern inv07(inc : Income) {
75 Income.details.distance(inc, d1);
76 Income.details.distance(inc, d2);
77 check(d1 != d2);//compare values
78}
79
80//user_complete_details-AttributeRemoved
81
82//inv8 - oclIsTypeOf - handled here
83@Constraint(message = "inv08", severity = "error", key = {inc})
84pattern inv08(inc : Income) {
85 //income_type: None
86 neg find x_inv08_noType(inc);
87 Income.details.distance(inc, dist);
88 check(dist != 0);
89} or {
90 //income_type: Not Employment_Income
91 Income.income_type(inc, type);
92 neg find x_inv08_notEI(type);
93 Income.details.distance(inc, dist);
94 check(dist != 0);
95} or {
96 //income_type: Employment Income
97 Income.income_type(inc, type);
98 Employment_Income(type);
99 find x_inv08_inRange(inc);
100}
101pattern x_inv08_notEI(type : Employment_Income) {
102 Employment_Income(type);
103}
104pattern x_inv08_noType(inc : Income) {
105 Income.income_type(inc, _);
106}
107pattern x_inv08_inRange(inc : Income) {
108 Income.details.distance(inc, dist);
109 check(dist < 0);
110} or {
111 Income.details.distance(inc, dist);
112 check(dist > 100);
113}
114//inv9-DerivedFeature
115
116//inv10-Ordered Sets
117@Constraint(message = "inv10", severity = "error", key = {inc})
118pattern inv10(inc : Income) {
119 Income.details.amount(inc, a1);
120 Income.details.amount(inc, a2);
121 check(a1 != a2);//compare values
122}
123
124//inv11-attributes-handled by multiplicity
125@Constraint(message = "inv11", severity = "error", key = {exp})
126pattern inv11(exp : Expense) {
127 find x_inv11_incOver100(exp);
128 find x_inv11_incNotOver100(exp);
129}
130pattern x_inv11_incOver100(exp : Expense) {
131 Expense.income.income_amount(exp, incVal);
132 check(incVal / 2 > 50);
133
134} or {
135 Expense.declared_amount(exp, decl);
136 check(decl != 50);
137}
138pattern x_inv11_incNotOver100(exp : Expense) {
139 Expense.income.income_amount(exp, incVal);
140 check(incVal / 2 <= 50);
141} or {
142 Expense.declared_amount(exp, decl);
143 check(decl < 50);
144} or {
145 Expense.income.income_amount(exp, incVal);
146 Expense.declared_amount(exp, decl);
147 check(decl > incVal/2);
148}
149
150//inv12
151//exists - handled logically
152@Constraint(message = "inv12", severity = "error", key = {tp})
153pattern inv12(tp : Tax_Payer) {
154 Tax_Payer.addresses(tp, hab_add);
155 Habitual_Address(hab_add);
156 neg find x_inv12_notZZ(hab_add);
157 Tax_Payer.incomes(tp, inc);
158 Local_Income(inc);
159 neg find x_inv12_notNonRes(tp);
160}
161pattern x_inv12_notNonRes(tp : Non_Resident_Tax_Payer) {
162 Non_Resident_Tax_Payer(tp);
163}
164pattern x_inv12_notZZ(hab_add : Habitual_Address) {
165 Address.country(hab_add, ::ZZ);
166}
167
168//inv13 - Added new containment rel Phys_Pers->Address
169//exists - handled logically
170@Constraint(message = "inv13", severity = "error", key = {tp})
171pattern inv13(tp : Tax_Payer) {
172 Tax_Payer.addresses(tp, hab_add);
173 Habitual_Address(hab_add);
174 Address.country(hab_add, ::ZZ);
175 neg find x_inv13(tp);
176}
177pattern x_inv13(tp : Resident_Tax_Payer) {
178 Resident_Tax_Payer(tp);
179}
180
181//inv14-MultiplicityChanged
182
183//inv15-Ordered Sets in assignment if block
184//ERROR if no household object
185//@Constraint(message = "inv15", severity = "error", key = {ea})
186//pattern inv15(ea : External_Allowance) {
187// neg find x_inv15(ea);
188//}
189//pattern x_inv15(ea : External_Allowance) {
190// External_Allowance.person(ea, child);
191// Household.children(h, child);//only one due to multiplicity
192// Household.parents.individual_A(h, iA);
193// Tax_Payer(iA);
194// External_Allowance.reciver(ea, iA);
195//} or {
196// External_Allowance.person(ea, child);
197// Household.children(h, child);//only one due to multiplicity
198// Household.parents.individual_B(h, iB);
199// Tax_Payer(iB);
200// External_Allowance.reciver(ea, iB);
201//}
202
203@Constraint(message = "inv15", severity = "error", key = {ea})
204pattern inv15(ea : External_Allowance) {
205 External_Allowance.person(ea, child);
206 Household.children(h, child);//only one due to multiplicity
207 External_Allowance.reciver(ea, i);
208 Tax_Payer(i);
209 neg find x_inv15(h, i);
210} or {
211 External_Allowance.reciver(ea, i);
212 Dependent(i);
213}
214
215pattern x_inv15(h : Household, i : Tax_Payer) {
216 Household.parents.individual_A(h, i);
217} or {
218 Household.parents.individual_B(h, i);
219}
220
221//inv16-Tax_Card.tax_card_type is a derived feature
222
223//inv17-attribute-handled by multiplicity
224@Constraint(message = "inv17", severity = "error", key = {lur})
225pattern inv17(lur : Legal_Union_Record) {
226 Legal_Union_Record.start_year(lur, sy);
227 check(sy < 1950);
228} or {
229 Legal_Union_Record.start_year(lur, sy);
230 check(sy > 2018);
231}
232
233//inv18-MultiplicityChecked
234//inv19-MultiplicityChecked
235
236//inv20-Useless constraint since both edges are containment (TODOCheck)
237//OclIsUndefined-Handled by multiplicity
238@Constraint(message = "inv20", severity = "error", key = {lur})
239pattern inv20(lur : Legal_Union_Record) {
240 Legal_Union_Record.individual_A(lur, iA);
241 Legal_Union_Record.individual_B(lur, iB);
242 iA == iB;
243}
244//inv21-MultiplicityChecked
245//inv22-MultiplicityChecked
246//inv23-MultiplicityChecked
247//inv24-MultiplicityChecked
248//inv25-MultiplicityChecked
249//inv26-MultiplicityChanged
250//inv27-dupOfInv24
251//inv28-dubOfInv23
252//inv29-MultiplicityChanged
253//inv30-AttributeRemoved
254//inv31-AttributeRemoved
255//inv32-AttributeRemoved
256
257//inv33-attribute-handled by multiplicity
258@Constraint(message = "inv33", severity = "error", key = {p})
259pattern inv33(p : Physical_Person) {
260 Physical_Person.birth_year(p, by);
261 check(2018-by < 0);
262} or {
263 Physical_Person.birth_year(p, by);
264 check(2018-by > 100);
265}
266
267//inv34-attribute-handled by multiplicity
268@Constraint(message = "inv34", severity = "error", key = {p})
269pattern inv34(p : Physical_Person) {
270 Physical_Person.birth_month(p, birthMonth);
271 check(birthMonth < 1);
272} or {
273 Physical_Person.birth_month(p, birthMonth);
274 check(birthMonth > 12);
275}
276
277//inv35-attribute-handled by multiplicity
278@Constraint(message = "inv35", severity = "error", key = {p})
279pattern inv35(p : Physical_Person) {
280 Physical_Person.birth_day(p, birthDay);
281 check(birthDay < 1);
282} or {
283 Physical_Person.birth_day(p, birthDay);
284 check(birthDay > 28);
285}
286
287//inv36-AttributeRemoved
288//inv37-AttributeRemoved
289//inv38-AttributeRemoved
290//inv39-AttributeRemoved
291//inv40-AttributeRemoved
292//inv41-AttributeRemoved
293//inv42-AttributeRemoved
294//inv43-AttributeRemoved
295//inv44-AttributeRemoved
296//inv45-AttributeRemoved
297//inv46-AttributeRemoved
298
299//inv47-attributes-handled by multiplicity
300@Constraint(message = "inv47", severity = "error", key = {lur})
301pattern inv47(lur : Legal_Union_Record) {
302 Legal_Union_Record.end_year(lur, endY);
303 Legal_Union_Record.start_year(lur, startY);
304 neg find x_inv47(lur);
305 check(startY >= endY);
306} or {
307 Legal_Union_Record.end_year(lur, endY);
308 Legal_Union_Record.start_year(lur, startY);
309 check(endY!= -1);
310 check(startY >= endY);
311}
312pattern x_inv47(lur : Legal_Union_Record) {
313 Legal_Union_Record.separation_cause(lur, ::NONE);
314}
315
316//inv48-attributes-handled by multiplicity
317@Constraint(message = "inv48", severity = "error", key = {p})
318pattern inv48(p : Physical_Person) {
319 Physical_Person.disability_percentage(p, disPer);
320 check(disPer > 1.0);
321} or {
322 Physical_Person.disability_percentage(p, disPer);
323 check(disPer < 0.0);
324} or {
325 Physical_Person.disability_type(p, ::NONE);
326 Physical_Person.disability_percentage(p, disPer);
327 check(disPer != 0.0);
328} or {
329 neg find x_inv48(p);
330 Physical_Person.disability_percentage(p, disPer);
331 check(disPer == 0.0);
332}
333pattern x_inv48(p : Physical_Person) {
334 Physical_Person.disability_type(p, ::NONE);
335}
336
337//inv49-OclKindOf-handled by multiplicity
338@Constraint(message = "inv49", severity = "error", key = {lur})
339pattern inv49_A(lur : Legal_Union_Record) {
340 Legal_Union_Record.individual_A(lur, i);
341 Legal_Union_Record.individual_B(lur, i);
342}
343//inv49-OclKindOf-handled by multiplicity
344@Constraint(message = "inv49", severity = "error", key = {lur})
345pattern inv49_B(lur : Legal_Union_Record) {
346 Legal_Union_Record.individual_A(lur, i);
347 Dependent(i);
348} or {
349 Legal_Union_Record.individual_B(lur, i);
350 Dependent(i);
351}
352
353//inv50-MultiplicityChecked
354//inv51-MultiplicityChecked
355//inv52-MultiplicityChecked
356//inv53-MultiplicityChecked \ No newline at end of file
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/archives/sources/case_study_short.vql_ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/archives/sources/case_study_short.vql_
new file mode 100644
index 00000000..d6ced021
--- /dev/null
+++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/archives/sources/case_study_short.vql_
@@ -0,0 +1,51 @@
1package queries
2
3import "http:///TaxCard.ecore"
4
5//inv47-attributes-handled by multiplicity
6//@Constraint(message = "inv47", severity = "error", key = {lur})
7//pattern inv47(lur : Legal_Union_Record) {
8// Legal_Union_Record.end_year(lur, endY);
9// Legal_Union_Record.start_year(lur, startY);
10// neg find x_inv47(lur);
11// check(startY >= endY);
12//} or {
13// Legal_Union_Record.end_year(lur, endY);
14// Legal_Union_Record.start_year(lur, startY);
15// check(endY!= -1);
16// check(startY >= endY);
17//}
18//pattern x_inv47(lur : Legal_Union_Record) {
19// Legal_Union_Record.separation_cause(lur, ::NONE);
20//}
21//
22////inv17-attribute-handled by multiplicity
23//@Constraint(message = "inv17", severity = "error", key = {lur})
24//pattern inv17(lur : Legal_Union_Record) {
25// Legal_Union_Record.start_year(lur, sy);
26// check(sy < 1950);
27//} or {
28// Legal_Union_Record.start_year(lur, sy);
29// check(sy > 2018);
30//}
31
32////inv48-attributes-handled by multiplicity
33@Constraint(message = "inv48", severity = "error", key = {p})
34pattern inv48(p : Physical_Person) {
35 Physical_Person.disability_percentage(p, disPer);
36 check(disPer > 1.0);
37} or {
38 Physical_Person.disability_percentage(p, disPer);
39 check(disPer < 0.0);
40} or {
41 Physical_Person.disability_type(p, ::NONE);
42 Physical_Person.disability_percentage(p, disPer);
43 check(disPer != 0.0);
44} or {
45 neg find x_inv48(p);
46 Physical_Person.disability_percentage(p, disPer);
47 check(disPer == 0.0);
48}
49pattern x_inv48(p : Physical_Person) {
50 Physical_Person.disability_type(p, ::NONE);
51} \ No newline at end of file