From d90bedacaafe87e06fddaa05a6ff9b7b796e97e7 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sat, 16 Feb 2019 00:43:11 +0100 Subject: Two-valued fault tree analyzer WIP --- .../bme/mit/inf/dslreasoner/logic/model/builder/LogicSolver.xtend | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic') diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/builder/LogicSolver.xtend b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/builder/LogicSolver.xtend index f1d410d8..d88e2a52 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/builder/LogicSolver.xtend +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/builder/LogicSolver.xtend @@ -34,7 +34,7 @@ public class LogicReasonerException extends Exception { } } -abstract class LogicSolverConfiguration { +abstract class SolverConfiguration { public static val Unlimited = -1; public static val String UndefinedPath = null @@ -42,7 +42,7 @@ abstract class LogicSolverConfiguration { public String solverPath = UndefinedPath /** Max runtime limit in seconds. */ public int runtimeLimit = Unlimited - /** Max runtime limit in seconds. */ + /** Max memory limit in megabytes. */ public int memoryLimit = Unlimited /** Documentation level of the solver. */ public DocumentationLevel documentationLevel = DocumentationLevel::NONE @@ -52,7 +52,9 @@ abstract class LogicSolverConfiguration { * or via a listener registered by {@link progressMonitor.addCancelListener} */ public SolverProgressMonitor progressMonitor = new NullSolverProgressMonitor +} +abstract class LogicSolverConfiguration extends SolverConfiguration { public var TypeScopes typeScopes = new TypeScopes; public var SolutionScope solutionScope = new SolutionScope } -- cgit v1.2.3-54-g00ecf From 3f9b1c92cc35fa4ed9672a2b8601f4c22af24921 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sun, 7 Apr 2019 13:46:36 +0200 Subject: Infrastructure for objective functions --- .../.ApplicationConfigurationIdeModule.xtendbin | Bin 1701 -> 1701 bytes .../ide/.ApplicationConfigurationIdeSetup.xtendbin | Bin 2526 -> 2526 bytes .../execution/GenerationTaskExecutor.xtend | 2 +- .../application/execution/SolverLoader.xtend | 2 +- .../ApplicationConfigurationScopeProvider.xtend | 2 +- .../logic/model/builder/LogicSolver.xtend | 2 +- .../dlsreasoner/alloy/reasoner/AlloySolver.xtend | 2 +- .../alloy/reasoner/builder/AlloyHandler.xtend | 6 +- .../MultiplicityGoalConstraintCalculator.xtend | 10 +- .../viatrasolver/reasoner/ViatraReasoner.xtend | 188 +++++++++++---------- .../reasoner/ViatraReasonerConfiguration.xtend | 12 +- .../dse/BestFirstStrategyForModelGeneration.java | 57 +++---- .../viatrasolver/reasoner/dse/DseUtils.xtend | 65 +++++++ .../reasoner/dse/IThreeValuedObjective.xtend | 10 ++ .../reasoner/dse/LoggerSolutionFoundHandler.xtend | 24 +++ .../dse/ModelGenerationCompositeObjective.xtend | 77 +++++---- .../viatrasolver/reasoner/dse/SolutionCopier.xtend | 74 ++++++++ .../reasoner/dse/SolutionStoreWithCopy.xtend | 52 ------ .../SurelyViolatedObjectiveGlobalConstraint.xtend | 29 ++++ .../dse/UnfinishedMultiplicityObjective.xtend | 2 +- .../reasoner/dse/UnfinishedWFObjective.xtend | 56 ------ .../reasoner/dse/ViatraReasonerSolutionSaver.xtend | 99 +++++++++++ .../reasoner/dse/WF2ObjectiveConverter.xtend | 44 +++-- .../components/ide/.CftLanguageIdeModule.xtendbin | Bin 1712 -> 1712 bytes .../components/ide/.CftLanguageIdeSetup.xtendbin | Bin 2549 -> 2549 bytes .../components/ui/.CftLanguageUiModule.xtendbin | Bin 3606 -> 3606 bytes .../.CftLanguageProposalProvider.xtendbin | Bin 1820 -> 1820 bytes .../.CftLanguageDescriptionLabelProvider.xtendbin | Bin 1993 -> 1993 bytes .../ui/labeling/.CftLanguageLabelProvider.xtendbin | Bin 2885 -> 2885 bytes .../.CftLanguageOutlineTreeProvider.xtendbin | Bin 2451 -> 2451 bytes .../quickfix/.CftLanguageQuickfixProvider.xtendbin | Bin 1819 -> 1819 bytes ...LanguageSemanticHighlightingCalculator.xtendbin | Bin 3773 -> 3773 bytes .../.CftLanguageTokenToAttributeIdMapper.xtendbin | Bin 2740 -> 2740 bytes .../components/.CftLanguageRuntimeModule.xtendbin | Bin 3436 -> 3436 bytes .../.CftLanguageStandaloneSetup.xtendbin | Bin 2015 -> 2015 bytes .../.CftLanguageValueConverterService.xtendbin | Bin 3002 -> 3002 bytes .../conversion/.OF_INTValueConverter.xtendbin | Bin 4411 -> 4411 bytes .../generator/.CftLanguageGenerator.xtendbin | Bin 2365 -> 2365 bytes .../.CftLanguageQualifiedNameProvider.xtendbin | Bin 3630 -> 3630 bytes .../naming/.PackageNameProvider.xtendbin | Bin 3283 -> 3283 bytes ...portedNamespaceAwareLocalScopeProvider.xtendbin | Bin 4651 -> 4651 bytes .../scoping/.CftLanguageScopeProvider.xtendbin | Bin 9417 -> 9417 bytes .../validation/.CftLanguageValidator.xtendbin | Bin 1760 -> 1760 bytes .../faulttree/model/util/.CftExtensions.xtendbin | Bin 4295 -> 4295 bytes .../cft2ft/.Cft2FtTransformation.xtendbin | Bin 2825 -> 2825 bytes .../cft2ft/.EventCollection.xtendbin | Bin 7022 -> 7022 bytes .../cft2ft/.EventMaterializer.xtendbin | Bin 12110 -> 12110 bytes .../cft2ft/.FaultTreeBuilder.xtendbin | Bin 4029 -> 4029 bytes .../ecore2cft/.ComponentFaultTreeTrace.xtendbin | Bin 5530 -> 5530 bytes .../ecore2cft/.ComponentInstanceTrace.xtendbin | Bin 5932 -> 5932 bytes .../ecore2cft/.ComponentNameGenerator.xtendbin | Bin 3472 -> 3472 bytes .../ecore2cft/.Ecore2CftTransformation.xtendbin | Bin 3431 -> 3431 bytes .../transformation/ecore2cft/.InputTrace.xtendbin | Bin 4202 -> 4202 bytes .../ecore2cft/.LookupHandler.xtendbin | Bin 5169 -> 5169 bytes .../ecore2cft/.MappingHandler.xtendbin | Bin 6876 -> 6876 bytes .../ecore2cft/.MappingQueries.xtendbin | Bin 4833 -> 4833 bytes .../ft2galileo/.Ft2GalileoTransformation.xtendbin | Bin 4794 -> 4794 bytes .../solver/.ReliabilityResult.xtendbin | Bin 5435 -> 5435 bytes .../solver/.StormDftConfiguration.xtendbin | Bin 4311 -> 4311 bytes .../solver/.StormDftHandler.xtendbin | Bin 13570 -> 13570 bytes .../transformation/solver/.StormDftSolver.xtendbin | Bin 4801 -> 4801 bytes .../bin/.gitignore | 1 + .../configs/generation.vsconfig | 2 +- 63 files changed, 514 insertions(+), 304 deletions(-) create mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/DseUtils.xtend create mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/IThreeValuedObjective.xtend create mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/LoggerSolutionFoundHandler.xtend create mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/SolutionCopier.xtend delete mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/SolutionStoreWithCopy.xtend create mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/SurelyViolatedObjectiveGlobalConstraint.xtend delete mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/UnfinishedWFObjective.xtend create mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ViatraReasonerSolutionSaver.xtend create mode 100644 Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.ui/bin/.gitignore (limited to 'Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic') diff --git a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin index 213b9134..ba53fa44 100644 Binary files a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin and b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin differ diff --git a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin index 21d26265..81608794 100644 Binary files a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin and b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin differ 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 3e879539..35ffaf65 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 @@ -138,7 +138,7 @@ class GenerationTaskExecutor { // 5.2 set values that defined directly solverConfig.solutionScope = new SolutionScope => [ - it.numberOfRequiredSolution = if(task.numberSpecified) { + it.numberOfRequiredSolutions = if(task.numberSpecified) { task.number } else { 1 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 a9573fbf..9eceef5f 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 @@ -75,7 +75,7 @@ class SolverLoader { ] } else if(solver === Solver::VIATRA_SOLVER) { return new ViatraReasonerConfiguration => [c| - c.debugCongiguration.partialInterpretatioVisualiser = new GraphvizVisualiser + c.debugConfiguration.partialInterpretatioVisualiser = new GraphvizVisualiser if(config.containsKey("diversity-range")) { val stringValue = config.get("diversity-range") try{ diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/scoping/ApplicationConfigurationScopeProvider.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/scoping/ApplicationConfigurationScopeProvider.xtend index 9d7e8aec..4daf9831 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/scoping/ApplicationConfigurationScopeProvider.xtend +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/scoping/ApplicationConfigurationScopeProvider.xtend @@ -10,6 +10,7 @@ import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.EPackageI import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.MetamodelElement import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.MetamodelEntry import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PatternEntry +import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ReliabilityObjectiveFunction import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ViatraImport import hu.bme.mit.inf.dslreasoner.faulttree.components.cftLanguage.CftModel import org.eclipse.emf.ecore.EClass @@ -22,7 +23,6 @@ import org.eclipse.xtext.naming.IQualifiedNameConverter import org.eclipse.xtext.scoping.Scopes import static hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ApplicationConfigurationPackage.Literals.* -import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ReliabilityObjectiveFunction /** * This class contains custom scoping description. diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/builder/LogicSolver.xtend b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/builder/LogicSolver.xtend index d88e2a52..e62a3cb7 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/builder/LogicSolver.xtend +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/builder/LogicSolver.xtend @@ -159,7 +159,7 @@ public class TypeScopes { */ public class SolutionScope { public static val All = Integer.MAX_VALUE; - public var numberOfRequiredSolution = 1 + public var numberOfRequiredSolutions = 1 } /** Progress monitor class for a solver to *
  • (optionally) report progress via {@link worked}
  • diff --git a/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/AlloySolver.xtend b/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/AlloySolver.xtend index 432651af..ceb78e99 100644 --- a/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/AlloySolver.xtend +++ b/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/AlloySolver.xtend @@ -57,7 +57,7 @@ class AlloySolver extends LogicReasoner{ val result2 = handler.callSolver(alloyProblem,workspace,alloyConfig,alloyCode) alloyConfig.progressMonitor.workedSearchFinished - val logicResult = backwardMapper.transformOutput(problem,configuration.solutionScope.numberOfRequiredSolution,result2,forwardTrace,transformationTime) + val logicResult = backwardMapper.transformOutput(problem,configuration.solutionScope.numberOfRequiredSolutions,result2,forwardTrace,transformationTime) alloyConfig.progressMonitor.workedBackwardTransformationFinished //val solverFinish = System.currentTimeMillis-solverStart // Finish: Solving Alloy problem diff --git a/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/AlloyHandler.xtend b/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/AlloyHandler.xtend index ebbca624..033ced04 100644 --- a/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/AlloyHandler.xtend +++ b/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/AlloyHandler.xtend @@ -184,7 +184,7 @@ class AlloyCallerWithTimeout implements Callable>>{ } else { lastAnswer = lastAnswer.next } - configuration.progressMonitor.workedBackwardTransformation(configuration.solutionScope.numberOfRequiredSolution) + configuration.progressMonitor.workedBackwardTransformation(configuration.solutionScope.numberOfRequiredSolutions) val runtime = System.currentTimeMillis -startTime synchronized(this) { @@ -201,8 +201,8 @@ class AlloyCallerWithTimeout implements Callable>>{ } def hasEnoughSolution(List answers) { - if(configuration.solutionScope.numberOfRequiredSolution < 0) return false - else return answers.size() == configuration.solutionScope.numberOfRequiredSolution + if(configuration.solutionScope.numberOfRequiredSolutions < 0) return false + else return answers.size() == configuration.solutionScope.numberOfRequiredSolutions } public def getPartialAnswers() { diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/MultiplicityGoalConstraintCalculator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/MultiplicityGoalConstraintCalculator.xtend index e05160d0..4b9629df 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/MultiplicityGoalConstraintCalculator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/MultiplicityGoalConstraintCalculator.xtend @@ -11,28 +11,28 @@ class MultiplicityGoalConstraintCalculator { val IQuerySpecification querySpecification; var ViatraQueryMatcher matcher; - public new(String targetRelationName, IQuerySpecification querySpecification) { + new(String targetRelationName, IQuerySpecification querySpecification) { this.targetRelationName = targetRelationName this.querySpecification = querySpecification this.matcher = null } - public new(MultiplicityGoalConstraintCalculator other) { + new(MultiplicityGoalConstraintCalculator other) { this.targetRelationName = other.targetRelationName this.querySpecification = other.querySpecification this.matcher = null } - def public getName() { + def getName() { targetRelationName } - def public init(Notifier notifier) { + def init(Notifier notifier) { val engine = ViatraQueryEngine.on(new EMFScope(notifier)) matcher = querySpecification.getMatcher(engine) } - def public calculateValue() { + def calculateValue() { var res = 0 val allMatches = this.matcher.allMatches for(match : allMatches) { diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasoner.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasoner.xtend index 6639e5f3..8831b0ff 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasoner.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasoner.xtend @@ -17,11 +17,13 @@ import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.par import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.statecoder.IdentifierBasedStateCoderFactory import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.statecoder.NeighbourhoodBasedStateCoderFactory import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.BestFirstStrategyForModelGeneration +import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.LoggerSolutionFoundHandler import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.ModelGenerationCompositeObjective import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.PartialModelAsLogicInterpretation import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.ScopeObjective +import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.SurelyViolatedObjectiveGlobalConstraint import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.UnfinishedMultiplicityObjective -import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.UnfinishedWFObjective +import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.ViatraReasonerSolutionSaver import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.WF2ObjectiveConverter import hu.bme.mit.inf.dslreasoner.workspace.ReasonerWorkspace import java.util.List @@ -31,44 +33,41 @@ import org.eclipse.viatra.dse.api.DesignSpaceExplorer import org.eclipse.viatra.dse.api.DesignSpaceExplorer.DseLoggingLevel import org.eclipse.viatra.dse.solutionstore.SolutionStore import org.eclipse.viatra.dse.statecode.IStateCoderFactory -import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.SolutionStoreWithDiversityDescriptor -import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.DiversityGranularity -class ViatraReasoner extends LogicReasoner{ +class ViatraReasoner extends LogicReasoner { val PartialInterpretationInitialiser initialiser = new PartialInterpretationInitialiser() val ModelGenerationMethodProvider modelGenerationMethodProvider = new ModelGenerationMethodProvider - val extension LogicresultFactory factory = LogicresultFactory.eINSTANCE + val extension LogicresultFactory factory = LogicresultFactory.eINSTANCE val WF2ObjectiveConverter wf2ObjectiveConverter = new WF2ObjectiveConverter - - - override solve(LogicProblem problem, LogicSolverConfiguration configuration, ReasonerWorkspace workspace) throws LogicReasonerException { + + override solve(LogicProblem problem, LogicSolverConfiguration configuration, + ReasonerWorkspace workspace) throws LogicReasonerException { val viatraConfig = configuration.asConfig - - if(viatraConfig.debugCongiguration.logging) { + + if (viatraConfig.debugConfiguration.logging) { DesignSpaceExplorer.turnOnLogging(DseLoggingLevel.VERBOSE_FULL) } else { DesignSpaceExplorer.turnOnLogging(DseLoggingLevel.WARN) } - + val DesignSpaceExplorer dse = new DesignSpaceExplorer(); - + dse.addMetaModelPackage(LogiclanguagePackage.eINSTANCE) dse.addMetaModelPackage(LogicproblemPackage.eINSTANCE) dse.addMetaModelPackage(PartialinterpretationPackage.eINSTANCE) - + val transformationStartTime = System.nanoTime - - - - val emptySolution = initialiser.initialisePartialInterpretation(problem,viatraConfig.typeScopes).output - if((viatraConfig.documentationLevel == DocumentationLevel::FULL || viatraConfig.documentationLevel == DocumentationLevel::NORMAL) && workspace !== null) { - workspace.writeModel(emptySolution,"init.partialmodel") - } + + val emptySolution = initialiser.initialisePartialInterpretation(problem, viatraConfig.typeScopes).output + if ((viatraConfig.documentationLevel == DocumentationLevel::FULL || + viatraConfig.documentationLevel == DocumentationLevel::NORMAL) && workspace !== null) { + workspace.writeModel(emptySolution, "init.partialmodel") + } emptySolution.problemConainer = problem - + val ScopePropagator scopePropagator = new ScopePropagator(emptySolution) - scopePropagator.propagateAllScopeConstraints - + scopePropagator.propagateAllScopeConstraints + val method = modelGenerationMethodProvider.createModelGenerationMethod( problem, emptySolution, @@ -78,138 +77,151 @@ class ViatraReasoner extends LogicReasoner{ scopePropagator, viatraConfig.documentationLevel ) - + dse.addObjective(new ModelGenerationCompositeObjective( new ScopeObjective, method.unfinishedMultiplicities.map[new UnfinishedMultiplicityObjective(it)], - new UnfinishedWFObjective(method.unfinishedWF) + wf2ObjectiveConverter.createCompletenessObjective(method.unfinishedWF) )) - dse.addGlobalConstraint(wf2ObjectiveConverter.createInvalidationObjective(method.invalidWF)) - for(additionalConstraint : viatraConfig.searchSpaceConstraints.additionalGlobalConstraints) { + val solutionStore = new SolutionStore(configuration.solutionScope.numberOfRequiredSolutions) + solutionStore.registerSolutionFoundHandler(new LoggerSolutionFoundHandler(viatraConfig)) + val solutionSaver = new ViatraReasonerSolutionSaver(newArrayOfSize(0, 0)) + val solutionCopier = solutionSaver.solutionCopier + solutionStore.withSolutionSaver(solutionSaver) + dse.solutionStore = solutionStore + + dse.addGlobalConstraint(wf2ObjectiveConverter.createInvalidationGlobalConstraint(method.invalidWF)) + dse.addGlobalConstraint(new SurelyViolatedObjectiveGlobalConstraint(solutionSaver)) + for (additionalConstraint : viatraConfig.searchSpaceConstraints.additionalGlobalConstraints) { dse.addGlobalConstraint(additionalConstraint.apply(method)) } - - dse.setInitialModel(emptySolution,false) - - val IStateCoderFactory statecoder = if(viatraConfig.stateCoderStrategy == StateCoderStrategy.Neighbourhood) { - new NeighbourhoodBasedStateCoderFactory - } else { - new IdentifierBasedStateCoderFactory - } + + dse.setInitialModel(emptySolution, false) + + val IStateCoderFactory statecoder = if (viatraConfig.stateCoderStrategy == StateCoderStrategy.Neighbourhood) { + new NeighbourhoodBasedStateCoderFactory + } else { + new IdentifierBasedStateCoderFactory + } dse.stateCoderFactory = statecoder - + dse.maxNumberOfThreads = 1 - - val solutionStore = new SolutionStore(configuration.solutionScope.numberOfRequiredSolution) - dse.solutionStore = solutionStore - - for(rule : method.relationRefinementRules) { + + for (rule : method.relationRefinementRules) { dse.addTransformationRule(rule) } - for(rule : method.objectRefinementRules) { + for (rule : method.objectRefinementRules) { dse.addTransformationRule(rule) } - - val strategy = new BestFirstStrategyForModelGeneration(workspace,viatraConfig,method) + + val strategy = new BestFirstStrategyForModelGeneration(workspace, viatraConfig, method) viatraConfig.progressMonitor.workedForwardTransformation - + val transformationTime = System.nanoTime - transformationStartTime val solverStartTime = System.nanoTime - + var boolean stoppedByTimeout - var boolean stoppedByException - try{ - stoppedByTimeout = dse.startExplorationWithTimeout(strategy,configuration.runtimeLimit*1000); - stoppedByException = false + try { + stoppedByTimeout = dse.startExplorationWithTimeout(strategy, configuration.runtimeLimit * 1000); } catch (NullPointerException npe) { stoppedByTimeout = false - stoppedByException = true } val solverTime = System.nanoTime - solverStartTime viatraConfig.progressMonitor.workedSearchFinished - - //additionalMatches = strategy.solutionStoreWithCopy.additionalMatches + + // additionalMatches = strategy.solutionStoreWithCopy.additionalMatches val statistics = createStatistics => [ - //it.solverTime = viatraConfig.runtimeLimit - it.solverTime = (solverTime/1000000) as int - it.transformationTime = (transformationTime/1000000) as int - for(x : 0.. [ - it.name = '''_Solution«x»FoundAt''' - it.value = (strategy.solutionStoreWithCopy.allRuntimes.get(x)/1000000) as int + it.name = '''_Solution«pair.key»FoundAt''' + it.value = (pair.value / 1000000) as int ] } it.entries += createIntStatisticEntry => [ - it.name = "TransformationExecutionTime" it.value = (method.statistics.transformationExecutionTime/1000000) as int + it.name = "TransformationExecutionTime" + it.value = (method.statistics.transformationExecutionTime / 1000000) as int ] it.entries += createIntStatisticEntry => [ - it.name = "TypeAnalysisTime" it.value = (method.statistics.PreliminaryTypeAnalisisTime/1000000) as int + it.name = "TypeAnalysisTime" + it.value = (method.statistics.PreliminaryTypeAnalisisTime / 1000000) as int ] it.entries += createIntStatisticEntry => [ - it.name = "StateCoderTime" it.value = (statecoder.runtime/1000000) as int + it.name = "StateCoderTime" + it.value = (statecoder.runtime / 1000000) as int ] it.entries += createIntStatisticEntry => [ - it.name = "StateCoderFailCount" it.value = strategy.numberOfStatecoderFail + it.name = "StateCoderFailCount" + it.value = strategy.numberOfStatecoderFail ] it.entries += createIntStatisticEntry => [ - it.name = "SolutionCopyTime" it.value = (strategy.solutionStoreWithCopy.sumRuntime/1000000) as int + it.name = "SolutionCopyTime" + it.value = (solutionCopier.getTotalCopierRuntime / 1000000) as int ] - if(strategy.solutionStoreWithDiversityDescriptor.isActive) { + if (strategy.solutionStoreWithDiversityDescriptor.isActive) { it.entries += createIntStatisticEntry => [ - it.name = "SolutionDiversityCheckTime" it.value = (strategy.solutionStoreWithDiversityDescriptor.sumRuntime/1000000) as int + it.name = "SolutionDiversityCheckTime" + it.value = (strategy.solutionStoreWithDiversityDescriptor.sumRuntime / 1000000) as int ] it.entries += createRealStatisticEntry => [ - it.name = "SolutionDiversitySuccessRate" it.value = strategy.solutionStoreWithDiversityDescriptor.successRate + it.name = "SolutionDiversitySuccessRate" + it.value = strategy.solutionStoreWithDiversityDescriptor.successRate ] } ] - + viatraConfig.progressMonitor.workedBackwardTransformationFinished - - if(stoppedByTimeout) { - return createInsuficientResourcesResult=>[ + + if (stoppedByTimeout) { + return createInsuficientResourcesResult => [ it.problem = problem - it.resourceName="time" - it.representation += strategy.solutionStoreWithCopy.solutions + it.resourceName = "time" + it.representation += solutionCopier.getPartialInterpretations(true) it.statistics = statistics ] } else { - if(solutionStore.solutions.empty) { + if (solutionStore.solutions.empty) { return createInconsistencyResult => [ it.problem = problem - it.representation += strategy.solutionStoreWithCopy.solutions + it.representation += solutionCopier.getPartialInterpretations(true) it.statistics = statistics ] } else { return createModelResult => [ it.problem = problem - it.trace = strategy.solutionStoreWithCopy.copyTraces - it.representation += strategy.solutionStoreWithCopy.solutions + it.trace = solutionCopier.getTraces(true) + it.representation += solutionCopier.getPartialInterpretations(true) it.statistics = statistics ] } } } - private def dispatch long runtime(NeighbourhoodBasedStateCoderFactory sc) { - sc.sumStatecoderRuntime - } + private def dispatch long runtime(NeighbourhoodBasedStateCoderFactory sc) { + sc.sumStatecoderRuntime + } - private def dispatch long runtime(IdentifierBasedStateCoderFactory sc) { - sc.sumStatecoderRuntime - } + private def dispatch long runtime(IdentifierBasedStateCoderFactory sc) { + sc.sumStatecoderRuntime + } override getInterpretations(ModelResult modelResult) { - val indexes = 0..>; - val res = indexes.map[i | new PartialModelAsLogicInterpretation(modelResult.representation.get(i) as PartialInterpretation,traces.get(i))].toList + val res = indexes.map [ i | + new PartialModelAsLogicInterpretation(modelResult.representation.get(i) as PartialInterpretation, + traces.get(i)) + ].toList return res } - + private def ViatraReasonerConfiguration asConfig(LogicSolverConfiguration configuration) { - if(configuration instanceof ViatraReasonerConfiguration) { + if (configuration instanceof ViatraReasonerConfiguration) { return configuration - } else throw new IllegalArgumentException('''Wrong configuration. Expected: «ViatraReasonerConfiguration.name», but got: «configuration.class.name»"''') + } else + throw new IllegalArgumentException('''Wrong configuration. Expected: «ViatraReasonerConfiguration.name», but got: «configuration.class.name»"''') } } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasonerConfiguration.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasonerConfiguration.xtend index c4d7e231..9ef23c59 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasonerConfiguration.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasonerConfiguration.xtend @@ -12,7 +12,7 @@ import java.util.List import java.util.Set import org.eclipse.xtext.xbase.lib.Functions.Function1 -public enum StateCoderStrategy { +enum StateCoderStrategy { Neighbourhood, NeighbourhoodWithEquivalence, IDBased, DefinedByDiversity } @@ -40,14 +40,14 @@ class ViatraReasonerConfiguration extends LogicSolverConfiguration{ /** * Configuration for debugging support. */ - public var DebugConfiguration debugCongiguration = new DebugConfiguration + public var DebugConfiguration debugConfiguration = new DebugConfiguration /** * Configuration for cutting search space. */ public var SearchSpaceConstraint searchSpaceConstraints = new SearchSpaceConstraint } -public class DiversityDescriptor { +class DiversityDescriptor { public var ensureDiversity = false public static val FixPointRange = -1 public var int range = FixPointRange @@ -57,19 +57,19 @@ public class DiversityDescriptor { public var Set relevantRelations = null } -public class DebugConfiguration { +class DebugConfiguration { public var logging = false public var PartialInterpretationVisualiser partialInterpretatioVisualiser = null; public var partalInterpretationVisualisationFrequency = 1 } -public class InternalConsistencyCheckerConfiguration { +class InternalConsistencyCheckerConfiguration { public var LogicReasoner internalIncosnsitencyDetector = null public var LogicSolverConfiguration internalInconsistencDetectorConfiguration = null public var incternalConsistencyCheckingFrequency = 1 } -public class SearchSpaceConstraint { +class SearchSpaceConstraint { public static val UNLIMITED_MAXDEPTH = Integer.MAX_VALUE public var int maxDepth = UNLIMITED_MAXDEPTH public var List> additionalGlobalConstraints = new LinkedList diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java index 60f46033..1234d54b 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java @@ -75,7 +75,6 @@ public class BestFirstStrategyForModelGeneration implements IStrategy { // Running private PriorityQueue trajectoiresToExplore; private SolutionStore solutionStore; - private SolutionStoreWithCopy solutionStoreWithCopy; private SolutionStoreWithDiversityDescriptor solutionStoreWithDiversityDescriptor; private volatile boolean isInterrupted = false; private ModelResult modelResultByInternalSolver = null; @@ -97,9 +96,6 @@ public class BestFirstStrategyForModelGeneration implements IStrategy { this.method = method; } - public SolutionStoreWithCopy getSolutionStoreWithCopy() { - return solutionStoreWithCopy; - } public SolutionStoreWithDiversityDescriptor getSolutionStoreWithDiversityDescriptor() { return solutionStoreWithDiversityDescriptor; } @@ -121,7 +117,6 @@ public class BestFirstStrategyForModelGeneration implements IStrategy { matchers.add(matcher); } - this.solutionStoreWithCopy = new SolutionStoreWithCopy(); this.solutionStoreWithDiversityDescriptor = new SolutionStoreWithDiversityDescriptor(configuration.diversityRequirement); final ObjectiveComparatorHelper objectiveComparatorHelper = context.getObjectiveComparatorHelper(); @@ -146,13 +141,13 @@ public class BestFirstStrategyForModelGeneration implements IStrategy { return; } - final Fitness firstFittness = context.calculateFitness(); - checkForSolution(firstFittness); + final Fitness firstfitness = context.calculateFitness(); + checkForSolution(firstfitness); final ObjectiveComparatorHelper objectiveComparatorHelper = context.getObjectiveComparatorHelper(); final Object[] firstTrajectory = context.getTrajectory().toArray(new Object[0]); - TrajectoryWithFitness currentTrajectoryWithFittness = new TrajectoryWithFitness(firstTrajectory, firstFittness); - trajectoiresToExplore.add(currentTrajectoryWithFittness); + TrajectoryWithFitness currentTrajectoryWithfitness = new TrajectoryWithFitness(firstTrajectory, firstfitness); + trajectoiresToExplore.add(currentTrajectoryWithfitness); //if(configuration) visualiseCurrentState(); @@ -167,22 +162,22 @@ public class BestFirstStrategyForModelGeneration implements IStrategy { mainLoop: while (!isInterrupted && !configuration.progressMonitor.isCancelled()) { - if (currentTrajectoryWithFittness == null) { + if (currentTrajectoryWithfitness == null) { if (trajectoiresToExplore.isEmpty()) { logger.debug("State space is fully traversed."); return; } else { - currentTrajectoryWithFittness = selectState(); + currentTrajectoryWithfitness = selectState(); if (logger.isDebugEnabled()) { logger.debug("Current trajectory: " + Arrays.toString(context.getTrajectory().toArray())); - logger.debug("New trajectory is chosen: " + currentTrajectoryWithFittness); + logger.debug("New trajectory is chosen: " + currentTrajectoryWithfitness); } - context.getDesignSpaceManager().executeTrajectoryWithMinimalBacktrackWithoutStateCoding(currentTrajectoryWithFittness.trajectory); + context.getDesignSpaceManager().executeTrajectoryWithMinimalBacktrackWithoutStateCoding(currentTrajectoryWithfitness.trajectory); } } // visualiseCurrentState(); -// boolean consistencyCheckResult = checkConsistency(currentTrajectoryWithFittness); +// boolean consistencyCheckResult = checkConsistency(currentTrajectoryWithfitness); // if(consistencyCheckResult == true) { // continue mainLoop; // } @@ -194,7 +189,7 @@ public class BestFirstStrategyForModelGeneration implements IStrategy { final Object nextActivation = iterator.next(); // if (!iterator.hasNext()) { // logger.debug("Last untraversed activation of the state."); -// trajectoiresToExplore.remove(currentTrajectoryWithFittness); +// trajectoiresToExplore.remove(currentTrajectoryWithfitness); // } logger.debug("Executing new activation: " + nextActivation); context.executeAcitvationId(nextActivation); @@ -209,7 +204,7 @@ public class BestFirstStrategyForModelGeneration implements IStrategy { // System.out.println("---------"); // } - boolean consistencyCheckResult = checkConsistency(currentTrajectoryWithFittness); + boolean consistencyCheckResult = checkConsistency(currentTrajectoryWithfitness); if(consistencyCheckResult == true) { continue mainLoop; } if (context.isCurrentStateAlreadyTraversed()) { @@ -227,31 +222,31 @@ public class BestFirstStrategyForModelGeneration implements IStrategy { continue; } - TrajectoryWithFitness nextTrajectoryWithFittness = new TrajectoryWithFitness( + TrajectoryWithFitness nextTrajectoryWithfitness = new TrajectoryWithFitness( context.getTrajectory().toArray(), nextFitness); - trajectoiresToExplore.add(nextTrajectoryWithFittness); + trajectoiresToExplore.add(nextTrajectoryWithfitness); - int compare = objectiveComparatorHelper.compare(currentTrajectoryWithFittness.fitness, - nextTrajectoryWithFittness.fitness); + int compare = objectiveComparatorHelper.compare(currentTrajectoryWithfitness.fitness, + nextTrajectoryWithfitness.fitness); if (compare < 0) { logger.debug("Better fitness, moving on: " + nextFitness); - currentTrajectoryWithFittness = nextTrajectoryWithFittness; + currentTrajectoryWithfitness = nextTrajectoryWithfitness; continue mainLoop; } else if (compare == 0) { logger.debug("Equally good fitness, moving on: " + nextFitness); - currentTrajectoryWithFittness = nextTrajectoryWithFittness; + currentTrajectoryWithfitness = nextTrajectoryWithfitness; continue mainLoop; } else { logger.debug("Worse fitness."); - currentTrajectoryWithFittness = null; + currentTrajectoryWithfitness = null; continue mainLoop; } } } logger.debug("State is fully traversed."); - trajectoiresToExplore.remove(currentTrajectoryWithFittness); - currentTrajectoryWithFittness = null; + trajectoiresToExplore.remove(currentTrajectoryWithfitness); + currentTrajectoryWithfitness = null; } logger.info("Interrupted."); @@ -269,15 +264,11 @@ public class BestFirstStrategyForModelGeneration implements IStrategy { return activationIds; } - private void checkForSolution(final Fitness fittness) { - if (fittness.isSatisifiesHardObjectives()) { + private void checkForSolution(final Fitness fitness) { + if (fitness.isSatisifiesHardObjectives()) { if (solutionStoreWithDiversityDescriptor.isDifferent(context)) { - solutionStoreWithCopy.newSolution(context); solutionStoreWithDiversityDescriptor.newSolution(context); solutionStore.newSolution(context); - configuration.progressMonitor.workedModelFound(configuration.solutionScope.numberOfRequiredSolution); - - logger.debug("Found a solution."); } } } @@ -311,11 +302,11 @@ public class BestFirstStrategyForModelGeneration implements IStrategy { } public void visualiseCurrentState() { - PartialInterpretationVisualiser partialInterpretatioVisualiser = configuration.debugCongiguration.partialInterpretatioVisualiser; + PartialInterpretationVisualiser partialInterpretatioVisualiser = configuration.debugConfiguration.partialInterpretatioVisualiser; if(partialInterpretatioVisualiser != null && this.configuration.documentationLevel == DocumentationLevel.FULL && workspace != null) { PartialInterpretation p = (PartialInterpretation) (context.getModel()); int id = ++numberOfPrintedModel; - if (id % configuration.debugCongiguration.partalInterpretationVisualisationFrequency == 0) { + if (id % configuration.debugConfiguration.partalInterpretationVisualisationFrequency == 0) { PartialInterpretationVisualisation visualisation = partialInterpretatioVisualiser.visualiseConcretization(p); visualisation.writeToFile(workspace, String.format("state%09d.png", id)); } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/DseUtils.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/DseUtils.xtend new file mode 100644 index 00000000..3a897aa3 --- /dev/null +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/DseUtils.xtend @@ -0,0 +1,65 @@ +package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse + +import org.eclipse.viatra.dse.base.ThreadContext +import org.eclipse.viatra.dse.objectives.Comparators +import org.eclipse.viatra.dse.objectives.Fitness +import org.eclipse.viatra.dse.objectives.IObjective + +final class DseUtils { + private new() { + throw new IllegalStateException("This is a static utility class and should not be instantiated directly.") + } + + static def calculateFitness(ThreadContext it, (IObjective)=>Double getFitness) { + val result = new Fitness + var boolean satisifiesHardObjectives = true + for (objective : objectives) { + val fitness = getFitness.apply(objective) + result.put(objective.name, fitness) + if (objective.isHardObjective() && !objective.satisifiesHardObjective(fitness)) { + satisifiesHardObjectives = false + } + } + result.satisifiesHardObjectives = satisifiesHardObjectives + result + } + + static def caclulateBestPossibleFitness(ThreadContext threadContext) { + threadContext.calculateFitness [ objective | + if (objective instanceof IThreeValuedObjective) { + objective.getBestPossibleFitness(threadContext) + } else { + switch (objective.comparator) { + case Comparators.LOWER_IS_BETTER: + Double.NEGATIVE_INFINITY + case Comparators.HIGHER_IS_BETTER: + Double.POSITIVE_INFINITY + case Comparators.DIFFERENCE_TO_ZERO_IS_BETTER: + 0.0 + default: + throw new IllegalArgumentException("Unknown comparator for non-three-valued objective: " + + objective.name) + } + } + ] + } + + static def caclulateWorstPossibleFitness(ThreadContext threadContext) { + threadContext.calculateFitness [ objective | + if (objective instanceof IThreeValuedObjective) { + objective.getWorstPossibleFitness(threadContext) + } else { + switch (objective.comparator) { + case Comparators.LOWER_IS_BETTER, + case Comparators.DIFFERENCE_TO_ZERO_IS_BETTER: + Double.POSITIVE_INFINITY + case Comparators.HIGHER_IS_BETTER: + Double.NEGATIVE_INFINITY + default: + throw new IllegalArgumentException("Unknown comparator for non-three-valued objective: " + + objective.name) + } + } + ] + } +} diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/IThreeValuedObjective.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/IThreeValuedObjective.xtend new file mode 100644 index 00000000..8c93d4ec --- /dev/null +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/IThreeValuedObjective.xtend @@ -0,0 +1,10 @@ +package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse + +import org.eclipse.viatra.dse.base.ThreadContext +import org.eclipse.viatra.dse.objectives.IObjective + +interface IThreeValuedObjective extends IObjective { + def Double getWorstPossibleFitness(ThreadContext threadContext) + + def Double getBestPossibleFitness(ThreadContext threadContext) +} diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/LoggerSolutionFoundHandler.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/LoggerSolutionFoundHandler.xtend new file mode 100644 index 00000000..39ef5f9a --- /dev/null +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/LoggerSolutionFoundHandler.xtend @@ -0,0 +1,24 @@ +package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse + +import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration +import org.apache.log4j.Logger +import org.eclipse.viatra.dse.api.SolutionTrajectory +import org.eclipse.viatra.dse.base.ThreadContext +import org.eclipse.viatra.dse.solutionstore.ISolutionFoundHandler +import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor + +@FinalFieldsConstructor +class LoggerSolutionFoundHandler implements ISolutionFoundHandler { + val ViatraReasonerConfiguration configuration + + val logger = Logger.getLogger(SolutionCopier) + + override solutionFound(ThreadContext context, SolutionTrajectory trajectory) { + configuration.progressMonitor.workedModelFound(configuration.solutionScope.numberOfRequiredSolutions) + logger.debug("Found a solution.") + } + + override solutionTriedToSave(ThreadContext context, SolutionTrajectory trajectory) { + // We are not interested in invalid solutions, ignore. + } +} diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ModelGenerationCompositeObjective.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ModelGenerationCompositeObjective.xtend index 2489c751..af6d1bbd 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ModelGenerationCompositeObjective.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ModelGenerationCompositeObjective.xtend @@ -1,11 +1,12 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse +import com.google.common.collect.ImmutableList import java.util.Comparator import java.util.List import org.eclipse.viatra.dse.base.ThreadContext import org.eclipse.viatra.dse.objectives.Comparators import org.eclipse.viatra.dse.objectives.IObjective -import org.eclipse.viatra.dse.objectives.impl.BaseObjective +import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor //class ViatraReasonerNumbers { // public static val scopePriority = 2 @@ -22,64 +23,66 @@ import org.eclipse.viatra.dse.objectives.impl.BaseObjective // public static val compositePriority = 2 //} -class ModelGenerationCompositeObjective implements IObjective{ - val ScopeObjective scopeObjective - val List unfinishedMultiplicityObjectives - val UnfinishedWFObjective unfinishedWFObjective - - public new( - ScopeObjective scopeObjective, - List unfinishedMultiplicityObjectives, - UnfinishedWFObjective unfinishedWFObjective) - { - this.scopeObjective = scopeObjective - this.unfinishedMultiplicityObjectives = unfinishedMultiplicityObjectives - this.unfinishedWFObjective = unfinishedWFObjective - } - +@FinalFieldsConstructor +class ModelGenerationCompositeObjective implements IThreeValuedObjective { + val IObjective scopeObjective + val List unfinishedMultiplicityObjectives + val IObjective unfinishedWFObjective + override init(ThreadContext context) { this.scopeObjective.init(context) this.unfinishedMultiplicityObjectives.forEach[it.init(context)] this.unfinishedWFObjective.init(context) } - + override createNew() { return new ModelGenerationCompositeObjective( - this.scopeObjective, this.unfinishedMultiplicityObjectives, this.unfinishedWFObjective) + scopeObjective.createNew, + ImmutableList.copyOf(unfinishedMultiplicityObjectives.map[createNew]), + unfinishedWFObjective.createNew + ) } - + override getComparator() { Comparators.LOWER_IS_BETTER } + override getFitness(ThreadContext context) { var sum = 0.0 val scopeFitnes = scopeObjective.getFitness(context) - //val unfinishedMultiplicitiesFitneses = unfinishedMultiplicityObjectives.map[x|x.getFitness(context)] + // val unfinishedMultiplicitiesFitneses = unfinishedMultiplicityObjectives.map[x|x.getFitness(context)] val unfinishedWFsFitness = unfinishedWFObjective.getFitness(context) - - sum+=scopeFitnes + + sum += scopeFitnes var multiplicity = 0.0 - for(multiplicityObjective : unfinishedMultiplicityObjectives) { - multiplicity+=multiplicityObjective.getFitness(context)//*0.5 + for (multiplicityObjective : unfinishedMultiplicityObjectives) { + multiplicity += multiplicityObjective.getFitness(context) // *0.5 } - sum+=multiplicity - sum += unfinishedWFsFitness//*0.5 - - //println('''Sum=«sum»|Scope=«scopeFitnes»|Multiplicity=«multiplicity»|WFs=«unfinishedWFsFitness»''') - + sum += multiplicity + sum += unfinishedWFsFitness // *0.5 + // println('''Sum=«sum»|Scope=«scopeFitnes»|Multiplicity=«multiplicity»|WFs=«unfinishedWFsFitness»''') return sum } - override getLevel() { 2 } - override getName() { "CompositeUnfinishednessObjective"} + override getWorstPossibleFitness(ThreadContext threadContext) { + Double.POSITIVE_INFINITY + } + override getBestPossibleFitness(ThreadContext threadContext) { + 0.0 + } + + override getLevel() { 2 } + + override getName() { "CompositeUnfinishednessObjective" } + override isHardObjective() { true } + override satisifiesHardObjective(Double fitness) { fitness <= 0.001 } - - + override setComparator(Comparator comparator) { - throw new UnsupportedOperationException("TODO: auto-generated method stub") + throw new UnsupportedOperationException("Model generation objective comparator cannot be set.") } + override setLevel(int level) { - throw new UnsupportedOperationException("TODO: auto-generated method stub") + throw new UnsupportedOperationException("Model generation objective level cannot be set.") } - -} \ No newline at end of file +} diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/SolutionCopier.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/SolutionCopier.xtend new file mode 100644 index 00000000..d036257d --- /dev/null +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/SolutionCopier.xtend @@ -0,0 +1,74 @@ +package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse + +import com.google.common.collect.ImmutableList +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation +import java.util.LinkedHashMap +import java.util.List +import java.util.Map +import org.eclipse.emf.ecore.EObject +import org.eclipse.emf.ecore.util.EcoreUtil +import org.eclipse.viatra.dse.base.ThreadContext +import org.eclipse.xtend.lib.annotations.Accessors +import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor + +@FinalFieldsConstructor +class CopiedSolution { + @Accessors val PartialInterpretation partialInterpretations + @Accessors val Map trace + @Accessors val long copierRuntime + @Accessors var boolean current = true +} + +class SolutionCopier { + val copiedSolutions = new LinkedHashMap + + long startTime = System.nanoTime + @Accessors(PUBLIC_GETTER) long totalCopierRuntime = 0 + + def void copySolution(ThreadContext context, Object solutionId) { + val existingCopy = copiedSolutions.get(solutionId) + if (existingCopy === null) { + val copyStart = System.nanoTime + val solution = context.model as PartialInterpretation + val copier = new EcoreUtil.Copier + val copiedPartialInterpretation = copier.copy(solution) as PartialInterpretation + copier.copyReferences + totalCopierRuntime += System.nanoTime - copyStart + val copierRuntime = System.nanoTime - startTime + val copiedSolution = new CopiedSolution(copiedPartialInterpretation, copier, copierRuntime) + copiedSolutions.put(solutionId, copiedSolution) + } else { + existingCopy.current = true + } + } + + def void markAsObsolete(Object solutionId) { + val copiedSolution = copiedSolutions.get(solutionId) + if (copiedSolution === null) { + throw new IllegalStateException("No solution to mark as obsolete for state code: " + solutionId) + } + copiedSolution.current = false + } + + def List getPartialInterpretations(boolean currentOnly) { + getListOfCopiedSolutions(currentOnly).map[partialInterpretations] + } + + def List> getTraces(boolean currentOnly) { + getListOfCopiedSolutions(currentOnly).map[trace] + } + + def List getAllCopierRuntimes(boolean currentOnly) { + getListOfCopiedSolutions(currentOnly).map[copierRuntime] + } + + def List getListOfCopiedSolutions(boolean currentOnly) { + val values = copiedSolutions.values + val filteredSolutions = if (currentOnly) { + values.filter[current] + } else { + values + } + ImmutableList.copyOf(filteredSolutions) + } +} diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/SolutionStoreWithCopy.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/SolutionStoreWithCopy.xtend deleted file mode 100644 index a8b7301e..00000000 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/SolutionStoreWithCopy.xtend +++ /dev/null @@ -1,52 +0,0 @@ -package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse - -import java.util.List -import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation -import java.util.LinkedList -import org.eclipse.emf.ecore.EObject -import java.util.Map -import org.eclipse.emf.ecore.util.EcoreUtil -import org.eclipse.viatra.dse.base.ThreadContext -import java.util.TreeMap -import java.util.SortedMap - -class SolutionStoreWithCopy { - - long runtime = 0 - List solutions = new LinkedList - //public List> additionalMatches = new LinkedList - List> copyTraces = new LinkedList - - long sartTime = System.nanoTime - List solutionTimes = new LinkedList - - /*def newSolution(ThreadContext context, SortedMap additonalMatch) { - additionalMatches+= additonalMatch - newSolution(context) - }*/ - - def newSolution(ThreadContext context) { - //print(System.nanoTime-initTime + ";") - val copyStart = System.nanoTime - val solution = context.model as PartialInterpretation - val copier = new EcoreUtil.Copier - val solutionCopy = copier.copy(solution) as PartialInterpretation - copier.copyReferences - solutions.add(solutionCopy) - copyTraces.add(copier) - runtime += System.nanoTime - copyStart - solutionTimes.add(System.nanoTime-sartTime) - } - def getSumRuntime() { - return runtime - } - def getAllRuntimes() { - return solutionTimes - } - def getSolutions() { - solutions - } - def getCopyTraces() { - return copyTraces - } -} \ No newline at end of file diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/SurelyViolatedObjectiveGlobalConstraint.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/SurelyViolatedObjectiveGlobalConstraint.xtend new file mode 100644 index 00000000..7fd494a0 --- /dev/null +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/SurelyViolatedObjectiveGlobalConstraint.xtend @@ -0,0 +1,29 @@ +package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse + +import org.eclipse.viatra.dse.base.ThreadContext +import org.eclipse.viatra.dse.objectives.IGlobalConstraint +import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor + +@FinalFieldsConstructor +class SurelyViolatedObjectiveGlobalConstraint implements IGlobalConstraint { + val ViatraReasonerSolutionSaver solutionSaver + + override init(ThreadContext context) { + if (solutionSaver !== null) { + return + } + } + + override createNew() { + this + } + + override getName() { + class.name + } + + override checkGlobalConstraint(ThreadContext context) { + val bestFitness = DseUtils.caclulateBestPossibleFitness(context) + bestFitness.satisifiesHardObjectives && !solutionSaver.isFitnessDominated(bestFitness) + } +} diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/UnfinishedMultiplicityObjective.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/UnfinishedMultiplicityObjective.xtend index aad9a448..7d0a7884 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/UnfinishedMultiplicityObjective.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/UnfinishedMultiplicityObjective.xtend @@ -9,7 +9,7 @@ import org.eclipse.viatra.dse.objectives.Comparators class UnfinishedMultiplicityObjective implements IObjective { val MultiplicityGoalConstraintCalculator unfinishedMultiplicity; - public new(MultiplicityGoalConstraintCalculator unfinishedMultiplicity) { + new(MultiplicityGoalConstraintCalculator unfinishedMultiplicity) { this.unfinishedMultiplicity = unfinishedMultiplicity } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/UnfinishedWFObjective.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/UnfinishedWFObjective.xtend deleted file mode 100644 index e0111cf6..00000000 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/UnfinishedWFObjective.xtend +++ /dev/null @@ -1,56 +0,0 @@ -package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse - -import org.eclipse.viatra.dse.objectives.IObjective -import org.eclipse.viatra.query.runtime.api.IPatternMatch -import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher -import org.eclipse.viatra.query.runtime.api.IQuerySpecification -import java.util.Collection -import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine -import org.eclipse.viatra.query.runtime.emf.EMFScope -import org.eclipse.viatra.dse.base.ThreadContext -import java.util.List -import org.eclipse.viatra.dse.objectives.Comparators -import java.util.ArrayList -import java.util.Comparator - -class UnfinishedWFObjective implements IObjective { - Collection>> unfinishedWFs - val List> matchers - - public new(Collection>> unfinishedWFs) { - this.unfinishedWFs = unfinishedWFs - matchers = new ArrayList(unfinishedWFs.size) - } - override getName() '''unfinishedWFs''' - override createNew() { - return new UnfinishedWFObjective(unfinishedWFs) - } - override init(ThreadContext context) { - val engine = context.queryEngine//ViatraQueryEngine.on(new EMFScope(context.model)) - for(unfinishedWF : unfinishedWFs) { - matchers += unfinishedWF.getMatcher(engine) - } - } - - override getComparator() { Comparators.LOWER_IS_BETTER } - override getFitness(ThreadContext context) { - var sumOfMatches = 0 - for(matcher : matchers) { - val number = matcher.countMatches - //println('''«matcher.patternName» = «number»''') - sumOfMatches+=number - } - return sumOfMatches.doubleValue - } - - override getLevel() { 2 } - override isHardObjective() { true } - override satisifiesHardObjective(Double fitness) { return fitness <=0.01 } - - override setComparator(Comparator comparator) { - throw new UnsupportedOperationException("TODO: auto-generated method stub") - } - override setLevel(int level) { - throw new UnsupportedOperationException("TODO: auto-generated method stub") - } -} \ No newline at end of file diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ViatraReasonerSolutionSaver.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ViatraReasonerSolutionSaver.xtend new file mode 100644 index 00000000..5877778e --- /dev/null +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ViatraReasonerSolutionSaver.xtend @@ -0,0 +1,99 @@ +package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse + +import java.util.HashMap +import java.util.Map +import org.eclipse.viatra.dse.api.DSEException +import org.eclipse.viatra.dse.api.Solution +import org.eclipse.viatra.dse.api.SolutionTrajectory +import org.eclipse.viatra.dse.base.ThreadContext +import org.eclipse.viatra.dse.objectives.Fitness +import org.eclipse.viatra.dse.objectives.IObjective +import org.eclipse.viatra.dse.objectives.ObjectiveComparatorHelper +import org.eclipse.viatra.dse.solutionstore.SolutionStore.ISolutionSaver +import org.eclipse.xtend.lib.annotations.Accessors + +/** + * Based on {@link org.eclipse.viatra.dse.solutionstore.SolutionStore.BestSolutionSaver}. + */ +class ViatraReasonerSolutionSaver implements ISolutionSaver { + @Accessors val solutionCopier = new SolutionCopier + val boolean hasExtremalObjectives + val ObjectiveComparatorHelper comparatorHelper + val Map trajectories = new HashMap + + @Accessors(PUBLIC_SETTER) var Map solutionsCollection + + new(IObjective[][] leveledExtremalObjectives) { + comparatorHelper = new ObjectiveComparatorHelper(leveledExtremalObjectives) + hasExtremalObjectives = leveledExtremalObjectives.exists[!empty] + } + + override saveSolution(ThreadContext context, Object id, SolutionTrajectory solutionTrajectory) { + if (hasExtremalObjectives) { + saveBestSolutionOnly(context, id, solutionTrajectory) + } else { + basicSaveSolution(context, id, solutionTrajectory) + } + } + + private def saveBestSolutionOnly(ThreadContext context, Object id, SolutionTrajectory solutionTrajectory) { + val fitness = context.lastFitness + val dominatedTrajectories = newArrayList + for (entry : trajectories.entrySet) { + val isLastFitnessBetter = comparatorHelper.compare(fitness, entry.value) + if (isLastFitnessBetter < 0) { + // Found a trajectory that dominates the current one, no need to save + return false + } + if (isLastFitnessBetter > 0) { + dominatedTrajectories += entry.key + } + } + // We must save the new trajectory before removing dominated trajectories + // to avoid removing the current solution when it is reachable only via dominated trajectories. + val solutionSaved = basicSaveSolution(context, id, solutionTrajectory) + for (dominatedTrajectory : dominatedTrajectories) { + trajectories -= dominatedTrajectory + val dominatedSolution = dominatedTrajectory.solution + if (!dominatedSolution.trajectories.remove(dominatedTrajectory)) { + throw new DSEException( + "Dominated solution is not reachable from dominated trajectory. This should never happen!") + } + if (dominatedSolution.trajectories.empty) { + val dominatedSolutionId = dominatedSolution.stateCode + solutionCopier.markAsObsolete(dominatedSolutionId) + solutionsCollection -= dominatedSolutionId + } + } + solutionSaved + } + + private def basicSaveSolution(ThreadContext context, Object id, SolutionTrajectory solutionTrajectory) { + val fitness = context.lastFitness + var boolean solutionSaved = false + var dseSolution = solutionsCollection.get(id) + if (dseSolution === null) { + solutionCopier.copySolution(context, id) + dseSolution = new Solution(id, solutionTrajectory) + solutionsCollection.put(id, dseSolution) + solutionSaved = true + } else { + solutionSaved = dseSolution.trajectories.add(solutionTrajectory) + } + if (solutionSaved) { + solutionTrajectory.solution = dseSolution + trajectories.put(solutionTrajectory, fitness) + } + solutionSaved + } + + def isFitnessDominated(Fitness fitness) { + for (existingFitness : trajectories.values) { + val isNewFitnessBetter = comparatorHelper.compare(fitness, existingFitness) + if (isNewFitnessBetter < 0) { + return true + } + } + false + } +} diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/WF2ObjectiveConverter.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/WF2ObjectiveConverter.xtend index 5a528a9e..c601de40 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/WF2ObjectiveConverter.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/WF2ObjectiveConverter.xtend @@ -1,5 +1,6 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse +import com.google.common.collect.ImmutableList import java.util.ArrayList import java.util.Collection import org.eclipse.viatra.dse.objectives.Comparators @@ -12,25 +13,34 @@ import org.eclipse.viatra.query.runtime.api.IQuerySpecification import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher class WF2ObjectiveConverter { - + static val UNFINISHED_WFS_NAME = "unfinishedWFs" + static val INVALIDATED_WFS_NAME = "invalidatedWFs" + def createCompletenessObjective( - Collection>> unfinishedWF) - { - val res = new ConstraintsObjective('''unfinishedWFs''', - unfinishedWF.map[ - new QueryConstraint(it.fullyQualifiedName,it,2.0) - ].toList + Collection>> unfinishedWF) { + createConstraintObjective(UNFINISHED_WFS_NAME, unfinishedWF) + } + + def createInvalidationObjective( + Collection>> invalidatedByWF) { + createConstraintObjective(INVALIDATED_WFS_NAME, invalidatedByWF) + } + + def IGlobalConstraint createInvalidationGlobalConstraint( + Collection>> invalidatedByWF) { + new ModelQueriesGlobalConstraint(INVALIDATED_WFS_NAME, new ArrayList(invalidatedByWF)) + } + + private def createConstraintObjective(String name, + Collection>> queries) { + val res = new ConstraintsObjective( + name, + ImmutableList.copyOf(queries.map [ + new QueryConstraint(it.fullyQualifiedName, it, 1.0) + ]) ) res.withComparator(Comparators.LOWER_IS_BETTER) res.level = 2 - return res - } - - def IGlobalConstraint createInvalidationObjective( - Collection>> invalidatedByWF) - { - return new ModelQueriesGlobalConstraint('''invalidatedWFs''', - new ArrayList(invalidatedByWF) - ) + res } -} \ No newline at end of file +} diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ide/.CftLanguageIdeModule.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ide/.CftLanguageIdeModule.xtendbin index b05b37d4..2c3fb067 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ide/.CftLanguageIdeModule.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ide/.CftLanguageIdeModule.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ide/.CftLanguageIdeSetup.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ide/.CftLanguageIdeSetup.xtendbin index 7a01ace8..dd1a46c1 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ide/.CftLanguageIdeSetup.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ide/.CftLanguageIdeSetup.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/.CftLanguageUiModule.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/.CftLanguageUiModule.xtendbin index 0e56af1c..1694059d 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/.CftLanguageUiModule.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/.CftLanguageUiModule.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/contentassist/.CftLanguageProposalProvider.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/contentassist/.CftLanguageProposalProvider.xtendbin index e3b08949..e89abd97 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/contentassist/.CftLanguageProposalProvider.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/contentassist/.CftLanguageProposalProvider.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/labeling/.CftLanguageDescriptionLabelProvider.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/labeling/.CftLanguageDescriptionLabelProvider.xtendbin index a9a231c9..c2485146 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/labeling/.CftLanguageDescriptionLabelProvider.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/labeling/.CftLanguageDescriptionLabelProvider.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/labeling/.CftLanguageLabelProvider.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/labeling/.CftLanguageLabelProvider.xtendbin index c96ad697..cdef3946 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/labeling/.CftLanguageLabelProvider.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/labeling/.CftLanguageLabelProvider.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/outline/.CftLanguageOutlineTreeProvider.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/outline/.CftLanguageOutlineTreeProvider.xtendbin index 7c4945f3..04b65373 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/outline/.CftLanguageOutlineTreeProvider.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/outline/.CftLanguageOutlineTreeProvider.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/quickfix/.CftLanguageQuickfixProvider.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/quickfix/.CftLanguageQuickfixProvider.xtendbin index 6f9ed2db..13419ed3 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/quickfix/.CftLanguageQuickfixProvider.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/quickfix/.CftLanguageQuickfixProvider.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/syntaxcoloring/.CftLanguageSemanticHighlightingCalculator.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/syntaxcoloring/.CftLanguageSemanticHighlightingCalculator.xtendbin index 319b1a7b..42bf1c75 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/syntaxcoloring/.CftLanguageSemanticHighlightingCalculator.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/syntaxcoloring/.CftLanguageSemanticHighlightingCalculator.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/syntaxcoloring/.CftLanguageTokenToAttributeIdMapper.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/syntaxcoloring/.CftLanguageTokenToAttributeIdMapper.xtendbin index 64980787..09c27dfe 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/syntaxcoloring/.CftLanguageTokenToAttributeIdMapper.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components.ui/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/ui/syntaxcoloring/.CftLanguageTokenToAttributeIdMapper.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/.CftLanguageRuntimeModule.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/.CftLanguageRuntimeModule.xtendbin index e3eb300d..25c11260 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/.CftLanguageRuntimeModule.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/.CftLanguageRuntimeModule.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/.CftLanguageStandaloneSetup.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/.CftLanguageStandaloneSetup.xtendbin index cf472a5c..7a10919f 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/.CftLanguageStandaloneSetup.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/.CftLanguageStandaloneSetup.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/conversion/.CftLanguageValueConverterService.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/conversion/.CftLanguageValueConverterService.xtendbin index 9e436c25..f4a74d7b 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/conversion/.CftLanguageValueConverterService.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/conversion/.CftLanguageValueConverterService.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/conversion/.OF_INTValueConverter.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/conversion/.OF_INTValueConverter.xtendbin index 8dcb67ce..8d4c818e 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/conversion/.OF_INTValueConverter.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/conversion/.OF_INTValueConverter.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/generator/.CftLanguageGenerator.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/generator/.CftLanguageGenerator.xtendbin index f55b7c31..79e0e382 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/generator/.CftLanguageGenerator.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/generator/.CftLanguageGenerator.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/naming/.CftLanguageQualifiedNameProvider.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/naming/.CftLanguageQualifiedNameProvider.xtendbin index 1f55e190..51f5e2fe 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/naming/.CftLanguageQualifiedNameProvider.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/naming/.CftLanguageQualifiedNameProvider.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/naming/.PackageNameProvider.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/naming/.PackageNameProvider.xtendbin index d7439d22..cf8f603b 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/naming/.PackageNameProvider.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/naming/.PackageNameProvider.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/scoping/.CftLanguageImportedNamespaceAwareLocalScopeProvider.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/scoping/.CftLanguageImportedNamespaceAwareLocalScopeProvider.xtendbin index 4fbc7cd3..116d5bc1 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/scoping/.CftLanguageImportedNamespaceAwareLocalScopeProvider.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/scoping/.CftLanguageImportedNamespaceAwareLocalScopeProvider.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/scoping/.CftLanguageScopeProvider.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/scoping/.CftLanguageScopeProvider.xtendbin index 5b585e60..7a6eb47e 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/scoping/.CftLanguageScopeProvider.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/scoping/.CftLanguageScopeProvider.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/validation/.CftLanguageValidator.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/validation/.CftLanguageValidator.xtendbin index 481a23f6..fbb89193 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/validation/.CftLanguageValidator.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/components/validation/.CftLanguageValidator.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.model/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/model/util/.CftExtensions.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.model/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/model/util/.CftExtensions.xtendbin index 390ee219..0e63880f 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.model/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/model/util/.CftExtensions.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.model/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/model/util/.CftExtensions.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/.Cft2FtTransformation.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/.Cft2FtTransformation.xtendbin index 594bfecb..dfae40e9 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/.Cft2FtTransformation.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/.Cft2FtTransformation.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/.EventCollection.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/.EventCollection.xtendbin index a868ae36..0aaf712d 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/.EventCollection.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/.EventCollection.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/.EventMaterializer.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/.EventMaterializer.xtendbin index f7ca5531..e51f73a6 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/.EventMaterializer.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/.EventMaterializer.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/.FaultTreeBuilder.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/.FaultTreeBuilder.xtendbin index 1d15efbb..89e003dc 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/.FaultTreeBuilder.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/.FaultTreeBuilder.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.ComponentFaultTreeTrace.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.ComponentFaultTreeTrace.xtendbin index 3fce519e..028440a8 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.ComponentFaultTreeTrace.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.ComponentFaultTreeTrace.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.ComponentInstanceTrace.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.ComponentInstanceTrace.xtendbin index 564e58c4..d542ba2d 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.ComponentInstanceTrace.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.ComponentInstanceTrace.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.ComponentNameGenerator.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.ComponentNameGenerator.xtendbin index ebcfced8..949da0cd 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.ComponentNameGenerator.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.ComponentNameGenerator.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.Ecore2CftTransformation.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.Ecore2CftTransformation.xtendbin index d4b5ecdb..82c045e2 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.Ecore2CftTransformation.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.Ecore2CftTransformation.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.InputTrace.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.InputTrace.xtendbin index 1faa21b3..ffd70c04 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.InputTrace.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.InputTrace.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.LookupHandler.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.LookupHandler.xtendbin index afc40951..418c71d4 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.LookupHandler.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.LookupHandler.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.MappingHandler.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.MappingHandler.xtendbin index 419b9490..86c0d704 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.MappingHandler.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.MappingHandler.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.MappingQueries.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.MappingQueries.xtendbin index 0e703f40..c9dda5c4 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.MappingQueries.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/.MappingQueries.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ft2galileo/.Ft2GalileoTransformation.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ft2galileo/.Ft2GalileoTransformation.xtendbin index 41e6e441..0956e6e0 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ft2galileo/.Ft2GalileoTransformation.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ft2galileo/.Ft2GalileoTransformation.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/solver/.ReliabilityResult.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/solver/.ReliabilityResult.xtendbin index ef8c3b88..cdaacb58 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/solver/.ReliabilityResult.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/solver/.ReliabilityResult.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/solver/.StormDftConfiguration.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/solver/.StormDftConfiguration.xtendbin index 4aff77d3..6e1908aa 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/solver/.StormDftConfiguration.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/solver/.StormDftConfiguration.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/solver/.StormDftHandler.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/solver/.StormDftHandler.xtendbin index a2c634bc..5772b0e7 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/solver/.StormDftHandler.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/solver/.StormDftHandler.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/solver/.StormDftSolver.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/solver/.StormDftSolver.xtendbin index 45f12291..e1c1a8c7 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/solver/.StormDftSolver.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/solver/.StormDftSolver.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.ui/bin/.gitignore b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.ui/bin/.gitignore new file mode 100644 index 00000000..1c0a02cd --- /dev/null +++ b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.ui/bin/.gitignore @@ -0,0 +1 @@ +/hu/ diff --git a/Tests/hu.bme.mit.inf.dslreasoner.application.FAMTest/configs/generation.vsconfig b/Tests/hu.bme.mit.inf.dslreasoner.application.FAMTest/configs/generation.vsconfig index 9a073728..490d6942 100644 --- a/Tests/hu.bme.mit.inf.dslreasoner.application.FAMTest/configs/generation.vsconfig +++ b/Tests/hu.bme.mit.inf.dslreasoner.application.FAMTest/configs/generation.vsconfig @@ -7,7 +7,7 @@ generate { partial-model = { "inputs/FamInstance.xmi"} solver = ViatraSolver scope = { - #node = 5 + #node = 500 } config = { -- cgit v1.2.3-54-g00ecf From 9152a660dbfbf3294964233c76d6cf22111298ff Mon Sep 17 00:00:00 2001 From: Oszkar Semerath Date: Tue, 9 Jul 2019 20:49:10 +0200 Subject: aggregated partial substitution + builder --- .../model/logiclanguage/AggregateExpression.java | 15 ++ .../AggregatedParameterSubstitution.java | 46 ++++ .../model/logiclanguage/LogiclanguageFactory.java | 9 + .../model/logiclanguage/LogiclanguagePackage.java | 152 +++++++++++- .../impl/AggregateExpressionImpl.java | 56 +++++ .../impl/AggregatedParameterSubstitutionImpl.java | 159 +++++++++++++ .../impl/LogiclanguageFactoryImpl.java | 12 + .../impl/LogiclanguagePackageImpl.java | 46 ++++ .../util/LogiclanguageAdapterFactory.java | 18 ++ .../logiclanguage/util/LogiclanguageSwitch.java | 21 ++ .../model/logiclanguage.aird | 103 +++++++- .../model/logiclanguage.ecore | 5 + .../model/logiclanguage.genmodel | 4 + .../logic/model/builder/LogicProblemBuilder.xtend | 261 ++++++++++++--------- 14 files changed, 784 insertions(+), 123 deletions(-) create mode 100644 Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/AggregatedParameterSubstitution.java create mode 100644 Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/impl/AggregatedParameterSubstitutionImpl.java (limited to 'Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic') diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/AggregateExpression.java b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/AggregateExpression.java index be146469..4b38becf 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/AggregateExpression.java +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/AggregateExpression.java @@ -2,6 +2,8 @@ */ package hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage; +import org.eclipse.emf.common.util.EList; + /** * @@ -13,6 +15,7 @@ package hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage; *

    *
      *
    • {@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregateExpression#getRelation Relation}
    • + *
    • {@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregateExpression#getParameterSubstitution Parameter Substitution}
    • *
    * * @see hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.LogiclanguagePackage#getAggregateExpression() @@ -46,4 +49,16 @@ public interface AggregateExpression extends Term { */ void setRelation(Relation value); + /** + * Returns the value of the 'Parameter Substitution' containment reference list. + * The list contents are of type {@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregatedParameterSubstitution}. + * + * + * @return the value of the 'Parameter Substitution' containment reference list. + * @see hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.LogiclanguagePackage#getAggregateExpression_ParameterSubstitution() + * @model containment="true" + * @generated + */ + EList getParameterSubstitution(); + } // AggregateExpression diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/AggregatedParameterSubstitution.java b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/AggregatedParameterSubstitution.java new file mode 100644 index 00000000..94b6365d --- /dev/null +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/AggregatedParameterSubstitution.java @@ -0,0 +1,46 @@ +/** + */ +package hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage; + +import org.eclipse.emf.ecore.EObject; + +/** + * + * A representation of the model object 'Aggregated Parameter Substitution'. + * + * + *

    + * The following features are supported: + *

    + *
      + *
    • {@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregatedParameterSubstitution#getVariable Variable}
    • + *
    + * + * @see hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.LogiclanguagePackage#getAggregatedParameterSubstitution() + * @model + * @generated + */ +public interface AggregatedParameterSubstitution extends EObject { + /** + * Returns the value of the 'Variable' reference. + * + * + * @return the value of the 'Variable' reference. + * @see #setVariable(Variable) + * @see hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.LogiclanguagePackage#getAggregatedParameterSubstitution_Variable() + * @model + * @generated + */ + Variable getVariable(); + + /** + * Sets the value of the '{@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregatedParameterSubstitution#getVariable Variable}' reference. + * + * + * @param value the new value of the 'Variable' reference. + * @see #getVariable() + * @generated + */ + void setVariable(Variable value); + +} // AggregatedParameterSubstitution diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/LogiclanguageFactory.java b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/LogiclanguageFactory.java index a6b0a790..33d79329 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/LogiclanguageFactory.java +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/LogiclanguageFactory.java @@ -453,6 +453,15 @@ public interface LogiclanguageFactory extends EFactory { */ Max createMax(); + /** + * Returns a new object of class 'Aggregated Parameter Substitution'. + * + * + * @return a new object of class 'Aggregated Parameter Substitution'. + * @generated + */ + AggregatedParameterSubstitution createAggregatedParameterSubstitution(); + /** * Returns the package supported by this factory. * diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/LogiclanguagePackage.java b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/LogiclanguagePackage.java index ddfb75a2..f5347e31 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/LogiclanguagePackage.java +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/LogiclanguagePackage.java @@ -2750,6 +2750,15 @@ public interface LogiclanguagePackage extends EPackage { */ int AGGREGATE_EXPRESSION__RELATION = TERM_FEATURE_COUNT + 0; + /** + * The feature id for the 'Parameter Substitution' containment reference list. + * + * + * @generated + * @ordered + */ + int AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION = TERM_FEATURE_COUNT + 1; + /** * The number of structural features of the 'Aggregate Expression' class. * @@ -2757,7 +2766,7 @@ public interface LogiclanguagePackage extends EPackage { * @generated * @ordered */ - int AGGREGATE_EXPRESSION_FEATURE_COUNT = TERM_FEATURE_COUNT + 1; + int AGGREGATE_EXPRESSION_FEATURE_COUNT = TERM_FEATURE_COUNT + 2; /** * The number of operations of the 'Aggregate Expression' class. @@ -2787,6 +2796,15 @@ public interface LogiclanguagePackage extends EPackage { */ int PROJECTED_AGGREGATE_EXPRESSION__RELATION = AGGREGATE_EXPRESSION__RELATION; + /** + * The feature id for the 'Parameter Substitution' containment reference list. + * + * + * @generated + * @ordered + */ + int PROJECTED_AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION = AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION; + /** * The feature id for the 'Projection Index' attribute. * @@ -2833,6 +2851,15 @@ public interface LogiclanguagePackage extends EPackage { */ int SUM__RELATION = PROJECTED_AGGREGATE_EXPRESSION__RELATION; + /** + * The feature id for the 'Parameter Substitution' containment reference list. + * + * + * @generated + * @ordered + */ + int SUM__PARAMETER_SUBSTITUTION = PROJECTED_AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION; + /** * The feature id for the 'Projection Index' attribute. * @@ -2879,6 +2906,15 @@ public interface LogiclanguagePackage extends EPackage { */ int COUNT__RELATION = AGGREGATE_EXPRESSION__RELATION; + /** + * The feature id for the 'Parameter Substitution' containment reference list. + * + * + * @generated + * @ordered + */ + int COUNT__PARAMETER_SUBSTITUTION = AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION; + /** * The number of structural features of the 'Count' class. * @@ -2916,6 +2952,15 @@ public interface LogiclanguagePackage extends EPackage { */ int MIN__RELATION = PROJECTED_AGGREGATE_EXPRESSION__RELATION; + /** + * The feature id for the 'Parameter Substitution' containment reference list. + * + * + * @generated + * @ordered + */ + int MIN__PARAMETER_SUBSTITUTION = PROJECTED_AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION; + /** * The feature id for the 'Projection Index' attribute. * @@ -2962,6 +3007,15 @@ public interface LogiclanguagePackage extends EPackage { */ int MAX__RELATION = PROJECTED_AGGREGATE_EXPRESSION__RELATION; + /** + * The feature id for the 'Parameter Substitution' containment reference list. + * + * + * @generated + * @ordered + */ + int MAX__PARAMETER_SUBSTITUTION = PROJECTED_AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION; + /** * The feature id for the 'Projection Index' attribute. * @@ -2990,6 +3044,44 @@ public interface LogiclanguagePackage extends EPackage { int MAX_OPERATION_COUNT = PROJECTED_AGGREGATE_EXPRESSION_OPERATION_COUNT + 0; + /** + * The meta object id for the '{@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.impl.AggregatedParameterSubstitutionImpl Aggregated Parameter Substitution}' class. + * + * + * @see hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.impl.AggregatedParameterSubstitutionImpl + * @see hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.impl.LogiclanguagePackageImpl#getAggregatedParameterSubstitution() + * @generated + */ + int AGGREGATED_PARAMETER_SUBSTITUTION = 65; + + /** + * The feature id for the 'Variable' reference. + * + * + * @generated + * @ordered + */ + int AGGREGATED_PARAMETER_SUBSTITUTION__VARIABLE = 0; + + /** + * The number of structural features of the 'Aggregated Parameter Substitution' class. + * + * + * @generated + * @ordered + */ + int AGGREGATED_PARAMETER_SUBSTITUTION_FEATURE_COUNT = 1; + + /** + * The number of operations of the 'Aggregated Parameter Substitution' class. + * + * + * @generated + * @ordered + */ + int AGGREGATED_PARAMETER_SUBSTITUTION_OPERATION_COUNT = 0; + + /** * Returns the meta object for class '{@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type Type}'. * @@ -4305,6 +4397,17 @@ public interface LogiclanguagePackage extends EPackage { */ EReference getAggregateExpression_Relation(); + /** + * Returns the meta object for the containment reference list '{@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregateExpression#getParameterSubstitution Parameter Substitution}'. + * + * + * @return the meta object for the containment reference list 'Parameter Substitution'. + * @see hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregateExpression#getParameterSubstitution() + * @see #getAggregateExpression() + * @generated + */ + EReference getAggregateExpression_ParameterSubstitution(); + /** * Returns the meta object for class '{@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Sum Sum}'. * @@ -4366,6 +4469,27 @@ public interface LogiclanguagePackage extends EPackage { */ EAttribute getProjectedAggregateExpression_ProjectionIndex(); + /** + * Returns the meta object for class '{@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregatedParameterSubstitution Aggregated Parameter Substitution}'. + * + * + * @return the meta object for class 'Aggregated Parameter Substitution'. + * @see hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregatedParameterSubstitution + * @generated + */ + EClass getAggregatedParameterSubstitution(); + + /** + * Returns the meta object for the reference '{@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregatedParameterSubstitution#getVariable Variable}'. + * + * + * @return the meta object for the reference 'Variable'. + * @see hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregatedParameterSubstitution#getVariable() + * @see #getAggregatedParameterSubstitution() + * @generated + */ + EReference getAggregatedParameterSubstitution_Variable(); + /** * Returns the factory that creates the instances of the model. * @@ -5509,6 +5633,14 @@ public interface LogiclanguagePackage extends EPackage { */ EReference AGGREGATE_EXPRESSION__RELATION = eINSTANCE.getAggregateExpression_Relation(); + /** + * The meta object literal for the 'Parameter Substitution' containment reference list feature. + * + * + * @generated + */ + EReference AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION = eINSTANCE.getAggregateExpression_ParameterSubstitution(); + /** * The meta object literal for the '{@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.impl.SumImpl Sum}' class. * @@ -5567,6 +5699,24 @@ public interface LogiclanguagePackage extends EPackage { */ EAttribute PROJECTED_AGGREGATE_EXPRESSION__PROJECTION_INDEX = eINSTANCE.getProjectedAggregateExpression_ProjectionIndex(); + /** + * The meta object literal for the '{@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.impl.AggregatedParameterSubstitutionImpl Aggregated Parameter Substitution}' class. + * + * + * @see hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.impl.AggregatedParameterSubstitutionImpl + * @see hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.impl.LogiclanguagePackageImpl#getAggregatedParameterSubstitution() + * @generated + */ + EClass AGGREGATED_PARAMETER_SUBSTITUTION = eINSTANCE.getAggregatedParameterSubstitution(); + + /** + * The meta object literal for the 'Variable' reference feature. + * + * + * @generated + */ + EReference AGGREGATED_PARAMETER_SUBSTITUTION__VARIABLE = eINSTANCE.getAggregatedParameterSubstitution_Variable(); + } } //LogiclanguagePackage diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/impl/AggregateExpressionImpl.java b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/impl/AggregateExpressionImpl.java index fc1420b0..0459af42 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/impl/AggregateExpressionImpl.java +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/impl/AggregateExpressionImpl.java @@ -3,15 +3,21 @@ package hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.impl; import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregateExpression; +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregatedParameterSubstitution; import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.LogiclanguagePackage; import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Relation; +import java.util.Collection; import org.eclipse.emf.common.notify.Notification; +import org.eclipse.emf.common.notify.NotificationChain; +import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.impl.ENotificationImpl; +import org.eclipse.emf.ecore.util.EObjectContainmentEList; +import org.eclipse.emf.ecore.util.InternalEList; /** * @@ -22,6 +28,7 @@ import org.eclipse.emf.ecore.impl.ENotificationImpl; *

    *
      *
    • {@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.impl.AggregateExpressionImpl#getRelation Relation}
    • + *
    • {@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.impl.AggregateExpressionImpl#getParameterSubstitution Parameter Substitution}
    • *
    * * @generated @@ -37,6 +44,16 @@ public abstract class AggregateExpressionImpl extends TermImpl implements Aggreg */ protected Relation relation; + /** + * The cached value of the '{@link #getParameterSubstitution() Parameter Substitution}' containment reference list. + * + * + * @see #getParameterSubstitution() + * @generated + * @ordered + */ + protected EList parameterSubstitution; + /** * * @@ -96,6 +113,33 @@ public abstract class AggregateExpressionImpl extends TermImpl implements Aggreg eNotify(new ENotificationImpl(this, Notification.SET, LogiclanguagePackage.AGGREGATE_EXPRESSION__RELATION, oldRelation, relation)); } + /** + * + * + * @generated + */ + @Override + public EList getParameterSubstitution() { + if (parameterSubstitution == null) { + parameterSubstitution = new EObjectContainmentEList(AggregatedParameterSubstitution.class, this, LogiclanguagePackage.AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION); + } + return parameterSubstitution; + } + + /** + * + * + * @generated + */ + @Override + public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) { + switch (featureID) { + case LogiclanguagePackage.AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION: + return ((InternalEList)getParameterSubstitution()).basicRemove(otherEnd, msgs); + } + return super.eInverseRemove(otherEnd, featureID, msgs); + } + /** * * @@ -107,6 +151,8 @@ public abstract class AggregateExpressionImpl extends TermImpl implements Aggreg case LogiclanguagePackage.AGGREGATE_EXPRESSION__RELATION: if (resolve) return getRelation(); return basicGetRelation(); + case LogiclanguagePackage.AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION: + return getParameterSubstitution(); } return super.eGet(featureID, resolve, coreType); } @@ -116,12 +162,17 @@ public abstract class AggregateExpressionImpl extends TermImpl implements Aggreg * * @generated */ + @SuppressWarnings("unchecked") @Override public void eSet(int featureID, Object newValue) { switch (featureID) { case LogiclanguagePackage.AGGREGATE_EXPRESSION__RELATION: setRelation((Relation)newValue); return; + case LogiclanguagePackage.AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION: + getParameterSubstitution().clear(); + getParameterSubstitution().addAll((Collection)newValue); + return; } super.eSet(featureID, newValue); } @@ -137,6 +188,9 @@ public abstract class AggregateExpressionImpl extends TermImpl implements Aggreg case LogiclanguagePackage.AGGREGATE_EXPRESSION__RELATION: setRelation((Relation)null); return; + case LogiclanguagePackage.AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION: + getParameterSubstitution().clear(); + return; } super.eUnset(featureID); } @@ -151,6 +205,8 @@ public abstract class AggregateExpressionImpl extends TermImpl implements Aggreg switch (featureID) { case LogiclanguagePackage.AGGREGATE_EXPRESSION__RELATION: return relation != null; + case LogiclanguagePackage.AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION: + return parameterSubstitution != null && !parameterSubstitution.isEmpty(); } return super.eIsSet(featureID); } diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/impl/AggregatedParameterSubstitutionImpl.java b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/impl/AggregatedParameterSubstitutionImpl.java new file mode 100644 index 00000000..15af0f21 --- /dev/null +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/impl/AggregatedParameterSubstitutionImpl.java @@ -0,0 +1,159 @@ +/** + */ +package hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.impl; + +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregatedParameterSubstitution; +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.LogiclanguagePackage; +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Variable; + +import org.eclipse.emf.common.notify.Notification; + +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.InternalEObject; + +import org.eclipse.emf.ecore.impl.ENotificationImpl; +import org.eclipse.emf.ecore.impl.MinimalEObjectImpl; + +/** + * + * An implementation of the model object 'Aggregated Parameter Substitution'. + * + *

    + * The following features are implemented: + *

    + *
      + *
    • {@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.impl.AggregatedParameterSubstitutionImpl#getVariable Variable}
    • + *
    + * + * @generated + */ +public class AggregatedParameterSubstitutionImpl extends MinimalEObjectImpl.Container implements AggregatedParameterSubstitution { + /** + * The cached value of the '{@link #getVariable() Variable}' reference. + * + * + * @see #getVariable() + * @generated + * @ordered + */ + protected Variable variable; + + /** + * + * + * @generated + */ + protected AggregatedParameterSubstitutionImpl() { + super(); + } + + /** + * + * + * @generated + */ + @Override + protected EClass eStaticClass() { + return LogiclanguagePackage.Literals.AGGREGATED_PARAMETER_SUBSTITUTION; + } + + /** + * + * + * @generated + */ + @Override + public Variable getVariable() { + if (variable != null && variable.eIsProxy()) { + InternalEObject oldVariable = (InternalEObject)variable; + variable = (Variable)eResolveProxy(oldVariable); + if (variable != oldVariable) { + if (eNotificationRequired()) + eNotify(new ENotificationImpl(this, Notification.RESOLVE, LogiclanguagePackage.AGGREGATED_PARAMETER_SUBSTITUTION__VARIABLE, oldVariable, variable)); + } + } + return variable; + } + + /** + * + * + * @generated + */ + public Variable basicGetVariable() { + return variable; + } + + /** + * + * + * @generated + */ + @Override + public void setVariable(Variable newVariable) { + Variable oldVariable = variable; + variable = newVariable; + if (eNotificationRequired()) + eNotify(new ENotificationImpl(this, Notification.SET, LogiclanguagePackage.AGGREGATED_PARAMETER_SUBSTITUTION__VARIABLE, oldVariable, variable)); + } + + /** + * + * + * @generated + */ + @Override + public Object eGet(int featureID, boolean resolve, boolean coreType) { + switch (featureID) { + case LogiclanguagePackage.AGGREGATED_PARAMETER_SUBSTITUTION__VARIABLE: + if (resolve) return getVariable(); + return basicGetVariable(); + } + return super.eGet(featureID, resolve, coreType); + } + + /** + * + * + * @generated + */ + @Override + public void eSet(int featureID, Object newValue) { + switch (featureID) { + case LogiclanguagePackage.AGGREGATED_PARAMETER_SUBSTITUTION__VARIABLE: + setVariable((Variable)newValue); + return; + } + super.eSet(featureID, newValue); + } + + /** + * + * + * @generated + */ + @Override + public void eUnset(int featureID) { + switch (featureID) { + case LogiclanguagePackage.AGGREGATED_PARAMETER_SUBSTITUTION__VARIABLE: + setVariable((Variable)null); + return; + } + super.eUnset(featureID); + } + + /** + * + * + * @generated + */ + @Override + public boolean eIsSet(int featureID) { + switch (featureID) { + case LogiclanguagePackage.AGGREGATED_PARAMETER_SUBSTITUTION__VARIABLE: + return variable != null; + } + return super.eIsSet(featureID); + } + +} //AggregatedParameterSubstitutionImpl diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/impl/LogiclanguageFactoryImpl.java b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/impl/LogiclanguageFactoryImpl.java index b890b6e0..b8d87d99 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/impl/LogiclanguageFactoryImpl.java +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/impl/LogiclanguageFactoryImpl.java @@ -104,6 +104,7 @@ public class LogiclanguageFactoryImpl extends EFactoryImpl implements Logiclangu case LogiclanguagePackage.COUNT: return createCount(); case LogiclanguagePackage.MIN: return createMin(); case LogiclanguagePackage.MAX: return createMax(); + case LogiclanguagePackage.AGGREGATED_PARAMETER_SUBSTITUTION: return createAggregatedParameterSubstitution(); default: throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier"); } @@ -637,6 +638,17 @@ public class LogiclanguageFactoryImpl extends EFactoryImpl implements Logiclangu return max; } + /** + * + * + * @generated + */ + @Override + public AggregatedParameterSubstitution createAggregatedParameterSubstitution() { + AggregatedParameterSubstitutionImpl aggregatedParameterSubstitution = new AggregatedParameterSubstitutionImpl(); + return aggregatedParameterSubstitution; + } + /** * * diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/impl/LogiclanguagePackageImpl.java b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/impl/LogiclanguagePackageImpl.java index 6d370c0f..64ebdde1 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/impl/LogiclanguagePackageImpl.java +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/impl/LogiclanguagePackageImpl.java @@ -3,6 +3,7 @@ package hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.impl; import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregateExpression; +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregatedParameterSubstitution; import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.And; import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Assertion; import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AtomicTerm; @@ -547,6 +548,13 @@ public class LogiclanguagePackageImpl extends EPackageImpl implements Logiclangu */ private EClass projectedAggregateExpressionEClass = null; + /** + * + * + * @generated + */ + private EClass aggregatedParameterSubstitutionEClass = null; + /** * Creates an instance of the model Package, registered with * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package @@ -1868,6 +1876,16 @@ public class LogiclanguagePackageImpl extends EPackageImpl implements Logiclangu return (EReference)aggregateExpressionEClass.getEStructuralFeatures().get(0); } + /** + * + * + * @generated + */ + @Override + public EReference getAggregateExpression_ParameterSubstitution() { + return (EReference)aggregateExpressionEClass.getEStructuralFeatures().get(1); + } + /** * * @@ -1928,6 +1946,26 @@ public class LogiclanguagePackageImpl extends EPackageImpl implements Logiclangu return (EAttribute)projectedAggregateExpressionEClass.getEStructuralFeatures().get(0); } + /** + * + * + * @generated + */ + @Override + public EClass getAggregatedParameterSubstitution() { + return aggregatedParameterSubstitutionEClass; + } + + /** + * + * + * @generated + */ + @Override + public EReference getAggregatedParameterSubstitution_Variable() { + return (EReference)aggregatedParameterSubstitutionEClass.getEStructuralFeatures().get(0); + } + /** * * @@ -2141,6 +2179,7 @@ public class LogiclanguagePackageImpl extends EPackageImpl implements Logiclangu aggregateExpressionEClass = createEClass(AGGREGATE_EXPRESSION); createEReference(aggregateExpressionEClass, AGGREGATE_EXPRESSION__RELATION); + createEReference(aggregateExpressionEClass, AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION); sumEClass = createEClass(SUM); @@ -2152,6 +2191,9 @@ public class LogiclanguagePackageImpl extends EPackageImpl implements Logiclangu projectedAggregateExpressionEClass = createEClass(PROJECTED_AGGREGATE_EXPRESSION); createEAttribute(projectedAggregateExpressionEClass, PROJECTED_AGGREGATE_EXPRESSION__PROJECTION_INDEX); + + aggregatedParameterSubstitutionEClass = createEClass(AGGREGATED_PARAMETER_SUBSTITUTION); + createEReference(aggregatedParameterSubstitutionEClass, AGGREGATED_PARAMETER_SUBSTITUTION__VARIABLE); } /** @@ -2433,6 +2475,7 @@ public class LogiclanguagePackageImpl extends EPackageImpl implements Logiclangu initEClass(aggregateExpressionEClass, AggregateExpression.class, "AggregateExpression", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); initEReference(getAggregateExpression_Relation(), this.getRelation(), null, "relation", null, 0, 1, AggregateExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); + initEReference(getAggregateExpression_ParameterSubstitution(), this.getAggregatedParameterSubstitution(), null, "parameterSubstitution", null, 0, -1, AggregateExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); initEClass(sumEClass, Sum.class, "Sum", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); @@ -2445,6 +2488,9 @@ public class LogiclanguagePackageImpl extends EPackageImpl implements Logiclangu initEClass(projectedAggregateExpressionEClass, ProjectedAggregateExpression.class, "ProjectedAggregateExpression", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); initEAttribute(getProjectedAggregateExpression_ProjectionIndex(), ecorePackage.getEInt(), "projectionIndex", "-1", 1, 1, ProjectedAggregateExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); + initEClass(aggregatedParameterSubstitutionEClass, AggregatedParameterSubstitution.class, "AggregatedParameterSubstitution", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); + initEReference(getAggregatedParameterSubstitution_Variable(), this.getVariable(), null, "variable", null, 0, 1, AggregatedParameterSubstitution.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); + // Create resource createResource(eNS_URI); } diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/util/LogiclanguageAdapterFactory.java b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/util/LogiclanguageAdapterFactory.java index 25edee70..3fc7c298 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/util/LogiclanguageAdapterFactory.java +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/util/LogiclanguageAdapterFactory.java @@ -328,6 +328,10 @@ public class LogiclanguageAdapterFactory extends AdapterFactoryImpl { return createProjectedAggregateExpressionAdapter(); } @Override + public Adapter caseAggregatedParameterSubstitution(AggregatedParameterSubstitution object) { + return createAggregatedParameterSubstitutionAdapter(); + } + @Override public Adapter defaultCase(EObject object) { return createEObjectAdapter(); } @@ -1257,6 +1261,20 @@ public class LogiclanguageAdapterFactory extends AdapterFactoryImpl { return null; } + /** + * Creates a new adapter for an object of class '{@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregatedParameterSubstitution Aggregated Parameter Substitution}'. + * + * This default implementation returns null so that we can easily ignore cases; + * it's useful to ignore a case when inheritance will catch all the cases anyway. + * + * @return the new adapter. + * @see hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregatedParameterSubstitution + * @generated + */ + public Adapter createAggregatedParameterSubstitutionAdapter() { + return null; + } + /** * Creates a new adapter for the default case. * diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/util/LogiclanguageSwitch.java b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/util/LogiclanguageSwitch.java index fc443484..ac821567 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/util/LogiclanguageSwitch.java +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/util/LogiclanguageSwitch.java @@ -617,6 +617,12 @@ public class LogiclanguageSwitch extends Switch { if (result == null) result = defaultCase(theEObject); return result; } + case LogiclanguagePackage.AGGREGATED_PARAMETER_SUBSTITUTION: { + AggregatedParameterSubstitution aggregatedParameterSubstitution = (AggregatedParameterSubstitution)theEObject; + T result = caseAggregatedParameterSubstitution(aggregatedParameterSubstitution); + if (result == null) result = defaultCase(theEObject); + return result; + } default: return defaultCase(theEObject); } } @@ -1596,6 +1602,21 @@ public class LogiclanguageSwitch extends Switch { return null; } + /** + * Returns the result of interpreting the object as an instance of 'Aggregated Parameter Substitution'. + * + * This implementation returns null; + * returning a non-null result will terminate the switch. + * + * @param object the target of the switch. + * @return the result of interpreting the object as an instance of 'Aggregated Parameter Substitution'. + * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject) + * @generated + */ + public T caseAggregatedParameterSubstitution(AggregatedParameterSubstitution object) { + return null; + } + /** * Returns the result of interpreting the object as an instance of 'EObject'. * diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/model/logiclanguage.aird b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/model/logiclanguage.aird index 5673d66a..0a49e388 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/model/logiclanguage.aird +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/model/logiclanguage.aird @@ -7805,7 +7805,7 @@ - + @@ -7814,7 +7814,7 @@ - + @@ -7823,7 +7823,7 @@ - + @@ -7832,7 +7832,7 @@ - + @@ -7841,7 +7841,7 @@ - + @@ -7854,7 +7854,16 @@ - + + + + + + + + + + @@ -9011,17 +9020,17 @@ - + - + - + - + @@ -9105,6 +9114,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -9199,7 +9240,7 @@ - + KEEP_LOCATION @@ -10473,7 +10514,7 @@ - + KEEP_LOCATION @@ -10635,6 +10676,44 @@ + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + + + labelSize + + + labelSize + + + + + + + + + + + labelSize + + + labelSize + + + + diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/model/logiclanguage.ecore b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/model/logiclanguage.ecore index fdbc1c27..fb94b598 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/model/logiclanguage.ecore +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/model/logiclanguage.ecore @@ -215,6 +215,8 @@ + @@ -225,4 +227,7 @@ + + + diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/model/logiclanguage.genmodel b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/model/logiclanguage.genmodel index 303080e7..cb14ae5b 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/model/logiclanguage.genmodel +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/model/logiclanguage.genmodel @@ -168,6 +168,7 @@ + @@ -176,6 +177,9 @@ + + + diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/builder/LogicProblemBuilder.xtend b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/builder/LogicProblemBuilder.xtend index f6bd9541..09bfbb39 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/builder/LogicProblemBuilder.xtend +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/builder/LogicProblemBuilder.xtend @@ -1,5 +1,6 @@ package hu.bme.mit.inf.dslreasoner.logic.model.builder +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregateExpression import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Assertion import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.BoolTypeReference import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference @@ -8,6 +9,7 @@ import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Function import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.IntTypeReference import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.LogiclanguageFactory +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ProjectedAggregateExpression import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.QuantifiedExpression import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RealTypeReference import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Relation @@ -46,16 +48,16 @@ class LogicProblemBuilderException extends Exception { } } -public class LogicProblemBuilder{ +class LogicProblemBuilder{ val protected extension LogiclanguageFactory logicFactiory = LogiclanguageFactory.eINSTANCE val protected extension LogicproblemFactory problemFactory = LogicproblemFactory.eINSTANCE val protected advancedConstructs = new LogicProblemBuilder_AdvancedConstructs(this) - def public createProblem(){ createLogicProblem } + def createProblem(){ createLogicProblem } // Names def protected String canonize(CharSequence name) { - if(name == null) return "" + if(name === null) return "" val result = name.toString.split("\\s+"); if(result.size == 1) { val element = result.get(0); @@ -82,23 +84,23 @@ public class LogicProblemBuilder{ } // Type builders - def public Element(CharSequence elementName) { return createDefinedElement => [x|x.name = elementName.canonize] } - def public Element() { return createDefinedElement } - def public TypeDeclaration(CharSequence name, boolean isAbstract) { TypeDeclaration => [x | x.name = name.canonize x.isAbstract = isAbstract] } - def public TypeDeclaration() { createTypeDeclaration } - def public TypeDefinition(CharSequence name, boolean isAbstract, DefinedElement... elements) { TypeDefinition(name, isAbstract, elements as Iterable) } - def public TypeDefinition(CharSequence name, boolean isAbstract, Iterable elements) { createTypeDefinition => [x | x.name = name.canonize x.isAbstract = isAbstract x.elements += elements ] } - - def public Supertype(Type subtype, Type supertype) { + def Element(CharSequence elementName) { return createDefinedElement => [x|x.name = elementName.canonize] } + def Element() { return createDefinedElement } + def TypeDeclaration(CharSequence name, boolean isAbstract) { TypeDeclaration => [x | x.name = name.canonize x.isAbstract = isAbstract] } + def TypeDeclaration() { createTypeDeclaration } + def TypeDefinition(CharSequence name, boolean isAbstract, DefinedElement... elements) { TypeDefinition(name, isAbstract, elements as Iterable) } + def TypeDefinition(CharSequence name, boolean isAbstract, Iterable elements) { createTypeDefinition => [x | x.name = name.canonize x.isAbstract = isAbstract x.elements += elements ] } + + def Supertype(Type subtype, Type supertype) { subtype.supertypes+=supertype } - def public SetSupertype(Type subtype, Type supertype, boolean value) { + def SetSupertype(Type subtype, Type supertype, boolean value) { if(value) subtype.supertypes+=supertype else subtype.subtypes-=supertype } // Type add - def public add(LogicProblem problem, Type type) { + def add(LogicProblem problem, Type type) { problem.nameIfAnonymType(type) problem.types+=type if(type instanceof TypeDefinition) { @@ -118,10 +120,10 @@ public class LogicProblemBuilder{ element.name = typeDefinition.elements.map[it.name].generateUniqueName[i | '''type «i.toString»'''] } - def public LogicBool() { createBoolTypeReference } - def public LogicInt() { createIntTypeReference } - def public LogicReal() { createRealTypeReference } - def public LogicString() { createStringTypeReference } + def LogicBool() { createBoolTypeReference } + def LogicInt() { createIntTypeReference } + def LogicReal() { createRealTypeReference } + def LogicString() { createStringTypeReference } def toTypeReference(TypeDescriptor descriptor) { if(descriptor instanceof TypeReference) { return EcoreUtil.copy(descriptor); } else if(descriptor instanceof Type) { return createComplexTypeReference => [referred = descriptor]} @@ -129,31 +131,31 @@ public class LogicProblemBuilder{ } // Variables - def public createVar(CharSequence name, TypeDescriptor range) { + def createVar(CharSequence name, TypeDescriptor range) { return createVariable => [it.name = name.canonize it.range = range.toTypeReference] } // Functions - def public FunctionDescription ->(TypeDescriptor parameter, TypeDescriptor range) { return #[parameter] -> range } - def public FunctionDescription ->(Iterable parameters, TypeDescriptor range) { return new FunctionDescription(parameters.map[toTypeReference], range.toTypeReference); } - def public FunctionDeclaration(CharSequence name, FunctionDescription functionDescription) { FunctionDeclaration(name,functionDescription.range, functionDescription.parameters) } - def public FunctionDeclaration(FunctionDescription functionDescription) { FunctionDeclaration(functionDescription.range, functionDescription.parameters) } - def public FunctionDeclaration(CharSequence name, TypeDescriptor range, TypeDescriptor... parameters) { FunctionDeclaration(name, range, parameters as Iterable) } - def public FunctionDeclaration(TypeDescriptor range, TypeDescriptor... parameters) { FunctionDeclaration(range, parameters as Iterable) } - def public FunctionDeclaration(CharSequence name, TypeDescriptor range, Iterable parameters) { return FunctionDeclaration(range,parameters) => [x|x.name = name.canonize] } - def public FunctionDeclaration(TypeDescriptor range, Iterable parameters) { + def FunctionDescription ->(TypeDescriptor parameter, TypeDescriptor range) { return #[parameter] -> range } + def FunctionDescription ->(Iterable parameters, TypeDescriptor range) { return new FunctionDescription(parameters.map[toTypeReference], range.toTypeReference); } + def FunctionDeclaration(CharSequence name, FunctionDescription functionDescription) { FunctionDeclaration(name,functionDescription.range, functionDescription.parameters) } + def FunctionDeclaration(FunctionDescription functionDescription) { FunctionDeclaration(functionDescription.range, functionDescription.parameters) } + def FunctionDeclaration(CharSequence name, TypeDescriptor range, TypeDescriptor... parameters) { FunctionDeclaration(name, range, parameters as Iterable) } + def FunctionDeclaration(TypeDescriptor range, TypeDescriptor... parameters) { FunctionDeclaration(range, parameters as Iterable) } + def FunctionDeclaration(CharSequence name, TypeDescriptor range, Iterable parameters) { return FunctionDeclaration(range,parameters) => [x|x.name = name.canonize] } + def FunctionDeclaration(TypeDescriptor range, Iterable parameters) { val function = createFunctionDeclaration for(parameter : parameters) function.parameters+=parameter.toTypeReference function.range = range.toTypeReference return function } - def public FunctionDefinition(CharSequence name, TypeDescriptor range, Function1 expression) { + def FunctionDefinition(CharSequence name, TypeDescriptor range, Function1 expression) { val context = new VariableContext(this,logicFactiory) val definition = expression.apply(context) return FunctionDefinition(name,range,context.variables,definition); } - def public FunctionDefinition(CharSequence name, TypeDescriptor range, Iterable variables, TermDescription definition) { + def FunctionDefinition(CharSequence name, TypeDescriptor range, Iterable variables, TermDescription definition) { return createFunctionDefinition => [ it.name = name.canonize it.parameters += variables.map[it.range.toTypeReference] @@ -162,23 +164,23 @@ public class LogicProblemBuilder{ it.value = definition.toTerm ] } - def public FunctionDefinition(CharSequence name, TypeDescriptor range, Iterable parameters, Map,Term> parametersToValue) { + def FunctionDefinition(CharSequence name, TypeDescriptor range, Iterable parameters, Map,Term> parametersToValue) { return FunctionDefinition(name,range,parameters,parametersToValue,null) } - def public FunctionDefinition(CharSequence name, TypeDescriptor range, Iterable parameters, Map,Term> parametersToValue, Term defaultValue) { + def FunctionDefinition(CharSequence name, TypeDescriptor range, Iterable parameters, Map,Term> parametersToValue, Term defaultValue) { val parameterList = parameters.toList; val variableList = (1..parameterList.size).map[index | '''param «index»'''.createVar(parameterList.get(index-1))].toList return FunctionDefinition(name,range,variableList,advancedConstructs.FunctionDefinitionBody(variableList,parametersToValue,defaultValue)) } // Add function to a problem - def public add(LogicProblem input, Function function) { + def add(LogicProblem input, Function function) { input.nameIfAnonymFunction(function) input.checkFunction(function) input.functions += function return function } - def public add(LogicProblem input, FunctionDescription functionDescription) { input.add(FunctionDeclaration(functionDescription)) } + def add(LogicProblem input, FunctionDescription functionDescription) { input.add(FunctionDeclaration(functionDescription)) } def protected nameIfAnonymFunction(LogicProblem problem, Function functionDeclaration) { if(functionDeclaration.name.nullOrEmpty) { functionDeclaration.name = problem.functions.map[it.name].generateUniqueName[i | "function"+i] @@ -199,15 +201,15 @@ public class LogicProblemBuilder{ } // Constants - def public ConstantDeclaration(CharSequence name, TypeDescriptor type) { ConstantDeclaration(type) => [it.name = name.canonize] } - def public ConstantDeclaration(TypeDescriptor type) { createConstantDeclaration => [it.type = type.toTypeReference] } + def ConstantDeclaration(CharSequence name, TypeDescriptor type) { ConstantDeclaration(type) => [it.name = name.canonize] } + def ConstantDeclaration(TypeDescriptor type) { createConstantDeclaration => [it.type = type.toTypeReference] } - def public ConstantDefinition(CharSequence name, TypeDescriptor type, TermDescription value) { + def ConstantDefinition(CharSequence name, TypeDescriptor type, TermDescription value) { createConstantDefinition => [it.name = name.canonize it.type = type.toTypeReference it.value = value.toTerm] } // Add constant to a problem - def public add(LogicProblem problem, Constant constant) { + def add(LogicProblem problem, Constant constant) { problem.nameIfAnonymConstant(constant); problem.checkConstant(constant) problem.constants += constant @@ -226,10 +228,10 @@ public class LogicProblemBuilder{ } // Relations - def public RelationDeclaration(CharSequence name, TypeDescriptor... parameters) { return RelationDeclaration(name, parameters as Iterable) } - def public RelationDeclaration(CharSequence name, Iterable parameters) { return RelationDeclaration(parameters) => [x|x.name = name.canonize] } - def public RelationDeclaration(TypeDescriptor... parameters) { RelationDeclaration( parameters as Iterable) } - def public RelationDeclaration(Iterable parameters) { + def RelationDeclaration(CharSequence name, TypeDescriptor... parameters) { return RelationDeclaration(name, parameters as Iterable) } + def RelationDeclaration(CharSequence name, Iterable parameters) { return RelationDeclaration(parameters) => [x|x.name = name.canonize] } + def RelationDeclaration(TypeDescriptor... parameters) { RelationDeclaration( parameters as Iterable) } + def RelationDeclaration(Iterable parameters) { val relation = createRelationDeclaration for(parameter : parameters) { relation.parameters+=parameter.toTypeReference @@ -237,12 +239,12 @@ public class LogicProblemBuilder{ return relation } - def public RelationDefinition(CharSequence name, Function1 expression) { + def RelationDefinition(CharSequence name, Function1 expression) { val context = new VariableContext(this,logicFactiory); val definition = expression.apply(context); return RelationDefinition(name,context.variables,definition) } - def public RelationDefinition(CharSequence name, Iterable variables, TermDescription definition) { + def RelationDefinition(CharSequence name, Iterable variables, TermDescription definition) { return createRelationDefinition => [ it.name = name.canonize it.parameters += variables.map[it.range.toTypeReference] @@ -250,7 +252,7 @@ public class LogicProblemBuilder{ it.value = definition?.toTerm ] } - def public RelationDefinition(CharSequence name, Iterable parameters, Iterable> possibleValues) { + def RelationDefinition(CharSequence name, Iterable parameters, Iterable> possibleValues) { val res = createRelationDefinition => [it.name = name.canonize] val variableMap = new ArrayList(parameters.size) var index = 0 @@ -267,7 +269,7 @@ public class LogicProblemBuilder{ } // Add Relation to a problem - def public add(LogicProblem input, Relation relation) { + def add(LogicProblem input, Relation relation) { input.nameIfAnonymRelation(relation) input.checkRelation(relation) input.relations+=relation @@ -293,17 +295,17 @@ public class LogicProblemBuilder{ } // Assertion - def public Assertion(TermDescription term) { + def Assertion(TermDescription term) { val result = term.toTerm result.nameAnonymVariables(Collections.EMPTY_LIST) createAssertion => [it.value = result] } - def public Assertion(CharSequence name, TermDescription term) { + def Assertion(CharSequence name, TermDescription term) { val result = term.toTerm result.nameAnonymVariables(Collections.EMPTY_LIST) createAssertion => [it.value = result it.name=name.canonize] } - def public add(LogicProblem problem, Assertion assertion) { + def add(LogicProblem problem, Assertion assertion) { if(assertion.name.nullOrEmpty) { val name = problem.assertions.map[name].generateUniqueName["assertion"+it] assertion.name=name @@ -313,7 +315,7 @@ public class LogicProblemBuilder{ return assertion } - def public add(LogicProblem problem, TermDescription term) { + def add(LogicProblem problem, TermDescription term) { problem.add(Assertion(term)) } @@ -329,7 +331,7 @@ public class LogicProblemBuilder{ } } - def public checkDefinition(EObject definition) { + def checkDefinition(EObject definition) { /*for(value : definition.eAllContents.filter(SymbolicValue).toIterable) { var referred = value.symbolicReference if(referred instanceof Variable) { @@ -341,7 +343,7 @@ public class LogicProblemBuilder{ } // Containment - def public ContainmentHierarchy( + def ContainmentHierarchy( Iterable typesInHierarchy, Iterable containmentFunctions, Iterable containmentRelations, @@ -355,7 +357,7 @@ public class LogicProblemBuilder{ ] return result } - def public add(LogicProblem problem, ContainmentHierarchy hierarchy) { + def add(LogicProblem problem, ContainmentHierarchy hierarchy) { problem.containmentHierarchies+=hierarchy return hierarchy } @@ -413,7 +415,7 @@ public class LogicProblemBuilder{ return result; } - def public Term toTerm(TermDescription term) { + def Term toTerm(TermDescription term) { if(term instanceof Term) return term else if (term instanceof Variable) return createSymbolicValue => [symbolicReference = term] else if (term instanceof Constant) return term.call() @@ -421,74 +423,74 @@ public class LogicProblemBuilder{ else throw new UnsupportedOperationException("Can not create reference for symbolic declaration " + term.class.name) } - def public !(TermDescription term) { Not(term) } - def public Not(TermDescription term) { createNot => [operand = term.toTerm] } + def !(TermDescription term) { Not(term) } + def Not(TermDescription term) { createNot => [operand = term.toTerm] } - def public &&(TermDescription a, TermDescription b) { And(a,b) } - def public And(TermDescription... terms) { return And(terms as Iterable) } - def public And(Iterable terms) { createAnd => [operands += terms.map[toTerm]] } + def &&(TermDescription a, TermDescription b) { And(a,b) } + def And(TermDescription... terms) { return And(terms as Iterable) } + def And(Iterable terms) { createAnd => [operands += terms.map[toTerm]] } - def public ||(TermDescription a, TermDescription b) { Or(a,b) } - def public Or(TermDescription... terms) { Or(terms as Iterable) } - def public Or(Iterable terms) { createOr => [operands += terms.map[toTerm]] } + def ||(TermDescription a, TermDescription b) { Or(a,b) } + def Or(TermDescription... terms) { Or(terms as Iterable) } + def Or(Iterable terms) { createOr => [operands += terms.map[toTerm]] } - def public =>(TermDescription a, TermDescription b) { Impl(a,b) } - def public Impl(TermDescription a, TermDescription b) { createImpl => [leftOperand = a.toTerm rightOperand = b.toTerm] } + def =>(TermDescription a, TermDescription b) { Impl(a,b) } + def Impl(TermDescription a, TermDescription b) { createImpl => [leftOperand = a.toTerm rightOperand = b.toTerm] } - def public <=>(TermDescription a, TermDescription b) { Iff(a,b)} - def public Iff(TermDescription a, TermDescription b) { createIff =>[leftOperand=a.toTerm rightOperand=b.toTerm] } + def <=>(TermDescription a, TermDescription b) { Iff(a,b)} + def Iff(TermDescription a, TermDescription b) { createIff =>[leftOperand=a.toTerm rightOperand=b.toTerm] } - def public ITE(TermDescription condition, TermDescription ifTrue, TermDescription ifFalse) { + def ITE(TermDescription condition, TermDescription ifTrue, TermDescription ifFalse) { createIfThenElse => [it.condition = condition.toTerm it.ifTrue = ifTrue.toTerm it.ifFalse = ifFalse.toTerm] } - def public >(TermDescription left, TermDescription right) { MoreThan(left,right)} - def public MoreThan(TermDescription left, TermDescription right) { createMoreThan => [leftOperand=left.toTerm rightOperand=right.toTerm] } + def >(TermDescription left, TermDescription right) { MoreThan(left,right)} + def MoreThan(TermDescription left, TermDescription right) { createMoreThan => [leftOperand=left.toTerm rightOperand=right.toTerm] } - def public <(TermDescription left, TermDescription right) { LessThan(left,right)} - def public LessThan(TermDescription left, TermDescription right) { createLessThan => [leftOperand=left.toTerm rightOperand=right.toTerm] } + def <(TermDescription left, TermDescription right) { LessThan(left,right)} + def LessThan(TermDescription left, TermDescription right) { createLessThan => [leftOperand=left.toTerm rightOperand=right.toTerm] } - def public <=(TermDescription left, TermDescription right) { LessOrEqual(left,right) } - def public LessOrEqual(TermDescription left, TermDescription right) { createLessOrEqualThan => [leftOperand=left.toTerm rightOperand=right.toTerm] } + def <=(TermDescription left, TermDescription right) { LessOrEqual(left,right) } + def LessOrEqual(TermDescription left, TermDescription right) { createLessOrEqualThan => [leftOperand=left.toTerm rightOperand=right.toTerm] } - def public >=(TermDescription left, TermDescription right) { MoreOrEqual(left,right) } - def public MoreOrEqual(TermDescription left, TermDescription right) { createMoreOrEqualThan => [leftOperand=left.toTerm rightOperand=right.toTerm] } + def >=(TermDescription left, TermDescription right) { MoreOrEqual(left,right) } + def MoreOrEqual(TermDescription left, TermDescription right) { createMoreOrEqualThan => [leftOperand=left.toTerm rightOperand=right.toTerm] } - def public ==(TermDescription left, TermDescription right) {Equals(left,right)} - def public Equals(TermDescription left, TermDescription right) { createEquals => [leftOperand=left.toTerm rightOperand=right.toTerm] } + def ==(TermDescription left, TermDescription right) {Equals(left,right)} + def Equals(TermDescription left, TermDescription right) { createEquals => [leftOperand=left.toTerm rightOperand=right.toTerm] } - def public !=(TermDescription left, TermDescription right) { Distinct(left,right) } - def public Distinct(TermDescription... terms) { return Distinct(terms as Iterable) } - def public Distinct(Iterable terms) { createDistinct => [operands += terms.map[toTerm]] } + def !=(TermDescription left, TermDescription right) { Distinct(left,right) } + def Distinct(TermDescription... terms) { return Distinct(terms as Iterable) } + def Distinct(Iterable terms) { createDistinct => [operands += terms.map[toTerm]] } - def public +(TermDescription left, TermDescription right) { Plus(left,right) } - def public Plus(TermDescription left, TermDescription right) { createPlus => [leftOperand=left.toTerm rightOperand=right.toTerm] } + def +(TermDescription left, TermDescription right) { Plus(left,right) } + def Plus(TermDescription left, TermDescription right) { createPlus => [leftOperand=left.toTerm rightOperand=right.toTerm] } - def public -(TermDescription left, TermDescription right) { Minus(left,right) } - def public Minus(TermDescription left, TermDescription right) { createMinus => [leftOperand=left.toTerm rightOperand=right.toTerm] } + def -(TermDescription left, TermDescription right) { Minus(left,right) } + def Minus(TermDescription left, TermDescription right) { createMinus => [leftOperand=left.toTerm rightOperand=right.toTerm] } - def public *(TermDescription left, TermDescription right) { Multiply(left,right) } - def public Multiply(TermDescription left, TermDescription right) { createMultiply => [leftOperand=left.toTerm rightOperand=right.toTerm] } + def *(TermDescription left, TermDescription right) { Multiply(left,right) } + def Multiply(TermDescription left, TermDescription right) { createMultiply => [leftOperand=left.toTerm rightOperand=right.toTerm] } - def public /(TermDescription left, TermDescription right) { Divide(left,right) } - def public Divide(TermDescription left, TermDescription right) { createDivison => [leftOperand = left.toTerm rightOperand = right.toTerm]} + def /(TermDescription left, TermDescription right) { Divide(left,right) } + def Divide(TermDescription left, TermDescription right) { createDivison => [leftOperand = left.toTerm rightOperand = right.toTerm]} - def public %(TermDescription left, TermDescription right) { Modulo(left,right) } - def public Modulo(TermDescription left, TermDescription right) { createMod => [leftOperand = left.toTerm rightOperand = right.toTerm]} + def %(TermDescription left, TermDescription right) { Modulo(left,right) } + def Modulo(TermDescription left, TermDescription right) { createMod => [leftOperand = left.toTerm rightOperand = right.toTerm]} - def public asTerm(boolean value) { createBoolLiteral => [x|x.value = value] } - def public asTerm(int value) { createIntLiteral => [x|x.value = value] } - def public asTerm(double value) { BigDecimal.valueOf(value).asTerm } - def public asTerm(float value) { BigDecimal.valueOf(value).asTerm } - def public asTerm(BigDecimal value) { createRealLiteral => [x|x.value = value] } - def public asTerm(String value) { createStringLiteral => [x|x.value = value]} - def public InstanceOf(TermDescription term, TypeDescriptor type) { + def asTerm(boolean value) { createBoolLiteral => [x|x.value = value] } + def asTerm(int value) { createIntLiteral => [x|x.value = value] } + def asTerm(double value) { BigDecimal.valueOf(value).asTerm } + def asTerm(float value) { BigDecimal.valueOf(value).asTerm } + def asTerm(BigDecimal value) { createRealLiteral => [x|x.value = value] } + def asTerm(String value) { createStringLiteral => [x|x.value = value]} + def InstanceOf(TermDescription term, TypeDescriptor type) { createInstanceOf => [ it.value = term.toTerm it.range = type.toTypeReference ] } - def public transitiveClosure(Relation relation, TermDescription source, TermDescription target) { + def transitiveClosure(Relation relation, TermDescription source, TermDescription target) { createTransitiveClosure => [ it.relation = relation it.leftOperand = leftOperand @@ -498,38 +500,79 @@ public class LogicProblemBuilder{ // QuantifiedExpressions - def public Forall(Function1 expression) { + def Forall(Function1 expression) { val context = new VariableContext(this,logicFactiory) val term = expression.apply(context) return createForall => [x| x.quantifiedVariables+=context.variables x.expression = term.toTerm] } - def public Forall(TermDescription expression, Variable... variables) { + def Forall(TermDescription expression, Variable... variables) { Forall(variables,expression) } - def public Forall(Iterable variables,TermDescription expression) { + def Forall(Iterable variables,TermDescription expression) { val forallExpression = createForall for(variable : variables) forallExpression.quantifiedVariables += variable forallExpression.expression = expression.toTerm return forallExpression } - def public Exists(Function1 expression) { + def Exists(Function1 expression) { val context = new VariableContext(this,logicFactiory) val term = expression.apply(context) return createExists => [x| x.quantifiedVariables+=context.variables x.expression = term.toTerm] } - def public Exists(TermDescription expression, Variable... variables) { + def Exists(TermDescription expression, Variable... variables) { Exists(variables,expression) } - def public Exists(Iterable variables, TermDescription expression) { + def Exists(Iterable variables, TermDescription expression) { val existsExpression = createExists for(variable : variables) existsExpression.quantifiedVariables += variable existsExpression.expression = expression.toTerm return existsExpression } + // AggregatedExpression + + private def configureAggregateExpression(T expression, Relation referred, List terms) { + if(terms.size != referred.parameters.size) { + throw new LogicProblemBuilderException( + '''The function called has «referred.parameters.size» parameters but it is called with «terms.size»!''') + } else { + expression.relation = referred + for(var i=0; i [it.variable = target] + expression.parameterSubstitution += substitution + } + return expression + } + } + private def configureProjectedAggregateExpression(T expression, Relation referred, List terms, int projection) { + if(projection < 0 || projection >= referred.parameters.size) { + throw new LogicProblemBuilderException( + '''The function called has «referred.parameters.size» parameters but it is called with «terms.size»!''') + } else { + val res = expression.configureAggregateExpression(referred, terms) + if(res.parameterSubstitution.get(projection) !== null) { + throw new LogicProblemBuilderException( + '''Projection over set variable!''') + } + val projectionType = referred.parameters.get(projection) + if(!(projectionType instanceof IntTypeReference || projectionType instanceof RealTypeReference)) { + throw new LogicProblemBuilderException('''Projection over nunnumeric parameter!''' + ) + } + res.projectionIndex = projection + return res + } + + } + def Count(Relation referred, List terms) { createCount.configureAggregateExpression(referred,terms) } + def Sum(Relation referred, List terms, int projection) { createSum.configureProjectedAggregateExpression(referred,terms,projection) } + def Min(Relation referred, List terms, int projection) { createMin.configureProjectedAggregateExpression(referred,terms,projection) } + def Max(Relation referred, List terms, int projection) { createMax.configureProjectedAggregateExpression(referred,terms,projection) } + // Function calls - def public call(Function function, TermDescription... substitutions) { + def call(Function function, TermDescription... substitutions) { call(function, substitutions as Iterable) } - def public call(Function function, Iterable substitutions) { + def call(Function function, Iterable substitutions) { val functionReference = createSymbolicValue functionReference.symbolicReference=function val List l= new LinkedList() @@ -546,8 +589,8 @@ public class LogicProblemBuilder{ } // Relation calls - def public call(Relation relation, TermDescription... substitution) { relation.call(substitution as Iterable)} - def public call(Relation relation, Iterable substitution) { + def call(Relation relation, TermDescription... substitution) { relation.call(substitution as Iterable)} + def call(Relation relation, Iterable substitution) { val relationReference = createSymbolicValue relationReference.symbolicReference = relation //println('''«relation.name»(«substitution.size»->«relation.parameters»)''') @@ -567,11 +610,9 @@ public class LogicProblemBuilder{ } // constant evaluation - def public call(Constant constant) { + def call(Constant constant) { val constantReference = createSymbolicValue constantReference.symbolicReference = constant return constantReference - } - - + } } -- cgit v1.2.3-54-g00ecf From 539618ccaedfe05d5d62971c8fd0578f5ff3d040 Mon Sep 17 00:00:00 2001 From: Oszkar Semerath Date: Mon, 15 Jul 2019 17:31:00 +0200 Subject: parsing count, min, max, check and eval v1 --- .../model/logiclanguage/AggregateExpression.java | 23 ++ .../model/logiclanguage/LogiclanguagePackage.java | 75 +++- .../impl/AggregateExpressionImpl.java | 63 ++++ .../impl/LogiclanguagePackageImpl.java | 12 + .../model/logiclanguage.aird | 34 +- .../model/logiclanguage.ecore | 1 + .../model/logiclanguage.genmodel | 1 + .../logic/model/builder/LogicProblemBuilder.xtend | 40 ++- .../META-INF/MANIFEST.MF | 3 +- .../viatra2logic/Constraint2Logic.xtend | 69 ++++ .../viatra2logic/ExpressionEvaluation2Logic.xtend | 132 +++++++ .../dslreasoner/viatra2logic/Viatra2Logic.xtend | 328 ++++------------- .../viatra2logic/Viatra2LogicTypeInferer.xtend | 392 +++++++++++++++++++++ .../viatra2logic/Viatra2LogicTypeResult.xtend | 47 +++ .../viatra2logic/XExpressionExtractor.xtend | 24 ++ 15 files changed, 961 insertions(+), 283 deletions(-) create mode 100644 Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/ExpressionEvaluation2Logic.xtend create mode 100644 Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Viatra2LogicTypeInferer.xtend create mode 100644 Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Viatra2LogicTypeResult.xtend create mode 100644 Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/XExpressionExtractor.xtend (limited to 'Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic') diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/AggregateExpression.java b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/AggregateExpression.java index 4b38becf..589145c3 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/AggregateExpression.java +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/AggregateExpression.java @@ -16,6 +16,7 @@ import org.eclipse.emf.common.util.EList; *
      *
    • {@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregateExpression#getRelation Relation}
    • *
    • {@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregateExpression#getParameterSubstitution Parameter Substitution}
    • + *
    • {@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregateExpression#getResultVariable Result Variable}
    • *
    * * @see hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.LogiclanguagePackage#getAggregateExpression() @@ -61,4 +62,26 @@ public interface AggregateExpression extends Term { */ EList getParameterSubstitution(); + /** + * Returns the value of the 'Result Variable' reference. + * + * + * @return the value of the 'Result Variable' reference. + * @see #setResultVariable(Variable) + * @see hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.LogiclanguagePackage#getAggregateExpression_ResultVariable() + * @model + * @generated + */ + Variable getResultVariable(); + + /** + * Sets the value of the '{@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregateExpression#getResultVariable Result Variable}' reference. + * + * + * @param value the new value of the 'Result Variable' reference. + * @see #getResultVariable() + * @generated + */ + void setResultVariable(Variable value); + } // AggregateExpression diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/LogiclanguagePackage.java b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/LogiclanguagePackage.java index f5347e31..193d9bdd 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/LogiclanguagePackage.java +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/LogiclanguagePackage.java @@ -2759,6 +2759,15 @@ public interface LogiclanguagePackage extends EPackage { */ int AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION = TERM_FEATURE_COUNT + 1; + /** + * The feature id for the 'Result Variable' reference. + * + * + * @generated + * @ordered + */ + int AGGREGATE_EXPRESSION__RESULT_VARIABLE = TERM_FEATURE_COUNT + 2; + /** * The number of structural features of the 'Aggregate Expression' class. * @@ -2766,7 +2775,7 @@ public interface LogiclanguagePackage extends EPackage { * @generated * @ordered */ - int AGGREGATE_EXPRESSION_FEATURE_COUNT = TERM_FEATURE_COUNT + 2; + int AGGREGATE_EXPRESSION_FEATURE_COUNT = TERM_FEATURE_COUNT + 3; /** * The number of operations of the 'Aggregate Expression' class. @@ -2805,6 +2814,15 @@ public interface LogiclanguagePackage extends EPackage { */ int PROJECTED_AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION = AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION; + /** + * The feature id for the 'Result Variable' reference. + * + * + * @generated + * @ordered + */ + int PROJECTED_AGGREGATE_EXPRESSION__RESULT_VARIABLE = AGGREGATE_EXPRESSION__RESULT_VARIABLE; + /** * The feature id for the 'Projection Index' attribute. * @@ -2860,6 +2878,15 @@ public interface LogiclanguagePackage extends EPackage { */ int SUM__PARAMETER_SUBSTITUTION = PROJECTED_AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION; + /** + * The feature id for the 'Result Variable' reference. + * + * + * @generated + * @ordered + */ + int SUM__RESULT_VARIABLE = PROJECTED_AGGREGATE_EXPRESSION__RESULT_VARIABLE; + /** * The feature id for the 'Projection Index' attribute. * @@ -2915,6 +2942,15 @@ public interface LogiclanguagePackage extends EPackage { */ int COUNT__PARAMETER_SUBSTITUTION = AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION; + /** + * The feature id for the 'Result Variable' reference. + * + * + * @generated + * @ordered + */ + int COUNT__RESULT_VARIABLE = AGGREGATE_EXPRESSION__RESULT_VARIABLE; + /** * The number of structural features of the 'Count' class. * @@ -2961,6 +2997,15 @@ public interface LogiclanguagePackage extends EPackage { */ int MIN__PARAMETER_SUBSTITUTION = PROJECTED_AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION; + /** + * The feature id for the 'Result Variable' reference. + * + * + * @generated + * @ordered + */ + int MIN__RESULT_VARIABLE = PROJECTED_AGGREGATE_EXPRESSION__RESULT_VARIABLE; + /** * The feature id for the 'Projection Index' attribute. * @@ -3016,6 +3061,15 @@ public interface LogiclanguagePackage extends EPackage { */ int MAX__PARAMETER_SUBSTITUTION = PROJECTED_AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION; + /** + * The feature id for the 'Result Variable' reference. + * + * + * @generated + * @ordered + */ + int MAX__RESULT_VARIABLE = PROJECTED_AGGREGATE_EXPRESSION__RESULT_VARIABLE; + /** * The feature id for the 'Projection Index' attribute. * @@ -4408,6 +4462,17 @@ public interface LogiclanguagePackage extends EPackage { */ EReference getAggregateExpression_ParameterSubstitution(); + /** + * Returns the meta object for the reference '{@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregateExpression#getResultVariable Result Variable}'. + * + * + * @return the meta object for the reference 'Result Variable'. + * @see hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregateExpression#getResultVariable() + * @see #getAggregateExpression() + * @generated + */ + EReference getAggregateExpression_ResultVariable(); + /** * Returns the meta object for class '{@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Sum Sum}'. * @@ -5641,6 +5706,14 @@ public interface LogiclanguagePackage extends EPackage { */ EReference AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION = eINSTANCE.getAggregateExpression_ParameterSubstitution(); + /** + * The meta object literal for the 'Result Variable' reference feature. + * + * + * @generated + */ + EReference AGGREGATE_EXPRESSION__RESULT_VARIABLE = eINSTANCE.getAggregateExpression_ResultVariable(); + /** * The meta object literal for the '{@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.impl.SumImpl Sum}' class. * diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/impl/AggregateExpressionImpl.java b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/impl/AggregateExpressionImpl.java index 0459af42..31155b84 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/impl/AggregateExpressionImpl.java +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/impl/AggregateExpressionImpl.java @@ -7,6 +7,7 @@ import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.AggregatedParameterS import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.LogiclanguagePackage; import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Relation; +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Variable; import java.util.Collection; import org.eclipse.emf.common.notify.Notification; @@ -29,6 +30,7 @@ import org.eclipse.emf.ecore.util.InternalEList; *
      *
    • {@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.impl.AggregateExpressionImpl#getRelation Relation}
    • *
    • {@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.impl.AggregateExpressionImpl#getParameterSubstitution Parameter Substitution}
    • + *
    • {@link hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.impl.AggregateExpressionImpl#getResultVariable Result Variable}
    • *
    * * @generated @@ -54,6 +56,16 @@ public abstract class AggregateExpressionImpl extends TermImpl implements Aggreg */ protected EList parameterSubstitution; + /** + * The cached value of the '{@link #getResultVariable() Result Variable}' reference. + * + * + * @see #getResultVariable() + * @generated + * @ordered + */ + protected Variable resultVariable; + /** * * @@ -126,6 +138,46 @@ public abstract class AggregateExpressionImpl extends TermImpl implements Aggreg return parameterSubstitution; } + /** + * + * + * @generated + */ + @Override + public Variable getResultVariable() { + if (resultVariable != null && resultVariable.eIsProxy()) { + InternalEObject oldResultVariable = (InternalEObject)resultVariable; + resultVariable = (Variable)eResolveProxy(oldResultVariable); + if (resultVariable != oldResultVariable) { + if (eNotificationRequired()) + eNotify(new ENotificationImpl(this, Notification.RESOLVE, LogiclanguagePackage.AGGREGATE_EXPRESSION__RESULT_VARIABLE, oldResultVariable, resultVariable)); + } + } + return resultVariable; + } + + /** + * + * + * @generated + */ + public Variable basicGetResultVariable() { + return resultVariable; + } + + /** + * + * + * @generated + */ + @Override + public void setResultVariable(Variable newResultVariable) { + Variable oldResultVariable = resultVariable; + resultVariable = newResultVariable; + if (eNotificationRequired()) + eNotify(new ENotificationImpl(this, Notification.SET, LogiclanguagePackage.AGGREGATE_EXPRESSION__RESULT_VARIABLE, oldResultVariable, resultVariable)); + } + /** * * @@ -153,6 +205,9 @@ public abstract class AggregateExpressionImpl extends TermImpl implements Aggreg return basicGetRelation(); case LogiclanguagePackage.AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION: return getParameterSubstitution(); + case LogiclanguagePackage.AGGREGATE_EXPRESSION__RESULT_VARIABLE: + if (resolve) return getResultVariable(); + return basicGetResultVariable(); } return super.eGet(featureID, resolve, coreType); } @@ -173,6 +228,9 @@ public abstract class AggregateExpressionImpl extends TermImpl implements Aggreg getParameterSubstitution().clear(); getParameterSubstitution().addAll((Collection)newValue); return; + case LogiclanguagePackage.AGGREGATE_EXPRESSION__RESULT_VARIABLE: + setResultVariable((Variable)newValue); + return; } super.eSet(featureID, newValue); } @@ -191,6 +249,9 @@ public abstract class AggregateExpressionImpl extends TermImpl implements Aggreg case LogiclanguagePackage.AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION: getParameterSubstitution().clear(); return; + case LogiclanguagePackage.AGGREGATE_EXPRESSION__RESULT_VARIABLE: + setResultVariable((Variable)null); + return; } super.eUnset(featureID); } @@ -207,6 +268,8 @@ public abstract class AggregateExpressionImpl extends TermImpl implements Aggreg return relation != null; case LogiclanguagePackage.AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION: return parameterSubstitution != null && !parameterSubstitution.isEmpty(); + case LogiclanguagePackage.AGGREGATE_EXPRESSION__RESULT_VARIABLE: + return resultVariable != null; } return super.eIsSet(featureID); } diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/impl/LogiclanguagePackageImpl.java b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/impl/LogiclanguagePackageImpl.java index 64ebdde1..03a679e4 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/impl/LogiclanguagePackageImpl.java +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/ecore-gen/hu/bme/mit/inf/dslreasoner/logic/model/logiclanguage/impl/LogiclanguagePackageImpl.java @@ -1886,6 +1886,16 @@ public class LogiclanguagePackageImpl extends EPackageImpl implements Logiclangu return (EReference)aggregateExpressionEClass.getEStructuralFeatures().get(1); } + /** + * + * + * @generated + */ + @Override + public EReference getAggregateExpression_ResultVariable() { + return (EReference)aggregateExpressionEClass.getEStructuralFeatures().get(2); + } + /** * * @@ -2180,6 +2190,7 @@ public class LogiclanguagePackageImpl extends EPackageImpl implements Logiclangu aggregateExpressionEClass = createEClass(AGGREGATE_EXPRESSION); createEReference(aggregateExpressionEClass, AGGREGATE_EXPRESSION__RELATION); createEReference(aggregateExpressionEClass, AGGREGATE_EXPRESSION__PARAMETER_SUBSTITUTION); + createEReference(aggregateExpressionEClass, AGGREGATE_EXPRESSION__RESULT_VARIABLE); sumEClass = createEClass(SUM); @@ -2476,6 +2487,7 @@ public class LogiclanguagePackageImpl extends EPackageImpl implements Logiclangu initEClass(aggregateExpressionEClass, AggregateExpression.class, "AggregateExpression", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); initEReference(getAggregateExpression_Relation(), this.getRelation(), null, "relation", null, 0, 1, AggregateExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); initEReference(getAggregateExpression_ParameterSubstitution(), this.getAggregatedParameterSubstitution(), null, "parameterSubstitution", null, 0, -1, AggregateExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); + initEReference(getAggregateExpression_ResultVariable(), this.getVariable(), null, "resultVariable", null, 0, 1, AggregateExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); initEClass(sumEClass, Sum.class, "Sum", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/model/logiclanguage.aird b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/model/logiclanguage.aird index 0a49e388..e96b4586 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/model/logiclanguage.aird +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/model/logiclanguage.aird @@ -9146,6 +9146,22 @@ + + + + + + + + + + + + + + + + @@ -9240,7 +9256,7 @@ - + KEEP_LOCATION @@ -10514,7 +10530,7 @@ - + KEEP_LOCATION @@ -10714,6 +10730,20 @@ + + + + + + + labelSize + + + labelSize + + + + diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/model/logiclanguage.ecore b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/model/logiclanguage.ecore index fb94b598..a91d4407 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/model/logiclanguage.ecore +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/model/logiclanguage.ecore @@ -217,6 +217,7 @@ +
    diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/model/logiclanguage.genmodel b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/model/logiclanguage.genmodel index cb14ae5b..0f35db7c 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/model/logiclanguage.genmodel +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/model/logiclanguage.genmodel @@ -169,6 +169,7 @@ + diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/builder/LogicProblemBuilder.xtend b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/builder/LogicProblemBuilder.xtend index 09bfbb39..a231af3c 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/builder/LogicProblemBuilder.xtend +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/builder/LogicProblemBuilder.xtend @@ -478,6 +478,7 @@ class LogicProblemBuilder{ def %(TermDescription left, TermDescription right) { Modulo(left,right) } def Modulo(TermDescription left, TermDescription right) { createMod => [leftOperand = left.toTerm rightOperand = right.toTerm]} + def Pow(TermDescription left, TermDescription right) {createPow => [leftOperand = left.toTerm rightOperand = right.toTerm]} def asTerm(boolean value) { createBoolLiteral => [x|x.value = value] } def asTerm(int value) { createIntLiteral => [x|x.value = value] } def asTerm(double value) { BigDecimal.valueOf(value).asTerm } @@ -530,27 +531,28 @@ class LogicProblemBuilder{ // AggregatedExpression - private def configureAggregateExpression(T expression, Relation referred, List terms) { + private def configureAggregateExpression(T expression, Relation referred, List terms, Variable target) { if(terms.size != referred.parameters.size) { throw new LogicProblemBuilderException( '''The function called has «referred.parameters.size» parameters but it is called with «terms.size»!''') } else { expression.relation = referred + expression.resultVariable = target for(var i=0; i [it.variable = target] + val targetRelation = terms.get(i) + val substitution = createAggregatedParameterSubstitution => [it.variable = targetRelation] expression.parameterSubstitution += substitution } return expression } } - private def configureProjectedAggregateExpression(T expression, Relation referred, List terms, int projection) { + private def configureProjectedAggregateExpression(T expression, Relation referred, List terms, Variable target, int projection) { if(projection < 0 || projection >= referred.parameters.size) { throw new LogicProblemBuilderException( '''The function called has «referred.parameters.size» parameters but it is called with «terms.size»!''') } else { - val res = expression.configureAggregateExpression(referred, terms) - if(res.parameterSubstitution.get(projection) !== null) { + val res = expression.configureAggregateExpression(referred, terms,target) + if(res.parameterSubstitution.get(projection).variable !== null) { throw new LogicProblemBuilderException( '''Projection over set variable!''') } @@ -564,10 +566,18 @@ class LogicProblemBuilder{ } } - def Count(Relation referred, List terms) { createCount.configureAggregateExpression(referred,terms) } - def Sum(Relation referred, List terms, int projection) { createSum.configureProjectedAggregateExpression(referred,terms,projection) } - def Min(Relation referred, List terms, int projection) { createMin.configureProjectedAggregateExpression(referred,terms,projection) } - def Max(Relation referred, List terms, int projection) { createMax.configureProjectedAggregateExpression(referred,terms,projection) } + def Count(Relation referred, List terms, Variable result) { + createCount.configureAggregateExpression(referred,terms,result) + } + def Sum(Relation referred, List terms, int projection, Variable result) { + createSum.configureProjectedAggregateExpression(referred,terms,result,projection) + } + def Min(Relation referred, List terms, int projection, Variable result) { + createMin.configureProjectedAggregateExpression(referred,terms,result,projection) + } + def Max(Relation referred, List terms, int projection, Variable result) { + createMax.configureProjectedAggregateExpression(referred,terms,result,projection) + } // Function calls def call(Function function, TermDescription... substitutions) { @@ -592,17 +602,19 @@ class LogicProblemBuilder{ def call(Relation relation, TermDescription... substitution) { relation.call(substitution as Iterable)} def call(Relation relation, Iterable substitution) { val relationReference = createSymbolicValue + if(relation === null) { + throw new LogicProblemBuilderException('''Call is referring to null!''') + } relationReference.symbolicReference = relation - //println('''«relation.name»(«substitution.size»->«relation.parameters»)''') for(value : substitution) relationReference.parameterSubstitutions += value.toTerm relationReference.checkRelationCall(relation) return relationReference } def private checkRelationCall(SymbolicValue value, Relation referredRelation) { -// if(value === null || referredRelation === null) { -// println("gebasz") -// } + if(value === null || referredRelation === null) { + throw new LogicProblemBuilderException('''Call is referring to null!''') + } if(value.parameterSubstitutions.size != referredRelation.parameters.size) { throw new LogicProblemBuilderException( '''The relation "«referredRelation.name»" called has «referredRelation.parameters.size» parameters but it is called with «value.parameterSubstitutions.size»!''') diff --git a/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/META-INF/MANIFEST.MF b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/META-INF/MANIFEST.MF index 8fa4517d..6aa9b63e 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/META-INF/MANIFEST.MF +++ b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/META-INF/MANIFEST.MF @@ -18,7 +18,8 @@ Require-Bundle: com.google.guava, hu.bme.mit.inf.dslreasoner.logic.model;bundle-version="1.0.0";visibility:=reexport, org.eclipse.viatra.query.runtime.base.itc;bundle-version="1.5.0", org.eclipse.viatra.query.patternlanguage.emf;bundle-version="2.0.0", - org.eclipse.xtext + org.eclipse.xtext, + org.eclipse.xtext.xbase;bundle-version="2.18.0" Bundle-ActivationPolicy: lazy Export-Package: hu.bme.mit.inf.dslreasoner.viatra2logic, hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations, diff --git a/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Constraint2Logic.xtend b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Constraint2Logic.xtend index 3e8b3366..ffbca0af 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Constraint2Logic.xtend +++ b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Constraint2Logic.xtend @@ -30,10 +30,20 @@ import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeCo import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.TypeFilterConstraint +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.AggregatorConstraint +import org.eclipse.viatra.query.runtime.matchers.aggregators.DoubleSumOperator +import org.eclipse.viatra.query.runtime.matchers.aggregators.IntegerSumOperator +import org.eclipse.viatra.query.runtime.matchers.aggregators.LongSumOperator +import org.eclipse.viatra.query.runtime.matchers.aggregators.ExtremumOperator +import org.eclipse.viatra.query.runtime.matchers.aggregators.ExtremumOperator.Extreme +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.PatternMatchCounter +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExpressionEvaluation class Constraint2Logic { val extension LogicProblemBuilder builder = new LogicProblemBuilder val Ecore2Logic ecore2Logic + val ExpressionEvaluation2Logic expressionEvaliation2Logic = new ExpressionEvaluation2Logic + val expressionExtractor = new XExpressionExtractor new(Ecore2Logic ecore2Logic) { this.ecore2Logic = ecore2Logic @@ -269,6 +279,65 @@ class Constraint2Logic { } else throw new IllegalArgumentException('''unknown tuple: «tuple»''') } + def dispatch Term transformConstraint(AggregatorConstraint constraint, + TracedOutput ecore2LogicTrace, + Viatra2LogicTrace viatra2LogicTrace, + Map variable2Variable, + Viatra2LogicConfiguration config) + { + val logicReferred = constraint.referredQuery.lookup(viatra2LogicTrace.query2Relation) + val parameterSubstitution = new LinkedList + for(index : 0.. ecore2LogicTrace, + Viatra2LogicTrace viatra2LogicTrace, + Map variable2Variable, + Viatra2LogicConfiguration config) + { + val logicReferred = constraint.referredQuery.lookup(viatra2LogicTrace.query2Relation) + val parameterSubstitution = new LinkedList + for(index : 0.. ecore2LogicTrace, + Viatra2LogicTrace viatra2LogicTrace, + Map variable2Variable, + Viatra2LogicConfiguration config) + { + val outputVariable = constraint.outputVariable + val expression = expressionExtractor.extractExpression(constraint.evaluator) + return expressionEvaliation2Logic.transformEval(outputVariable,expression,variable2Variable) + } + def dispatch Term transformConstraint(PConstraint constraint, TracedOutput ecore2LogicTrace, Viatra2LogicTrace viatra2LogicTrace, diff --git a/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/ExpressionEvaluation2Logic.xtend b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/ExpressionEvaluation2Logic.xtend new file mode 100644 index 00000000..f474ded4 --- /dev/null +++ b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/ExpressionEvaluation2Logic.xtend @@ -0,0 +1,132 @@ +package hu.bme.mit.inf.dslreasoner.viatra2logic + +import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Term +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Variable +import java.util.Map +import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable +import org.eclipse.xtext.xbase.XBinaryOperation +import org.eclipse.xtext.xbase.XExpression +import org.eclipse.xtext.xbase.XFeatureCall +import org.eclipse.xtext.xbase.XMemberFeatureCall +import org.eclipse.xtext.xbase.XNumberLiteral +import org.eclipse.xtext.xbase.XUnaryOperation + +import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* + +class ExpressionEvaluation2Logic { + val extension LogicProblemBuilder builder = new LogicProblemBuilder + + def Term transformCheck(XExpression expression, Map variable2Variable) { + return expression.transform(variable2Variable) + } + def Term transformEval(PVariable target, XExpression expression, Map variable2Variable) { + return target.lookup(variable2Variable) == expression.transform(variable2Variable) + } + + static val N_Base = "org.eclipse.xtext.xbase.lib." + + static val N_PLUS1 = "operator_plus" + static val N_MINUS1 = "operator_minus" + + static val N_MINUS2 = "operator_minus" + static val N_PLUS2 = "operator_plus" + static val N_POWER = "operator_power" + static val N_MULTIPLY = "operator_multiply" + static val N_DIVIDE = "operator_divide" + static val N_MODULO = "operator_modulo" + static val N_LESSTHAN = "operator_lessThan" + static val N_LESSEQUALSTHAN = "operator_lessEqualsThan" + static val N_GREATERTHAN = "operator_greaterThan" + static val N_GREATEREQUALTHAN = "operator_greaterEqualsThan" + static val N_EQUALS = "operator_equals" + static val N_NOTEQUALS = "operator_notEquals" + static val N_EQUALS3 = "operator_tripleEquals" + static val N_NOTEQUALS3 = "operator_tripleNotEquals" + + + + protected def isN(String name, String s) { + val res = name.startsWith(N_Base) && name.endsWith(s) + //println('''[«res»] «name» ?= «N_Base»*«s»''') + return res + } + + static val N_POWER2 = "java.lang.Math.pow" + + def protected dispatch Term transform(XBinaryOperation e, Map variable2Variable) { + val left = e.leftOperand.transform(variable2Variable) + val right = e.rightOperand.transform(variable2Variable) + val feature = e.feature.qualifiedName + if(feature.isN(N_MINUS2)) { return Minus(left,right) } + else if(feature.isN(N_PLUS2)) { return Plus(left,right) } + else if(feature.isN(N_POWER)) { return Pow(left,right) } + else if(feature.isN(N_MULTIPLY)) { return Multiply(left,right) } + else if(feature.isN(N_DIVIDE)) { return Divide(left,right) } + else if(feature.isN(N_MODULO)) { return Modulo(left,right) } + else if(feature.isN(N_LESSTHAN)) { return LessThan(left,right) } + else if(feature.isN(N_LESSEQUALSTHAN)) { return LessOrEqual(left,right) } + else if(feature.isN(N_GREATERTHAN)) { return MoreThan(left,right) } + else if(feature.isN(N_GREATEREQUALTHAN)) { return MoreOrEqual(left,right) } + else if(feature.isN(N_EQUALS)) { return Equals(left,right) } + else if(feature.isN(N_NOTEQUALS)) { return Distinct(left,right) } + else if(feature.isN(N_EQUALS3)) { return Equals(left,right) } + else if(feature.isN(N_NOTEQUALS3)) { return Distinct(left,right) } + else { + println("-> " + e.feature+","+e.class) + println("-> " + e.leftOperand) + println("-> " + e.rightOperand) + println("-> " + e.feature.qualifiedName) + throw new UnsupportedOperationException('''Unsupported binary operator feature: "«e.feature.class.simpleName»" - «e»''') + } + } + + def protected dispatch Term transform(XUnaryOperation e, Map variable2Variable) { + val operand = e.operand.transform(variable2Variable) + val feature = e.feature.qualifiedName + if(feature.isN(N_MINUS1)) { return Minus(0.asTerm,operand)} + else if(feature.isN(N_PLUS1)) { return operand} + else{ + println("-> " + e.feature+","+e.class) + println("-> " + e.operand) + println("-> " + e.feature.qualifiedName) + throw new UnsupportedOperationException('''Unsupported unary operator feature: "«e.feature.class.simpleName»" - «e»''') + } + } + + def protected dispatch Term transform(XMemberFeatureCall e, Map variable2Variable) { + val transformedArguments = e.actualArguments.map[transform(variable2Variable)] + val feature = e.feature.qualifiedName + if(feature == N_POWER2) { + return Pow(transformedArguments.get(0),transformedArguments.get(1)) + }else { + println(e.feature+","+e.class) + println(e.actualArguments.join(", ")) + println(e.feature.qualifiedName) + throw new UnsupportedOperationException('''Unsupported feature call: "«e.feature.qualifiedName»" - «e»''') + } + } + + def protected dispatch Term transform(XFeatureCall e, Map variable2Variable) { + val featureName = e.feature.qualifiedName + val entryWithName = variable2Variable.entrySet.filter[it.key.name == featureName].head + if(entryWithName !== null) { + return entryWithName.value.toTerm + } else { + throw new IllegalArgumentException('''Feature call reference to unavailable variable "«featureName»"''') + } + } + + def protected dispatch Term transform(XNumberLiteral l, Map variable2Variable) { + val s = l.value + try{ return Integer.parseInt(s).asTerm } catch(NumberFormatException e){} + try{ return Short.parseShort(s).asTerm } catch(NumberFormatException e){} + try{ return Double.parseDouble(s).asTerm } catch(NumberFormatException e){} + try{ return Float.parseFloat(s).asTerm } catch(NumberFormatException e){} + throw new UnsupportedOperationException('''Unsupported numeric type: "«s»"''') + } + + def protected dispatch Term transform(XExpression e, Map variable2Variable) { + throw new UnsupportedOperationException('''Unsupported expression: "«e.class.simpleName»" - «e»''') + } +} \ No newline at end of file diff --git a/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Viatra2Logic.xtend b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Viatra2Logic.xtend index 3b828170..0f97d3fe 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Viatra2Logic.xtend +++ b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Viatra2Logic.xtend @@ -4,48 +4,36 @@ import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder import hu.bme.mit.inf.dslreasoner.logic.model.builder.TracedOutput -import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference -import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.PrimitiveTypeReference import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDefinition -import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type -import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeReference import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Variable import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.TransfomedViatraQuery import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.Viatra2LogicAnnotationsFactory import java.util.ArrayList import java.util.HashMap -import java.util.HashSet import java.util.LinkedList import java.util.List import java.util.Map import java.util.Set import org.eclipse.emf.ecore.EAttribute -import org.eclipse.emf.ecore.EClassifier -import org.eclipse.emf.ecore.EEnum import org.eclipse.emf.ecore.EReference import org.eclipse.emf.ecore.EStructuralFeature -import org.eclipse.emf.ecore.EcorePackage +import org.eclipse.emf.ecore.util.EcoreUtil import org.eclipse.viatra.query.runtime.api.IQuerySpecification import org.eclipse.viatra.query.runtime.emf.EMFQueryMetaContext -import org.eclipse.viatra.query.runtime.emf.types.BaseEMFTypeKey -import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey -import org.eclipse.viatra.query.runtime.emf.types.EDataTypeInSlotsKey -import org.eclipse.viatra.query.runtime.matchers.context.IInputKey -import org.eclipse.viatra.query.runtime.matchers.context.common.JavaTransitiveInstancesKey -import org.eclipse.viatra.query.runtime.matchers.planning.helpers.TypeHelper import org.eclipse.viatra.query.runtime.matchers.psystem.PBody +import org.eclipse.viatra.query.runtime.matchers.psystem.PConstraint import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.AggregatorConstraint import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.NegativePatternCall +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.PatternMatchCounter +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PDisjunction import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery import org.eclipse.viatra.query.runtime.matchers.psystem.rewriters.PBodyNormalizer import org.eclipse.xtend.lib.annotations.Data import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* -import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PDisjunction -import org.eclipse.emf.ecore.util.EcoreUtil -import org.eclipse.viatra.query.runtime.emf.types.EClassUnscopedTransitiveInstancesKey @Data class ViatraQuerySetDescriptor { val List> patterns @@ -57,24 +45,24 @@ class Viatra2LogicTrace { public val Map query2Relation = new HashMap public val Map query2Annotation = new HashMap public val Map, Variable> parameter2Variable = new HashMap - //public val Map variable2Variable = new HashMap } class Viatra2LogicConfiguration { public var normalize = true - public var transitiveClosureDepth = 3 } class Viatra2Logic { val extension LogicProblemBuilder builder = new LogicProblemBuilder val extension Viatra2LogicAnnotationsFactory factory = Viatra2LogicAnnotationsFactory.eINSTANCE val normalizer = new PBodyNormalizer(EMFQueryMetaContext.DEFAULT) + val Viatra2LogicTypeInferer typeInferer val Ecore2Logic ecore2Logic Constraint2Logic constraint2Logic new(Ecore2Logic ecore2Logic) { this.ecore2Logic = ecore2Logic - constraint2Logic = new Constraint2Logic(ecore2Logic) + this.typeInferer = new Viatra2LogicTypeInferer(ecore2Logic) + this.constraint2Logic = new Constraint2Logic(ecore2Logic) } def TracedOutput transformQueries( @@ -82,65 +70,55 @@ class Viatra2Logic { TracedOutput ecore2LogicTrace, Viatra2LogicConfiguration config) { + // Create trace val viatra2LogicTrace = new Viatra2LogicTrace - val typeAlanysis = new HashMap + + // Translation works on PQueries. QuerySpecification -> PQuery. val pQueries = queries.patterns.map[it.internalQueryRepresentation] - for(query: pQueries) { - val disjunction = normalizer.rewrite(query) + // If requested, the queries are normalized + for(query: pQueries) { + val disjunction = normalizer.rewrite(query) viatra2LogicTrace.query2Disjunction.put(query,disjunction) } - for(query: pQueries) { - val types = query.lookup(viatra2LogicTrace.query2Disjunction).bodies.toInvertedMap[ - TypeHelper::inferUnaryTypesFor(it.uniqueVariables,it.constraints,EMFQueryMetaContext.DEFAULT) - ] -// for(m : types.values) { -// for(n: m.entrySet) { -// val variable = n.key -// println(''' - «variable.name»''') -// for(type : n.value) { -// println('''«variable.name» - «type»''') -// } -// } -// -// } - - typeAlanysis.put(query,types) - } + // The types are calculated + val types = typeInferer.inferTypes(pQueries,ecore2LogicTrace,viatra2LogicTrace) + // First, the signature of the queries are translated, ... for(query: pQueries) { try { - this.transformQueryHeader(query,query.lookup(typeAlanysis),ecore2LogicTrace,viatra2LogicTrace,config) + this.transformQueryHeader(query,types,ecore2LogicTrace,viatra2LogicTrace,config) } catch(IllegalArgumentException e) { throw new IllegalArgumentException(''' Unable to translate query "«query.fullyQualifiedName»". Reason: «e.class.simpleName», «e.message»''',e) } } + + // ...then the bodies, ... for(query: pQueries) { try { - this.transformQuerySpecification(query,query.lookup(typeAlanysis),ecore2LogicTrace,viatra2LogicTrace,config) + this.transformQuerySpecification(query,types,ecore2LogicTrace,viatra2LogicTrace,config) } catch (IllegalArgumentException e){ throw new IllegalArgumentException(''' Unable to translate query "«query.fullyQualifiedName»". Reason: «e.class.simpleName», «e.message»''',e) } } - /*for(d : viatra2LogicTrace.query2Relation.values) { - checkDefinition(d) - }*/ + // ... and finally, the annotations. transformQueryConstraints( queries.validationPatterns.map[internalQueryRepresentation], queries.derivedFeatures, ecore2LogicTrace,viatra2LogicTrace) + return new TracedOutput(ecore2LogicTrace.output,viatra2LogicTrace) } def protected transformQueryHeader( PQuery pquery, - Map>> types, + Viatra2LogicTypeResult types, TracedOutput ecore2LogicTrace, Viatra2LogicTrace viatra2LogicTrace, Viatra2LogicConfiguration config) @@ -149,7 +127,7 @@ class Viatra2Logic { val parameters = new ArrayList(pquery.parameters.size) for(vParam: pquery.parameters) { val parameterName = '''parameter «vParam.name»''' - val parameterType = getType(vParam,types,ecore2LogicTrace) + val parameterType = types.getType(pquery,vParam) if(parameterType === null) { throw new AssertionError('''null type for parameter «vParam.name» in pattern «pquery.fullyQualifiedName»''') } @@ -175,7 +153,7 @@ class Viatra2Logic { def protected transformQuerySpecification( PQuery pquery, - Map>> types, + Viatra2LogicTypeResult types, TracedOutput ecore2LogicTrace, Viatra2LogicTrace viatra2LogicTrace, Viatra2LogicConfiguration config) @@ -233,7 +211,7 @@ class Viatra2Logic { } def transformBody(PBody body, - Map>> types, + Viatra2LogicTypeResult types, TracedOutput ecore2LogicTrace, Viatra2LogicTrace viatra2LogicTrace, Viatra2LogicConfiguration config) @@ -248,19 +226,29 @@ class Viatra2Logic { // Inner Variables val innerPositiveVariables = new LinkedList val innerNegativeVariables = new LinkedList + val innerAggreatedVariables = new LinkedList + //println(body.uniqueVariables) for(innerVariable : body.uniqueVariables) { if(!variable2Variable.containsKey(innerVariable)) { - val name = '''variable «innerVariable.name.normalizeName»''' - //println(body.pattern.fullyQualifiedName + "-") - val logicType = getType(innerVariable,types,ecore2LogicTrace) - val logicVariable = createVar(name,logicType) - if(innerVariable.isPositiveVariable) { - innerPositiveVariables += logicVariable + if(innerVariable.aggregateOnly) { + // do not create variable + innerAggreatedVariables.add(innerVariable) + variable2Variable.put(innerVariable,null) } else { - innerNegativeVariables += logicVariable + val name = '''variable «innerVariable.name.normalizeName»''' + val logicType = types.getType(body,innerVariable) + if(logicType === null) { + throw new IllegalArgumentException('''Variable «innerVariable.name.normalizeName» has no type!''') + } + val logicVariable = createVar(name,logicType) + if(innerVariable.negativeOnly) { + innerNegativeVariables += logicVariable + } else { + innerPositiveVariables += logicVariable + } + variable2Variable.put(innerVariable,logicVariable) } - variable2Variable.put(innerVariable,logicVariable) } } @@ -282,226 +270,36 @@ class Viatra2Logic { return allVariablesAreExisting } -// def toTypeJudgement(PVariable v, IInputKey key) { -// new TypeJudgement(key,new Tuple1) -// } def private normalizeName(String variableName) { return variableName.replaceAll("[\\W]|_", "") } - - /** - * Translates the type of a parameter variable in a pattern - */ - def TypeReference getType(PParameter v, Map>> types, TracedOutput ecore2LogicTrace) { - // If parameter type is specified then the specified type is used - if(v.declaredUnaryType !== null) { - val res = transformTypeReference(v.declaredUnaryType,ecore2LogicTrace) - if(res === null) { - throw new AssertionError(''' - Unable to translate declared type «v.declaredUnaryType». - ''') - } else { - return res - } - } - // Otherwise, calculate the type based on the type of the variable in the bodies - else { - val bodies = types.keySet - val typesFromBodies = new ArrayList(bodies.size) - for(body : bodies) { - // collect the variable in the body - val exported = body.symbolicParameters.filter[it.patternParameter === v] - if(exported.size !== 1) { - throw new AssertionError('''Parameter «v.name» has no reference in body!''') - } - val variable = exported.head.parameterVariable - typesFromBodies+=variable.getType(types,ecore2LogicTrace) - } - return typesFromBodies.calculateCommonSupertype - } - } - - /** - * Translates the type of a variable in a pattern body - */ - def TypeReference getType(PVariable v, Map>> types ,TracedOutput ecore2LogicTrace) { - if (v.isPositiveVariable) { - val keys = getTypesFromCollection(v,types) - val logicTypes = keys.map[transformTypeReference(it,ecore2LogicTrace)].filterNull - return logicTypes.calculateCommonSubtype - } else { - val onlyConstraint = v.referringConstraints.head as NegativePatternCall - val indexOfVariable = v.lookup(onlyConstraint.actualParametersTuple.invertIndex) - val parameter = onlyConstraint.referredQuery.parameters.get(indexOfVariable) - val declaredUnaryType = parameter.declaredUnaryType as BaseEMFTypeKey - if (declaredUnaryType === null) { - throw new UnsupportedOperationException( - '''parameter «parameter.name» in pattern «onlyConstraint.referredQuery.fullyQualifiedName» does not have type!''') - } else - return declaredUnaryType.transformTypeReference(ecore2LogicTrace) - } - } - - def getTypesFromCollection(PVariable v, Map>> types) { - for(entry : types.entrySet) { - if(entry.key.uniqueVariables.contains(v)) { - return v.lookup(entry.value) - } - } - throw new IllegalArgumentException('''Variable «v.name» is not present in neither of the bodies!''') - } - - def TypeReference calculateCommonSubtype(Iterable types) { - val primitiveTypeReferences = types.filter(PrimitiveTypeReference) - val complexTypeReferences = types.filter(ComplexTypeReference) - if(complexTypeReferences.isEmpty) { - val head = primitiveTypeReferences.head - if(primitiveTypeReferences.exists[it.eClass !== head.eClass]) { - throw new IllegalArgumentException('''Inconsistent types: «primitiveTypeReferences.map[eClass.name].toSet.toList»''') - } - return head - } else if(primitiveTypeReferences.isEmpty) { - val complexTypes = complexTypeReferences.map[it.referred].toSet - if(complexTypes.size === 1) { - return builder.toTypeReference(complexTypes.head) - } - // Collect possible subtypes - val subtypeSets = complexTypes.map[it.transitiveClosureStar[it.subtypes].toSet] - val commonTypeSet = new HashSet(subtypeSets.head) - val otherSets = subtypeSets.tail - for(otherSet : otherSets) { - commonTypeSet.retainAll(otherSet) - } - if(commonTypeSet.empty) { - throw new IllegalArgumentException('''Inconsistent types: «complexTypes.map[name].toList»''') - } - - return calculateCommonComplexSupertype(commonTypeSet) - - } else { - throw new IllegalArgumentException(''' - Inconsistent types, mixing primitive and complex types: - «primitiveTypeReferences.map[eClass.name].toSet.toList» - and - «complexTypeReferences.map[it.referred].toSet.map[name].toList»''') - - } - } - def TypeReference calculateCommonSupertype(Iterable types) { - val primitiveTypeReferences = types.filter(PrimitiveTypeReference) - val complexTypeReferences = types.filter(ComplexTypeReference) - if(complexTypeReferences.isEmpty) { - val head = primitiveTypeReferences.head - if(primitiveTypeReferences.exists[it.eClass !== head.eClass]) { - throw new IllegalArgumentException('''Inconsistent types: «primitiveTypeReferences.map[eClass.name].toSet.toList»''') - } - return head - } else if(primitiveTypeReferences.isEmpty) { - val complexTypes = complexTypeReferences.map[it.referred].toSet - return calculateCommonComplexSupertype(complexTypes) - - } else { - throw new IllegalArgumentException(''' - Inconsistent types, mixing primitive and complex types: - «primitiveTypeReferences.map[eClass.name].toSet.toList» - and - «complexTypeReferences.map[it.referred].toSet.map[name].toList»''') - - } - } - def TypeReference calculateCommonComplexSupertype(Set complexTypes) { - if(complexTypes.size === 1) { - return builder.toTypeReference(complexTypes.head) - } - // Collect possible supertypes - val supertypeSets = complexTypes.map[it.transitiveClosureStar[it.supertypes].toSet] - val commonTypeSet = new HashSet(supertypeSets.head) - val otherSets = supertypeSets.tail - for(otherSet : otherSets) { - commonTypeSet.retainAll(otherSet) - } - if(commonTypeSet.empty) { - throw new IllegalArgumentException('''Inconsistent types: «complexTypes.map[name].toList»''') - } - // Remove type that already have covered - val coveredTypes = commonTypeSet.map[it.supertypes].flatten - commonTypeSet.removeAll(coveredTypes) - return builder.toTypeReference(commonTypeSet.head) - } - - /** - * Transforms a Viatra type reference to a logic type. - */ - def dispatch TypeReference transformTypeReference(EDataTypeInSlotsKey k,TracedOutput ecore2LogicTrace) { - val w = k.wrappedKey - if(w == EcorePackage.Literals.EINT || w == EcorePackage.Literals.ESHORT || w == EcorePackage.Literals.ELONG) { - return builder.LogicInt - } else if(w == EcorePackage.Literals.EDOUBLE || w == EcorePackage.Literals.EFLOAT) { - return builder.LogicReal - } else if(w == EcorePackage.Literals.EBOOLEAN) { - return builder.LogicBool - } else if(w == EcorePackage.Literals.ESTRING) { - return builder.LogicString - } else if(w instanceof EEnum) { - val c = this.ecore2Logic.TypeofEEnum(ecore2LogicTrace.trace,w) - return builder.toTypeReference(c); - } else throw new UnsupportedOperationException('''Unknown reference type «w.class.name»''') - } - def dispatch TypeReference transformTypeReference(JavaTransitiveInstancesKey k,TracedOutput ecore2LogicTrace) { - val c = k.wrapperInstanceClass - if(c == Integer || c == Long || c == Short) { - return LogicInt - } else if(c == Float || c == Double) { - return LogicReal - } else if(c == Boolean) { - return LogicBool - } else if(c == String) { - return LogicString - } else if(c.superclass == java.lang.Enum){ - val enums = ecore2Logic.allEnumsInScope(ecore2LogicTrace.trace) - for(enum : enums) { - if(c == enum.instanceClass) { - return builder.toTypeReference(ecore2Logic.TypeofEEnum(ecore2LogicTrace.trace,enum)) - } + def isNegativeOnly(PVariable variable) { + if(variable.referringConstraints.size == 1) { + val PConstraint onlyConstraint = variable.referringConstraints.head + if(onlyConstraint instanceof NegativePatternCall) { + return true + } else { + return false } - throw new IllegalArgumentException('''Enum type «c.simpleName» is not mapped to logic!''') - } - return null - } - def dispatch TypeReference transformTypeReference(EClassTransitiveInstancesKey k,TracedOutput ecore2LogicTrace) { - val c = k.wrappedKey - - if(this.ecore2Logic.allClassesInScope(ecore2LogicTrace.trace).toList.contains(c)) { - return builder.toTypeReference(this.ecore2Logic.TypeofEClass(ecore2LogicTrace.trace,k.wrappedKey)) } else { - return null + return false } } - def dispatch TypeReference transformTypeReference(EClassUnscopedTransitiveInstancesKey k, TracedOutput ecore2LogicTrace) { - val c = k.wrappedKey - - if(this.ecore2Logic.allClassesInScope(ecore2LogicTrace.trace).toList.contains(c)) { - return builder.toTypeReference(this.ecore2Logic.TypeofEClass(ecore2LogicTrace.trace,k.wrappedKey)) - } else { - return null - } - } - - def dispatch TypeReference transformTypeReference(IInputKey k,TracedOutput ecore2LogicTrace) { - //println(k) - throw new IllegalArgumentException('''Unsupported type: «k.class.simpleName»''') - } - def boolean isPositiveVariable(PVariable v) { - val constraints = v.referringConstraints - if(constraints.size == 1) { - val onlyConstraint = constraints.head - if(onlyConstraint instanceof NegativePatternCall) { + def isAggregateOnly(PVariable variable) { + if(variable.referringConstraints.size == 1) { + val PConstraint onlyConstraint = variable.referringConstraints.head + if(onlyConstraint instanceof AggregatorConstraint) { + return true + } else if(onlyConstraint instanceof PatternMatchCounter) { + return true + } else { return false } + } else { + return false } - return true } } \ No newline at end of file diff --git a/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Viatra2LogicTypeInferer.xtend b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Viatra2LogicTypeInferer.xtend new file mode 100644 index 00000000..b8a6b9c1 --- /dev/null +++ b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Viatra2LogicTypeInferer.xtend @@ -0,0 +1,392 @@ +package hu.bme.mit.inf.dslreasoner.viatra2logic + +import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic +import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace +import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder +import hu.bme.mit.inf.dslreasoner.logic.model.builder.TracedOutput +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.IntTypeReference +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.PrimitiveTypeReference +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RealTypeReference +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeReference +import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem +import java.util.HashMap +import java.util.HashSet +import java.util.List +import java.util.Set +import org.eclipse.emf.ecore.EEnum +import org.eclipse.emf.ecore.EcorePackage +import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandaloneSetup +import org.eclipse.viatra.query.patternlanguage.emf.specification.XBaseEvaluator +import org.eclipse.viatra.query.runtime.emf.EMFQueryMetaContext +import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey +import org.eclipse.viatra.query.runtime.emf.types.EClassUnscopedTransitiveInstancesKey +import org.eclipse.viatra.query.runtime.emf.types.EDataTypeInSlotsKey +import org.eclipse.viatra.query.runtime.matchers.context.IInputKey +import org.eclipse.viatra.query.runtime.matchers.context.common.JavaTransitiveInstancesKey +import org.eclipse.viatra.query.runtime.matchers.planning.helpers.TypeHelper +import org.eclipse.viatra.query.runtime.matchers.psystem.IExpressionEvaluator +import org.eclipse.viatra.query.runtime.matchers.psystem.PBody +import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.AggregatorConstraint +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExpressionEvaluation +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.PatternCallBasedDeferred +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.PatternMatchCounter +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery +import org.eclipse.xtext.xbase.XExpression +import org.eclipse.xtext.xbase.typesystem.IBatchTypeResolver +import org.eclipse.xtext.xbase.typesystem.references.UnknownTypeReference + +import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* +import org.eclipse.xtext.xbase.typesystem.references.InnerTypeReference + +class Viatra2LogicTypeInferer{ + val Ecore2Logic ecore2Logic + val extension LogicProblemBuilder builder = new LogicProblemBuilder + /**Typeresolver uses the same resolver as EMFPatternLanguageStandaloneSetup.*/ + val IBatchTypeResolver typeResolver = + (new EMFPatternLanguageStandaloneSetup).createInjector.getInstance(IBatchTypeResolver) + val expressionExtractor = new XExpressionExtractor + + new(Ecore2Logic ecore2Logic) { + this.ecore2Logic = ecore2Logic + } + + def Viatra2LogicTypeResult inferTypes(List pQueries, TracedOutput ecore2LogicTrace, Viatra2LogicTrace viatra2LogicTrace) { + val Viatra2LogicTypeResult result = new Viatra2LogicTypeResult(new HashMap,new HashMap); + for(query : pQueries) { + for(body: query.lookup(viatra2LogicTrace.query2Disjunction).bodies) { + for(variable : body.uniqueVariables) { + getOrMakeTypeDecision(result,variable,body,ecore2LogicTrace,viatra2LogicTrace,emptySet) + } + } + for(parameter: query.parameters) { + getOrMakeTypeDecision(result,query,parameter,ecore2LogicTrace,viatra2LogicTrace,emptySet) + } + } + return result + } + + private def TypeReference getOrMakeTypeDecision( + Viatra2LogicTypeResult result, + PVariable variable, PBody body, + TracedOutput ecore2LogicTrace, + Viatra2LogicTrace viatra2LogicTrace, + Set checkedInDecisionMaking) + { + if(result.containsSolution(body,variable)) { + return result.getType(body,variable) + } else { + val inferredTypesByViatra = TypeHelper::inferUnaryTypesFor(body.uniqueVariables, body.constraints, EMFQueryMetaContext.DEFAULT) + val constraintsForVariable = variable.lookup(inferredTypesByViatra) + + val typeConstraintsDerivedByTypeHelper = constraintsForVariable.map[transformTypeReference(ecore2LogicTrace)] + val typesFromEval = variable.getTypesFromEval(typeResolver) + val typesFromAggregatorResult = variable.getTypeFromPassivePatternCallConstraintResult( + result, + ecore2LogicTrace, + viatra2LogicTrace, + checkedInDecisionMaking) + + val typesFromPositiveReasoning = (typeConstraintsDerivedByTypeHelper + typesFromEval + typesFromAggregatorResult).filterNull + + val types = if(!typesFromPositiveReasoning.empty) { + typesFromPositiveReasoning + } else { + variable.getTypeFromPassivePatternCallConstraints( + result, + ecore2LogicTrace, + viatra2LogicTrace, + checkedInDecisionMaking) + } + + val commonSubtype = this.calculateCommonSubtype(types) + + result.addType(body,variable,commonSubtype) + return commonSubtype + } + } + + private def TypeReference getOrMakeTypeDecision( + Viatra2LogicTypeResult result, + PQuery query, + PParameter parameter, + TracedOutput ecore2LogicTrace, + Viatra2LogicTrace viatra2LogicTrace, + Set checkedInDecisionMaking) + { + if(checkedInDecisionMaking.contains(parameter)) { + return null + } + if(result.containsSolution(parameter)) { + return result.getType(query, parameter) + } + + var TypeReference typeReference; + + if(parameter.declaredUnaryType !== null) { + val key = parameter.declaredUnaryType + typeReference = key.transformTypeReference(ecore2LogicTrace) + } else { + val bodies = query.lookup(viatra2LogicTrace.query2Disjunction).bodies + val newChecked = new HashSet(checkedInDecisionMaking) => [add(parameter)] + val Iterable variableTypes = bodies.map[body| + val symbolicParameter = body.symbolicParameters.filter[patternParameter === parameter].head + val variable = symbolicParameter.parameterVariable + getOrMakeTypeDecision(result,variable,body,ecore2LogicTrace,viatra2LogicTrace,newChecked) + ] + typeReference = calculateCommonSupertype(variableTypes) + } + result.addType(query,parameter,typeReference) + return typeReference + } + + private def Iterable getTypesFromEval(PVariable v, IBatchTypeResolver typeResolver) { + val constraints = v.getReferringConstraintsOfType( + typeof(ExpressionEvaluation) + ).filter[ + it.outputVariable === v + ] + val res = constraints.map[getTypeFromEval] + return res + } + + def TypeReference getTypeFromEval(ExpressionEvaluation evaluation) { + val XExpression expression = expressionExtractor.extractExpression(evaluation.evaluator) + val returnType = typeResolver.resolveTypes(expression).getReturnType(expression); + if(returnType === null || returnType instanceof UnknownTypeReference) { + return null + } else { + val javaIdentifier = returnType.wrapperTypeIfPrimitive.javaIdentifier + if(javaIdentifier == Boolean.name) { + return LogicBool + } else if(javaIdentifier == Integer.name || javaIdentifier == Short.name) { + return LogicInt + } else if(javaIdentifier == Double.name || javaIdentifier == Float.name){ + return LogicReal + } else if(javaIdentifier == String.name) { + return LogicString + } else { + throw new UnsupportedOperationException('''Unsupported eval type: "«javaIdentifier»"!''') + } + } + } + + private def getTypeFromPassivePatternCallConstraintResult( + PVariable v, + Viatra2LogicTypeResult result, + TracedOutput ecore2LogicTrace, + Viatra2LogicTrace viatra2LogicTrace, + Set checkedInDecisionMaking + ) { + val referringConstraints = v.referringConstraints + + val referringCountMatcherTargeting = referringConstraints + .filter(PatternMatchCounter) + .filter[it.resultVariable === v] + .map[builder.LogicInt] + val referringAggregatorConstraintsTargeting = referringConstraints + .filter(AggregatorConstraint) + .filter[it.resultVariable === v] + .map[ // get the type of the referred column + getOrMakeTypeDecision( + result, + it.referredQuery, + it.referredQuery.parameters.get(aggregatedColumn), + ecore2LogicTrace, + viatra2LogicTrace, + checkedInDecisionMaking)] + + return referringCountMatcherTargeting + referringAggregatorConstraintsTargeting + } + + private def getTypeFromPassivePatternCallConstraints( + PVariable v, + Viatra2LogicTypeResult result, + TracedOutput ecore2LogicTrace, + Viatra2LogicTrace viatra2LogicTrace, + Set checkedInDecisionMaking + ) { + val referringConstraints = v.referringConstraints + if(referringConstraints.size === 1) { + val onlyConstraint = referringConstraints.head + + if(onlyConstraint instanceof PatternCallBasedDeferred) { + val indexOfVariable = v.lookup(onlyConstraint.actualParametersTuple.invertIndex) + val parameter = onlyConstraint.referredQuery.parameters.get(indexOfVariable) + val res = getOrMakeTypeDecision(result, onlyConstraint.referredQuery, parameter, ecore2LogicTrace,viatra2LogicTrace,checkedInDecisionMaking) + return #[res] + } else { + throw new IllegalArgumentException('''A non-PatternCallBasedDeferred type constraint is referring to the variable "«v.name»"!''') + } + } else { + throw new IllegalArgumentException('''Multiple («referringConstraints.size», «FOR c:referringConstraints SEPARATOR ", "»«c»«ENDFOR») constraints are referring to variable "«v.name»", but no type is inferred!''') + } + } + + def TypeReference calculateCommonSubtype(Iterable types) { + val primitiveTypeReferences = types.filter(PrimitiveTypeReference) + val complexTypeReferences = types.filter(ComplexTypeReference) + if(complexTypeReferences.isEmpty) { + // If there is an int type, ... + if(primitiveTypeReferences.exists[it instanceof IntTypeReference]) { + // ... and all types are either real or int, then return int! + if(primitiveTypeReferences.forall[it instanceof RealTypeReference || it instanceof IntTypeReference]) { + return primitiveTypeReferences.filter(IntTypeReference).head + } + // Otherwise, the types are inconsistent, because they mixing numeric and non-numeric types. + else throw new IllegalArgumentException('''Inconsistent types: «primitiveTypeReferences.map[eClass.name].toSet.toList»''') + } + // If there is no Real, then the types should be homogenious + val head = primitiveTypeReferences.head + if(primitiveTypeReferences.exists[it.eClass !== head.eClass]) { + throw new IllegalArgumentException('''Inconsistent types: «primitiveTypeReferences.map[eClass.name].toSet.toList»''') + } + return head + } else if(primitiveTypeReferences.isEmpty) { + val complexTypes = complexTypeReferences.map[it.referred].toSet + if(complexTypes.size === 1) { + return builder.toTypeReference(complexTypes.head) + } + // Collect possible subtypes + val subtypeSets = complexTypes.map[it.transitiveClosureStar[it.subtypes].toSet] + val commonTypeSet = new HashSet(subtypeSets.head) + val otherSets = subtypeSets.tail + for(otherSet : otherSets) { + commonTypeSet.retainAll(otherSet) + } + if(commonTypeSet.empty) { + throw new IllegalArgumentException('''Inconsistent types: «complexTypes.map[name].toList»''') + } + + + return calculateCommonComplexSupertype(commonTypeSet) + + } else { + throw new IllegalArgumentException(''' + Inconsistent types, mixing primitive and complex types: + «primitiveTypeReferences.map[eClass.name].toSet.toList» + and + «complexTypeReferences.map[it.referred].toSet.map[name].toList»''') + + } + } + + + def TypeReference calculateCommonSupertype(Iterable types) { + val primitiveTypeReferences = types.filter(PrimitiveTypeReference) + val complexTypeReferences = types.filter(ComplexTypeReference) + if(complexTypeReferences.isEmpty) { + // If there is a real type, ... + if(primitiveTypeReferences.exists[it instanceof RealTypeReference]) { + // ... and all types are either real or int, then return real! + if(primitiveTypeReferences.forall[it instanceof RealTypeReference || it instanceof IntTypeReference]) { + return primitiveTypeReferences.filter(RealTypeReference).head + } + // Otherwise, the types are inconsistent, because they mixing numeric and non-numeric types. + else throw new IllegalArgumentException('''Inconsistent types: «primitiveTypeReferences.map[eClass.name].toSet.toList»''') + } + // If there is no Real, then the types should be homogenious + val head = primitiveTypeReferences.head + if(primitiveTypeReferences.exists[it.eClass !== head.eClass]) { + throw new IllegalArgumentException('''Inconsistent types: «primitiveTypeReferences.map[eClass.name].toSet.toList»''') + } + return head + } else if(primitiveTypeReferences.isEmpty) { + val complexTypes = complexTypeReferences.map[it.referred].toSet + return calculateCommonComplexSupertype(complexTypes) + + } else { + throw new IllegalArgumentException(''' + Inconsistent types, mixing primitive and complex types: + «primitiveTypeReferences.map[eClass.name].toSet.toList» + and + «complexTypeReferences.map[it.referred].toSet.map[name].toList»''') + + } + } + def TypeReference calculateCommonComplexSupertype(Set complexTypes) { + if(complexTypes.size === 1) { + return builder.toTypeReference(complexTypes.head) + } + // Collect possible supertypes + val supertypeSets = complexTypes.map[it.transitiveClosureStar[it.supertypes].toSet] + val commonTypeSet = new HashSet(supertypeSets.head) + val otherSets = supertypeSets.tail + for(otherSet : otherSets) { + commonTypeSet.retainAll(otherSet) + } + if(commonTypeSet.empty) { + throw new IllegalArgumentException('''Inconsistent types: «complexTypes.map[name].toList»''') + } + // Remove type that already have covered + val coveredTypes = commonTypeSet.map[it.supertypes].flatten + commonTypeSet.removeAll(coveredTypes) + return builder.toTypeReference(commonTypeSet.head) + } + + /** + * Transforms a Viatra type reference to a logic type. + */ + def dispatch TypeReference transformTypeReference(EDataTypeInSlotsKey k,TracedOutput ecore2LogicTrace) { + val w = k.wrappedKey + if(w == EcorePackage.Literals.EINT || w == EcorePackage.Literals.ESHORT || w == EcorePackage.Literals.ELONG) { + return builder.LogicInt + } else if(w == EcorePackage.Literals.EDOUBLE || w == EcorePackage.Literals.EFLOAT) { + return builder.LogicReal + } else if(w == EcorePackage.Literals.EBOOLEAN) { + return builder.LogicBool + } else if(w == EcorePackage.Literals.ESTRING) { + return builder.LogicString + } else if(w instanceof EEnum) { + val c = this.ecore2Logic.TypeofEEnum(ecore2LogicTrace.trace,w) + return builder.toTypeReference(c); + } else throw new UnsupportedOperationException('''Unknown reference type «w.class.name»''') + } + def dispatch TypeReference transformTypeReference(JavaTransitiveInstancesKey k,TracedOutput ecore2LogicTrace) { + val c = k.wrapperInstanceClass + if(c == Integer || c == Long || c == Short) { + return LogicInt + } else if(c == Float || c == Double) { + return LogicReal + } else if(c == Boolean) { + return LogicBool + } else if(c == String) { + return LogicString + } else if(c.superclass == Enum){ + val enums = ecore2Logic.allEnumsInScope(ecore2LogicTrace.trace) + for(enum : enums) { + if(c == enum.instanceClass) { + return builder.toTypeReference(ecore2Logic.TypeofEEnum(ecore2LogicTrace.trace,enum)) + } + } + throw new IllegalArgumentException('''Enum type «c.simpleName» is not mapped to logic!''') + } else { + return null + } + } + def dispatch TypeReference transformTypeReference(EClassTransitiveInstancesKey k,TracedOutput ecore2LogicTrace) { + val c = k.wrappedKey + + if(this.ecore2Logic.allClassesInScope(ecore2LogicTrace.trace).toList.contains(c)) { + return builder.toTypeReference(this.ecore2Logic.TypeofEClass(ecore2LogicTrace.trace,k.wrappedKey)) + } else { + return null + } + } + def dispatch TypeReference transformTypeReference(EClassUnscopedTransitiveInstancesKey k, TracedOutput ecore2LogicTrace) { + val c = k.wrappedKey + + if(this.ecore2Logic.allClassesInScope(ecore2LogicTrace.trace).toList.contains(c)) { + return builder.toTypeReference(this.ecore2Logic.TypeofEClass(ecore2LogicTrace.trace,k.wrappedKey)) + } else { + return null + } + } + + def dispatch TypeReference transformTypeReference(IInputKey k,TracedOutput ecore2LogicTrace) { + throw new IllegalArgumentException('''Unsupported type: «k.class.simpleName»''') + } +} \ No newline at end of file diff --git a/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Viatra2LogicTypeResult.xtend b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Viatra2LogicTypeResult.xtend new file mode 100644 index 00000000..7ba90724 --- /dev/null +++ b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Viatra2LogicTypeResult.xtend @@ -0,0 +1,47 @@ +package hu.bme.mit.inf.dslreasoner.viatra2logic + +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeReference +import java.util.Map +import org.eclipse.viatra.query.runtime.matchers.psystem.PBody +import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery +import org.eclipse.xtend.lib.annotations.Data +import org.eclipse.xtext.xbase.lib.Functions.Function0 +import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.LogiclanguageFactory +import org.eclipse.emf.ecore.util.EcoreUtil +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.PrimitiveTypeReference + +@Data class Viatra2LogicTypeResult{ + Map,Function0> typesInParameters + Map,Function0> typesInBodies; + + def addType(PBody body, PVariable variable, TypeReference typeConstructor) { + typesInBodies.put(body->variable,typeConstructor.createTypeConstructor) + } + def addType(PQuery query, PParameter variable, TypeReference typeConstructor) { + typesInParameters.put(query->variable,typeConstructor.createTypeConstructor) + } + def getType(PBody body, PVariable variable) { + return (body->variable).lookup(typesInBodies).apply + } + def getType(PQuery query, PParameter variable) { + return (query->variable).lookup(typesInParameters).apply + } + + def containsSolution(PBody body, PVariable variable) { + return typesInBodies.containsKey(body->variable) + } + def containsSolution(PParameter variable) { + return typesInParameters.containsKey(variable) + } + + def dispatch Function0 createTypeConstructor(ComplexTypeReference ref) { + return [LogiclanguageFactory.eINSTANCE.createComplexTypeReference=>[it.referred = ref.referred]] + } + def dispatch Function0 createTypeConstructor(PrimitiveTypeReference ref) { + return [EcoreUtil.copy(ref)] + } +} \ No newline at end of file diff --git a/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/XExpressionExtractor.xtend b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/XExpressionExtractor.xtend new file mode 100644 index 00000000..ea8d0b23 --- /dev/null +++ b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/XExpressionExtractor.xtend @@ -0,0 +1,24 @@ +package hu.bme.mit.inf.dslreasoner.viatra2logic + +import org.eclipse.viatra.query.patternlanguage.emf.specification.XBaseEvaluator +import org.eclipse.viatra.query.runtime.matchers.psystem.IExpressionEvaluator +import org.eclipse.xtext.xbase.XExpression + +class XExpressionExtractor { + def dispatch XExpression extractExpression(XBaseEvaluator evaluator) { evaluator.expression } + def dispatch XExpression extractExpression(IExpressionEvaluator evaluator) { + val clazz = evaluator.class + if(clazz.name == "org.eclipse.viatra.query.runtime.matchers.psystem.rewriters.VariableMappingExpressionEvaluatorWrapper") { + val field = clazz.declaredFields.filter[it.name == "wrapped"].head + if(field === null) { + throw new IllegalArgumentException('''Class «clazz.simpleName» has no field "wrapped"!''') + } else { + field.setAccessible(true); + val wrappedEvaluator = field.get(evaluator) as XBaseEvaluator + return wrappedEvaluator.extractExpression + } + } else { + throw new IllegalArgumentException('''Unsupported expression evaluation form: «clazz.simpleName»!''') + } + } +} \ No newline at end of file -- cgit v1.2.3-54-g00ecf From 933ce1872359918ff71602479640f4153063a737 Mon Sep 17 00:00:00 2001 From: Oszkar Semerath Date: Fri, 30 Aug 2019 14:26:55 +0200 Subject: Bug fixed in transitive closure expression builder --- .../mit/inf/dslreasoner/logic/model/builder/LogicProblemBuilder.xtend | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic') diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/builder/LogicProblemBuilder.xtend b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/builder/LogicProblemBuilder.xtend index a231af3c..fa97cbef 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/builder/LogicProblemBuilder.xtend +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/builder/LogicProblemBuilder.xtend @@ -494,8 +494,8 @@ class LogicProblemBuilder{ def transitiveClosure(Relation relation, TermDescription source, TermDescription target) { createTransitiveClosure => [ it.relation = relation - it.leftOperand = leftOperand - it.rightOperand = rightOperand + it.leftOperand = source.toTerm + it.rightOperand = target.toTerm ] } -- cgit v1.2.3-54-g00ecf From 28b8a136335733343360d2e6ff0bbdb959334386 Mon Sep 17 00:00:00 2001 From: Oszkar Semerath Date: Thu, 14 May 2020 23:06:40 +0200 Subject: separtor ; -> \t --- .../inf/dslreasoner/logic/model/statistics/StatisticSections2CSV.xtend | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic') diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/statistics/StatisticSections2CSV.xtend b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/statistics/StatisticSections2CSV.xtend index d673cb17..d6dc1c5e 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/statistics/StatisticSections2CSV.xtend +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/statistics/StatisticSections2CSV.xtend @@ -17,7 +17,7 @@ class StatisticsData { } class StatisticSections2CSV { - static val separator = ';' + static val separator = '\t' static val empty = "" private def getValue(Map map,String key) { -- cgit v1.2.3-54-g00ecf From 73738a94151363ae96557d749ff4ab93d941f983 Mon Sep 17 00:00:00 2001 From: Oszkar Semerath Date: Sun, 17 May 2020 01:34:05 +0200 Subject: Setting delimier in every printing mode to ',' --- .../inf/dslreasoner/logic/model/statistics/StatisticSections2CSV.xtend | 2 +- .../dslreasoner/logic/model/statistics/StatisticSections2Print.xtend | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic') diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/statistics/StatisticSections2CSV.xtend b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/statistics/StatisticSections2CSV.xtend index d6dc1c5e..a78ceb19 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/statistics/StatisticSections2CSV.xtend +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/statistics/StatisticSections2CSV.xtend @@ -17,7 +17,7 @@ class StatisticsData { } class StatisticSections2CSV { - static val separator = '\t' + static val separator = ',' static val empty = "" private def getValue(Map map,String key) { diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/statistics/StatisticSections2Print.xtend b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/statistics/StatisticSections2Print.xtend index 39370d75..c5e81f94 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/statistics/StatisticSections2Print.xtend +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/statistics/StatisticSections2Print.xtend @@ -12,7 +12,7 @@ class StatisticSections2Print { { var result = ""; for(statistic : statistics) { - result+= '''«statistic.readValue»;''' + result+= '''«statistic.readValue»,''' } return result } -- cgit v1.2.3-54-g00ecf From eb081453e93e6e30c0b6bb92400275529ed3273b Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Wed, 20 May 2020 02:07:37 +0200 Subject: Fix attribute export to xmi --- .../inf/dslreasoner/ecore2logic/Ecore2Logic.xtend | 10 +-- .../model/builder/LogicModelInterpretation.xtend | 76 ++++++++++++++++------ .../inf/dslreasoner/logic2ecore/Logic2Ecore.xtend | 49 +++++--------- .../dse/PartialModelAsLogicInterpretation.xtend | 63 +++++++++++++++++- 4 files changed, 139 insertions(+), 59 deletions(-) (limited to 'Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic') diff --git a/Framework/hu.bme.mit.inf.dslreasoner.ecore2logic/src/hu/bme/mit/inf/dslreasoner/ecore2logic/Ecore2Logic.xtend b/Framework/hu.bme.mit.inf.dslreasoner.ecore2logic/src/hu/bme/mit/inf/dslreasoner/ecore2logic/Ecore2Logic.xtend index cae489e3..85b488eb 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.ecore2logic/src/hu/bme/mit/inf/dslreasoner/ecore2logic/Ecore2Logic.xtend +++ b/Framework/hu.bme.mit.inf.dslreasoner.ecore2logic/src/hu/bme/mit/inf/dslreasoner/ecore2logic/Ecore2Logic.xtend @@ -1,7 +1,13 @@ package hu.bme.mit.inf.dslreasoner.ecore2logic +import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder +import hu.bme.mit.inf.dslreasoner.logic.model.builder.TracedOutput +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Term +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TermDescription +import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.ContainmentHierarchy import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem import java.util.List +import java.util.Set import org.eclipse.emf.ecore.EAttribute import org.eclipse.emf.ecore.EClass import org.eclipse.emf.ecore.EEnum @@ -9,10 +15,6 @@ import org.eclipse.emf.ecore.EEnumLiteral import org.eclipse.emf.ecore.EReference import org.eclipse.xtend.lib.annotations.Data import org.eclipse.xtend.lib.annotations.Delegate -import hu.bme.mit.inf.dslreasoner.logic.model.builder.TracedOutput -import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder -import java.util.Set -import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.ContainmentHierarchy @Data class EcoreMetamodelDescriptor { val List classes; diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/builder/LogicModelInterpretation.xtend b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/builder/LogicModelInterpretation.xtend index 905859eb..cdcbb48a 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/builder/LogicModelInterpretation.xtend +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/builder/LogicModelInterpretation.xtend @@ -3,22 +3,27 @@ package hu.bme.mit.inf.dslreasoner.logic.model.builder import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ConstantDeclaration import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.FunctionDeclaration +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.LogiclanguageFactory import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDeclaration +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TermDescription import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDeclaration import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDefinition +import java.math.BigDecimal import java.util.List +import java.util.Map +import java.util.SortedSet +import java.util.TreeSet import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* -import java.util.SortedSet -import java.math.BigDecimal -interface LogicModelInterpretation{ - +interface LogicModelInterpretation { + /** * Returns the elements of a type. - */ + */ def List getElements(Type type) + /** * Returns the interpretation of a function. The parameters and the return values are encoded to primitive java objects defined by the following table: *

    @@ -34,6 +39,7 @@ interface LogicModelInterpretation{ * @return The result of the function call encoded as defined in the table. */ def Object getInterpretation(FunctionDeclaration function, Object[] parameterSubstitution) + /** * Returns the interpretation of a relation. The parameters are encoded to primitive java objects defined by the following table: *

    @@ -49,6 +55,7 @@ interface LogicModelInterpretation{ * @return If the parameter tuple is in the relation. */ def boolean getInterpretation(RelationDeclaration relation, Object[] parameterSubstitution) + /** * Returns the interpretation of a constant. The value is encoded to primitive java objects defined by the following table: *

    @@ -63,60 +70,89 @@ interface LogicModelInterpretation{ * @return The value of the constant encoded as specified in the table. */ def Object getInterpretation(ConstantDeclaration constant) - + /** * Returns all integers relevant to the logic structure. Not all integer is necessarily used. */ def SortedSet getAllIntegersInStructure() + + def Map getAllIntegersWithInterpretation() { + allIntegersInStructure.toMap [ integer | + (LogiclanguageFactory.eINSTANCE.createIntLiteral => [value = integer]) as TermDescription + ] + } + /** * Returns all real numbers relevant to the logic structure. Not all integer is necessarily used. */ - def SortedSet getAllRealsInStructure() - /** + def SortedSet getAllRealsInStructure() + + def Map getAllRealsWithInterpretation() { + allRealsInStructure.toMap [ real | + (LogiclanguageFactory.eINSTANCE.createRealLiteral => [value = real]) as TermDescription + ] + } + + /** * Returns all string values relevant to the logic structure. Not all integer is necessarily used. */ - def SortedSet getAllStringsInStructure() + def SortedSet getAllStringsInStructure() + + def Map getAllStringsWithInterpretation() { + allStringsInStructure.toMap [ string | + (LogiclanguageFactory.eINSTANCE.createStringLiteral => [value = string]) as TermDescription + ] + } + + def SortedSet getAllBooleansInStructure() { + new TreeSet(#{true, false}) + } + + def Map getAllBooleansWithInterpretation() { + allBooleansInStructure.toMap [ bool | + (LogiclanguageFactory.eINSTANCE.createBoolLiteral => [value = bool]) as TermDescription + ] + } } class Uninterpreted implements LogicModelInterpretation { /*private val static unknownBecauseUninterpreted = LogiclanguageFactory.eINSTANCE.createUnknownBecauseUninterpreted - public def static getUnknownBecauseUninterpreted() {return Uninterpreted.unknownBecauseUninterpreted}*/ - + public def static getUnknownBecauseUninterpreted() {return Uninterpreted.unknownBecauseUninterpreted}*/ override getElements(Type type) { throw new UnsupportedOperationException("The interpteration is unknown.") } - + def getKnownElements(Type type) { val allSubtypes = type.transitiveClosureStar[it.subtypes] return allSubtypes.filter(TypeDefinition).map[elements].flatten.toList } - + def allElementsAreInterpreted(Type type) { val allSubtypes = type.transitiveClosureStar[it.subtypes] return allSubtypes.exists[it instanceof TypeDeclaration] } - + override getInterpretation(FunctionDeclaration function, Object[] parameterSubstitution) { throw new UnsupportedOperationException("The interpteration is unknown.") } - + override getInterpretation(RelationDeclaration relation, Object[] parameterSubstitution) { throw new UnsupportedOperationException("The interpteration is unknown.") } - + override getInterpretation(ConstantDeclaration constant) { throw new UnsupportedOperationException("The interpteration is unknown.") } - + override getAllIntegersInStructure() { throw new UnsupportedOperationException("The interpteration is unknown.") } - + override getAllRealsInStructure() { throw new UnsupportedOperationException("The interpteration is unknown.") } - + override getAllStringsInStructure() { throw new UnsupportedOperationException("The interpteration is unknown.") } -} \ No newline at end of file +} diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic2ecore/src/hu/bme/mit/inf/dslreasoner/logic2ecore/Logic2Ecore.xtend b/Framework/hu.bme.mit.inf.dslreasoner.logic2ecore/src/hu/bme/mit/inf/dslreasoner/logic2ecore/Logic2Ecore.xtend index 08c6b7b7..8d6b565a 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic2ecore/src/hu/bme/mit/inf/dslreasoner/logic2ecore/Logic2Ecore.xtend +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic2ecore/src/hu/bme/mit/inf/dslreasoner/logic2ecore/Logic2Ecore.xtend @@ -3,25 +3,24 @@ package hu.bme.mit.inf.dslreasoner.logic2ecore import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicModelInterpretation +import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicStructureBuilder +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TermDescription +import java.math.BigDecimal import java.util.Collection import java.util.HashMap import java.util.HashSet import java.util.List +import java.util.Map import java.util.Set import org.eclipse.emf.ecore.EClass +import org.eclipse.emf.ecore.EDataType +import org.eclipse.emf.ecore.EEnum import org.eclipse.emf.ecore.EObject import org.eclipse.emf.ecore.EStructuralFeature +import org.eclipse.emf.ecore.EcorePackage import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* -import org.eclipse.emf.ecore.EEnum -import org.eclipse.emf.ecore.EDataType -import org.eclipse.emf.ecore.EcorePackage -import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TermDescription -import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder -import java.util.Map -import org.eclipse.emf.ecore.EAttribute -import java.math.BigDecimal class Logic2Ecore { val extension LogicStructureBuilder structureBuilder = new LogicStructureBuilder @@ -86,15 +85,15 @@ class Logic2Ecore { if(attributeType.EContainingClass.isSuperTypeOf(sourceObject.eClass)) { val allElementsOfTargetDatatype = getAllElementsOfDatatype(attributeType.EAttributeType,forwardTrace,interpretation) for(l : allElementsOfTargetDatatype.entrySet) { - val expression = ecore2Logic.IsAttributeValue(forwardTrace,sourceElement,l.value,attributeType) + val expression = ecore2Logic.IsAttributeValue(forwardTrace,sourceElement,l.key,attributeType) val linkExist = interpretation.evalAsBool(expression) if(linkExist) { if(attributeType.isMany) { val list = sourceObject.eGet(attributeType) as List - list += l.key + list += l.value } else { try { - sourceObject.eSet(attributeType,translateType(attributeType.EAttributeType,l.key)) + sourceObject.eSet(attributeType,translateType(attributeType.EAttributeType,l.value)) } catch(Exception e) { e.printStackTrace } @@ -119,34 +118,20 @@ class Logic2Ecore { } else return value } - -// if(attributeType.EAttributeType.isSuperTypeOf(targetObject.eClass)) { -// val expression = ecore2Logic.IsAttributeValue(forwardTrace,sourceElement,targetElement,attributeType) -// val linkExist = interpretation.evalAsBool(expression) -// if(linkExist) { -// if(attributeType.isMany) { -// val list = sourceObject.eGet(attributeType) as List -// list+= targetObject -// } else { -// sourceObject.eSet(referenceType,targetObject) -// } -// } -// } - - protected dispatch def Map getAllElementsOfDatatype(EEnum type, Ecore2Logic_Trace forwardTrace, LogicModelInterpretation interpretation) { - ecore2Logic.allLiteralsInScope(forwardTrace).toInvertedMap[ecore2Logic.Literal(forwardTrace,it)] + protected dispatch def Map getAllElementsOfDatatype(EEnum type, Ecore2Logic_Trace forwardTrace, LogicModelInterpretation interpretation) { + ecore2Logic.allLiteralsInScope(forwardTrace).toMap[ecore2Logic.Literal(forwardTrace,it)] } - protected dispatch def Map getAllElementsOfDatatype(EDataType primitive, Ecore2Logic_Trace forwardTrace, LogicModelInterpretation interpretation) { + protected dispatch def Map getAllElementsOfDatatype(EDataType primitive, Ecore2Logic_Trace forwardTrace, LogicModelInterpretation interpretation) { val extension LogicProblemBuilder b = new LogicProblemBuilder if(primitive === EcorePackage.eINSTANCE.EInt || primitive === EcorePackage.eINSTANCE.EShort || primitive === EcorePackage.eINSTANCE.ELong) { - interpretation.allIntegersInStructure.toInvertedMap[it.asTerm] + interpretation.allIntegersWithInterpretation } else if(primitive === EcorePackage.eINSTANCE.EDouble || primitive === EcorePackage.eINSTANCE.EFloat) { - interpretation.allRealsInStructure.toInvertedMap[it.asTerm] + interpretation.allRealsWithInterpretation } else if(primitive === EcorePackage.eINSTANCE.EString) { - interpretation.allStringsInStructure.toInvertedMap[it.asTerm] + interpretation.allStringsWithInterpretation } else if(primitive === EcorePackage.eINSTANCE.EBoolean) { - return #[false,true].toInvertedMap[it.asTerm] + interpretation.allBooleansWithInterpretation } } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/PartialModelAsLogicInterpretation.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/PartialModelAsLogicInterpretation.xtend index f61c7333..48922f5d 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/PartialModelAsLogicInterpretation.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/PartialModelAsLogicInterpretation.xtend @@ -1,5 +1,6 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse +import com.google.common.collect.ImmutableMap import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicModelInterpretation import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ConstantDeclaration import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement @@ -153,14 +154,70 @@ class PartialModelAsLogicInterpretation implements LogicModelInterpretation{ } override getAllIntegersInStructure() { - new TreeSet(this.integerForwardTrace.keySet) + new TreeSet(allIntegersWithInterpretation.values) + } + + override getAllIntegersWithInterpretation() { + val builder = new HashMap + for (entry : integerForwardTrace.entrySet) { + builder.put(entry.value, entry.key) + } + for (element : partialInterpretation.newElements) { + if (element instanceof IntegerElement) { + builder.put(element, element.value) + } + } + builder } override getAllRealsInStructure() { - new TreeSet(this.realForwardTrace.keySet) + new TreeSet(allRealsWithInterpretation.values) + } + + override getAllRealsWithInterpretation() { + val builder = new HashMap + for (entry : realForwardTrace.entrySet) { + builder.put(entry.value, entry.key) + } + for (element : partialInterpretation.newElements) { + if (element instanceof RealElement) { + builder.put(element, element.value) + } + } + builder } override getAllStringsInStructure() { - new TreeSet(this.stringForwardTrace.keySet) + new TreeSet(allStringsWithInterpretation.values) + } + + override getAllStringsWithInterpretation() { + val builder = new HashMap + for (entry : stringForwardTrace.entrySet) { + builder.put(entry.value, entry.key) + } + for (element : partialInterpretation.newElements) { + if (element instanceof StringElement) { + builder.put(element, element.value) + } + } + builder + } + + override getAllBooleansInStructure() { + new TreeSet(allBooleansWithInterpretation.values) + } + + override getAllBooleansWithInterpretation() { + val builder = new HashMap + for (entry : booleanForwardTrace.entrySet) { + builder.put(entry.value, entry.key) + } + for (element : partialInterpretation.newElements) { + if (element instanceof BooleanElement) { + builder.put(element, element.value) + } + } + builder } } \ No newline at end of file -- cgit v1.2.3-54-g00ecf