From 769b900ed48916536eeb61391dd69d0905fce9f3 Mon Sep 17 00:00:00 2001 From: OszkarSemerath Date: Sat, 3 Mar 2018 16:24:38 -0500 Subject: Generation is executed in a job --- .../execution/GenerationTaskExecutor.xtend | 252 +++++++++++---------- 1 file changed, 130 insertions(+), 122 deletions(-) (limited to 'Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/GenerationTaskExecutor.xtend') 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 33f59413..9ffd33c5 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 @@ -20,6 +20,8 @@ import hu.bme.mit.inf.dslreasoner.visualisation.pi2graphviz.GraphvizVisualisatio import hu.bme.mit.inf.dslreasoner.workspace.ProjectWorkspace import java.util.Optional import org.eclipse.emf.common.util.URI +import org.eclipse.core.runtime.IProgressMonitor +import hu.bme.mit.inf.dslreasoner.logic.model.builder.SolverProgressMonitor class GenerationTaskExecutor { val metamodelLoader = new MetamodelLoader @@ -33,10 +35,11 @@ class GenerationTaskExecutor { def executeGenerationTask( GenerationTask task, - ScriptExecutor scriptExecutor) + ScriptExecutor scriptExecutor, + IProgressMonitor monitor) { + monitor.subTask('''Collecting all resources''') // 1. Load all resources - val metamodelSpecification = scriptExecutor.getMetamodelSpecification(task.metamodel) val patternSpecification = scriptExecutor.getPatternSpecification(task.patterns) val partialmodelSpecification = scriptExecutor.getPartialModelSpecification(task.partialModel) @@ -52,153 +55,158 @@ class GenerationTaskExecutor { val documentationLevel = scriptExecutor.getDocumentation(configSpecification) val runtieLimit = scriptExecutor.getRuntimeLimit(configSpecification) val memoryLimit = scriptExecutor.getMemoryLimit(configSpecification) - // 2. create console - - val reasonerWorkspace = if(debugFolder!== null) { - new ProjectWorkspace(debugFolder.path,"") - } else { - new NullWorkspace - } - reasonerWorkspace.initAndClear - val outputWorkspace = if(outputFolder !== null) { - new ProjectWorkspace(outputFolder.path,"") - } else { - new NullWorkspace - } - outputWorkspace.initAndClear + // 2. create console val console = new ScriptConsole(true,true, if(messageFile!==null) URI.createURI(messageFile.path) else null, if(debugFolder!==null) URI.createURI('''«debugFolder.path»/errors.txt''') else null, if(statisticsFile!==null) URI.createURI(statisticsFile.path) else null ) - // 3. interpret all specification to a description - val metamodelDescriptor = if(metamodelSpecification !== null) { - metamodelLoader.loadMetamodel(metamodelSpecification) - } else { - console.writeError('''Error during the loading of the metamodel: No metamodel specified!''') - throw new IllegalArgumentException('''No metamodel is specified!''') - } - val queryDescriptor = if(patternSpecification !== null) { - this.queryLoader.loadQueries(patternSpecification) - } else { - null - } - val partialModelDescriptor = if(partialmodelSpecification !== null) { - this.modelLoader.loadModel(partialmodelSpecification,scriptExecutor) - } else { - null - } - - // 4. translate all description to a logic problem - val Ecore2Logic ecore2Logic = new Ecore2Logic - val Logic2Ecore logic2Ecore = new Logic2Ecore(ecore2Logic) - val Viatra2Logic viatra2Logic = new Viatra2Logic(ecore2Logic) - val InstanceModel2Logic instanceModel2Logic = new InstanceModel2Logic - - var modelGeneration = ecore2Logic.transformMetamodel(metamodelDescriptor,new Ecore2LogicConfiguration()) - var problem = modelGeneration.output - if(partialModelDescriptor !== null) { - problem = instanceModel2Logic.transform( - modelGeneration, - partialModelDescriptor - ).output - } - if(queryDescriptor !== null){ - problem = viatra2Logic.transformQueries( - queryDescriptor.key, - modelGeneration, - new Viatra2LogicConfiguration - ).output - } - if(documentationLevel.atLeastNormal) { - reasonerWorkspace.writeModel(problem,"generation.logicproblem") - } - - // 5. create a solver and a configuration - // 5.1 initialize - val solver = solverLoader.loadSolver(task.solver,configurationMap) - val solverConfig = solverLoader.loadSolverConfig(task.solver,configurationMap,console) - - - // 5.2 set values that defined directly - solverConfig.solutionScope = new SolutionScope => [ - it.numberOfRequiredSolution = if(task.numberSpecified) { - task.number + try { + val reasonerWorkspace = if(debugFolder!== null) { + new ProjectWorkspace(debugFolder.path,"") } else { - 1 + new NullWorkspace } - ] - solverConfig.typeScopes = scopeLoader.loadScope( - scopeSpecification, - problem, - ecore2Logic, - modelGeneration.trace - ) - - // 5.3 set resource limits - documentationLevel.ifPresent[solverConfig.documentationLevel = it] - runtieLimit.ifPresent[solverConfig.runtimeLimit = it] - memoryLimit.ifPresent[solverConfig.memoryLimit = it] - - // 6. execute the solver on the problem with the configuration - // 6.1 calculating the runs - val runs = if(task.runSpecified) { task.runs } else { 1 } - console.writeMessage("Model generation started") - - for(run : 1..runs) { + reasonerWorkspace.init + val outputWorkspace = if(outputFolder !== null) { + new ProjectWorkspace(outputFolder.path,"") + } else { + new NullWorkspace + } + outputWorkspace.init - // 6.2 For each run, the configuration and the workspace is adjusted - solverLoader.setRunIndex(solverConfig,configurationMap,run,console) - val reasonerWorkspaceForRun = if(runs > 1) { - reasonerWorkspace.subWorkspace('''run«run»''',"") => [initAndClear] + // 3. interpret all specification to a description + val metamodelDescriptor = if(metamodelSpecification !== null) { + metamodelLoader.loadMetamodel(metamodelSpecification) + } else { + console.writeError('''Error during the loading of the metamodel: No metamodel specified!''') + throw new IllegalArgumentException('''No metamodel is specified!''') + } + val queryDescriptor = if(patternSpecification !== null) { + this.queryLoader.loadQueries(patternSpecification) } else { - reasonerWorkspace + null } + val partialModelDescriptor = if(partialmodelSpecification !== null) { + this.modelLoader.loadModel(partialmodelSpecification,scriptExecutor) + } else { + null + } + monitor.worked(50) + // 4. translate all description to a logic problem + monitor.subTask('''Translating all resources to logic''') + val Ecore2Logic ecore2Logic = new Ecore2Logic + val Logic2Ecore logic2Ecore = new Logic2Ecore(ecore2Logic) + val Viatra2Logic viatra2Logic = new Viatra2Logic(ecore2Logic) + val InstanceModel2Logic instanceModel2Logic = new InstanceModel2Logic - // 7. Solver call + var modelGeneration = ecore2Logic.transformMetamodel(metamodelDescriptor,new Ecore2LogicConfiguration()) + var problem = modelGeneration.output + if(partialModelDescriptor !== null) { + problem = instanceModel2Logic.transform( + modelGeneration, + partialModelDescriptor + ).output + } + if(queryDescriptor !== null){ + problem = viatra2Logic.transformQueries( + queryDescriptor.key, + modelGeneration, + new Viatra2LogicConfiguration + ).output + } + if(documentationLevel.atLeastNormal) { + reasonerWorkspace.writeModel(problem,"generation.logicproblem") + } - val solution = solver.solve(problem,solverConfig,reasonerWorkspaceForRun) + // 5. create a solver and a configuration + // 5.1 initialize + val solver = solverLoader.loadSolver(task.solver,configurationMap) + val solverConfig = solverLoader.loadSolverConfig(task.solver,configurationMap,console) - console.writeMessage(solution.soutionDescription.toString) - // 8. Solution processing - if(solution instanceof ModelResult) { - // - val interpretations = solver.getInterpretations(solution) - val outputWorkspaceForRun = if(runs > 1) { - outputWorkspace.subWorkspace('''run«run»''',"") => [initAndClear] + // 5.2 set values that defined directly + solverConfig.solutionScope = new SolutionScope => [ + it.numberOfRequiredSolution = if(task.numberSpecified) { + task.number } else { - outputWorkspace + 1 } + ] + solverConfig.typeScopes = scopeLoader.loadScope( + scopeSpecification, + problem, + ecore2Logic, + modelGeneration.trace + ) + + // 5.3 set resource limits + documentationLevel.ifPresent[solverConfig.documentationLevel = it] + runtieLimit.ifPresent[solverConfig.runtimeLimit = it] + memoryLimit.ifPresent[solverConfig.memoryLimit = it] + + // 6. execute the solver on the problem with the configuration + // 6.1 calculating the runs + val runs = if(task.runSpecified) { task.runs } else { 1 } + monitor.worked(50) + + console.writeMessage("Model generation started") + for(run : 1..runs) { + monitor.subTask('''Solving problem«IF runs>0» «run»/«runs»«ENDIF»''') + + // 6.2 For each run, the configuration and the workspace is adjusted + solverLoader.setRunIndex(solverConfig,configurationMap,run,console) + solverConfig.progressMonitor = new EclipseProgressMonitor(monitor) + val reasonerWorkspaceForRun = if(runs > 1) { + reasonerWorkspace.subWorkspace('''run«run»''',"") => [init] + } else { + reasonerWorkspace + } + + // 7. Solver call + val solution = solver.solve(problem,solverConfig,reasonerWorkspaceForRun) + console.writeMessage(solution.soutionDescription.toString) - for(interpretationIndex : 0..1»_«run»«ENDIF»_«interpretationIndex».xmi''') + // 8. Solution processing + if(solution instanceof ModelResult) { + val interpretations = solver.getInterpretations(solution) + val outputWorkspaceForRun = if(runs > 1) { + outputWorkspace.subWorkspace('''run«run»''',"") => [initAndClear] + } else { + outputWorkspace + } - val representation = solution.representation.get(interpretationIndex) - if(representation instanceof PartialInterpretation) { - val vis1 = new PartialInterpretation2Gml - val gml = vis1.transform(representation) - outputWorkspaceForRun.writeText('''model«IF runs>1»_«run»«ENDIF»_«interpretationIndex».gml''',gml) - if(representation.newElements.size + representation.problem.elements.size < 150) { - val vis2 = new GraphvizVisualisation - val dot = vis2.visualiseConcretization(representation) - dot.writeToFile(outputWorkspaceForRun,'''model«IF runs>1»_«run»«ENDIF»_«interpretationIndex»''') + for(interpretationIndex : 0..0» «run»/«runs»«ENDIF»: Visualising solution «interpretationIndex»/«interpretations.size»''') + val interpretation = interpretations.get(interpretationIndex) + val model = logic2Ecore.transformInterpretation(interpretation,modelGeneration.trace) + outputWorkspaceForRun.writeModel(model,'''model«IF runs>1»_«run»«ENDIF»_«interpretationIndex+1».xmi''') + + val representation = solution.representation.get(interpretationIndex) + if(representation instanceof PartialInterpretation) { + val vis1 = new PartialInterpretation2Gml + val gml = vis1.transform(representation) + outputWorkspaceForRun.writeText('''model«IF runs>1»_«run»«ENDIF»_«interpretationIndex+1».gml''',gml) + if(representation.newElements.size + representation.problem.elements.size < 150) { + val vis2 = new GraphvizVisualisation + val dot = vis2.visualiseConcretization(representation) + dot.writeToFile(outputWorkspaceForRun,'''model«IF runs>1»_«run»«ENDIF»_«interpretationIndex+1»''') + } } + monitor.worked(100) } + } else { + monitor.worked(solverConfig.solutionScope.numberOfRequiredSolution*100) } - for(representation : solution.representation) { - - } } - + console.writeMessage("Model generation finished") + } catch(Exception e) { + console.writeError('''Error occured: «e.message»''') } - console.writeMessage("Model generation finished") } private def dispatch soutionDescription(InconsistencyResult s) { -- cgit v1.2.3-70-g09d2