From 2f99ce37e5380c8e53fb3515cc2bc5d48bd3d7fd Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Fri, 11 Jan 2019 15:41:57 +0100 Subject: Build with Eclipse 2018.12, generated files change --- .../META-INF/MANIFEST.MF | 24 ++++++++-------- .../plugin.xml | 32 +++++++++++----------- 2 files changed, 28 insertions(+), 28 deletions(-) (limited to 'Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner') diff --git a/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/META-INF/MANIFEST.MF b/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/META-INF/MANIFEST.MF index 87ff7abc..b944302b 100644 --- a/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/META-INF/MANIFEST.MF +++ b/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/META-INF/MANIFEST.MF @@ -4,22 +4,22 @@ Bundle-Name: %pluginName Bundle-SymbolicName: hu.bme.mit.inf.dlsreasoner.alloy.reasoner;singleton:=true Bundle-Version: 1.0.0.qualifier Bundle-ClassPath: lib/alloy4.2_2015-02-22.jar, - . + . Bundle-Vendor: %providerName Bundle-Localization: plugin Export-Package: hu.bme.mit.inf.dlsreasoner.alloy.reasoner, - hu.bme.mit.inf.dlsreasoner.alloy.reasoner.builder, - hu.bme.mit.inf.dlsreasoner.alloy.reasoner.queries + hu.bme.mit.inf.dlsreasoner.alloy.reasoner.builder, + hu.bme.mit.inf.dlsreasoner.alloy.reasoner.queries Require-Bundle: com.google.guava, - org.eclipse.xtend.lib, - org.eclipse.xtext.xbase.lib, - org.eclipse.core.runtime, - org.eclipse.emf.ecore;visibility:=reexport, - hu.bme.mit.inf.dslreasoner.logic.model;bundle-version="1.0.0";visibility:=reexport, - hu.bme.mit.inf.dslreasoner.alloy.language;bundle-version="1.0.0", - org.eclipse.viatra.query.runtime.base.itc;bundle-version="1.3.0", - hu.bme.mit.inf.dslreasoner.ecore2logic;bundle-version="1.0.0", - org.eclipse.viatra.query.runtime;bundle-version="2.0.0" + org.eclipse.xtend.lib, + org.eclipse.xtext.xbase.lib, + org.eclipse.core.runtime, + org.eclipse.emf.ecore;visibility:=reexport, + hu.bme.mit.inf.dslreasoner.logic.model;bundle-version="1.0.0";visibility:=reexport, + hu.bme.mit.inf.dslreasoner.alloy.language;bundle-version="1.0.0", + org.eclipse.viatra.query.runtime.base.itc;bundle-version="1.3.0", + hu.bme.mit.inf.dslreasoner.ecore2logic;bundle-version="1.0.0", + org.eclipse.viatra.query.runtime;bundle-version="2.0.0" Import-Package: org.apache.log4j;version="1.2.15" Automatic-Module-Name: hu.bme.mit.inf.dlsreasoner.alloy.reasoner Bundle-ActivationPolicy: lazy diff --git a/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/plugin.xml b/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/plugin.xml index 5457d70c..e57b595a 100644 --- a/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/plugin.xml +++ b/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/plugin.xml @@ -1,17 +1,17 @@ - - - - - - - - - - - - - - - +--> + + + + + + + + + + + + + + + -- cgit v1.2.3-70-g09d2 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 'Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner') 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-70-g09d2 From b15b3d49ead78c9124a98ab982a4488e4d7bc3d4 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Tue, 29 Oct 2019 17:32:38 +0100 Subject: Alloy cardinality fixes --- .../alloy/reasoner/queries/typeQueries.vql | 2 +- .../alloy/reasoner/builder/Alloy2LogicMapper.xtend | 2 +- .../reasoner/builder/AlloyModelInterpretation.xtend | 2 +- ...AlloyLanguageMapper_TypeMapper_FilteredTypes.xtend | 2 +- .../alloy/reasoner/builder/RunCommandMapper.xtend | 19 +++++++++++++++---- 5 files changed, 19 insertions(+), 8 deletions(-) (limited to 'Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner') diff --git a/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/queries/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/queries/typeQueries.vql b/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/queries/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/queries/typeQueries.vql index 8d93cafb..14cf3594 100644 --- a/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/queries/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/queries/typeQueries.vql +++ b/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/queries/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/queries/typeQueries.vql @@ -81,5 +81,5 @@ private pattern typeDoesNotCoverElementOccurance(element: DefinedElement, type: find supertype(containerType,type); TypeDefinition.elements(containerType,element); TypeDefinition.elements(uncoveredOccurance,element); - neg find supertype(uncoveredOccurance,type); + neg find supertype(type,uncoveredOccurance); } \ No newline at end of file diff --git a/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/Alloy2LogicMapper.xtend b/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/Alloy2LogicMapper.xtend index 2efd6b29..328ca176 100644 --- a/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/Alloy2LogicMapper.xtend +++ b/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/Alloy2LogicMapper.xtend @@ -9,7 +9,7 @@ class Alloy2LogicMapper { public def transformOutput(LogicProblem problem, int requiredNumberOfSolution, MonitoredAlloySolution monitoredAlloySolution, Logic2AlloyLanguageMapperTrace trace, long transformationTime) { val models = monitoredAlloySolution.aswers.map[it.key].toList - if(!monitoredAlloySolution.finishedBeforeTimeout) { + if(models.empty || !monitoredAlloySolution.finishedBeforeTimeout) { return createInsuficientResourcesResult => [ it.problem = problem it.representation += models diff --git a/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/AlloyModelInterpretation.xtend b/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/AlloyModelInterpretation.xtend index 107aa001..29eabe2c 100644 --- a/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/AlloyModelInterpretation.xtend +++ b/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/AlloyModelInterpretation.xtend @@ -117,7 +117,7 @@ class AlloyModelInterpretation implements LogicModelInterpretation{ for(atom: allAtoms) { val typeName = getName(atom.type) val atomName = atom.name - println(atom.toString + " < - " + typeName) +// println(atom.toString + " < - " + typeName) if(typeName == forwardTrace.logicLanguage.name) { this.logicLanguage = atom } else if(typeName == "Int" || typeName == "seq/Int") { diff --git a/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/Logic2AlloyLanguageMapper_TypeMapper_FilteredTypes.xtend b/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/Logic2AlloyLanguageMapper_TypeMapper_FilteredTypes.xtend index 397fb84b..ae7a1e6b 100644 --- a/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/Logic2AlloyLanguageMapper_TypeMapper_FilteredTypes.xtend +++ b/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/Logic2AlloyLanguageMapper_TypeMapper_FilteredTypes.xtend @@ -124,7 +124,7 @@ class Logic2AlloyLanguageMapper_TypeMapper_FilteredTypes implements Logic2AlloyL for(type : types.filter[it.supertypes.size>=2]) { trace.specification.factDeclarations += createALSFactDeclaration => [ it.name = support.toIDMultiple("abstract",type.name) - it.term = createALSEquals => [ + it.term = createALSSubset => [ it.leftOperand = createALSReference => [ it.referred = type.lookup(typeTrace.type2ALSType) ] it.rightOperand = support.unfoldIntersection(type.supertypes.map[e| createALSReference => [it.referred = e.lookup(typeTrace.type2ALSType)]]) diff --git a/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/RunCommandMapper.xtend b/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/RunCommandMapper.xtend index 494197bc..b74017d8 100644 --- a/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/RunCommandMapper.xtend +++ b/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/RunCommandMapper.xtend @@ -9,8 +9,12 @@ import hu.bme.mit.inf.dslreasoner.alloyLanguage.ALSString import hu.bme.mit.inf.dslreasoner.alloyLanguage.ALSTerm import hu.bme.mit.inf.dslreasoner.alloyLanguage.AlloyLanguageFactory import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicSolverConfiguration +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDefinition import java.util.List +import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* + class RunCommandMapper { val extension AlloyLanguageFactory factory = AlloyLanguageFactory.eINSTANCE val Logic2AlloyLanguageMapper_Support support = new Logic2AlloyLanguageMapper_Support; @@ -89,16 +93,18 @@ class RunCommandMapper { ] for(upperLimit : config.typeScopes.maxNewElementsByType.entrySet) { - val limit = upperLimit.value + val type = upperLimit.key + val limit = upperLimit.value + getExistingCount(type) if(limit != LogicSolverConfiguration::Unlimited) { - this.typeScopeMapping.addUpperMultiplicity(specification,upperLimit.key,limit,mapper,trace) + this.typeScopeMapping.addUpperMultiplicity(specification,type,limit,mapper,trace) } } for(lowerLimit : config.typeScopes.minNewElementsByType.entrySet) { - val limit = lowerLimit.value + val type = lowerLimit.key + val limit = lowerLimit.value + getExistingCount(type) if(limit != 0) { - this.typeScopeMapping.addLowerMultiplicity(specification,lowerLimit.key,limit,mapper,trace) + this.typeScopeMapping.addLowerMultiplicity(specification,type,limit,mapper,trace) } } @@ -106,6 +112,11 @@ class RunCommandMapper { setStringScope(specification,config,specification.runCommand) } + private def getExistingCount(Type type) { + val existing = type.transitiveClosureStar[it.subtypes].filter(TypeDefinition).map[elements].flatten.toSet + existing.size + } + protected def Boolean setStringScope(ALSDocument specification, AlloySolverConfiguration config, ALSRunCommand it) { if(config.typeScopes.maxNewStrings === LogicSolverConfiguration::Unlimited) { throw new UnsupportedOperationException('''A string scope have to be specified for Alloy!''') -- cgit v1.2.3-70-g09d2 From b84e5c63aaded9d15d38b43ea9fbfb09a976e12a Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Wed, 12 Feb 2020 20:40:38 +0100 Subject: Fix concurrency bug in AlloyHandler --- .../inf/dlsreasoner/alloy/reasoner/builder/AlloyHandler.xtend | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) (limited to 'Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner') 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 ed2ef6b7..451aad6e 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 @@ -101,15 +101,8 @@ class AlloyHandler { try{ answers = future.get(configuration.runtimeLimit,TimeUnit.SECONDS) finished = true - } catch (TimeoutException ex) { - // handle the timeout - } catch (InterruptedException e) { - // handle the interrupts - } catch (ExecutionException e) { - // handle other exceptions - } finally { - future.cancel(true); - + } catch (TimeoutException | InterruptedException | ExecutionException e) { + future.cancel(true) answers = callable.partialAnswers finished = false } -- cgit v1.2.3-70-g09d2 From 6a3ff9bb588bf47242a56b91e35479dbba38eb19 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Thu, 7 May 2020 17:26:07 +0200 Subject: Scope unsat benchmarks --- .../.ApplicationConfigurationIdeModule.xtendbin | Bin 1701 -> 1701 bytes .../ide/.ApplicationConfigurationIdeSetup.xtendbin | Bin 2570 -> 2526 bytes .../Examples/ModelGenExampleFAM_plugin/.project | 6 + .../Examples/ModelGenExampleFAM_plugin/plugin.xml | 18 +- .../dslreasoner/domains/alloyexamples/Ecore.vql | 10 + .../plugin.xml | 2 + .../dslreasoner/domains/alloyexamples/.gitignore | 5 + .../alloyexamples/Unsat_loopInInheritance.java | 566 +++++++++++++++++ .../domains/alloyexamples/Unsat_subpackage.java | 704 +++++++++++++++++++++ .../domains/alloyexamples/internal/.gitignore | 4 + .../plugin.xml | 12 +- .../domains/satellite/queries/SatelliteQueries.vql | 13 + .../plugin.xml | 1 + .../partialsnapshot_mavo/yakindu/patterns.vql | 11 + .../.classpath | 26 +- .../META-INF/MANIFEST.MF | 7 +- .../NeighbourhoodBasedStateCoderFactory.xtend | 9 +- .../reasoner/ViatraReasonerConfiguration.xtend | 2 +- ..._ViatraSolver_polyhedral_typeHierarchy_Clp.json | 16 - .../configs/Yakindu.json | 13 + ..._ViatraSolver_polyhedral_typeHierarchy_Clp.json | 17 - .../configs/ecore.json | 17 + ..._ViatraSolver_polyhedral_typeHierarchy_Clp.json | 16 - ..._ViatraSolver_polyhedral_typeHierarchy_Clp.json | 16 - .../configs/satellite.json | 17 + ..._ViatraSolver_polyhedral_typeHierarchy_Clp.json | 17 - .../mit/inf/dslreasoner/run/MetamodelLoader.xtend | 63 +- .../dslreasoner/run/script/MeasurementScript.xtend | 13 +- .../run/script/MeasurementScriptRunner.xtend | 46 +- 29 files changed, 1511 insertions(+), 136 deletions(-) create mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/src-gen/hu/bme/mit/inf/dslreasoner/domains/alloyexamples/Unsat_loopInInheritance.java create mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/src-gen/hu/bme/mit/inf/dslreasoner/domains/alloyexamples/Unsat_subpackage.java create mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/src-gen/hu/bme/mit/inf/dslreasoner/domains/alloyexamples/internal/.gitignore delete mode 100644 Tests/hu.bme.mit.inf.dslreasoner.run/configs/FAM_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json create mode 100644 Tests/hu.bme.mit.inf.dslreasoner.run/configs/Yakindu.json delete mode 100644 Tests/hu.bme.mit.inf.dslreasoner.run/configs/Yakindu_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json create mode 100644 Tests/hu.bme.mit.inf.dslreasoner.run/configs/ecore.json delete mode 100644 Tests/hu.bme.mit.inf.dslreasoner.run/configs/ecore_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json delete mode 100644 Tests/hu.bme.mit.inf.dslreasoner.run/configs/fs_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json create mode 100644 Tests/hu.bme.mit.inf.dslreasoner.run/configs/satellite.json delete mode 100644 Tests/hu.bme.mit.inf.dslreasoner.run/configs/satellite_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json (limited to 'Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner') 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 83195553..c8086733 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 f5085470..1a907776 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/Domains/Examples/ModelGenExampleFAM_plugin/.project b/Domains/Examples/ModelGenExampleFAM_plugin/.project index 6e1b3a06..570f8a60 100644 --- a/Domains/Examples/ModelGenExampleFAM_plugin/.project +++ b/Domains/Examples/ModelGenExampleFAM_plugin/.project @@ -5,6 +5,11 @@ + + org.eclipse.xtext.ui.shared.xtextBuilder + + + org.eclipse.viatra.query.tooling.ui.projectbuilder @@ -30,5 +35,6 @@ org.eclipse.jdt.core.javanature org.eclipse.viatra.query.projectnature org.eclipse.pde.PluginNature + org.eclipse.xtext.ui.shared.xtextNature diff --git a/Domains/Examples/ModelGenExampleFAM_plugin/plugin.xml b/Domains/Examples/ModelGenExampleFAM_plugin/plugin.xml index c117a28e..8d99d401 100644 --- a/Domains/Examples/ModelGenExampleFAM_plugin/plugin.xml +++ b/Domains/Examples/ModelGenExampleFAM_plugin/plugin.xml @@ -5,23 +5,13 @@ - - - - + + + + - - - - - - - diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/patterns/hu/bme/mit/inf/dslreasoner/domains/alloyexamples/Ecore.vql b/Domains/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/patterns/hu/bme/mit/inf/dslreasoner/domains/alloyexamples/Ecore.vql index 78525a35..16c24d05 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/patterns/hu/bme/mit/inf/dslreasoner/domains/alloyexamples/Ecore.vql +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/patterns/hu/bme/mit/inf/dslreasoner/domains/alloyexamples/Ecore.vql @@ -11,6 +11,16 @@ pattern loopInInheritence(a: EClass) { find directSupertype+(a,a); } +pattern unsat_subpackage(a: EPackage, b: EPackage) { + EPackage.eSubpackages(a, b); +} + +@Constraint(key={p}, severity="error", message="error") +pattern unsat_loopInInheritance(p: EPackage) { + neg find unsat_subpackage(_, p); + neg find loopInInheritence(_); +} + pattern opposite(a:EReference, b: EReference) { EReference.eOpposite(a,b); } diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/plugin.xml b/Domains/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/plugin.xml index 6eae8535..eddd482c 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/plugin.xml +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/plugin.xml @@ -11,6 +11,8 @@ + + diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/src-gen/hu/bme/mit/inf/dslreasoner/domains/alloyexamples/.gitignore b/Domains/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/src-gen/hu/bme/mit/inf/dslreasoner/domains/alloyexamples/.gitignore index 0f8c77a1..70eab455 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/src-gen/hu/bme/mit/inf/dslreasoner/domains/alloyexamples/.gitignore +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/src-gen/hu/bme/mit/inf/dslreasoner/domains/alloyexamples/.gitignore @@ -54,3 +54,8 @@ /.RootIsNotDir.java._trace /Dir.java /RootIsNotDir.java +/.Unsat_loopInInheritance.java._trace +/.Subpackage.java._trace +/.Unsat_subpackage.java._trace +/.Unsat_subpackageOrSelf.java._trace +/.Unsat_topLevelPackageWithLoop.java._trace diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/src-gen/hu/bme/mit/inf/dslreasoner/domains/alloyexamples/Unsat_loopInInheritance.java b/Domains/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/src-gen/hu/bme/mit/inf/dslreasoner/domains/alloyexamples/Unsat_loopInInheritance.java new file mode 100644 index 00000000..83bd0f66 --- /dev/null +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/src-gen/hu/bme/mit/inf/dslreasoner/domains/alloyexamples/Unsat_loopInInheritance.java @@ -0,0 +1,566 @@ +/** + * Generated from platform:/resource/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/patterns/hu/bme/mit/inf/dslreasoner/domains/alloyexamples/Ecore.vql + */ +package hu.bme.mit.inf.dslreasoner.domains.alloyexamples; + +import hu.bme.mit.inf.dslreasoner.domains.alloyexamples.LoopInInheritence; +import hu.bme.mit.inf.dslreasoner.domains.alloyexamples.Unsat_subpackage; +import java.util.Arrays; +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.apache.log4j.Logger; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EPackage; +import org.eclipse.viatra.query.runtime.api.IPatternMatch; +import org.eclipse.viatra.query.runtime.api.IQuerySpecification; +import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; +import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; +import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; +import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; +import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; +import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey; +import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; +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.annotations.PAnnotation; +import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.NegativePatternCall; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; +import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; +import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; +import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil; + +/** + * A pattern-specific query specification that can instantiate Matcher in a type-safe way. + * + *

    Original source: + *

    + *         {@literal @}Constraint(key={p}, severity="error", message="error")
    + *         pattern unsat_loopInInheritance(p: EPackage) {
    + *         	neg find unsat_subpackage(_, p);
    + *         	neg find loopInInheritence(_);
    + *         }
    + * 
    + * + * @see Matcher + * @see Match + * + */ +@SuppressWarnings("all") +public final class Unsat_loopInInheritance extends BaseGeneratedEMFQuerySpecification { + /** + * Pattern-specific match representation of the hu.bme.mit.inf.dslreasoner.domains.alloyexamples.unsat_loopInInheritance pattern, + * to be used in conjunction with {@link Matcher}. + * + *

    Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. + * Each instance is a (possibly partial) substitution of pattern parameters, + * usable to represent a match of the pattern in the result of a query, + * or to specify the bound (fixed) input parameters when issuing a query. + * + * @see Matcher + * + */ + public static abstract class Match extends BasePatternMatch { + private EPackage fP; + + private static List parameterNames = makeImmutableList("p"); + + private Match(final EPackage pP) { + this.fP = pP; + } + + @Override + public Object get(final String parameterName) { + switch(parameterName) { + case "p": return this.fP; + default: return null; + } + } + + @Override + public Object get(final int index) { + switch(index) { + case 0: return this.fP; + default: return null; + } + } + + public EPackage getP() { + return this.fP; + } + + @Override + public boolean set(final String parameterName, final Object newValue) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + if ("p".equals(parameterName) ) { + this.fP = (EPackage) newValue; + return true; + } + return false; + } + + public void setP(final EPackage pP) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + this.fP = pP; + } + + @Override + public String patternName() { + return "hu.bme.mit.inf.dslreasoner.domains.alloyexamples.unsat_loopInInheritance"; + } + + @Override + public List parameterNames() { + return Unsat_loopInInheritance.Match.parameterNames; + } + + @Override + public Object[] toArray() { + return new Object[]{fP}; + } + + @Override + public Unsat_loopInInheritance.Match toImmutable() { + return isMutable() ? newMatch(fP) : this; + } + + @Override + public String prettyPrint() { + StringBuilder result = new StringBuilder(); + result.append("\"p\"=" + prettyPrintValue(fP)); + return result.toString(); + } + + @Override + public int hashCode() { + return Objects.hash(fP); + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) { + return false; + } + if ((obj instanceof Unsat_loopInInheritance.Match)) { + Unsat_loopInInheritance.Match other = (Unsat_loopInInheritance.Match) obj; + return Objects.equals(fP, other.fP); + } else { + // this should be infrequent + if (!(obj instanceof IPatternMatch)) { + return false; + } + IPatternMatch otherSig = (IPatternMatch) obj; + return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); + } + } + + @Override + public Unsat_loopInInheritance specification() { + return Unsat_loopInInheritance.instance(); + } + + /** + * Returns an empty, mutable match. + * Fields of the mutable match can be filled to create a partial match, usable as matcher input. + * + * @return the empty match. + * + */ + public static Unsat_loopInInheritance.Match newEmptyMatch() { + return new Mutable(null); + } + + /** + * Returns a mutable (partial) match. + * Fields of the mutable match can be filled to create a partial match, usable as matcher input. + * + * @param pP the fixed value of pattern parameter p, or null if not bound. + * @return the new, mutable (partial) match object. + * + */ + public static Unsat_loopInInheritance.Match newMutableMatch(final EPackage pP) { + return new Mutable(pP); + } + + /** + * Returns a new (partial) match. + * This can be used e.g. to call the matcher with a partial match. + *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. + * @param pP the fixed value of pattern parameter p, or null if not bound. + * @return the (partial) match object. + * + */ + public static Unsat_loopInInheritance.Match newMatch(final EPackage pP) { + return new Immutable(pP); + } + + private static final class Mutable extends Unsat_loopInInheritance.Match { + Mutable(final EPackage pP) { + super(pP); + } + + @Override + public boolean isMutable() { + return true; + } + } + + private static final class Immutable extends Unsat_loopInInheritance.Match { + Immutable(final EPackage pP) { + super(pP); + } + + @Override + public boolean isMutable() { + return false; + } + } + } + + /** + * Generated pattern matcher API of the hu.bme.mit.inf.dslreasoner.domains.alloyexamples.unsat_loopInInheritance pattern, + * providing pattern-specific query methods. + * + *

    Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, + * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. + * + *

    Matches of the pattern will be represented as {@link Match}. + * + *

    Original source: + *

    +   * {@literal @}Constraint(key={p}, severity="error", message="error")
    +   * pattern unsat_loopInInheritance(p: EPackage) {
    +   * 	neg find unsat_subpackage(_, p);
    +   * 	neg find loopInInheritence(_);
    +   * }
    +   * 
    + * + * @see Match + * @see Unsat_loopInInheritance + * + */ + public static class Matcher extends BaseMatcher { + /** + * Initializes the pattern matcher within an existing VIATRA Query engine. + * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. + * + * @param engine the existing VIATRA Query engine in which this matcher will be created. + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * + */ + public static Unsat_loopInInheritance.Matcher on(final ViatraQueryEngine engine) { + // check if matcher already exists + Matcher matcher = engine.getExistingMatcher(querySpecification()); + if (matcher == null) { + matcher = (Matcher)engine.getMatcher(querySpecification()); + } + return matcher; + } + + /** + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * @return an initialized matcher + * @noreference This method is for internal matcher initialization by the framework, do not call it manually. + * + */ + public static Unsat_loopInInheritance.Matcher create() { + return new Matcher(); + } + + private static final int POSITION_P = 0; + + private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Unsat_loopInInheritance.Matcher.class); + + /** + * Initializes the pattern matcher within an existing VIATRA Query engine. + * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. + * + * @param engine the existing VIATRA Query engine in which this matcher will be created. + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * + */ + private Matcher() { + super(querySpecification()); + } + + /** + * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. + * @param pP the fixed value of pattern parameter p, or null if not bound. + * @return matches represented as a Match object. + * + */ + public Collection getAllMatches(final EPackage pP) { + return rawStreamAllMatches(new Object[]{pP}).collect(Collectors.toSet()); + } + + /** + * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. + *

    + * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * @param pP the fixed value of pattern parameter p, or null if not bound. + * @return a stream of matches represented as a Match object. + * + */ + public Stream streamAllMatches(final EPackage pP) { + return rawStreamAllMatches(new Object[]{pP}); + } + + /** + * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. + * Neither determinism nor randomness of selection is guaranteed. + * @param pP the fixed value of pattern parameter p, or null if not bound. + * @return a match represented as a Match object, or null if no match is found. + * + */ + public Optional getOneArbitraryMatch(final EPackage pP) { + return rawGetOneArbitraryMatch(new Object[]{pP}); + } + + /** + * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, + * under any possible substitution of the unspecified parameters (if any). + * @param pP the fixed value of pattern parameter p, or null if not bound. + * @return true if the input is a valid (partial) match of the pattern. + * + */ + public boolean hasMatch(final EPackage pP) { + return rawHasMatch(new Object[]{pP}); + } + + /** + * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. + * @param pP the fixed value of pattern parameter p, or null if not bound. + * @return the number of pattern matches found. + * + */ + public int countMatches(final EPackage pP) { + return rawCountMatches(new Object[]{pP}); + } + + /** + * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. + * Neither determinism nor randomness of selection is guaranteed. + * @param pP the fixed value of pattern parameter p, or null if not bound. + * @param processor the action that will process the selected match. + * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked + * + */ + public boolean forOneArbitraryMatch(final EPackage pP, final Consumer processor) { + return rawForOneArbitraryMatch(new Object[]{pP}, processor); + } + + /** + * Returns a new (partial) match. + * This can be used e.g. to call the matcher with a partial match. + *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. + * @param pP the fixed value of pattern parameter p, or null if not bound. + * @return the (partial) match object. + * + */ + public Unsat_loopInInheritance.Match newMatch(final EPackage pP) { + return Unsat_loopInInheritance.Match.newMatch(pP); + } + + /** + * Retrieve the set of values that occur in matches for p. + * @return the Set of all values or empty set if there are no matches + * + */ + protected Stream rawStreamAllValuesOfp(final Object[] parameters) { + return rawStreamAllValues(POSITION_P, parameters).map(EPackage.class::cast); + } + + /** + * Retrieve the set of values that occur in matches for p. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOfp() { + return rawStreamAllValuesOfp(emptyArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for p. + * @return the Set of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOfp() { + return rawStreamAllValuesOfp(emptyArray()); + } + + @Override + protected Unsat_loopInInheritance.Match tupleToMatch(final Tuple t) { + try { + return Unsat_loopInInheritance.Match.newMatch((EPackage) t.get(POSITION_P)); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in tuple not properly typed!",e); + return null; + } + } + + @Override + protected Unsat_loopInInheritance.Match arrayToMatch(final Object[] match) { + try { + return Unsat_loopInInheritance.Match.newMatch((EPackage) match[POSITION_P]); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in array not properly typed!",e); + return null; + } + } + + @Override + protected Unsat_loopInInheritance.Match arrayToMatchMutable(final Object[] match) { + try { + return Unsat_loopInInheritance.Match.newMutableMatch((EPackage) match[POSITION_P]); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in array not properly typed!",e); + return null; + } + } + + /** + * @return the singleton instance of the query specification of this pattern + * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded + * + */ + public static IQuerySpecification querySpecification() { + return Unsat_loopInInheritance.instance(); + } + } + + private Unsat_loopInInheritance() { + super(GeneratedPQuery.INSTANCE); + } + + /** + * @return the singleton instance of the query specification + * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded + * + */ + public static Unsat_loopInInheritance instance() { + try{ + return LazyHolder.INSTANCE; + } catch (ExceptionInInitializerError err) { + throw processInitializerError(err); + } + } + + @Override + protected Unsat_loopInInheritance.Matcher instantiate(final ViatraQueryEngine engine) { + return Unsat_loopInInheritance.Matcher.on(engine); + } + + @Override + public Unsat_loopInInheritance.Matcher instantiate() { + return Unsat_loopInInheritance.Matcher.create(); + } + + @Override + public Unsat_loopInInheritance.Match newEmptyMatch() { + return Unsat_loopInInheritance.Match.newEmptyMatch(); + } + + @Override + public Unsat_loopInInheritance.Match newMatch(final Object... parameters) { + return Unsat_loopInInheritance.Match.newMatch((org.eclipse.emf.ecore.EPackage) parameters[0]); + } + + /** + * Inner class allowing the singleton instance of {@link Unsat_loopInInheritance} to be created + * not at the class load time of the outer class, + * but rather at the first call to {@link Unsat_loopInInheritance#instance()}. + * + *

    This workaround is required e.g. to support recursion. + * + */ + private static class LazyHolder { + private static final Unsat_loopInInheritance INSTANCE = new Unsat_loopInInheritance(); + + /** + * Statically initializes the query specification after the field {@link #INSTANCE} is assigned. + * This initialization order is required to support indirect recursion. + * + *

    The static initializer is defined using a helper field to work around limitations of the code generator. + * + */ + private static final Object STATIC_INITIALIZER = ensureInitialized(); + + public static Object ensureInitialized() { + INSTANCE.ensureInitializedInternal(); + return null; + } + } + + private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { + private static final Unsat_loopInInheritance.GeneratedPQuery INSTANCE = new GeneratedPQuery(); + + private final PParameter parameter_p = new PParameter("p", "org.eclipse.emf.ecore.EPackage", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EPackage")), PParameterDirection.INOUT); + + private final List parameters = Arrays.asList(parameter_p); + + private GeneratedPQuery() { + super(PVisibility.PUBLIC); + } + + @Override + public String getFullyQualifiedName() { + return "hu.bme.mit.inf.dslreasoner.domains.alloyexamples.unsat_loopInInheritance"; + } + + @Override + public List getParameterNames() { + return Arrays.asList("p"); + } + + @Override + public List getParameters() { + return parameters; + } + + @Override + public Set doGetContainedBodies() { + setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); + Set bodies = new LinkedHashSet<>(); + { + PBody body = new PBody(this); + PVariable var_p = body.getOrCreateVariableByName("p"); + PVariable var___0_ = body.getOrCreateVariableByName("_<0>"); + PVariable var___1_ = body.getOrCreateVariableByName("_<1>"); + new TypeConstraint(body, Tuples.flatTupleOf(var_p), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EPackage"))); + body.setSymbolicParameters(Arrays.asList( + new ExportedParameter(body, var_p, parameter_p) + )); + // neg find unsat_subpackage(_, p) + new NegativePatternCall(body, Tuples.flatTupleOf(var___0_, var_p), Unsat_subpackage.instance().getInternalQueryRepresentation()); + // neg find loopInInheritence(_) + new NegativePatternCall(body, Tuples.flatTupleOf(var___1_), LoopInInheritence.instance().getInternalQueryRepresentation()); + bodies.add(body); + } + { + PAnnotation annotation = new PAnnotation("Constraint"); + annotation.addAttribute("key", Arrays.asList(new Object[] { + new ParameterReference("p") + })); + annotation.addAttribute("severity", "error"); + annotation.addAttribute("message", "error"); + addAnnotation(annotation); + } + return bodies; + } + } +} diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/src-gen/hu/bme/mit/inf/dslreasoner/domains/alloyexamples/Unsat_subpackage.java b/Domains/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/src-gen/hu/bme/mit/inf/dslreasoner/domains/alloyexamples/Unsat_subpackage.java new file mode 100644 index 00000000..a9c8aed8 --- /dev/null +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/src-gen/hu/bme/mit/inf/dslreasoner/domains/alloyexamples/Unsat_subpackage.java @@ -0,0 +1,704 @@ +/** + * Generated from platform:/resource/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/patterns/hu/bme/mit/inf/dslreasoner/domains/alloyexamples/Ecore.vql + */ +package hu.bme.mit.inf.dslreasoner.domains.alloyexamples; + +import java.util.Arrays; +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.apache.log4j.Logger; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EPackage; +import org.eclipse.viatra.query.runtime.api.IPatternMatch; +import org.eclipse.viatra.query.runtime.api.IQuerySpecification; +import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; +import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; +import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; +import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; +import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; +import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey; +import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey; +import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; +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.Equality; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter; +import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; +import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; +import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; +import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; +import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil; + +/** + * A pattern-specific query specification that can instantiate Matcher in a type-safe way. + * + *

    Original source: + *

    + *         pattern unsat_subpackage(a: EPackage, b: EPackage) {
    + *         	EPackage.eSubpackages(a, b);
    + *         }
    + * 
    + * + * @see Matcher + * @see Match + * + */ +@SuppressWarnings("all") +public final class Unsat_subpackage extends BaseGeneratedEMFQuerySpecification { + /** + * Pattern-specific match representation of the hu.bme.mit.inf.dslreasoner.domains.alloyexamples.unsat_subpackage pattern, + * to be used in conjunction with {@link Matcher}. + * + *

    Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. + * Each instance is a (possibly partial) substitution of pattern parameters, + * usable to represent a match of the pattern in the result of a query, + * or to specify the bound (fixed) input parameters when issuing a query. + * + * @see Matcher + * + */ + public static abstract class Match extends BasePatternMatch { + private EPackage fA; + + private EPackage fB; + + private static List parameterNames = makeImmutableList("a", "b"); + + private Match(final EPackage pA, final EPackage pB) { + this.fA = pA; + this.fB = pB; + } + + @Override + public Object get(final String parameterName) { + switch(parameterName) { + case "a": return this.fA; + case "b": return this.fB; + default: return null; + } + } + + @Override + public Object get(final int index) { + switch(index) { + case 0: return this.fA; + case 1: return this.fB; + default: return null; + } + } + + public EPackage getA() { + return this.fA; + } + + public EPackage getB() { + return this.fB; + } + + @Override + public boolean set(final String parameterName, final Object newValue) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + if ("a".equals(parameterName) ) { + this.fA = (EPackage) newValue; + return true; + } + if ("b".equals(parameterName) ) { + this.fB = (EPackage) newValue; + return true; + } + return false; + } + + public void setA(final EPackage pA) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + this.fA = pA; + } + + public void setB(final EPackage pB) { + if (!isMutable()) throw new java.lang.UnsupportedOperationException(); + this.fB = pB; + } + + @Override + public String patternName() { + return "hu.bme.mit.inf.dslreasoner.domains.alloyexamples.unsat_subpackage"; + } + + @Override + public List parameterNames() { + return Unsat_subpackage.Match.parameterNames; + } + + @Override + public Object[] toArray() { + return new Object[]{fA, fB}; + } + + @Override + public Unsat_subpackage.Match toImmutable() { + return isMutable() ? newMatch(fA, fB) : this; + } + + @Override + public String prettyPrint() { + StringBuilder result = new StringBuilder(); + result.append("\"a\"=" + prettyPrintValue(fA) + ", "); + result.append("\"b\"=" + prettyPrintValue(fB)); + return result.toString(); + } + + @Override + public int hashCode() { + return Objects.hash(fA, fB); + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) { + return false; + } + if ((obj instanceof Unsat_subpackage.Match)) { + Unsat_subpackage.Match other = (Unsat_subpackage.Match) obj; + return Objects.equals(fA, other.fA) && Objects.equals(fB, other.fB); + } else { + // this should be infrequent + if (!(obj instanceof IPatternMatch)) { + return false; + } + IPatternMatch otherSig = (IPatternMatch) obj; + return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); + } + } + + @Override + public Unsat_subpackage specification() { + return Unsat_subpackage.instance(); + } + + /** + * Returns an empty, mutable match. + * Fields of the mutable match can be filled to create a partial match, usable as matcher input. + * + * @return the empty match. + * + */ + public static Unsat_subpackage.Match newEmptyMatch() { + return new Mutable(null, null); + } + + /** + * Returns a mutable (partial) match. + * Fields of the mutable match can be filled to create a partial match, usable as matcher input. + * + * @param pA the fixed value of pattern parameter a, or null if not bound. + * @param pB the fixed value of pattern parameter b, or null if not bound. + * @return the new, mutable (partial) match object. + * + */ + public static Unsat_subpackage.Match newMutableMatch(final EPackage pA, final EPackage pB) { + return new Mutable(pA, pB); + } + + /** + * Returns a new (partial) match. + * This can be used e.g. to call the matcher with a partial match. + *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. + * @param pA the fixed value of pattern parameter a, or null if not bound. + * @param pB the fixed value of pattern parameter b, or null if not bound. + * @return the (partial) match object. + * + */ + public static Unsat_subpackage.Match newMatch(final EPackage pA, final EPackage pB) { + return new Immutable(pA, pB); + } + + private static final class Mutable extends Unsat_subpackage.Match { + Mutable(final EPackage pA, final EPackage pB) { + super(pA, pB); + } + + @Override + public boolean isMutable() { + return true; + } + } + + private static final class Immutable extends Unsat_subpackage.Match { + Immutable(final EPackage pA, final EPackage pB) { + super(pA, pB); + } + + @Override + public boolean isMutable() { + return false; + } + } + } + + /** + * Generated pattern matcher API of the hu.bme.mit.inf.dslreasoner.domains.alloyexamples.unsat_subpackage pattern, + * providing pattern-specific query methods. + * + *

    Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, + * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. + * + *

    Matches of the pattern will be represented as {@link Match}. + * + *

    Original source: + *

    +   * pattern unsat_subpackage(a: EPackage, b: EPackage) {
    +   * 	EPackage.eSubpackages(a, b);
    +   * }
    +   * 
    + * + * @see Match + * @see Unsat_subpackage + * + */ + public static class Matcher extends BaseMatcher { + /** + * Initializes the pattern matcher within an existing VIATRA Query engine. + * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. + * + * @param engine the existing VIATRA Query engine in which this matcher will be created. + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * + */ + public static Unsat_subpackage.Matcher on(final ViatraQueryEngine engine) { + // check if matcher already exists + Matcher matcher = engine.getExistingMatcher(querySpecification()); + if (matcher == null) { + matcher = (Matcher)engine.getMatcher(querySpecification()); + } + return matcher; + } + + /** + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * @return an initialized matcher + * @noreference This method is for internal matcher initialization by the framework, do not call it manually. + * + */ + public static Unsat_subpackage.Matcher create() { + return new Matcher(); + } + + private static final int POSITION_A = 0; + + private static final int POSITION_B = 1; + + private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Unsat_subpackage.Matcher.class); + + /** + * Initializes the pattern matcher within an existing VIATRA Query engine. + * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. + * + * @param engine the existing VIATRA Query engine in which this matcher will be created. + * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation + * + */ + private Matcher() { + super(querySpecification()); + } + + /** + * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. + * @param pA the fixed value of pattern parameter a, or null if not bound. + * @param pB the fixed value of pattern parameter b, or null if not bound. + * @return matches represented as a Match object. + * + */ + public Collection getAllMatches(final EPackage pA, final EPackage pB) { + return rawStreamAllMatches(new Object[]{pA, pB}).collect(Collectors.toSet()); + } + + /** + * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. + *

    + * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * @param pA the fixed value of pattern parameter a, or null if not bound. + * @param pB the fixed value of pattern parameter b, or null if not bound. + * @return a stream of matches represented as a Match object. + * + */ + public Stream streamAllMatches(final EPackage pA, final EPackage pB) { + return rawStreamAllMatches(new Object[]{pA, pB}); + } + + /** + * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. + * Neither determinism nor randomness of selection is guaranteed. + * @param pA the fixed value of pattern parameter a, or null if not bound. + * @param pB the fixed value of pattern parameter b, or null if not bound. + * @return a match represented as a Match object, or null if no match is found. + * + */ + public Optional getOneArbitraryMatch(final EPackage pA, final EPackage pB) { + return rawGetOneArbitraryMatch(new Object[]{pA, pB}); + } + + /** + * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, + * under any possible substitution of the unspecified parameters (if any). + * @param pA the fixed value of pattern parameter a, or null if not bound. + * @param pB the fixed value of pattern parameter b, or null if not bound. + * @return true if the input is a valid (partial) match of the pattern. + * + */ + public boolean hasMatch(final EPackage pA, final EPackage pB) { + return rawHasMatch(new Object[]{pA, pB}); + } + + /** + * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. + * @param pA the fixed value of pattern parameter a, or null if not bound. + * @param pB the fixed value of pattern parameter b, or null if not bound. + * @return the number of pattern matches found. + * + */ + public int countMatches(final EPackage pA, final EPackage pB) { + return rawCountMatches(new Object[]{pA, pB}); + } + + /** + * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. + * Neither determinism nor randomness of selection is guaranteed. + * @param pA the fixed value of pattern parameter a, or null if not bound. + * @param pB the fixed value of pattern parameter b, or null if not bound. + * @param processor the action that will process the selected match. + * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked + * + */ + public boolean forOneArbitraryMatch(final EPackage pA, final EPackage pB, final Consumer processor) { + return rawForOneArbitraryMatch(new Object[]{pA, pB}, processor); + } + + /** + * Returns a new (partial) match. + * This can be used e.g. to call the matcher with a partial match. + *

    The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. + * @param pA the fixed value of pattern parameter a, or null if not bound. + * @param pB the fixed value of pattern parameter b, or null if not bound. + * @return the (partial) match object. + * + */ + public Unsat_subpackage.Match newMatch(final EPackage pA, final EPackage pB) { + return Unsat_subpackage.Match.newMatch(pA, pB); + } + + /** + * Retrieve the set of values that occur in matches for a. + * @return the Set of all values or empty set if there are no matches + * + */ + protected Stream rawStreamAllValuesOfa(final Object[] parameters) { + return rawStreamAllValues(POSITION_A, parameters).map(EPackage.class::cast); + } + + /** + * Retrieve the set of values that occur in matches for a. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOfa() { + return rawStreamAllValuesOfa(emptyArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for a. + * @return the Set of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOfa() { + return rawStreamAllValuesOfa(emptyArray()); + } + + /** + * Retrieve the set of values that occur in matches for a. + *

    + * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * + * @return the Stream of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOfa(final Unsat_subpackage.Match partialMatch) { + return rawStreamAllValuesOfa(partialMatch.toArray()); + } + + /** + * Retrieve the set of values that occur in matches for a. + *

    + * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * + * @return the Stream of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOfa(final EPackage pB) { + return rawStreamAllValuesOfa(new Object[]{null, pB}); + } + + /** + * Retrieve the set of values that occur in matches for a. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOfa(final Unsat_subpackage.Match partialMatch) { + return rawStreamAllValuesOfa(partialMatch.toArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for a. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOfa(final EPackage pB) { + return rawStreamAllValuesOfa(new Object[]{null, pB}).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for b. + * @return the Set of all values or empty set if there are no matches + * + */ + protected Stream rawStreamAllValuesOfb(final Object[] parameters) { + return rawStreamAllValues(POSITION_B, parameters).map(EPackage.class::cast); + } + + /** + * Retrieve the set of values that occur in matches for b. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOfb() { + return rawStreamAllValuesOfb(emptyArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for b. + * @return the Set of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOfb() { + return rawStreamAllValuesOfb(emptyArray()); + } + + /** + * Retrieve the set of values that occur in matches for b. + *

    + * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * + * @return the Stream of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOfb(final Unsat_subpackage.Match partialMatch) { + return rawStreamAllValuesOfb(partialMatch.toArray()); + } + + /** + * Retrieve the set of values that occur in matches for b. + *

    + * NOTE: It is important not to modify the source model while the stream is being processed. + * If the match set of the pattern changes during processing, the contents of the stream is undefined. + * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. + * + * @return the Stream of all values or empty set if there are no matches + * + */ + public Stream streamAllValuesOfb(final EPackage pA) { + return rawStreamAllValuesOfb(new Object[]{pA, null}); + } + + /** + * Retrieve the set of values that occur in matches for b. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOfb(final Unsat_subpackage.Match partialMatch) { + return rawStreamAllValuesOfb(partialMatch.toArray()).collect(Collectors.toSet()); + } + + /** + * Retrieve the set of values that occur in matches for b. + * @return the Set of all values or empty set if there are no matches + * + */ + public Set getAllValuesOfb(final EPackage pA) { + return rawStreamAllValuesOfb(new Object[]{pA, null}).collect(Collectors.toSet()); + } + + @Override + protected Unsat_subpackage.Match tupleToMatch(final Tuple t) { + try { + return Unsat_subpackage.Match.newMatch((EPackage) t.get(POSITION_A), (EPackage) t.get(POSITION_B)); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in tuple not properly typed!",e); + return null; + } + } + + @Override + protected Unsat_subpackage.Match arrayToMatch(final Object[] match) { + try { + return Unsat_subpackage.Match.newMatch((EPackage) match[POSITION_A], (EPackage) match[POSITION_B]); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in array not properly typed!",e); + return null; + } + } + + @Override + protected Unsat_subpackage.Match arrayToMatchMutable(final Object[] match) { + try { + return Unsat_subpackage.Match.newMutableMatch((EPackage) match[POSITION_A], (EPackage) match[POSITION_B]); + } catch(ClassCastException e) { + LOGGER.error("Element(s) in array not properly typed!",e); + return null; + } + } + + /** + * @return the singleton instance of the query specification of this pattern + * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded + * + */ + public static IQuerySpecification querySpecification() { + return Unsat_subpackage.instance(); + } + } + + private Unsat_subpackage() { + super(GeneratedPQuery.INSTANCE); + } + + /** + * @return the singleton instance of the query specification + * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded + * + */ + public static Unsat_subpackage instance() { + try{ + return LazyHolder.INSTANCE; + } catch (ExceptionInInitializerError err) { + throw processInitializerError(err); + } + } + + @Override + protected Unsat_subpackage.Matcher instantiate(final ViatraQueryEngine engine) { + return Unsat_subpackage.Matcher.on(engine); + } + + @Override + public Unsat_subpackage.Matcher instantiate() { + return Unsat_subpackage.Matcher.create(); + } + + @Override + public Unsat_subpackage.Match newEmptyMatch() { + return Unsat_subpackage.Match.newEmptyMatch(); + } + + @Override + public Unsat_subpackage.Match newMatch(final Object... parameters) { + return Unsat_subpackage.Match.newMatch((org.eclipse.emf.ecore.EPackage) parameters[0], (org.eclipse.emf.ecore.EPackage) parameters[1]); + } + + /** + * Inner class allowing the singleton instance of {@link Unsat_subpackage} to be created + * not at the class load time of the outer class, + * but rather at the first call to {@link Unsat_subpackage#instance()}. + * + *

    This workaround is required e.g. to support recursion. + * + */ + private static class LazyHolder { + private static final Unsat_subpackage INSTANCE = new Unsat_subpackage(); + + /** + * Statically initializes the query specification after the field {@link #INSTANCE} is assigned. + * This initialization order is required to support indirect recursion. + * + *

    The static initializer is defined using a helper field to work around limitations of the code generator. + * + */ + private static final Object STATIC_INITIALIZER = ensureInitialized(); + + public static Object ensureInitialized() { + INSTANCE.ensureInitializedInternal(); + return null; + } + } + + private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { + private static final Unsat_subpackage.GeneratedPQuery INSTANCE = new GeneratedPQuery(); + + private final PParameter parameter_a = new PParameter("a", "org.eclipse.emf.ecore.EPackage", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EPackage")), PParameterDirection.INOUT); + + private final PParameter parameter_b = new PParameter("b", "org.eclipse.emf.ecore.EPackage", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EPackage")), PParameterDirection.INOUT); + + private final List parameters = Arrays.asList(parameter_a, parameter_b); + + private GeneratedPQuery() { + super(PVisibility.PUBLIC); + } + + @Override + public String getFullyQualifiedName() { + return "hu.bme.mit.inf.dslreasoner.domains.alloyexamples.unsat_subpackage"; + } + + @Override + public List getParameterNames() { + return Arrays.asList("a","b"); + } + + @Override + public List getParameters() { + return parameters; + } + + @Override + public Set doGetContainedBodies() { + setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); + Set bodies = new LinkedHashSet<>(); + { + PBody body = new PBody(this); + PVariable var_a = body.getOrCreateVariableByName("a"); + PVariable var_b = body.getOrCreateVariableByName("b"); + new TypeConstraint(body, Tuples.flatTupleOf(var_a), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EPackage"))); + new TypeConstraint(body, Tuples.flatTupleOf(var_b), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EPackage"))); + body.setSymbolicParameters(Arrays.asList( + new ExportedParameter(body, var_a, parameter_a), + new ExportedParameter(body, var_b, parameter_b) + )); + // EPackage.eSubpackages(a, b) + new TypeConstraint(body, Tuples.flatTupleOf(var_a), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EPackage"))); + PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}"); + new TypeConstraint(body, Tuples.flatTupleOf(var_a, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.eclipse.org/emf/2002/Ecore", "EPackage", "eSubpackages"))); + new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EPackage"))); + new Equality(body, var__virtual_0_, var_b); + bodies.add(body); + } + return bodies; + } + } +} diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/src-gen/hu/bme/mit/inf/dslreasoner/domains/alloyexamples/internal/.gitignore b/Domains/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/src-gen/hu/bme/mit/inf/dslreasoner/domains/alloyexamples/internal/.gitignore new file mode 100644 index 00000000..995169ff --- /dev/null +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.alloyexamples/src-gen/hu/bme/mit/inf/dslreasoner/domains/alloyexamples/internal/.gitignore @@ -0,0 +1,4 @@ +/.EcoreAll.java._trace +/.SubpackageOrSelf.java._trace +/.Subpackage.java._trace +/.TopLevelPackageWithLoop.java._trace diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/plugin.xml b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/plugin.xml index b0b77996..fe1af62e 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/plugin.xml +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/plugin.xml @@ -1,9 +1,12 @@ - - - - + + + + @@ -11,6 +14,7 @@ + diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/queries/SatelliteQueries.vql b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/queries/SatelliteQueries.vql index 1f83a3b0..ba12bbda 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/queries/SatelliteQueries.vql +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/queries/SatelliteQueries.vql @@ -59,6 +59,19 @@ pattern noLinkToGroundStation(Spacecraft : Spacecraft) { neg find indirectCommunicationLink(Spacecraft, GroundStation); } +//@Constraint(severity = "error", key = {Spacecraft}, message = "UNSAT") +//pattern unsat_linkToGroundStation(Spacecraft : Spacecraft) { +// ConstellationMission.groundStationNetwork(Mission, GroundStation); +// ConstellationMission.spacecraft(Mission, Spacecraft); +// find indirectCommunicationLink(Spacecraft, GroundStation); +//} + +@Constraint(severity = "error", key = {Mission}, message = "UNSAT") +pattern unsat_linkToGroundStation(Mission : InterferometryMission) { + InterferometryMission(Mission); + neg find noLinkToGroundStation(_); +} + @Constraint(severity = "error", key = {Spacecraft}, message = "Spacecraft has no potential communication path to the ground station.") pattern noPotentialLinkToGroundStation(Spacecraft : Spacecraft) { diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/plugin.xml b/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/plugin.xml index 7bf4a20b..d4ab204e 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/plugin.xml +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/plugin.xml @@ -8,6 +8,7 @@ + diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/queries/hu/bme/mit/inf/dslreasoner/partialsnapshot_mavo/yakindu/patterns.vql b/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/queries/hu/bme/mit/inf/dslreasoner/partialsnapshot_mavo/yakindu/patterns.vql index 98a10cde..49fb5b2f 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/queries/hu/bme/mit/inf/dslreasoner/partialsnapshot_mavo/yakindu/patterns.vql +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/queries/hu/bme/mit/inf/dslreasoner/partialsnapshot_mavo/yakindu/patterns.vql @@ -22,6 +22,12 @@ pattern multipleEntryInRegion(r : Region) { e1 != e2; } +@Constraint(severity="error", message="error", key = {sct}) +pattern unsat_multipleEntryInRegion(sct : Statechart) { + Statechart(sct); + neg find multipleEntryInRegion(_); +} + pattern transition(t : Transition, src : Vertex, trg : Vertex) { Transition.source(t, src); Transition.target(t, trg); @@ -197,6 +203,11 @@ pattern SynchronizedRegionDoesNotHaveMultipleRegions(s : Synchronization, v : Ve neg find hasMultipleRegions(c); } +//@Constraint(severity="error", message="error", key = {sct}) +//pattern unsat_SynchronizedRegionDoesNotHaveMultipleRegions(sct : Statechart) { +// Statechart(sct); +// neg find SynchronizedRegionDoesNotHaveMultipleRegions(_, _); +//} pattern hasMultipleRegions(composite: CompositeElement) { CompositeElement.regions(composite,region1); diff --git a/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/.classpath b/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/.classpath index de68b5f7..25b7f16f 100644 --- a/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/.classpath +++ b/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/.classpath @@ -1,11 +1,15 @@ - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/META-INF/MANIFEST.MF b/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/META-INF/MANIFEST.MF index b944302b..75581def 100644 --- a/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/META-INF/MANIFEST.MF +++ b/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/META-INF/MANIFEST.MF @@ -20,7 +20,8 @@ Require-Bundle: com.google.guava, org.eclipse.viatra.query.runtime.base.itc;bundle-version="1.3.0", hu.bme.mit.inf.dslreasoner.ecore2logic;bundle-version="1.0.0", org.eclipse.viatra.query.runtime;bundle-version="2.0.0" -Import-Package: org.apache.log4j;version="1.2.15" -Automatic-Module-Name: hu.bme.mit.inf.dlsreasoner.alloy.reasoner -Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Bundle-ActivationPolicy: lazy +Bundle-NativeCode: libminisat.so;osname=Linux;processor=x86_64 +Automatic-Module-Name: hu.bme.mit.inf.dlsreasoner.alloy.reasoner +Import-Package: org.apache.log4j;version="1.2.15" diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/statecoder/NeighbourhoodBasedStateCoderFactory.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/statecoder/NeighbourhoodBasedStateCoderFactory.xtend index 5e442ca7..f19ac30f 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/statecoder/NeighbourhoodBasedStateCoderFactory.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/statecoder/NeighbourhoodBasedStateCoderFactory.xtend @@ -59,15 +59,14 @@ class NeighbourhoodBasedPartialInterpretationStateCoder exten override doCreateActivationCode(IPatternMatch match) { val size = match.specification.parameters.size val res = new ArrayList(size) - var int index = 0 var int equivalenceHash = 0 val prime = 31 - while (index < size) { - res.add(getCode(match.get(index))) - index++ + for (var int index = 0; index < size; index++) { + val matchArgument = match.get(index) + res.add(getCode(matchArgument)) for (var i = 0; i < index; i++) { - val number = if (match.get(index) === match.get(i)) { + val number = if (matchArgument === match.get(i)) { 1 } else { 0 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 6f38d261..c0a71c85 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 @@ -55,7 +55,7 @@ class ViatraReasonerConfiguration extends LogicSolverConfiguration { */ public var SearchSpaceConstraint searchSpaceConstraints = new SearchSpaceConstraint - public var ScopePropagatorStrategy scopePropagatorStrategy = new ScopePropagatorStrategy.Polyhedral( + public var ScopePropagatorStrategy scopePropagatorStrategy = ScopePropagatorStrategy.Polyhedral( PolyhedralScopePropagatorConstraints.Relational, PolyhedralScopePropagatorSolver.Clp) public var List hints = newArrayList diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/configs/FAM_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json b/Tests/hu.bme.mit.inf.dslreasoner.run/configs/FAM_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json deleted file mode 100644 index 1e2d4dd4..00000000 --- a/Tests/hu.bme.mit.inf.dslreasoner.run/configs/FAM_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "inputPath": "initialModels", - "outputPath": "outputModels", - "timeout": 1200, - "saveModels": true, - "warmupIterations": 0, - "iterations": 5, - "domain": "FAM", - "scope": "none", - "sizes": [500], - "solver": "ViatraSolver", - "scopePropagator": "polyhedral", - "propagatedConstraints": "hints", - "polyhedronSolver": "Clp", - "scopeHeuristics": "polyhedral" -} diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/configs/Yakindu.json b/Tests/hu.bme.mit.inf.dslreasoner.run/configs/Yakindu.json new file mode 100644 index 00000000..b602f2fe --- /dev/null +++ b/Tests/hu.bme.mit.inf.dslreasoner.run/configs/Yakindu.json @@ -0,0 +1,13 @@ +{ + "inputPath": "initialModels", + "outputPath": "outputModels", + "timeout": 300, + "saveModels": true, + "saveTemporaryFiles": false, + "warmupIterations": 0, + "iterations": 30, + "domain": "Yakindu", + "scope": "unsat", + "sizes": [20], + "solver": "AlloySolver" +} diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/configs/Yakindu_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json b/Tests/hu.bme.mit.inf.dslreasoner.run/configs/Yakindu_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json deleted file mode 100644 index b4d51684..00000000 --- a/Tests/hu.bme.mit.inf.dslreasoner.run/configs/Yakindu_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "inputPath": "initialModels", - "outputPath": "outputModels", - "timeout": 1200, - "saveModels": false, - "saveTemporaryFiles": true, - "warmupIterations": 0, - "iterations": 5, - "domain": "Yakindu", - "scope": "none", - "sizes": [100], - "solver": "ViatraSolver", - "scopePropagator": "polyhedral", - "propagatedConstraints": "hints", - "polyhedronSolver": "Clp", - "scopeHeuristic": "polyhedral" -} diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/configs/ecore.json b/Tests/hu.bme.mit.inf.dslreasoner.run/configs/ecore.json new file mode 100644 index 00000000..36fb0ea2 --- /dev/null +++ b/Tests/hu.bme.mit.inf.dslreasoner.run/configs/ecore.json @@ -0,0 +1,17 @@ +{ + "inputPath": "initialModels", + "outputPath": "outputModels", + "timeout": 300, + "saveModels": true, + "saveTemporaryFiles": false, + "warmupIterations": 0, + "iterations": 1, + "domain": "ecoreUnsat", + "scope": "none", + "sizes": [5, 10, 20, 30, 40, 50], + "solver": "ViatraSolver", + "scopePropagator": "polyhedral", + "propagatedConstraints": "hints", + "polyhedronSolver": "Clp", + "scopeHeuristic": "polyhedral" +} diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/configs/ecore_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json b/Tests/hu.bme.mit.inf.dslreasoner.run/configs/ecore_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json deleted file mode 100644 index 72e97957..00000000 --- a/Tests/hu.bme.mit.inf.dslreasoner.run/configs/ecore_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "inputPath": "initialModels", - "outputPath": "outputModels", - "timeout": 1200, - "saveModels": true, - "warmupIterations": 0, - "iterations": 5, - "domain": "ecore", - "scope": "quantiles", - "sizes": [50], - "solver": "ViatraSolver", - "scopePropagator": "polyhedral", - "propagatedConstraints": "hints", - "polyhedronSolver": "Clp", - "scopeHeuristic": "polyhedral" -} diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/configs/fs_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json b/Tests/hu.bme.mit.inf.dslreasoner.run/configs/fs_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json deleted file mode 100644 index a7e29a22..00000000 --- a/Tests/hu.bme.mit.inf.dslreasoner.run/configs/fs_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "inputPath": "initialModels", - "outputPath": "outputModels", - "timeout": 1200, - "saveModels": true, - "warmupIterations": 1, - "iterations": 1, - "domain": "fs", - "scope": "none", - "sizes": [50, 100, 150, 200, 250, 300, 350, 400, 450, 500], - "solver": "ViatraSolver", - "scopePropagator": "polyhedral", - "propagatedConstraints": "hints", - "polyhedronSolver": "Clp", - "scopeHeuristic": "polyhedral" -} diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/configs/satellite.json b/Tests/hu.bme.mit.inf.dslreasoner.run/configs/satellite.json new file mode 100644 index 00000000..16abb5d0 --- /dev/null +++ b/Tests/hu.bme.mit.inf.dslreasoner.run/configs/satellite.json @@ -0,0 +1,17 @@ +{ + "inputPath": "initialModels", + "outputPath": "outputModels", + "timeout": 300, + "saveModels": true, + "saveTemporaryFiles": false, + "warmupIterations": 0, + "iterations": 30, + "domain": "satelliteUnsat", + "scope": "none", + "sizes": [10], + "solver": "ViatraSolver", + "scopePropagator": "polyhedral", + "propagatedConstraints": "hints", + "polyhedronSolver": "Clp", + "scopeHeuristic": "polyhedral" +} diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/configs/satellite_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json b/Tests/hu.bme.mit.inf.dslreasoner.run/configs/satellite_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json deleted file mode 100644 index d5469948..00000000 --- a/Tests/hu.bme.mit.inf.dslreasoner.run/configs/satellite_useful_ViatraSolver_polyhedral_typeHierarchy_Clp.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "inputPath": "initialModels", - "outputPath": "outputModels", - "timeout": 120, - "saveModels": true, - "saveTemporaryFiles": true, - "warmupIterations": 0, - "iterations": 1, - "domain": "Yakindu", - "scope": "quantiles", - "sizes": [10, 20, 30, 40, 50, 60, 70, 80, 90, 100], - "solver": "ViatraSolver", - "scopePropagator": "polyhedral", - "propagatedConstraints": "hints", - "polyhedronSolver": "Clp", - "scopeHeuristic": "polyhedral" -} diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/MetamodelLoader.xtend b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/MetamodelLoader.xtend index 1be03eed..bf9ca274 100644 --- a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/MetamodelLoader.xtend +++ b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/MetamodelLoader.xtend @@ -40,6 +40,8 @@ class TypeQuantiles { } abstract class MetamodelLoader { + public static val UNSAT_PREFIX = "unsat_" + protected val ReasonerWorkspace workspace new(ReasonerWorkspace workspace) { @@ -61,6 +63,10 @@ abstract class MetamodelLoader { def Map getTypeQuantiles() { emptyMap } + + def Map getUnsatTypeQuantiles() { + throw new UnsupportedOperationException("This domain has no type quantiles for unsatisfiable problems") + } def List getHints(Ecore2Logic ecore2Logic, Ecore2Logic_Trace trace) { emptyList @@ -136,9 +142,15 @@ class YakinduLoader extends MetamodelLoader { public static val patternsWithComplexStates = #["outgoingFromExit", "outgoingFromFinal", "choiceHasNoOutgoing", "choiceHasNoIncoming"] + val boolean satisfiable + new(ReasonerWorkspace workspace) { + this(workspace, true) + } + + new(ReasonerWorkspace workspace, boolean satisfiable) { super(workspace) - YakindummPackage.eINSTANCE.eClass + this.satisfiable = satisfiable } def setUseSynchronization(boolean useSynchronization) { @@ -173,6 +185,8 @@ class YakinduLoader extends MetamodelLoader { useSynchInThisLoad || !patternsWithSynchronization.exists[spec.fullyQualifiedName.endsWith(it)] ].filter [ spec | useComplexStates || !patternsWithComplexStates.exists[spec.fullyQualifiedName.endsWith(it)] + ].filter [ + !satisfiable || !it.simpleName.startsWith(UNSAT_PREFIX) ].toList val wfPatterns = patterns.filter[it.allAnnotations.exists[it.name == "Constraint"]].toSet val derivedFeatures = new LinkedHashMap @@ -213,6 +227,19 @@ class YakinduLoader extends MetamodelLoader { "Transition" -> new TypeQuantiles(0.581632653061224, 0.645161290322581) } } + + override getUnsatTypeQuantiles() { + #{ + "Choice" -> new TypeQuantiles(0.118279569892473, 0.154020979020979), + "Entry" -> new TypeQuantiles(0.2, 0.4), + "Exit" -> new TypeQuantiles(0, 0), + "FinalState" -> new TypeQuantiles(0, 0), + "Region" -> new TypeQuantiles(0.0294117647058824, 0.0633258678611422), + "State" -> new TypeQuantiles(0.132023636740618, 0.175925925925926), +// "Statechart" -> new TypeQuantiles(0.00961538461538462, 0.010752688172043), + "Transition" -> new TypeQuantiles(0.581632653061224, 0.645161290322581) + } + } override getHints(Ecore2Logic ecore2Logic, Ecore2Logic_Trace trace) { #[new SGraphHint(ecore2Logic, trace)] @@ -276,9 +303,15 @@ class FileSystemLoader extends MetamodelLoader { } class EcoreLoader extends MetamodelLoader { + val boolean satisfiable new(ReasonerWorkspace workspace) { + this(workspace, true) + } + + new(ReasonerWorkspace workspace, boolean satisfiable) { super(workspace) + this.satisfiable = satisfiable } override loadMetamodel() { @@ -307,7 +340,12 @@ class EcoreLoader extends MetamodelLoader { override loadQueries(EcoreMetamodelDescriptor metamodel) { val patternGroup = Ecore.instance val patterns = patternGroup.specifications.toList - val wfPatterns = patterns.filter[it.allAnnotations.exists[it.name == "Constraint"]].toSet + val allWfPatterns = patterns.filter[it.allAnnotations.exists[it.name == "Constraint"]].toSet + val wfPatterns = if (satisfiable) { + allWfPatterns.filter[!it.simpleName.startsWith(UNSAT_PREFIX)].toSet + } else { + allWfPatterns + } val derivedFeatures = new HashMap return new ViatraQuerySetDescriptor( patterns, @@ -346,9 +384,15 @@ class EcoreLoader extends MetamodelLoader { } class SatelliteLoader extends MetamodelLoader { + val boolean satisfiable new(ReasonerWorkspace workspace) { + this(workspace, true) + } + + new(ReasonerWorkspace workspace, boolean satisfiable) { super(workspace) + this.satisfiable = satisfiable } override loadMetamodel() { @@ -371,7 +415,9 @@ class SatelliteLoader extends MetamodelLoader { override loadQueries(EcoreMetamodelDescriptor metamodel) { val i = SatelliteQueriesAll.instance - val patterns = i.specifications.toList + val patterns = i.specifications.filter [ + !satisfiable || !it.simpleName.startsWith(UNSAT_PREFIX) + ].toList val wfPatterns = patterns.filter[it.allAnnotations.exists[it.name == "Constraint"]].toSet val derivedFeatures = new LinkedHashMap val res = new ViatraQuerySetDescriptor( @@ -404,4 +450,15 @@ class SatelliteLoader extends MetamodelLoader { } } + override getUnsatTypeQuantiles() { + #{ + "CubeSat3U" -> new TypeQuantiles(0.1, 0.25), + "CubeSat6U" -> new TypeQuantiles(0.1, 0.25), + "SmallSat" -> new TypeQuantiles(0.1, 0.25), + "UHFCommSubsystem" -> new TypeQuantiles(0.08, 0.1), + "XCommSubsystem" -> new TypeQuantiles(0, 0.1), + "KaCommSubsystem" -> new TypeQuantiles(0, 0.05), + "InterferometryPayload" -> new TypeQuantiles(0.15, 0.25) + } + } } diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/script/MeasurementScript.xtend b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/script/MeasurementScript.xtend index 56a65091..f842afb5 100644 --- a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/script/MeasurementScript.xtend +++ b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/script/MeasurementScript.xtend @@ -29,19 +29,26 @@ class MeasurementScript { enum Domain { fs, ecore, + ecoreUnsat, Yakindu, + YakinduUnsat, FAM, - satellite + satellite, + satelliteUnsat } enum Scope { none, - quantiles + quantiles, + upperOnly, + unsat, + exactly } enum Solver { ViatraSolver, - AlloySolver + AlloySolver, + AlloyMiniSat } enum ScopePropagator { diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/script/MeasurementScriptRunner.xtend b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/script/MeasurementScriptRunner.xtend index 1127f01a..973c3d13 100644 --- a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/script/MeasurementScriptRunner.xtend +++ b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/script/MeasurementScriptRunner.xtend @@ -54,6 +54,7 @@ import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandalone import org.eclipse.viatra.query.runtime.api.ViatraQueryEngineOptions import org.eclipse.viatra.query.runtime.rete.matcher.ReteBackendFactory import org.eclipse.xtend.lib.annotations.Data +import hu.bme.mit.inf.dlsreasoner.alloy.reasoner.AlloyBackendSolver class MeasurementScriptRunner { static val MODEL_SIZE_GAP = 0 @@ -75,9 +76,12 @@ class MeasurementScriptRunner { metamodelLoader = switch (script.domain) { case fs: new FileSystemLoader(inputWorkspace) case ecore: new EcoreLoader(inputWorkspace) + case ecoreUnsat: new EcoreLoader(inputWorkspace, false) case Yakindu: new YakinduLoader(inputWorkspace) => [useSynchronization = false; useComplexStates = true] + case YakinduUnsat: new YakinduLoader(inputWorkspace, false) => [useSynchronization = false; useComplexStates = true] case FAM: new FAMLoader(inputWorkspace) case satellite: new SatelliteLoader(inputWorkspace) + case satelliteUnsat: new SatelliteLoader(inputWorkspace, false) default: throw new IllegalArgumentException("Unsupported domain: " + script.domain) } } @@ -191,15 +195,17 @@ class MeasurementScriptRunner { config } - private def createAlloyConfig() { + private def createAlloyConfig(AlloyBackendSolver backendSolver) { val config = new AlloySolverConfiguration + config.solver = backendSolver config } private def createConfig(int modelSize) { val config = switch (solver : script.solver) { case ViatraSolver: createViatraConfig() - case AlloySolver: createAlloyConfig() + case AlloySolver: createAlloyConfig(AlloyBackendSolver.SAT4J) + case AlloyMiniSat: createAlloyConfig(AlloyBackendSolver.MiniSatJNI) default: throw new IllegalArgumentException("Unknown solver: " + solver) } config.solutionScope.numberOfRequiredSolutions = 1 @@ -243,7 +249,8 @@ class MeasurementScriptRunner { val solver = switch (solver : script.solver) { case ViatraSolver: new ViatraReasoner - case AlloySolver: new AlloySolver + case AlloySolver, + case AlloyMiniSat: new AlloySolver default: throw new IllegalArgumentException("Unknown solver: " + solver) } val result = solver.solve(problem, config, outputWorkspace) @@ -284,14 +291,31 @@ class MeasurementScriptRunner { } else { val numberOfKnownElements = knownElements.values.flatten.toSet.size val newElementCount = modelSize - numberOfKnownElements - config.typeScopes.minNewElements = newElementCount - config.typeScopes.maxNewElements = newElementCount + MODEL_SIZE_GAP + switch (script.scope) { + case upperOnly: + config.typeScopes.maxNewElements = newElementCount + MODEL_SIZE_GAP + case exactly: { + config.typeScopes.minNewElements = newElementCount + config.typeScopes.maxNewElements = newElementCount + } + default: { + config.typeScopes.minNewElements = newElementCount + config.typeScopes.maxNewElements = newElementCount + MODEL_SIZE_GAP + } + } } - switch (script.scope) { - case none: + switch (scope : script.scope) { + case none, + case exactly: return - case quantiles: { - val quantiles = metamodelLoader.typeQuantiles + case quantiles, + case unsat, + case upperOnly: { + val quantiles = if (scope == Scope.unsat) { + metamodelLoader.unsatTypeQuantiles + } else { + metamodelLoader.typeQuantiles + } for (eClassInScope : eClassMapper.allClassesInScope(trace)) { val quantile = quantiles.get(eClassInScope.name) if (quantile !== null) { @@ -301,7 +325,9 @@ class MeasurementScriptRunner { val lowCount = Math.floor(modelSize * quantile.low) as int val highCount = Math.ceil((modelSize + MODEL_SIZE_GAP) * quantile.high) as int // println('''«type.name» «lowCount» «highCount»''') - config.typeScopes.minNewElementsByType.put(type, Math.max(lowCount - currentCount, 0)) + if (script.scope != Scope.upperOnly) { + config.typeScopes.minNewElementsByType.put(type, Math.max(lowCount - currentCount, 0)) + } config.typeScopes.maxNewElementsByType.put(type, highCount - currentCount) } } -- cgit v1.2.3-70-g09d2