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 +++++++++++---------- .../application/execution/NullWorkspace.xtend | 3 + .../application/execution/ScriptExecutor.xtend | 55 ++++- 3 files changed, 180 insertions(+), 130 deletions(-) (limited to 'Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application') 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) { diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/NullWorkspace.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/NullWorkspace.xtend index fa677a7c..05081581 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/NullWorkspace.xtend +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/NullWorkspace.xtend @@ -24,6 +24,9 @@ class NullWorkspace extends ReasonerWorkspace{ override URI getWorkspaceURI() { throw new UnsupportedOperationException(message) } + + override init() { } + override clear() { } override public void initAndClear() {} override protected URI getURI(String name) { throw new UnsupportedOperationException(message) 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 37e64d98..d8a37184 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 @@ -26,6 +26,9 @@ import java.util.LinkedHashMap import java.util.Optional import org.eclipse.emf.common.util.URI import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.DocumentLevelSpecification +import org.eclipse.core.runtime.jobs.Job +import org.eclipse.core.runtime.IProgressMonitor +import org.eclipse.core.runtime.Status class ScriptExecutor { val parser = new ApplicationConfigurationParser @@ -37,15 +40,30 @@ class ScriptExecutor { * Executes a script */ public def executeScript(URI uri) { - val script = parser.parse(uri) - script.executeScript + val job = new Job('''Model Generation: «uri.lastSegment»''') { + override protected run(IProgressMonitor monitor) { + try{ + monitor.subTask('''Loading script''') + val script = parser.parse(uri) + script.executeScript(monitor) + return Status.OK_STATUS; + } catch(Exception e) { + return Status.OK_STATUS + } + } + } + job.setUser(true); + job.schedule(); } - public def executeScript(ConfigurationScript script) { + public def executeScript(ConfigurationScript script, IProgressMonitor monitor) { script.activateAllEPackageReferences val tasks = script.commands.filter(Task) - for(task : tasks.filterNull) { - task.execute + + for(taskIndex : 0..1» «taskIndex+1»«ENDIF»: «task.name»''',task.totalWork) + task.execute(monitor) } } @@ -75,12 +93,33 @@ class ScriptExecutor { // } } - def public dispatch execute(GenerationTask task) { + def public dispatch execute(GenerationTask task, IProgressMonitor monitor) { val generationTaskExecutor = new GenerationTaskExecutor - generationTaskExecutor.executeGenerationTask(task,this) + generationTaskExecutor.executeGenerationTask(task,this,monitor) + } + + def public dispatch execute(Task task, IProgressMonitor monitor) { + throw new IllegalArgumentException('''Unsupported task type: «task.class.simpleName»!''') } - def public dispatch execute(Task task) { + /** + * Mapping time = 100 + * Solving = 1000 * runs + * Visualisation = runs * number * 100 + */ + def protected dispatch getTotalWork(GenerationTask task) { + val runs = if(task.runSpecified) { task.runs } else { 1 } + val number = if(task.numberSpecified) { task.number } else { 1 } + return 100 + runs*1000 +runs*number*100 + } + def protected dispatch getTotalWork(Task task) { + throw new IllegalArgumentException('''Unsupported task type: «task.class.simpleName»!''') + } + + def protected dispatch getName(GenerationTask task) { + '''Model Generation''' + } + def protected dispatch getName(Task task) { throw new IllegalArgumentException('''Unsupported task type: «task.class.simpleName»!''') } -- cgit v1.2.3-54-g00ecf