aboutsummaryrefslogtreecommitdiffstats
path: root/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme
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 /Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme
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 'Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme')
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/ApplicationConfiguration.xtext413
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/GenerationTaskExecutor.xtend4
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptExecutor.xtend20
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/SolverLoader.xtend182
4 files changed, 416 insertions, 203 deletions
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/ApplicationConfiguration.xtext b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/ApplicationConfiguration.xtext
index 2b4a56a6..be1ac662 100644
--- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/ApplicationConfiguration.xtext
+++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/ApplicationConfiguration.xtext
@@ -6,203 +6,328 @@ import "http://www.bme.hu/mit/inf/dslreasoner/faulttree/components/CftLanguage"
6generate applicationConfiguration "http://www.bme.hu/mit/inf/dslreasoner/application/ApplicationConfiguration" 6generate applicationConfiguration "http://www.bme.hu/mit/inf/dslreasoner/application/ApplicationConfiguration"
7 7
8ConfigurationScript: 8ConfigurationScript:
9 (imports += Import)* 9 (imports+=Import)*
10 (commands += Command)* 10 (commands+=Command)*;
11;
12 11
13Command : 12Command:
14 Declaration | Task 13 Declaration | Task;
15;
16 14
17QualifiedName returns ecore::EString: 15QualifiedName returns ecore::EString:
18 ID ('.' ID)*; 16 ID ('.' ID)*;
19REALLiteral returns ecore::EBigDecimal: '-'? INT '.' INT; 17
20INTLiteral returns ecore::EInt: '-'? INT; 18REALLiteral returns ecore::EBigDecimal:
19 '-'? INT '.' INT;
20
21INTLiteral returns ecore::EInt:
22 '-'? INT;
21 23
22/////////////////////////////////////////////////// 24///////////////////////////////////////////////////
23// Imports 25// Imports
24/////////////////////////////////////////////////// 26///////////////////////////////////////////////////
27Import:
28 EPackageImport | ViatraImport | CftImport;
29
30EPackageImport:
31 "import" "epackage" importedPackage=[ecore::EPackage|STRING];
25 32
26Import: EPackageImport | ViatraImport | CftImport; 33ViatraImport:
34 "import" "viatra" importedViatra=[viatra::PatternModel|STRING];
27 35
28EPackageImport: "import" "epackage" importedPackage=[ecore::EPackage|STRING]; 36CftImport:
29ViatraImport: "import" "viatra" importedViatra=[viatra::PatternModel|STRING]; 37 "import" "reliability" importedCft=[cftLanguage::CftModel|STRING];
30CftImport: "import" "reliability" importedCft=[cftLanguage::CftModel|STRING]; 38
31
32/////////////////////////////////////////////////// 39///////////////////////////////////////////////////
33// Declaration 40// Declaration
34/////////////////////////////////////////////////// 41///////////////////////////////////////////////////
35 42Declaration:
36Declaration :
37 FileDeclaration 43 FileDeclaration
38 | MetamodelDeclaration 44 | MetamodelDeclaration
39 | PartialModelDeclaration 45 | PartialModelDeclaration
40 | GraphPatternDeclaration 46 | GraphPatternDeclaration
41 | ConfigDeclaration 47 | ConfigDeclaration
42 | ScopeDeclaration 48 | ScopeDeclaration
43 | ObjectiveDeclaration 49 | ObjectiveDeclaration;
44;
45 50
46/////////////////////////////////////////////////// 51///////////////////////////////////////////////////
47// Files and Folders 52// Files and Folders
48/////////////////////////////////////////////////// 53///////////////////////////////////////////////////
54FileSpecification:
55 path=STRING;
49 56
50FileSpecification: path = STRING; 57FileDeclaration:
51FileDeclaration: 'file' name = ID '=' specification = FileSpecification; 58 'file' name=ID '=' specification=FileSpecification;
52FileReference: referred = [FileDeclaration]; 59
53File: FileSpecification | FileReference; 60FileReference:
61 referred=[FileDeclaration];
62
63File:
64 FileSpecification | FileReference;
54 65
55/////////////////////////////////////////////////// 66///////////////////////////////////////////////////
56// Metamodel 67// Metamodel
57/////////////////////////////////////////////////// 68///////////////////////////////////////////////////
69MetamodelSpecification:
70 '{' (entries+=MetamodelEntry) (',' entries+=MetamodelEntry)* '}';
71
72MetamodelEntry:
73 MetamodelElement | AllPackageEntry;
74
75AllPackageEntry:
76 "package" package=[ecore::EPackage|QualifiedName] ("excluding" '{' exclusion+=MetamodelElement (','
77 exclusion+=MetamodelElement)* '}')?;
58 78
59MetamodelSpecification: '{' (entries += MetamodelEntry) (',' entries += MetamodelEntry)* '}'; 79MetamodelElement:
60MetamodelEntry: MetamodelElement | AllPackageEntry; 80 (package=[ecore::EPackage|QualifiedName] '::')? classifier=[ecore::EClassifier] ('.'
61AllPackageEntry: "package" package=[ecore::EPackage|QualifiedName] ("excluding" '{'exclusion +=MetamodelElement (',' exclusion +=MetamodelElement)*'}')?; 81 feature=[ecore::ENamedElement])?;
62MetamodelElement: (package=[ecore::EPackage|QualifiedName] '::')? classifier = [ecore::EClassifier] ('.' feature= [ecore::ENamedElement])?;
63 82
64MetamodelDeclaration: 'metamodel' name = ID specification = MetamodelSpecification; 83MetamodelDeclaration:
65MetamodelReference: referred = [MetamodelDeclaration]; 84 'metamodel' name=ID specification=MetamodelSpecification;
66Metamodel: MetamodelReference | MetamodelSpecification; 85
86MetamodelReference:
87 referred=[MetamodelDeclaration];
88
89Metamodel:
90 MetamodelReference | MetamodelSpecification;
67 91
68/////////////////////////////////////////////////// 92///////////////////////////////////////////////////
69// Partial Model 93// Partial Model
70/////////////////////////////////////////////////// 94///////////////////////////////////////////////////
95PartialModelSpecification:
96 '{' entry+=PartialModelEntry (',' entry+=PartialModelEntry)? '}';
97
98PartialModelEntry:
99 ModelEntry | FolderEntry;
100
101ModelEntry:
102 path=File;
103
104FolderEntry:
105 "folder" path=File ("excluding" "{" exclusion+=ModelEntry ("," exclusion+=ModelEntry)* "}")?;
71 106
72PartialModelSpecification: '{' entry += PartialModelEntry (',' entry += PartialModelEntry)? '}'; 107PartialModelDeclaration:
73PartialModelEntry: ModelEntry | FolderEntry; 108 'models' name=ID specification=PartialModelSpecification;
74ModelEntry: path = File;
75FolderEntry: "folder" path = File ("excluding" "{" exclusion += ModelEntry ("," exclusion += ModelEntry)* "}")?;
76 109
77PartialModelDeclaration: 'models' name = ID specification = PartialModelSpecification; 110PartialModelReference:
78PartialModelReference : referred = [PartialModelDeclaration]; 111 referred=[PartialModelDeclaration];
79PartialModel: PartialModelSpecification | PartialModelReference; 112
113PartialModel:
114 PartialModelSpecification | PartialModelReference;
80 115
81/////////////////////////////////////////////////// 116///////////////////////////////////////////////////
82// Patterns 117// Patterns
83/////////////////////////////////////////////////// 118///////////////////////////////////////////////////
119PatternSpecification:
120 '{' entries+=PatternEntry (',' entries+=PatternEntry)* '}';
121
122PatternEntry:
123 PatternElement | AllPatternEntry;
124
125AllPatternEntry:
126 'package' package=[viatra::PatternModel|QualifiedName] ('excluding' '{' exclusuion+=PatternElement (','
127 exclusuion+=PatternElement)* '}')?;
128
129PatternElement:
130 (package=[viatra::PatternModel|QualifiedName] '::')? pattern=[viatra::Pattern];
84 131
85PatternSpecification: '{' entries += PatternEntry (',' entries += PatternEntry)* '}'; 132GraphPatternDeclaration:
86PatternEntry: PatternElement | AllPatternEntry; 133 'constraints' name=ID specification=PatternSpecification;
87AllPatternEntry: 'package' package = [viatra::PatternModel|QualifiedName] ('excluding' '{' exclusuion += PatternElement (',' exclusuion += PatternElement)* '}')?;
88PatternElement: (package =[viatra::PatternModel|QualifiedName] '::')? pattern = [viatra::Pattern];
89 134
90GraphPatternDeclaration: 'constraints' name = ID specification = PatternSpecification; 135GraphPatternReference:
91GraphPatternReference: referred = [GraphPatternDeclaration]; 136 referred=[GraphPatternDeclaration];
92GraphPattern: GraphPatternReference|PatternSpecification; 137
138GraphPattern:
139 GraphPatternReference | PatternSpecification;
93 140
94/////////////////////////////////////////////////// 141///////////////////////////////////////////////////
95// Objectives 142// Objectives
96/////////////////////////////////////////////////// 143///////////////////////////////////////////////////
144ObjectiveSpecification:
145 '{' entries+=ObjectiveEntry (',' entries+=ObjectiveEntry)* '}';
146
147ObjectiveEntry:
148 OptimizationEntry | ThresholdEntry;
149
150enum OptimizationDirection:
151 MINIMIZE='minimize' | MAXIMIZE='maximize';
152
153OptimizationEntry:
154 direction=OptimizationDirection function=ObjectiveFunction;
155
156enum ComparisonOperator:
157 LESS='<' | GREATER='>' | LESS_EQUALS='<=' | GREATER_EQUALS='>=';
158
159ThresholdEntry:
160 function=ObjectiveFunction operator=ComparisonOperator threshold=REALLiteral;
161
162ObjectiveFunction:
163 CostObjectiveFunction | ReliabilityObjectiveFunction;
164
165CostObjectiveFunction:
166 'cost' '{' entries+=CostEntry (',' entries+=CostEntry)* '}';
167
168CostEntry:
169 patternElement=PatternElement '=' weight=INTLiteral;
170
171ReliabilityObjectiveFunction:
172 ReliabiltiyProbability | Mtff;
97 173
98ObjectiveSpecification: '{' entries += ObjectiveEntry (',' entries += ObjectiveEntry)* '}';
99ObjectiveEntry: OptimizationEntry | ThresholdEntry;
100enum OptimizationDirection: MINIMIZE='minimize' | MAXIMIZE='maximize';
101OptimizationEntry: direction=OptimizationDirection function=ObjectiveFunction;
102enum ComparisonOperator: LESS_EQUALS='<=' | GREATER_EQUALS='>=';
103ThresholdEntry: function=ObjectiveFunction operator=ComparisonOperator threshold=REALLiteral;
104ObjectiveFunction: ReliabilityObjectiveFunction;
105ReliabilityObjectiveFunction: ReliabiltiyProbability | Mtff;
106ReliabiltiyProbability: 174ReliabiltiyProbability:
107 'reliability' (package=[cftLanguage::CftModel|QualifiedName] '::')? transformation = [cftLanguage::TransformationDefinition] 175 'reliability' (package=[cftLanguage::CftModel|QualifiedName] '::')?
176 transformation=[cftLanguage::TransformationDefinition]
108 'at' time=REALLiteral; 177 'at' time=REALLiteral;
178
109Mtff: 179Mtff:
110 'mtff' (package=[cftLanguage::CftModel|QualifiedName] '::')? transformation = [cftLanguage::TransformationDefinition]; 180 'mtff' (package=[cftLanguage::CftModel|QualifiedName] '::')? transformation=[cftLanguage::TransformationDefinition];
181
182ObjectiveDeclaration:
183 'objectives' name=ID specification=ObjectiveSpecification;
184
185ObjectiveReference:
186 referred=[ObjectiveDeclaration];
111 187
112ObjectiveDeclaration: 'objectives' name = ID specification = ObjectiveSpecification; 188Objective:
113ObjectiveReference: referred = [ObjectiveDeclaration]; 189 ObjectiveReference | ObjectiveSpecification;
114Objective: ObjectiveReference|ObjectiveSpecification;
115 190
116/////////////////////////////////////////////////// 191///////////////////////////////////////////////////
117// SolverConfig 192// SolverConfig
118/////////////////////////////////////////////////// 193///////////////////////////////////////////////////
194ConfigSpecification:
195 {ConfigSpecification} '{'
196 (entries+=ConfigEntry ("," entries+=ConfigEntry)*)?
197 '}';
198
199ConfigDeclaration:
200 'config' name=ID specification=ConfigSpecification;
201
202ConfigEntry:
203 DocumentationEntry | RuntimeEntry | MemoryEntry | CustomEntry;
204
205DocumentationEntry:
206 "log-level" '=' level=DocumentLevelSpecification;
119 207
120ConfigSpecification: {ConfigSpecification}'{' 208enum DocumentLevelSpecification:
121 (entries += ConfigEntry ("," entries += ConfigEntry)*)? 209 none | normal | full;
210
211RuntimeEntry:
212 "runtime" "=" millisecLimit=INT;
213
214MemoryEntry:
215 "memory" "=" megabyteLimit=INT;
216
217CustomEntry:
218 key=STRING "=" value=STRING;
219
220ConfigReference:
221 config=[ConfigDeclaration];
222
223Config:
224 ConfigSpecification | ConfigReference;
225
226enum Solver:
227 SMTSolver | AlloySolver | ViatraSolver;
228
229ScopeSpecification:
230 {ScopeSpecification} '{'
231 (scopes+=TypeScope (',' scopes+=TypeScope)*)?
122 '}'; 232 '}';
123ConfigDeclaration : 233
124 'config' name = ID specification = ConfigSpecification 234TypeScope:
125; 235 ClassTypeScope | ObjectTypeScope | IntegerTypeScope | RealTypeScope | StringTypeScope;
126ConfigEntry: DocumentationEntry | RuntimeEntry | MemoryEntry | CustomEntry; 236
127DocumentationEntry: "log-level" '=' level = DocumentLevelSpecification; 237ClassTypeScope:
128enum DocumentLevelSpecification: none | normal | full; 238 '#' type=ClassReference
129RuntimeEntry: "runtime" "=" millisecLimit = INT; 239 (setsNew?='+=' | setsSum?='=')
130MemoryEntry: "memory" "=" megabyteLimit = INT; 240 (number=ExactNumber | number=IntervallNumber);
131CustomEntry: key = STRING "=" value = STRING; 241
132 242ObjectTypeScope:
133ConfigReference: config = [ConfigDeclaration]; 243 '#' type=ObjectReference
134Config: ConfigSpecification | ConfigReference; 244 (setsNew?='+=' | setsSum?='=')
135 245 (number=ExactNumber | number=IntervallNumber);
136enum Solver: SMTSolver | AlloySolver | ViatraSolver; 246
137 247IntegerTypeScope:
138ScopeSpecification: {ScopeSpecification} '{' 248 '#' type=IntegerReference
139 (scopes += TypeScope (',' scopes += TypeScope)*)? 249 (setsNew?='+=' | setsSum?='=')
140'}'; 250 (number=ExactNumber | number=IntervallNumber | number=IntEnumberation);
141TypeScope: ClassTypeScope | ObjectTypeScope | IntegerTypeScope | RealTypeScope | StringTypeScope; 251
142ClassTypeScope: '#' type = ClassReference 252RealTypeScope:
143 (setsNew ?='+=' | setsSum ?= '=') 253 '#' type=RealReference
144 (number = ExactNumber | number = IntervallNumber) 254 (setsNew?='+=' | setsSum?='=')
145; 255 (number=ExactNumber | number=IntervallNumber | number=RealEnumeration);
146ObjectTypeScope: '#' type = ObjectReference 256
147 (setsNew ?='+=' | setsSum ?= '=') 257StringTypeScope:
148 (number = ExactNumber | number = IntervallNumber) 258 '#' type=StringReference
149; 259 (setsNew?='+=' | setsSum?='=')
150IntegerTypeScope: '#' type = IntegerReference 260 (number=ExactNumber | number=IntervallNumber | number=StringEnumeration);
151 (setsNew ?='+=' | setsSum ?= '=') 261
152 (number = ExactNumber | number = IntervallNumber | number = IntEnumberation) 262TypeReference:
153; 263 ClassReference | ObjectReference | IntegerReference | RealReference | StringReference;
154RealTypeScope: '#' type = RealReference 264
155 (setsNew ?='+=' | setsSum ?= '=') 265ClassReference:
156 (number = ExactNumber | number = IntervallNumber | number = RealEnumeration) 266 '<' element=MetamodelElement '>';
157; 267
158StringTypeScope: '#' type = StringReference 268ObjectReference:
159 (setsNew ?='+=' | setsSum ?= '=') 269 {ObjectReference} 'node';
160 (number = ExactNumber | number = IntervallNumber | number = StringEnumeration) 270
161; 271IntegerReference:
162 272 {IntegerScope} 'int';
163TypeReference: ClassReference | ObjectReference | IntegerReference | RealReference | StringReference; 273
164ClassReference: '<' element = MetamodelElement '>'; 274RealReference:
165ObjectReference: {ObjectReference} 'node'; 275 {RealScope} 'real';
166IntegerReference: {IntegerScope} 'int'; 276
167RealReference: {RealScope} 'real'; 277StringReference:
168StringReference: {StringScope} 'string'; 278 {StringScope} 'string';
169 279
170NumberSpecification: ExactNumber | IntervallNumber | IntEnumberation | RealEnumeration | StringEnumeration; 280NumberSpecification:
171ExactNumber: exactNumber = INT | exactUnlimited ?= '*'; 281 ExactNumber | IntervallNumber | IntEnumberation | RealEnumeration | StringEnumeration;
172IntervallNumber: min = INT '..' (maxNumber = INT | maxUnlimited ?= '*'); 282
173IntEnumberation: {IntEnumberation} '{' (entry += INTLiteral (',' entry += INTLiteral)*)?'}'; 283ExactNumber:
174RealEnumeration: {RealEnumeration} '{' (entry += REALLiteral (',' entry += REALLiteral)*)?'}'; 284 exactNumber=INT | exactUnlimited?='*';
175StringEnumeration: {StringEnumeration} '{' (entry += STRING (',' entry += STRING)*)?'}'; 285
176 286IntervallNumber:
177ScopeDeclaration: 'scope' name = ID specification = ScopeSpecification; 287 min=INT '..' (maxNumber=INT | maxUnlimited?='*');
178ScopeReference: referred = [ScopeDeclaration]; 288
179Scope: ScopeSpecification | ScopeReference; 289IntEnumberation:
180 290 {IntEnumberation} '{' (entry+=INTLiteral (',' entry+=INTLiteral)*)? '}';
181Task: GenerationTask /*| CoverageCalculation | ValidationTask*/; 291
182 292RealEnumeration:
183GenerationTask: 'generate' {GenerationTask} '{'( 293 {RealEnumeration} '{' (entry+=REALLiteral (',' entry+=REALLiteral)*)? '}';
184 294
185 // domain 295StringEnumeration:
186 ('metamodel' '=' metamodel = Metamodel)? & 296 {StringEnumeration} '{' (entry+=STRING (',' entry+=STRING)*)? '}';
187 ('partial-model' '=' partialModel = PartialModel)? & 297
188 ('constraints' '=' patterns = GraphPattern)? & 298ScopeDeclaration:
189 ('objectives' '=' objectives = Objective)? & 299 'scope' name=ID specification=ScopeSpecification;
190 300
191 // model set 301ScopeReference:
192 ('scope' '=' scope = Scope)? & 302 referred=[ScopeDeclaration];
193 (numberSpecified ?= 'number' '=' number= INT)? & 303
194 (runSpecified ?= 'runs' '=' runs = INT)? & 304Scope:
195 // Solver 305 ScopeSpecification | ScopeReference;
196 ('solver' '=' solver = Solver)? & 306
197 ('config' '=' config = Config)? & 307Task:
198 308 GenerationTask /*| CoverageCalculation | ValidationTask*/;
199 // output texts 309
200 ('debug' '=' debugFolder = File)? & 310GenerationTask:
201 ('log' '=' targetLogFile = File)? & 311 'generate' {GenerationTask} '{' (
202 ('statistics' '=' targetStatisticsFile = File)? & 312
203 313 // domain
204 // output models 314 ('metamodel' '=' metamodel=Metamodel)? &
205 ('output' '=' tagetFolder = File)? 315 ('partial-model' '=' partialModel=PartialModel)? &
206 316 ('constraints' '=' patterns=GraphPattern)? &
207 )'}' 317 ('objectives' '=' objectives=Objective)? &
208; \ No newline at end of file 318
319 // model set
320 ('scope' '=' scope=Scope)? &
321 (numberSpecified?='number' '=' number=INT)? &
322 (runSpecified?='runs' '=' runs=INT)? &
323 // Solver
324 ('solver' '=' solver=Solver)? &
325 ('config' '=' config=Config)? &
326
327 // output texts
328 ('debug' '=' debugFolder=File)? &
329 ('log' '=' targetLogFile=File)? &
330 ('statistics' '=' targetStatisticsFile=File)? &
331
332 // output models
333 ('output' '=' tagetFolder=File)?) '}'; \ No newline at end of file
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/GenerationTaskExecutor.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/GenerationTaskExecutor.xtend
index 35ffaf65..8ea674d3 100644
--- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/GenerationTaskExecutor.xtend
+++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/GenerationTaskExecutor.xtend
@@ -133,7 +133,9 @@ class GenerationTaskExecutor {
133 // 5. create a solver and a configuration 133 // 5. create a solver and a configuration
134 // 5.1 initialize 134 // 5.1 initialize
135 val solver = solverLoader.loadSolver(task.solver,configurationMap) 135 val solver = solverLoader.loadSolver(task.solver,configurationMap)
136 val solverConfig = solverLoader.loadSolverConfig(task.solver,configurationMap,console) 136 val objectiveSpecification = scriptExecutor.getObjectiveSpecification(task.objectives)
137 val objectiveEntries = objectiveSpecification?.entries ?: emptyList
138 val solverConfig = solverLoader.loadSolverConfig(task.solver,configurationMap,objectiveEntries,console)
137 139
138 140
139 // 5.2 set values that defined directly 141 // 5.2 set values that defined directly
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptExecutor.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptExecutor.xtend
index 0512a5ee..25036df6 100644
--- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptExecutor.xtend
+++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptExecutor.xtend
@@ -30,6 +30,8 @@ import org.eclipse.core.runtime.Status
30import org.eclipse.core.runtime.jobs.Job 30import org.eclipse.core.runtime.jobs.Job
31import org.eclipse.emf.common.util.URI 31import org.eclipse.emf.common.util.URI
32import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor 32import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor
33import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ObjectiveSpecification
34import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ObjectiveReference
33 35
34@FinalFieldsConstructor 36@FinalFieldsConstructor
35class ScriptExecutor { 37class ScriptExecutor {
@@ -40,7 +42,7 @@ class ScriptExecutor {
40 /** 42 /**
41 * Executes a script 43 * Executes a script
42 */ 44 */
43 public def executeScript(URI uri) { 45 def executeScript(URI uri) {
44 val job = new Job('''Model Generation: «uri.lastSegment»''') { 46 val job = new Job('''Model Generation: «uri.lastSegment»''') {
45 override protected run(IProgressMonitor monitor) { 47 override protected run(IProgressMonitor monitor) {
46 try{ 48 try{
@@ -57,7 +59,7 @@ class ScriptExecutor {
57 job.schedule(); 59 job.schedule();
58 } 60 }
59 61
60 public def executeScript(ConfigurationScript script, IProgressMonitor monitor) { 62 def executeScript(ConfigurationScript script, IProgressMonitor monitor) {
61 script.activateAllEPackageReferences 63 script.activateAllEPackageReferences
62 val tasks = script.commands.filter(Task) 64 val tasks = script.commands.filter(Task)
63 65
@@ -94,12 +96,12 @@ class ScriptExecutor {
94// } 96// }
95 } 97 }
96 98
97 def public dispatch execute(GenerationTask task, IProgressMonitor monitor) { 99 def dispatch void execute(GenerationTask task, IProgressMonitor monitor) {
98 val generationTaskExecutor = new GenerationTaskExecutor 100 val generationTaskExecutor = new GenerationTaskExecutor
99 generationTaskExecutor.executeGenerationTask(task,this,scriptConsoleFactory,monitor) 101 generationTaskExecutor.executeGenerationTask(task,this,scriptConsoleFactory,monitor)
100 } 102 }
101 103
102 def public dispatch execute(Task task, IProgressMonitor monitor) { 104 def dispatch void execute(Task task, IProgressMonitor monitor) {
103 throw new IllegalArgumentException('''Unsupported task type: «task.class.simpleName»!''') 105 throw new IllegalArgumentException('''Unsupported task type: «task.class.simpleName»!''')
104 } 106 }
105 107
@@ -174,6 +176,16 @@ class ScriptExecutor {
174 null 176 null
175 } 177 }
176 178
179 def dispatch getObjectiveSpecification(ObjectiveSpecification config) {
180 config
181 }
182 def dispatch getObjectiveSpecification(ObjectiveReference config) {
183 config.referred.specification
184 }
185 def dispatch getObjectiveSpecification(Void config) {
186 null
187 }
188
177 def dispatch getConfiguration(ConfigSpecification config) { 189 def dispatch getConfiguration(ConfigSpecification config) {
178 config 190 config
179 } 191 }
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/SolverLoader.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/SolverLoader.xtend
index 9eceef5f..f769d46f 100644
--- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/SolverLoader.xtend
+++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/SolverLoader.xtend
@@ -1,44 +1,47 @@
1package hu.bme.mit.inf.dslreasoner.application.execution 1package hu.bme.mit.inf.dslreasoner.application.execution
2 2
3import hu.bme.mit.inf.dlsreasoner.alloy.reasoner.AlloyBackendSolver
4import hu.bme.mit.inf.dlsreasoner.alloy.reasoner.AlloySolver 3import hu.bme.mit.inf.dlsreasoner.alloy.reasoner.AlloySolver
5import hu.bme.mit.inf.dlsreasoner.alloy.reasoner.AlloySolverConfiguration 4import hu.bme.mit.inf.dlsreasoner.alloy.reasoner.AlloySolverConfiguration
5import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.CostObjectiveFunction
6import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ObjectiveEntry
7import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.OptimizationEntry
6import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.Solver 8import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.Solver
9import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ThresholdEntry
7import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicSolverConfiguration 10import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicSolverConfiguration
8import hu.bme.mit.inf.dslreasoner.smt.reasoner.SMTSolver 11import hu.bme.mit.inf.dslreasoner.smt.reasoner.SMTSolver
9import hu.bme.mit.inf.dslreasoner.smt.reasoner.SmtSolverConfiguration 12import hu.bme.mit.inf.dslreasoner.smt.reasoner.SmtSolverConfiguration
13import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.CostObjectiveConfiguration
14import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.CostObjectiveElementConfiguration
15import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.DiversityDescriptor
10import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasoner 16import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasoner
11import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration 17import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration
18import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization.ObjectiveKind
19import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization.ObjectiveThreshold
20import hu.bme.mit.inf.dslreasoner.visualisation.pi2graphviz.GraphvizVisualiser
21import java.util.List
12import java.util.Map 22import java.util.Map
13import java.util.Optional 23import java.util.Optional
24import org.eclipse.viatra.query.patternlanguage.emf.vql.PatternModel
25import org.eclipse.xtext.EcoreUtil2
14import org.eclipse.xtext.xbase.lib.Functions.Function1 26import org.eclipse.xtext.xbase.lib.Functions.Function1
15import hu.bme.mit.inf.dslreasoner.visualisation.pi2graphviz.GraphvizVisualiser
16import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.DiversityDescriptor
17 27
18class SolverLoader { 28class SolverLoader {
19 def loadSolver(Solver solver, Map<String, String> config) { 29 def loadSolver(Solver solver, Map<String, String> config) {
20 switch(solver) { 30 switch (solver) {
21 case ALLOY_SOLVER: return new AlloySolver 31 case ALLOY_SOLVER: return new AlloySolver
22 case SMT_SOLVER: return new SMTSolver 32 case SMT_SOLVER: return new SMTSolver
23 case VIATRA_SOLVER: return new ViatraReasoner 33 case VIATRA_SOLVER: return new ViatraReasoner
24 } 34 }
25 } 35 }
26 36
27 37 private def <Type> Optional<Type> getAsType(Map<String, String> config, String key, ScriptConsole console,
28 38 Function1<String, Type> parser, Class<Type> requestedType) {
29 private def <Type> Optional<Type> getAsType( 39 if (config.containsKey(key)) {
30 Map<String, String> config,
31 String key,
32 ScriptConsole console,
33 Function1<String,Type> parser,
34 Class<Type> requestedType)
35 {
36 if(config.containsKey(key)) {
37 val stringValue = config.get(key) 40 val stringValue = config.get(key)
38 try{ 41 try {
39 val parsedValue = parser.apply(stringValue) 42 val parsedValue = parser.apply(stringValue)
40 return Optional.of(parsedValue) 43 return Optional.of(parsedValue)
41 } catch(Exception e) { 44 } catch (Exception e) {
42 console.writeError('''Unable to parse configuration value for "«key»" to «requestedType.simpleName»!''') 45 console.writeError('''Unable to parse configuration value for "«key»" to «requestedType.simpleName»!''')
43 return Optional::empty 46 return Optional::empty
44 } 47 }
@@ -46,60 +49,131 @@ class SolverLoader {
46 return Optional::empty 49 return Optional::empty
47 } 50 }
48 } 51 }
52
49 private def getAsInteger(Map<String, String> config, String key, ScriptConsole console) { 53 private def getAsInteger(Map<String, String> config, String key, ScriptConsole console) {
50 return getAsType(config,key,console,[x|Integer.parseInt(x)],Integer) 54 return getAsType(config, key, console, [x|Integer.parseInt(x)], Integer)
51 } 55 }
56
52 private def getAsBoolean(Map<String, String> config, String key, ScriptConsole console) { 57 private def getAsBoolean(Map<String, String> config, String key, ScriptConsole console) {
53 return getAsType(config,key,console,[x|Boolean.parseBoolean(x)],Boolean) 58 return getAsType(config, key, console, [x|Boolean.parseBoolean(x)], Boolean)
54 } 59 }
60
55 private def getAsDouble(Map<String, String> config, String key, ScriptConsole console) { 61 private def getAsDouble(Map<String, String> config, String key, ScriptConsole console) {
56 return getAsType(config,key,console,[x|Double.parseDouble(x)],Double) 62 return getAsType(config, key, console, [x|Double.parseDouble(x)], Double)
57 } 63 }
58 64
59 def loadSolverConfig( 65 def loadSolverConfig(Solver solver, Map<String, String> config, List<ObjectiveEntry> objectiveEntries,
60 Solver solver, 66 ScriptConsole console) {
61 Map<String, String> config, 67 switch (solver) {
62 ScriptConsole console) 68 case ALLOY_SOLVER: {
63 { 69 if (!objectiveEntries.empty) {
64 if(solver === Solver::ALLOY_SOLVER) { 70 throw new IllegalArgumentException("Objectives are not supported by Alloy.")
65 return new AlloySolverConfiguration => [c| 71 }
66 config.getAsInteger("symmetry",console) 72 val c = new SmtSolverConfiguration
67 .ifPresent[c.symmetry = it] 73 config.getAsBoolean("fixRandomSeed", console).ifPresent[c.fixRandomSeed = it]
68 config.getAsType("solver",console,[x|AlloyBackendSolver::valueOf(x)],AlloyBackendSolver) 74 config.getAsType("path", console, [it], String).ifPresent[c.solverPath = it]
69 .ifPresent[c.solver = it] 75 c
70 ] 76 }
71 } else if(solver === Solver::SMT_SOLVER) { 77 case SMT_SOLVER: {
72 return new SmtSolverConfiguration => [c| 78 if (!objectiveEntries.empty) {
73 config.getAsBoolean("fixRandomSeed",console).ifPresent[c.fixRandomSeed = it] 79 throw new IllegalArgumentException("Objectives are not supported by Z3.")
74 config.getAsType("path",console,[it],String).ifPresent[c.solverPath = it] 80 }
75 ] 81 val c = new SmtSolverConfiguration
76 } else if(solver === Solver::VIATRA_SOLVER) { 82 config.getAsBoolean("fixRandomSeed", console).ifPresent[c.fixRandomSeed = it]
77 return new ViatraReasonerConfiguration => [c| 83 config.getAsType("path", console, [it], String).ifPresent[c.solverPath = it]
84 c
85 }
86 case VIATRA_SOLVER: {
87 val c = new ViatraReasonerConfiguration
78 c.debugConfiguration.partialInterpretatioVisualiser = new GraphvizVisualiser 88 c.debugConfiguration.partialInterpretatioVisualiser = new GraphvizVisualiser
79 if(config.containsKey("diversity-range")) { 89 if (config.containsKey("diversity-range")) {
80 val stringValue = config.get("diversity-range") 90 val stringValue = config.get("diversity-range")
81 try{ 91 try {
82 val range = Integer.parseInt(stringValue) 92 val range = Integer.parseInt(stringValue)
83 c.diversityRequirement = new DiversityDescriptor => [ 93 c.diversityRequirement = new DiversityDescriptor => [
84 it.ensureDiversity = true 94 it.ensureDiversity = true
85 it.range = range 95 it.range = range
86 ] 96 ]
87 } catch (NumberFormatException e) {console.writeError('''Malformed number format: «e.message»''')} 97 } catch (NumberFormatException e) {
98 console.writeError('''Malformed number format: «e.message»''')
99 }
88 } 100 }
89 ] 101 for (objectiveEntry : objectiveEntries) {
90 } else { 102 val costObjectiveConfig = new CostObjectiveConfiguration
91 throw new UnsupportedOperationException('''Unknown solver: «solver»''') 103 switch (objectiveEntry) {
104 OptimizationEntry: {
105 costObjectiveConfig.findExtremum = true
106 costObjectiveConfig.kind = switch (direction : objectiveEntry.direction) {
107 case MAXIMIZE:
108 ObjectiveKind.HIGHER_IS_BETTER
109 case MINIMIZE:
110 ObjectiveKind.LOWER_IS_BETTER
111 default:
112 throw new IllegalArgumentException("Unknown direction: " + direction)
113 }
114 costObjectiveConfig.threshold = ObjectiveThreshold.NO_THRESHOLD
115 }
116 ThresholdEntry: {
117 costObjectiveConfig.findExtremum = false
118 val threshold = objectiveEntry.threshold.doubleValue
119 switch (operator : objectiveEntry.operator) {
120 case LESS: {
121 costObjectiveConfig.kind = ObjectiveKind.LOWER_IS_BETTER
122 costObjectiveConfig.threshold = new ObjectiveThreshold.Exclusive(threshold)
123 }
124 case GREATER: {
125 costObjectiveConfig.kind = ObjectiveKind.HIGHER_IS_BETTER
126 costObjectiveConfig.threshold = new ObjectiveThreshold.Exclusive(threshold)
127 }
128 case LESS_EQUALS: {
129 costObjectiveConfig.kind = ObjectiveKind.LOWER_IS_BETTER
130 costObjectiveConfig.threshold = new ObjectiveThreshold.Exclusive(threshold)
131 }
132 case GREATER_EQUALS: {
133 costObjectiveConfig.kind = ObjectiveKind.HIGHER_IS_BETTER
134 costObjectiveConfig.threshold = new ObjectiveThreshold.Exclusive(threshold)
135 }
136 default:
137 throw new IllegalArgumentException("Unknown operator: " + operator)
138 }
139 }
140 }
141 val function = objectiveEntry.function
142 if (function instanceof CostObjectiveFunction) {
143 for (costEntry : function.entries) {
144 val element = new CostObjectiveElementConfiguration
145 val pattern = costEntry.patternElement.pattern
146 val packageName = costEntry.patternElement.package?.packageName ?:
147 EcoreUtil2.getContainerOfType(pattern, PatternModel)?.packageName
148 element.patternQualifiedName = if (packageName.nullOrEmpty) {
149 pattern.name
150 } else {
151 packageName + "." + pattern.name
152 }
153 costObjectiveConfig.elements += element
154 }
155 } else {
156 throw new IllegalArgumentException("Only cost objectives are supported by VIATRA.")
157 }
158 c.costObjectives += costObjectiveConfig
159 }
160 c
161 }
162 default:
163 throw new UnsupportedOperationException('''Unknown solver: «solver»''')
92 } 164 }
93 } 165 }
94 166
95 def dispatch void setRunIndex(AlloySolverConfiguration config, Map<String, String> parameters, int runIndex, ScriptConsole console) { 167 def dispatch void setRunIndex(AlloySolverConfiguration config, Map<String, String> parameters, int runIndex,
96 parameters.getAsBoolean("randomize",console).ifPresent[ 168 ScriptConsole console) {
97 if(it) { 169 parameters.getAsBoolean("randomize", console).ifPresent [
98 config.randomise = runIndex-1 170 if (it) {
171 config.randomise = runIndex - 1
99 } 172 }
100 ] 173 ]
101 } 174 }
102 def dispatch void setRunIndex(LogicSolverConfiguration config, Map<String, String> parameters, int runIndex, ScriptConsole console) { 175
103 176 def dispatch void setRunIndex(LogicSolverConfiguration config, Map<String, String> parameters, int runIndex,
177 ScriptConsole console) {
104 } 178 }
105} \ No newline at end of file 179}