From 0762fa6bbb703daf0df2d5db304b0cb86b19ef3c Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Tue, 25 Aug 2020 10:54:08 +0200 Subject: [PATCH 001/536] add Owicki-Gries annotation outline --- .../traceabstraction/BasicCegarLoop.java | 8 ++++ .../concurrency/OwickiGriesAnnotation.java | 45 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java index 4fe44c64c32..b63c215a5ce 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java @@ -115,6 +115,7 @@ import de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder.util.IcfgAngelicProgramExecution; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.automataminimization.AutomataMinimization; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.automataminimization.AutomataMinimization.AutomataMinimizationTimeout; +import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency.OwickiGriesAnnotation; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.errorabstraction.ErrorGeneralizationEngine; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.errorlocalization.FlowSensitiveFaultLocalizer; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.interpolantautomata.transitionappender.AbstractInterpolantAutomaton; @@ -1101,6 +1102,13 @@ public IStatisticsDataProvider getCegarLoopBenchmark() { * method called at the end of the cegar loop */ public void finish() { + if (!isSequential() && mPref.useLbeInConcurrentAnalysis() == PetriNetLbe.OFF) { + // TODO OwickiGriesAnnotation annotation = OwickiGriesAnnotation.fromFloydHoare(net, floydHoare, htc); + + // TODO: simplify + + //assert annotation.isValidAnnotation() : "Invalid Owicki-Gries annotation"; + } mCegarLoopBenchmark.stop(CegarLoopStatisticsDefinitions.OverallTime.toString()); } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java new file mode 100644 index 00000000000..0f0491802b4 --- /dev/null +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java @@ -0,0 +1,45 @@ +package de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency; + +import java.util.Map; + +import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; +import de.uni_freiburg.informatik.ultimate.automata.petrinet.Marking; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.hoaretriple.IHoareTripleChecker; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; +import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.SmtUtils; + +public class OwickiGriesAnnotation { + + // Petri net + private final IPetriNet mPetriNet; + + // + private final Map mFormulaMapping; + // ... + + private final IHoareTripleChecker mHtc; + + public OwickiGriesAnnotation(IHoareTripleChecker htc) { + mPetriNet = null; + mFormulaMapping = null; + mHtc = htc; + } + + public boolean isValidAnnotation() { + // ... + // mHtc.checkInternal(pre, act, succ) + return false; + } + + public int getSize() { + // ... + return 0; + } + + public static OwickiGriesAnnotation fromFloydHoare(IPetriNet net, + Map, IPredicate> floydHoare, IHoareTripleChecker htc) { + // ... + return new OwickiGriesAnnotation<>(htc); + } + +} From f6629998d8a440a7d1cd2bcbb367526f19c69682 Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Thu, 27 Aug 2020 19:05:38 +0200 Subject: [PATCH 002/536] preliminary (hacky) implementation of Floyd/Hoare annotation for concurrent programsSTATE --- ...-Automizer_Default-noMmResRef-FA-NoLbe.epf | 2 +- .../operations/PetriNet2FiniteAutomaton.java | 4 + .../traceabstraction/BasicCegarLoop.java | 84 ++++++++++++++----- .../CFG2NestedWordAutomaton.java | 8 +- .../HoareAnnotationComposer.java | 49 ++++++----- .../HoareAnnotationExtractor.java | 3 +- .../HoareAnnotationFragments.java | 43 +++++----- .../HoareAnnotationWriter.java | 23 ++++- .../PredicateFactoryRefinement.java | 18 +++- .../TraceAbstractionStarter.java | 6 +- 10 files changed, 158 insertions(+), 82 deletions(-) diff --git a/trunk/examples/settings/automizer/concurrent/svcomp-Reach-32bit-Automizer_Default-noMmResRef-FA-NoLbe.epf b/trunk/examples/settings/automizer/concurrent/svcomp-Reach-32bit-Automizer_Default-noMmResRef-FA-NoLbe.epf index c52efa7b1a7..cc07fecba47 100644 --- a/trunk/examples/settings/automizer/concurrent/svcomp-Reach-32bit-Automizer_Default-noMmResRef-FA-NoLbe.epf +++ b/trunk/examples/settings/automizer/concurrent/svcomp-Reach-32bit-Automizer_Default-noMmResRef-FA-NoLbe.epf @@ -46,7 +46,7 @@ file_export_version=3.0 /instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/SMT\ solver=External_ModelsAndUnsatCoreMode /instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Command\ for\ external\ solver=z3 SMTLIB2_COMPLIANT\=true -memory\:2024 -smt2 -in /instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Compute\ Hoare\ Annotation\ of\ negated\ interpolant\ automaton,\ abstraction\ and\ CFG=true -/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Positions\ where\ we\ compute\ the\ Hoare\ Annotation=LoopsAndPotentialCycles +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Positions\ where\ we\ compute\ the\ Hoare\ Annotation=All /instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Trace\ refinement\ strategy=CAMEL /instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Automaton\ type\ used\ in\ concurrency\ analysis=FINITE_AUTOMATA /instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Large\ block\ encoding\ in\ concurrent\ analysis=OFF diff --git a/trunk/source/Library-Automata/src/de/uni_freiburg/informatik/ultimate/automata/petrinet/operations/PetriNet2FiniteAutomaton.java b/trunk/source/Library-Automata/src/de/uni_freiburg/informatik/ultimate/automata/petrinet/operations/PetriNet2FiniteAutomaton.java index fff8a44142e..95efafeecc5 100644 --- a/trunk/source/Library-Automata/src/de/uni_freiburg/informatik/ultimate/automata/petrinet/operations/PetriNet2FiniteAutomaton.java +++ b/trunk/source/Library-Automata/src/de/uni_freiburg/informatik/ultimate/automata/petrinet/operations/PetriNet2FiniteAutomaton.java @@ -187,6 +187,10 @@ public INestedWordAutomaton getResult() { return mResult; } + public Map, PLACE> getStateMap() { + return mMarking2State; + } + @Override public boolean checkResult(final IStateFactory stateFactory) throws AutomataLibraryException { return true; diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java index b63c215a5ce..7199b5b34c8 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java @@ -70,9 +70,11 @@ import de.uni_freiburg.informatik.ultimate.automata.nestedword.operations.oldapi.IOpWithDelayedDeadEndRemoval; import de.uni_freiburg.informatik.ultimate.automata.nestedword.senwa.DifferenceSenwa; import de.uni_freiburg.informatik.ultimate.automata.nestedword.transitions.OutgoingCallTransition; +import de.uni_freiburg.informatik.ultimate.automata.petrinet.Marking; import de.uni_freiburg.informatik.ultimate.automata.petrinet.PetriNetNot1SafeException; import de.uni_freiburg.informatik.ultimate.automata.petrinet.netdatastructures.BoundedPetriNet; import de.uni_freiburg.informatik.ultimate.automata.petrinet.operations.PetriNet2FiniteAutomaton; +import de.uni_freiburg.informatik.ultimate.automata.statefactory.IPetriNet2FiniteAutomatonStateFactory; import de.uni_freiburg.informatik.ultimate.core.lib.exceptions.RunningTaskInfo; import de.uni_freiburg.informatik.ultimate.core.lib.exceptions.TaskCanceledException; import de.uni_freiburg.informatik.ultimate.core.lib.exceptions.TaskCanceledException.UserDefinedLimit; @@ -115,7 +117,6 @@ import de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder.util.IcfgAngelicProgramExecution; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.automataminimization.AutomataMinimization; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.automataminimization.AutomataMinimization.AutomataMinimizationTimeout; -import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency.OwickiGriesAnnotation; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.errorabstraction.ErrorGeneralizationEngine; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.errorlocalization.FlowSensitiveFaultLocalizer; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.interpolantautomata.transitionappender.AbstractInterpolantAutomaton; @@ -225,6 +226,7 @@ public enum PetriNetLbe { private final RelevanceAnalysisMode mFaultLocalizationMode; private final boolean mFaultLocalizationAngelic; private final Set mHoareAnnotationLocations; + private final Set mHoareAnnotationStates; private final SearchStrategy mSearchStrategy; private final StrategyFactory mStrategyFactory; private final PathProgramDumpController mPathProgramDumpController; @@ -268,12 +270,14 @@ public BasicCegarLoop(final DebugIdentifier name, final IIcfg rootNode, final if (mComputeHoareAnnotation) { mHoareAnnotationLocations = (Set) TraceAbstractionUtils .getLocationsForWhichHoareAnnotationIsComputed(rootNode, mPref.getHoareAnnotationPositions()); + mHoareAnnotationStates = new HashSet<>(); } else { mHoareAnnotationLocations = Collections.emptySet(); + mHoareAnnotationStates = Collections.emptySet(); } mStoreFloydHoareAutomata = taPrefs.getFloydHoareAutomataReuse() != FloydHoareAutomataReuse.NONE; mErrorGeneralizationEngine = new ErrorGeneralizationEngine<>(services); - mHaf = new HoareAnnotationFragments<>(mLogger, mHoareAnnotationLocations, mPref.getHoareAnnotationPositions()); + mHaf = new HoareAnnotationFragments<>(mLogger, mHoareAnnotationStates, mPref.getHoareAnnotationPositions()); mStateFactoryForRefinement = new PredicateFactoryRefinement(mServices, super.mCsToolkit.getManagedScript(), predicateFactory, computeHoareAnnotation, mHoareAnnotationLocations); mPredicateFactoryInterpolantAutomata = new PredicateFactoryForInterpolantAutomata( @@ -331,6 +335,8 @@ public BasicCegarLoop(final DebugIdentifier name, final IIcfg rootNode, final mAStarRandomHeuristicSeed = taPrefs.getHeuristicEmptinessCheckAStarHeuristicRandomSeed(); } + private Map, IPredicate> mMarking2State = null; + @Override protected void getInitialAbstraction() throws AutomataLibraryException { if (isSequential()) { @@ -356,8 +362,10 @@ protected void getInitialAbstraction() throws AutomataLibraryException { net = petrifiedCfg; } try { - mAbstraction = new PetriNet2FiniteAutomaton<>(new AutomataLibraryServices(mServices), - mStateFactoryForRefinement, net).getResult(); + final PetriNet2FiniteAutomaton conversion = new PetriNet2FiniteAutomaton<>(new AutomataLibraryServices(mServices), + mStateFactoryForRefinement, net); + mAbstraction = conversion.getResult(); + mMarking2State = conversion.getStateMap(); } catch (final PetriNetNot1SafeException e) { final Collection unsafePlaces = e.getUnsafePlaces(); if (unsafePlaces == null) { @@ -371,17 +379,32 @@ protected void getInitialAbstraction() throws AutomataLibraryException { } } - if (mComputeHoareAnnotation - && mPref.getHoareAnnotationPositions() == HoareAnnotationPositions.LoopsAndPotentialCycles) { - final INestedWordAutomaton nwa = - (INestedWordAutomaton) mAbstraction; + if (mComputeHoareAnnotation) { + final INestedWordAutomaton nwa = (INestedWordAutomaton) mAbstraction; for (final IPredicate pred : nwa.getStates()) { - for (final OutgoingCallTransition trans : nwa.callSuccessors(pred)) { - mHoareAnnotationLocations.add(((ISLPredicate) pred).getProgramPoint()); - mHoareAnnotationLocations.add(((ISLPredicate) trans.getSucc()).getProgramPoint()); + if (pred instanceof ISLPredicate) { + ISLPredicate locPred = (ISLPredicate) pred; + if (mHoareAnnotationLocations.contains(locPred.getProgramPoint())) { + mHoareAnnotationStates.add(locPred); + } + } else if (pred instanceof IMLPredicate) { + IMLPredicate locPred = (IMLPredicate) pred; + if (Arrays.stream(locPred.getProgramPoints()).anyMatch(mHoareAnnotationLocations::contains)) { + mHoareAnnotationStates.add(locPred); + } + } + + if (mPref.getHoareAnnotationPositions() == HoareAnnotationPositions.LoopsAndPotentialCycles) { + for (final OutgoingCallTransition trans : nwa.callSuccessors(pred)) { + mHoareAnnotationLocations.add(((ISLPredicate)pred).getProgramPoint()); + mHoareAnnotationStates.add((ISLPredicate)pred); + mHoareAnnotationLocations.add(((ISLPredicate) trans.getSucc()).getProgramPoint()); + mHoareAnnotationStates.add(trans.getSucc()); + } } } } + if (mWitnessAutomaton != null) { mAbstraction = WitnessUtils.constructIcfgAndWitnessProduct(mServices, mAbstraction, mWitnessAutomaton, mCsToolkit, mPredicateFactory, mStateFactoryForRefinement, mLogger, Property.NON_REACHABILITY); @@ -1044,20 +1067,25 @@ protected void minimizeAbstraction(final PredicateFactoryRefinement predicateFac @Override protected void computeCFGHoareAnnotation() { + mCegarLoopBenchmark.start(CegarLoopStatisticsDefinitions.HoareAnnotationTime.toString()); + final HoareAnnotationComposer clha = computeHoareAnnotationComposer(); + final HoareAnnotationWriter writer = new HoareAnnotationWriter(mIcfg, mCsToolkit, mPredicateFactory, clha, + mServices, mSimplificationTechnique, mXnfConversionTechnique); + // writer.addHoareAnnotationToCFG(); + mCegarLoopBenchmark.stop(CegarLoopStatisticsDefinitions.HoareAnnotationTime.toString()); + mCegarLoopBenchmark.addHoareAnnotationData(clha.getHoareAnnotationStatisticsGenerator()); + } + + protected HoareAnnotationComposer computeHoareAnnotationComposer() { if (mCsToolkit.getManagedScript().isLocked()) { throw new AssertionError("SMTManager must not be locked at the beginning of Hoare annotation computation"); } final INestedWordAutomaton abstraction = (INestedWordAutomaton) mAbstraction; - mCegarLoopBenchmark.start(CegarLoopStatisticsDefinitions.HoareAnnotationTime.toString()); new HoareAnnotationExtractor<>(mServices, abstraction, mHaf); final HoareAnnotationComposer clha = new HoareAnnotationComposer(mCsToolkit, mPredicateFactory, mHaf, mServices, mSimplificationTechnique, mXnfConversionTechnique); - final HoareAnnotationWriter writer = new HoareAnnotationWriter(mIcfg, mCsToolkit, mPredicateFactory, clha, - mServices, mSimplificationTechnique, mXnfConversionTechnique); - writer.addHoareAnnotationToCFG(); - mCegarLoopBenchmark.stop(CegarLoopStatisticsDefinitions.HoareAnnotationTime.toString()); - mCegarLoopBenchmark.addHoareAnnotationData(clha.getHoareAnnotationStatisticsGenerator()); + return clha; } @Override @@ -1103,15 +1131,27 @@ public IStatisticsDataProvider getCegarLoopBenchmark() { */ public void finish() { if (!isSequential() && mPref.useLbeInConcurrentAnalysis() == PetriNetLbe.OFF) { - // TODO OwickiGriesAnnotation annotation = OwickiGriesAnnotation.fromFloydHoare(net, floydHoare, htc); - - // TODO: simplify - - //assert annotation.isValidAnnotation() : "Invalid Owicki-Gries annotation"; + try { + computeOwickiGries(mStateFactoryForRefinement); + } catch (AutomataLibraryException e) { + throw new RuntimeException(e); // TODO + } } mCegarLoopBenchmark.stop(CegarLoopStatisticsDefinitions.OverallTime.toString()); } + private void computeOwickiGries(IPetriNet2FiniteAutomatonStateFactory factory) throws PetriNetNot1SafeException, AutomataOperationCanceledException { + + Map floydHoare = computeHoareAnnotationComposer().getLoc2hoare(); + IHoareTripleChecker htc = null; // TODO + + assert !floydHoare.isEmpty(); + //OwickiGriesAnnotation annotation = OwickiGriesAnnotation.fromFloydHoare(petriNet, + // petriFloydHoare, htc); + // TODO: simplify + //assert annotation.isValidAnnotation() : "Invalid Owicki-Gries annotation"; + } + @Override protected boolean isResultUnsafe(final boolean errorGeneralizationEnabled, final Result abstractResult) { if (!errorGeneralizationEnabled) { diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/CFG2NestedWordAutomaton.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/CFG2NestedWordAutomaton.java index a1d51bb7452..8afee733399 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/CFG2NestedWordAutomaton.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/CFG2NestedWordAutomaton.java @@ -283,6 +283,10 @@ private static BoundedPetriNet constructPetriNet( if (addThreadUsageMonitors) { for (final Entry, List> entry : icfg .getCfgSmtToolkit().getConcurrencyInformation().getThreadInstanceMap().entrySet()) { + + final ManagedScript mgdScript = icfg.getCfgSmtToolkit().getManagedScript(); + final Term trueTerm = mgdScript.getScript().term("true"); + final List threadInstances = entry.getValue(); final List notinUseStates = new ArrayList<>(); final List inUseStates = new ArrayList<>(); @@ -290,12 +294,12 @@ private static BoundedPetriNet constructPetriNet( IPredicate threadNotInUsePredicate; { final String threadNotInUseString = ti.getThreadInstanceName() + "NotInUse"; - threadNotInUsePredicate = predicateFactory.newDebugPredicate(threadNotInUseString); + threadNotInUsePredicate = predicateFactory.newPredicate(trueTerm); //.newDebugPredicate(threadNotInUseString); } IPredicate threadInUsePredicate; { final String threadInUseString = ti.getThreadInstanceName() + "InUse"; - threadInUsePredicate = predicateFactory.newDebugPredicate(threadInUseString); + threadInUsePredicate = predicateFactory.newPredicate(trueTerm); //.newDebugPredicate(threadInUseString); } threadInstance2notinUseState.put(ti.getThreadInstanceName(), threadNotInUsePredicate); threadInstance2inUseState.put(ti.getThreadInstanceName(), threadInUsePredicate); diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationComposer.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationComposer.java index da39fbceaec..707f3f6b39e 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationComposer.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationComposer.java @@ -37,7 +37,6 @@ import de.uni_freiburg.informatik.ultimate.core.model.services.ILogger; import de.uni_freiburg.informatik.ultimate.core.model.services.IUltimateServiceProvider; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.CfgSmtToolkit; -import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IcfgLocation; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.variables.IProgramVar; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.BasicPredicate; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; @@ -78,10 +77,10 @@ public class HoareAnnotationComposer { private final HoareAnnotationStatisticsGenerator mHoareAnnotationStatisticsGenerator; - private final NestedMap2 mLoc2callPred2disjunction; + private final NestedMap2 mLoc2callPred2disjunction; private int mNumberOfFragments = 0; - private final Map mLoc2hoare; + private final Map mLoc2hoare; private final IPredicate mSurrogateForEmptyCallPred; @@ -96,7 +95,7 @@ public HoareAnnotationComposer(final CfgSmtToolkit csToolkit, final PredicateFac mHoareAnnotationStatisticsGenerator = new HoareAnnotationStatisticsGenerator(); mSurrogateForEmptyCallPred = mPredicateFactory.newPredicate(mCsToolkit.getManagedScript().getScript().term("true")); - final HashRelation3 loc2callPred2disjuncts = + final HashRelation3 loc2callPred2disjuncts = constructLoc2CallPred2DisjunctsMapping(); mLoc2callPred2disjunction = constructLoc2Callpred2DisjunctionMapping(loc2callPred2disjuncts); mHoareAnnotationStatisticsGenerator.setNumberOfFragments(mNumberOfFragments); @@ -106,10 +105,10 @@ public HoareAnnotationComposer(final CfgSmtToolkit csToolkit, final PredicateFac } - private Map - combineInter(final NestedMap2 loc2callPred2invariant) { - final Map result = new HashMap<>(); - for (final IcfgLocation loc : loc2callPred2invariant.keySet()) { + private Map + combineInter(final NestedMap2 loc2callPred2invariant) { + final Map result = new HashMap<>(); + for (final IPredicate loc : loc2callPred2invariant.keySet()) { final Map callpred2invariant = loc2callPred2invariant.get(loc); final List conjuncts = new ArrayList<>(callpred2invariant.size()); for (final Entry entry : callpred2invariant.entrySet()) { @@ -144,8 +143,8 @@ public HoareAnnotationComposer(final CfgSmtToolkit csToolkit, final PredicateFac final Set vars = TermVarsProc.computeTermVarsProc(conjunction, mCsToolkit.getManagedScript().getScript(), mCsToolkit.getSymbolTable()).getVars(); - conjunction = TraceAbstractionUtils.substituteOldVarsOfNonModifiableGlobals(loc.getProcedure(), vars, - conjunction, mCsToolkit.getModifiableGlobalsTable(), mCsToolkit.getManagedScript().getScript()); + //conjunction = TraceAbstractionUtils.substituteOldVarsOfNonModifiableGlobals(loc.getProcedure(), vars, + // conjunction, mCsToolkit.getModifiableGlobalsTable(), mCsToolkit.getManagedScript().getScript()); final ExtendedSimplificationResult simplificationResult = SmtUtils.simplifyWithStatistics( mCsToolkit.getManagedScript(), conjunction, null, mServices, SimplificationTechnique.SIMPLIFY_DDA); mHoareAnnotationStatisticsGenerator.reportSimplificationInter(); @@ -163,10 +162,10 @@ public HoareAnnotationComposer(final CfgSmtToolkit csToolkit, final PredicateFac return result; } - private NestedMap2 constructLoc2Callpred2DisjunctionMapping( - final HashRelation3 loc2precond2invariantSet) { - final NestedMap2 loc2precond2invariant = new NestedMap2<>(); - for (final IcfgLocation loc : loc2precond2invariantSet.projectToFst()) { + private NestedMap2 constructLoc2Callpred2DisjunctionMapping( + final HashRelation3 loc2precond2invariantSet) { + final NestedMap2 loc2precond2invariant = new NestedMap2<>(); + for (final IPredicate loc : loc2precond2invariantSet.projectToFst()) { for (final IPredicate precond : loc2precond2invariantSet.projectToSnd(loc)) { final Set terms = loc2precond2invariantSet.projectToTrd(loc, precond); mNumberOfFragments += terms.size(); @@ -192,20 +191,20 @@ private Term or(final Set terms) { * invariants for live callpred * */ - public HashRelation3 constructLoc2CallPred2DisjunctsMapping() { - final HashRelation3 loc2callpred2invariant = new HashRelation3<>(); + public HashRelation3 constructLoc2CallPred2DisjunctsMapping() { + final HashRelation3 loc2callpred2invariant = new HashRelation3<>(); addHoareAnnotationForCallPred(loc2callpred2invariant, mSurrogateForEmptyCallPred, mHoareAnnotationFragments.getProgPoint2StatesWithEmptyContext()); for (final IPredicate callPred : mHoareAnnotationFragments.getDeadContexts2ProgPoint2Preds().keySet()) { - final HashRelation pp2preds = + final HashRelation pp2preds = mHoareAnnotationFragments.getDeadContexts2ProgPoint2Preds().get(callPred); addHoareAnnotationForCallPred(loc2callpred2invariant, callPred, pp2preds); } for (final IPredicate callPred : mHoareAnnotationFragments.getLiveContexts2ProgPoint2Preds().keySet()) { - final HashRelation pp2preds = + final HashRelation pp2preds = mHoareAnnotationFragments.getLiveContexts2ProgPoint2Preds().get(callPred); addHoareAnnotationForCallPred(loc2callpred2invariant, callPred, pp2preds); } @@ -217,8 +216,8 @@ public HashRelation3 constructLoc2CallPred2Disju * invariants for live callpred * */ - public HashRelation3 constructMappingOld() { - final HashRelation3 loc2callpred2invariant = new HashRelation3<>(); + public HashRelation3 constructMappingOld() { + final HashRelation3 loc2callpred2invariant = new HashRelation3<>(); final IPredicate surrogateForEmptyCallPred = mPredicateFactory.newPredicate(mCsToolkit.getManagedScript().getScript().term("true")); @@ -235,7 +234,7 @@ public HashRelation3 constructMappingOld() { } precondForContext = TraceAbstractionUtils.renameGlobalsToOldGlobals(precondForContext, mServices, mCsToolkit.getManagedScript(), mPredicateFactory, SimplificationTechnique.SIMPLIFY_DDA); - final HashRelation pp2preds = + final HashRelation pp2preds = mHoareAnnotationFragments.getDeadContexts2ProgPoint2Preds().get(context); addHoareAnnotationForCallPred(loc2callpred2invariant, precondForContext, pp2preds); } @@ -250,7 +249,7 @@ public HashRelation3 constructMappingOld() { } precondForContext = TraceAbstractionUtils.renameGlobalsToOldGlobals(precondForContext, mServices, mCsToolkit.getManagedScript(), mPredicateFactory, SimplificationTechnique.SIMPLIFY_DDA); - final HashRelation pp2preds = + final HashRelation pp2preds = mHoareAnnotationFragments.getLiveContexts2ProgPoint2Preds().get(context); addHoareAnnotationForCallPred(loc2callpred2invariant, precondForContext, pp2preds); } @@ -262,8 +261,8 @@ public HashRelation3 constructMappingOld() { * @param precondForContext * @param pp2preds */ - private static void addHoareAnnotationForCallPred( - final HashRelation3 loc2callPred2invariant, + private static void addHoareAnnotationForCallPred( + final HashRelation3 loc2callPred2invariant, final IPredicate precondForContext, final HashRelation pp2preds) { for (final DOM loc : pp2preds.getDomain()) { final Set preds = pp2preds.getImage(loc); @@ -281,7 +280,7 @@ public HoareAnnotationStatisticsGenerator getHoareAnnotationStatisticsGenerator( return mHoareAnnotationStatisticsGenerator; } - public Map getLoc2hoare() { + public Map getLoc2hoare() { return mLoc2hoare; } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationExtractor.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationExtractor.java index 0970068dbc1..354c06b2e8c 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationExtractor.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationExtractor.java @@ -44,6 +44,7 @@ import de.uni_freiburg.informatik.ultimate.core.model.services.IUltimateServiceProvider; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IIcfgTransition; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.MLPredicate; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.SPredicate; /** @@ -89,7 +90,7 @@ protected Collection getInitialStates() { // case where automaton is emtpy minimized and contains only one // dummy state. final IPredicate p = result.iterator().next(); - if (!(p instanceof SPredicate)) { + if (!(p instanceof SPredicate) && !(p instanceof MLPredicate)) { throw new AssertionError("No State Automaton would be ok"); // result = new ArrayList(0); } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationFragments.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationFragments.java index df7b8816c9b..9cb543728c9 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationFragments.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationFragments.java @@ -44,10 +44,7 @@ import de.uni_freiburg.informatik.ultimate.automata.nestedword.transitions.OutgoingCallTransition; import de.uni_freiburg.informatik.ultimate.core.model.services.ILogger; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IAction; -import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IcfgLocation; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; -import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.SPredicate; -import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.UnknownState; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.preferences.TraceAbstractionPreferenceInitializer.HoareAnnotationPositions; import de.uni_freiburg.informatik.ultimate.util.datastructures.relation.HashRelation; @@ -66,29 +63,29 @@ public class HoareAnnotationFragments { /** * States for contexts were the context was already removed (because it was a dead end) from the abstraction. */ - private final Map> mDeadContexts2ProgPoint2Preds = + private final Map> mDeadContexts2ProgPoint2Preds = new HashMap<>(); /** * States for contexts were the are still in the current abstraction. */ - private Map> mLiveContexts2ProgPoint2Preds = new HashMap<>(); + private Map> mLiveContexts2ProgPoint2Preds = new HashMap<>(); private final HashMap mContext2Entry = new HashMap<>(); - private final HashRelation mProgPoint2StatesWithEmptyContext = new HashRelation<>(); + private final HashRelation mProgPoint2StatesWithEmptyContext = new HashRelation<>(); - private final Set mHoareAnnotationPositions; + private final Set mHoareAnnotationPositions; private final HoareAnnotationPositions mHoareAnnotationPos; - Map> getDeadContexts2ProgPoint2Preds() { + Map> getDeadContexts2ProgPoint2Preds() { return mDeadContexts2ProgPoint2Preds; } - Map> getLiveContexts2ProgPoint2Preds() { + Map> getLiveContexts2ProgPoint2Preds() { return mLiveContexts2ProgPoint2Preds; } - HashRelation getProgPoint2StatesWithEmptyContext() { + HashRelation getProgPoint2StatesWithEmptyContext() { return mProgPoint2StatesWithEmptyContext; } @@ -96,7 +93,7 @@ HashMap getCallpred2Entry() { return mContext2Entry; } - public HoareAnnotationFragments(final ILogger logger, final Set hoareAnnotationLocations, + public HoareAnnotationFragments(final ILogger logger, final Set hoareAnnotationLocations, final HoareAnnotationPositions hoareAnnotationPos) { mLogger = logger; mHoareAnnotationPositions = hoareAnnotationLocations; @@ -132,10 +129,10 @@ public void updateOnMinimization(final Map old2New, * HoareAnnotationFragments stores double deckers that have been removed by a dead end removal. */ private void update(final IUpdate update, final INwaOutgoingLetterAndTransitionProvider newAbstraction) { - final Map> oldLiveContexts2ProgPoint2Preds = + final Map> oldLiveContexts2ProgPoint2Preds = mLiveContexts2ProgPoint2Preds; mLiveContexts2ProgPoint2Preds = new HashMap<>(); - for (final Entry> contextHrPair : oldLiveContexts2ProgPoint2Preds + for (final Entry> contextHrPair : oldLiveContexts2ProgPoint2Preds .entrySet()) { final IPredicate oldContext = contextHrPair.getKey(); final List newContexts = update.getNewPredicates(oldContext); @@ -146,7 +143,7 @@ private void update(final IUpdate update, final INwaOutgoingLetterAndTransitionP final IPredicate oldEntry = mContext2Entry.get(oldContext); mContext2Entry.remove(oldContext); for (int i = 0; i < newContexts.size(); i++) { - final HashRelation hr; + final HashRelation hr; if (i == newContexts.size() - 1) { // last iteration, we can use the original hr instead of // copy @@ -243,26 +240,26 @@ public List getNewPredicates(final IPredicate oldPredicate) { } } - void addDoubleDecker(final IPredicate down, final IPredicate up, final IPredicate emtpy) { - final IcfgLocation pp = getProgramPoint(up); + void addDoubleDecker(final IPredicate down, final IPredicate up, final IPredicate empty) { + //final STATE pp = (STATE)getProgramPoint(up); // TODO if (mHoareAnnotationPos == HoareAnnotationPositions.LoopsAndPotentialCycles - && !mHoareAnnotationPositions.contains(pp)) { + && !mHoareAnnotationPositions.contains(up)) { // do not compute Hoare annotation for this program point return; } - if (down == emtpy) { - mProgPoint2StatesWithEmptyContext.addPair(pp, up); + if (down == empty) { + mProgPoint2StatesWithEmptyContext.addPair(up, up); } else { - HashRelation pp2preds = mLiveContexts2ProgPoint2Preds.get(down); + HashRelation pp2preds = mLiveContexts2ProgPoint2Preds.get(down); if (pp2preds == null) { pp2preds = new HashRelation<>(); mLiveContexts2ProgPoint2Preds.put(down, pp2preds); } - pp2preds.addPair(pp, up); + pp2preds.addPair(up, up); } } - private IcfgLocation getProgramPoint(final IPredicate pred) { + /*private IcfgLocation getProgramPoint(final IPredicate pred) { final IcfgLocation pp; if (pred instanceof SPredicate) { pp = ((SPredicate) pred).getProgramPoint(); @@ -272,7 +269,7 @@ private IcfgLocation getProgramPoint(final IPredicate pred) { throw new AssertionError("predicate does not offer program point"); } return pp; - } + }*/ void addContextEntryPair(final IPredicate context, final IPredicate entry) { mContext2Entry.put(context, entry); diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationWriter.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationWriter.java index f381baf971f..e23cf7f4909 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationWriter.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationWriter.java @@ -36,6 +36,8 @@ import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.HoareAnnotation; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.PredicateFactory; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.SPredicate; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.UnknownState; import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.SmtUtils.SimplificationTechnique; import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.SmtUtils.XnfConversionTechnique; @@ -66,17 +68,30 @@ public HoareAnnotationWriter(final IIcfg icfg, final CfgSmtToolkit csToolkit, } public void addHoareAnnotationToCFG() { - for (final Entry entry : mCegarLoopHoareAnnotation.getLoc2hoare().entrySet()) { - final HoareAnnotation taAnnot = HoareAnnotation.getAnnotation(entry.getKey()); + for (final Entry entry : mCegarLoopHoareAnnotation.getLoc2hoare().entrySet()) { + final IcfgLocation loc = getProgramPoint(entry.getKey()); + final HoareAnnotation taAnnot = HoareAnnotation.getAnnotation(loc); final HoareAnnotation hoareAnnot; if (taAnnot == null) { hoareAnnot = - mPredicateFactory.getNewHoareAnnotation(entry.getKey(), mCsToolkit.getModifiableGlobalsTable()); - hoareAnnot.annotate(entry.getKey()); + mPredicateFactory.getNewHoareAnnotation(loc, mCsToolkit.getModifiableGlobalsTable()); + hoareAnnot.annotate(loc); } else { hoareAnnot = taAnnot; } hoareAnnot.addInvariant(entry.getValue()); } } + + private IcfgLocation getProgramPoint(final IPredicate pred) { + final IcfgLocation pp; + if (pred instanceof SPredicate) { + pp = ((SPredicate) pred).getProgramPoint(); + } else if (pred instanceof UnknownState) { + pp = ((UnknownState) pred).getProgramPoint(); + } else { + throw new AssertionError("predicate does not offer program point"); + } + return pp; + } } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/PredicateFactoryRefinement.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/PredicateFactoryRefinement.java index 8745077b77c..d0bbba5fcb4 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/PredicateFactoryRefinement.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/PredicateFactoryRefinement.java @@ -27,6 +27,7 @@ package de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Iterator; import java.util.Map; @@ -73,8 +74,23 @@ public PredicateFactoryRefinement(final IUltimateServiceProvider services, final @Override public IPredicate intersection(final IPredicate p1, final IPredicate p2) { if (p1 instanceof IMLPredicate) { + final IcfgLocation[] pps = ((IMLPredicate) p1).getProgramPoints(); // assert mCsToolkit.isDontCare(p2); - assert !mComputeHoareAnnotation; + //assert !mComputeHoareAnnotation; + if (Arrays.stream(pps).anyMatch(mHoareAnnotationProgramPoints::contains)) { + Term conjunction = mPredicateFactory.and(p1, p2).getFormula(); + conjunction = new CommuhashNormalForm(mServices, mMgdScript.getScript()).transform(conjunction); + final IPredicate result; + /*if (DEBUG_COMPUTE_HISTORY) { + assert p1 instanceof PredicateWithHistory; + final Map history = ((PredicateWithHistory) p1).getCopyOfHistory(); + history.put(mIteration, p2.getFormula()); + result = mPredicateFactory.newPredicateWithHistory(pp, conjunction, history); + } else {*/ + result = mPredicateFactory.newMLPredicate(pps, conjunction); + //} + return result; + } return mPredicateFactory.newMLDontCarePredicate(((IMLPredicate) p1).getProgramPoints()); } else if (p1 instanceof ISLPredicate) { final IcfgLocation pp = ((ISLPredicate) p1).getProgramPoint(); diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java index c7e1c29384c..29f013d5109 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java @@ -141,13 +141,13 @@ private void runCegarLoops(final IIcfg icfg, final TAPreferences taPrefs = new TAPreferences(mServices); final boolean computeHoareAnnotation; - if (taPrefs.computeHoareAnnotation() + /*if (taPrefs.computeHoareAnnotation() && !icfg.getCfgSmtToolkit().getConcurrencyInformation().getThreadInstanceMap().isEmpty()) { mLogger.warn("Switching off computation of Hoare annotation because input is a concurrent program"); computeHoareAnnotation = false; - } else { + } else {*/ computeHoareAnnotation = taPrefs.computeHoareAnnotation(); - } + //} String settings = "Automizer settings:"; settings += " Hoare:" + computeHoareAnnotation; From 4fb5f99d16f95ec1dd7f3a26de3a36edcd59878b Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Fri, 28 Aug 2020 13:31:28 +0200 Subject: [PATCH 003/536] Hoare annotation: recover original automaton states --- .../HoareAnnotationFragments.java | 43 +++++++++++++------ 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationFragments.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationFragments.java index 9cb543728c9..b1ce163a9f8 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationFragments.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationFragments.java @@ -60,6 +60,8 @@ public class HoareAnnotationFragments { private final ILogger mLogger; + private final Map mPred2ProgPoint = new HashMap<>(); + /** * States for contexts were the context was already removed (because it was a dead end) from the abstraction. */ @@ -129,6 +131,25 @@ public void updateOnMinimization(final Map old2New, * HoareAnnotationFragments stores double deckers that have been removed by a dead end removal. */ private void update(final IUpdate update, final INwaOutgoingLetterAndTransitionProvider newAbstraction) { + final Set oldStates; + if (mPred2ProgPoint.isEmpty()) { + oldStates = (Set) mHoareAnnotationPositions; + } else { + oldStates = mPred2ProgPoint.keySet(); + } + // TODO possibly merge this loop with the next, avoid redundant computation of getNewPredicates + for (final IPredicate oldState : oldStates) { + final IPredicate pp = getProgramPoint(oldState); + final List newStates = update.getNewPredicates(oldState); + if (newStates != null) { + for (final IPredicate newState : newStates) { + assert !mPred2ProgPoint.containsKey(newState); + mPred2ProgPoint.put(newState, pp); + } + mPred2ProgPoint.remove(oldState); + } + } + final Map> oldLiveContexts2ProgPoint2Preds = mLiveContexts2ProgPoint2Preds; mLiveContexts2ProgPoint2Preds = new HashMap<>(); @@ -241,35 +262,31 @@ public List getNewPredicates(final IPredicate oldPredicate) { } void addDoubleDecker(final IPredicate down, final IPredicate up, final IPredicate empty) { - //final STATE pp = (STATE)getProgramPoint(up); // TODO + final IPredicate pp = getProgramPoint(up); if (mHoareAnnotationPos == HoareAnnotationPositions.LoopsAndPotentialCycles - && !mHoareAnnotationPositions.contains(up)) { + && !mHoareAnnotationPositions.contains(pp)) { // do not compute Hoare annotation for this program point return; } if (down == empty) { - mProgPoint2StatesWithEmptyContext.addPair(up, up); + mProgPoint2StatesWithEmptyContext.addPair(pp, up); } else { HashRelation pp2preds = mLiveContexts2ProgPoint2Preds.get(down); if (pp2preds == null) { pp2preds = new HashRelation<>(); mLiveContexts2ProgPoint2Preds.put(down, pp2preds); } - pp2preds.addPair(up, up); + pp2preds.addPair(pp, up); } } - /*private IcfgLocation getProgramPoint(final IPredicate pred) { - final IcfgLocation pp; - if (pred instanceof SPredicate) { - pp = ((SPredicate) pred).getProgramPoint(); - } else if (pred instanceof UnknownState) { - pp = ((UnknownState) pred).getProgramPoint(); - } else { - throw new AssertionError("predicate does not offer program point"); + private IPredicate getProgramPoint(final IPredicate pred) { + final IPredicate pp = mPred2ProgPoint.get(pred); + if (pp == null) { + return pred; } return pp; - }*/ + } void addContextEntryPair(final IPredicate context, final IPredicate entry) { mContext2Entry.put(context, entry); From d296a4bfaa3fc3fc68c8991693a2d81467a9855a Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Fri, 28 Aug 2020 13:31:56 +0200 Subject: [PATCH 004/536] match Floyd-Hoare annotation to markings of Petri net --- .../traceabstraction/BasicCegarLoop.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java index 7199b5b34c8..fd98a0b8275 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java @@ -35,6 +35,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Map; @@ -1145,7 +1146,19 @@ private void computeOwickiGries(IPetriNet2FiniteAutomatonStateFactory floydHoare = computeHoareAnnotationComposer().getLoc2hoare(); IHoareTripleChecker htc = null; // TODO - assert !floydHoare.isEmpty(); + final Map> state2Marking = new HashMap<>(); + for (final Map.Entry, IPredicate> entry : mMarking2State.entrySet()) { + state2Marking.put(entry.getValue(), entry.getKey()); + } + + final Map, IPredicate> petriFloydHoare = new HashMap<>(); + for (final Map.Entry entry : floydHoare.entrySet()) { + final Marking marking = state2Marking.get(entry.getKey()); + petriFloydHoare.put(marking, entry.getValue()); + } + + assert !petriFloydHoare.isEmpty(); + //OwickiGriesAnnotation annotation = OwickiGriesAnnotation.fromFloydHoare(petriNet, // petriFloydHoare, htc); // TODO: simplify From 66f670bda2e8fc46f3ea6d50bc0e6964ad4fe4dd Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Fri, 28 Aug 2020 13:36:03 +0200 Subject: [PATCH 005/536] simplify matching of Floyd-Hoare to Petri --- .../generator/traceabstraction/BasicCegarLoop.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java index fd98a0b8275..be45c4fd01e 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java @@ -1146,15 +1146,12 @@ private void computeOwickiGries(IPetriNet2FiniteAutomatonStateFactory floydHoare = computeHoareAnnotationComposer().getLoc2hoare(); IHoareTripleChecker htc = null; // TODO - final Map> state2Marking = new HashMap<>(); - for (final Map.Entry, IPredicate> entry : mMarking2State.entrySet()) { - state2Marking.put(entry.getValue(), entry.getKey()); - } - final Map, IPredicate> petriFloydHoare = new HashMap<>(); - for (final Map.Entry entry : floydHoare.entrySet()) { - final Marking marking = state2Marking.get(entry.getKey()); - petriFloydHoare.put(marking, entry.getValue()); + for (final Map.Entry, IPredicate> entry : mMarking2State.entrySet()) { + final Marking marking = entry.getKey(); + final IPredicate state = entry.getValue(); + final IPredicate hoare = floydHoare.get(state); + petriFloydHoare.put(marking, hoare); } assert !petriFloydHoare.isEmpty(); From d7f0762b63f3e4c8bf3fed280f7472f00374be1d Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Fri, 28 Aug 2020 14:27:03 +0200 Subject: [PATCH 006/536] separate Owicki-Gries annotation from validity check --- .../concurrency/OwickiGriesAnnotation.java | 18 ++++----------- .../concurrency/OwickiGriesValidityCheck.java | 22 +++++++++++++++++++ 2 files changed, 26 insertions(+), 14 deletions(-) create mode 100644 trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java index 0f0491802b4..ddd17fdcfe3 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java @@ -4,9 +4,8 @@ import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; import de.uni_freiburg.informatik.ultimate.automata.petrinet.Marking; -import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.hoaretriple.IHoareTripleChecker; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; -import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.SmtUtils; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicateUnifier; public class OwickiGriesAnnotation { @@ -17,18 +16,9 @@ public class OwickiGriesAnnotation { private final Map mFormulaMapping; // ... - private final IHoareTripleChecker mHtc; - - public OwickiGriesAnnotation(IHoareTripleChecker htc) { + public OwickiGriesAnnotation() { mPetriNet = null; mFormulaMapping = null; - mHtc = htc; - } - - public boolean isValidAnnotation() { - // ... - // mHtc.checkInternal(pre, act, succ) - return false; } public int getSize() { @@ -37,9 +27,9 @@ public int getSize() { } public static OwickiGriesAnnotation fromFloydHoare(IPetriNet net, - Map, IPredicate> floydHoare, IHoareTripleChecker htc) { + Map, IPredicate> floydHoare, IPredicateUnifier unifier) { // ... - return new OwickiGriesAnnotation<>(htc); + return new OwickiGriesAnnotation<>(); } } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java new file mode 100644 index 00000000000..a6ea253b1ff --- /dev/null +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java @@ -0,0 +1,22 @@ +package de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency; + +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.hoaretriple.IHoareTripleChecker; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicateUnifier; + +public class OwickiGriesValidityCheck { + private final boolean mIsInductive; + private final boolean mIsInterferenceFree; + + public OwickiGriesValidityCheck(OwickiGriesAnnotation annotation, IPredicateUnifier unifier, + IHoareTripleChecker htc) { + mIsInductive = false; // TODO + mIsInterferenceFree = false; // TODO + + // TODO Use unifier.getOrConstructPredicateForConjunction(Collection) + // TODO Use htc.checkInternal(pre, act, succ) + } + + public boolean isValid() { + return mIsInductive && mIsInterferenceFree; + } +} From 46a3edc2ca906050f6322c9cacbb6b34faac827f Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Fri, 28 Aug 2020 16:39:49 +0200 Subject: [PATCH 007/536] initialize some needed components for O/G annotation --- .../concurrency/OwickiGriesAnnotation.java | 13 +++++++++--- .../concurrency/OwickiGriesValidityCheck.java | 21 +++++++++++++------ 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java index ddd17fdcfe3..107486ba0c2 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java @@ -4,8 +4,10 @@ import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; import de.uni_freiburg.informatik.ultimate.automata.petrinet.Marking; +import de.uni_freiburg.informatik.ultimate.core.model.services.IUltimateServiceProvider; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.CfgSmtToolkit; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.BasicPredicateFactory; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; -import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicateUnifier; public class OwickiGriesAnnotation { @@ -26,9 +28,14 @@ public int getSize() { return 0; } - public static OwickiGriesAnnotation fromFloydHoare(IPetriNet net, - Map, IPredicate> floydHoare, IPredicateUnifier unifier) { + public static OwickiGriesAnnotation fromFloydHoare(IUltimateServiceProvider services, + CfgSmtToolkit csToolkit, IPetriNet net, Map, IPredicate> floydHoare) { + final BasicPredicateFactory factory = new BasicPredicateFactory(services, csToolkit.getManagedScript(), + csToolkit.getSymbolTable()); + + // TODO Use factory.and(preds) // ... + return new OwickiGriesAnnotation<>(); } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java index a6ea253b1ff..f9edc4ced28 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java @@ -1,19 +1,28 @@ package de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency; +import de.uni_freiburg.informatik.ultimate.core.model.services.IUltimateServiceProvider; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.CfgSmtToolkit; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.hoaretriple.IHoareTripleChecker; -import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicateUnifier; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.hoaretriple.MonolithicHoareTripleChecker; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.BasicPredicateFactory; public class OwickiGriesValidityCheck { private final boolean mIsInductive; private final boolean mIsInterferenceFree; + private final IHoareTripleChecker mHoareTripleChecker; + private final BasicPredicateFactory mPredicateFactory; + + public OwickiGriesValidityCheck(IUltimateServiceProvider services, CfgSmtToolkit csToolkit, + OwickiGriesAnnotation annotation) { + mPredicateFactory = new BasicPredicateFactory(services, csToolkit.getManagedScript(), + csToolkit.getSymbolTable()); + mHoareTripleChecker = new MonolithicHoareTripleChecker(csToolkit); + + // TODO Use mPredicateFactory.and(preds) + // TODO Use mHoareTripleChecker.checkInternal(pre, act, succ) - public OwickiGriesValidityCheck(OwickiGriesAnnotation annotation, IPredicateUnifier unifier, - IHoareTripleChecker htc) { mIsInductive = false; // TODO mIsInterferenceFree = false; // TODO - - // TODO Use unifier.getOrConstructPredicateForConjunction(Collection) - // TODO Use htc.checkInternal(pre, act, succ) } public boolean isValid() { From ff9adf09b687ff6a8683c08329132e6471931ae6 Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Thu, 3 Sep 2020 15:41:04 +0200 Subject: [PATCH 008/536] eliminate duplicate code Not sure if IIcfg is the right place for this, but it's better than 8 copies. --- .../plugins/generator/codecheck/CodeCheckObserver.java | 2 +- .../lib/modelcheckerutils/cfg/structure/IIcfg.java | 4 ++++ .../plugins/generator/rcfgbuilder/cfg/PathProgram.java | 2 +- .../generator/traceabstraction/BasicCegarLoop.java | 2 +- .../generator/traceabstraction/CegarAbsIntRunner.java | 2 +- .../traceabstraction/TraceAbstractionStarter.java | 8 ++++---- .../TraceAbstractionConcurrentObserver.java | 2 +- 7 files changed, 13 insertions(+), 9 deletions(-) diff --git a/trunk/source/CodeCheck/src/de/uni_freiburg/informatik/ultimate/plugins/generator/codecheck/CodeCheckObserver.java b/trunk/source/CodeCheck/src/de/uni_freiburg/informatik/ultimate/plugins/generator/codecheck/CodeCheckObserver.java index 21820c4ee3a..821ba54b58e 100644 --- a/trunk/source/CodeCheck/src/de/uni_freiburg/informatik/ultimate/plugins/generator/codecheck/CodeCheckObserver.java +++ b/trunk/source/CodeCheck/src/de/uni_freiburg/informatik/ultimate/plugins/generator/codecheck/CodeCheckObserver.java @@ -171,7 +171,7 @@ public class CodeCheckObserver implements IUnmanagedObserver { * @return */ private boolean initialize(final IIcfg root) { - if (!root.getCfgSmtToolkit().getConcurrencyInformation().getThreadInstanceMap().isEmpty()) { + if (!root.isSequential()) { throw new UnsupportedOperationException("Concurrent programs are currently unsupported"); } diff --git a/trunk/source/Library-ModelCheckerUtils/src/de/uni_freiburg/informatik/ultimate/lib/modelcheckerutils/cfg/structure/IIcfg.java b/trunk/source/Library-ModelCheckerUtils/src/de/uni_freiburg/informatik/ultimate/lib/modelcheckerutils/cfg/structure/IIcfg.java index eb5765ea4b5..467e72d30d9 100644 --- a/trunk/source/Library-ModelCheckerUtils/src/de/uni_freiburg/informatik/ultimate/lib/modelcheckerutils/cfg/structure/IIcfg.java +++ b/trunk/source/Library-ModelCheckerUtils/src/de/uni_freiburg/informatik/ultimate/lib/modelcheckerutils/cfg/structure/IIcfg.java @@ -97,6 +97,10 @@ default VisualizationNode getVisualizationGraph() { return IcfgGraphProvider.getVisualizationGraph(this); } + default boolean isSequential() { + return getCfgSmtToolkit().getConcurrencyInformation().getThreadInstanceMap().isEmpty(); + } + Class getLocationClass(); default String graphStructureToString() { diff --git a/trunk/source/RCFGBuilder/src/de/uni_freiburg/informatik/ultimate/plugins/generator/rcfgbuilder/cfg/PathProgram.java b/trunk/source/RCFGBuilder/src/de/uni_freiburg/informatik/ultimate/plugins/generator/rcfgbuilder/cfg/PathProgram.java index a7a45fd22a3..9d3137bc199 100644 --- a/trunk/source/RCFGBuilder/src/de/uni_freiburg/informatik/ultimate/plugins/generator/rcfgbuilder/cfg/PathProgram.java +++ b/trunk/source/RCFGBuilder/src/de/uni_freiburg/informatik/ultimate/plugins/generator/rcfgbuilder/cfg/PathProgram.java @@ -238,7 +238,7 @@ private PathProgramConstructor(final IIcfg originalIcfg, final ModifiableGlobalsTable newModGlobTable = constructModifiableGlobalsTable(oldCfgSmtToolkit.getModifiableGlobalsTable()); - if (!oldCfgSmtToolkit.getConcurrencyInformation().getThreadInstanceMap().isEmpty()) { + if (!originalIcfg.isSequential()) { throw new UnsupportedOperationException( "Construction of path programs is not yet supported for concurrent programs"); } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java index be45c4fd01e..c1d326fdeb3 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java @@ -1212,7 +1212,7 @@ public IPostconditionProvider getPostconditionProvider() { } private final boolean isSequential() { - return super.mIcfg.getCfgSmtToolkit().getConcurrencyInformation().getThreadInstanceMap().isEmpty(); + return super.mIcfg.isSequential(); } @Override diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/CegarAbsIntRunner.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/CegarAbsIntRunner.java index c3234c971a1..ff02bcf79cd 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/CegarAbsIntRunner.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/CegarAbsIntRunner.java @@ -179,7 +179,7 @@ private AbsIntCurrentIteration generateFixpoints(final IRun cex) { throw new UnsupportedOperationException( "AbsInt only supports BoogieIcfgLocations and Codeblocks at the moment"); } - if (!mRoot.getCfgSmtToolkit().getConcurrencyInformation().getThreadInstanceMap().isEmpty()) { + if (!mRoot.isSequential()) { throw new UnsupportedOperationException("AbsInt currently does not support concurrent programs"); } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java index 29f013d5109..7fd3b5931de 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java @@ -123,7 +123,7 @@ public TraceAbstractionStarter(final IUltimateServiceProvider services, final II final List> rawFloydHoareAutomataFromFile) { mServices = services; mLogger = mServices.getLoggingService().getLogger(Activator.PLUGIN_ID); - // if (icfg.getCfgSmtToolkit().getConcurrencyInformation().getThreadInstanceMap().isEmpty()) { + // if (icfg.isSequential()) { runCegarLoops(icfg, witnessAutomaton, rawFloydHoareAutomataFromFile); // } else { // final IcfgPetrifier icfgPetrifier = @@ -142,7 +142,7 @@ private void runCegarLoops(final IIcfg icfg, final boolean computeHoareAnnotation; /*if (taPrefs.computeHoareAnnotation() - && !icfg.getCfgSmtToolkit().getConcurrencyInformation().getThreadInstanceMap().isEmpty()) { + && !icfg.isSequential()) { mLogger.warn("Switching off computation of Hoare annotation because input is a concurrent program"); computeHoareAnnotation = false; } else {*/ @@ -330,7 +330,7 @@ private Result iterateNew(final DebugIdentifier name, final IIcfg final List> rawFloydHoareAutomataFromFile, final boolean computeHoareAnnotation) { final CegarLoopResult> clres; - if (root.getCfgSmtToolkit().getConcurrencyInformation().getThreadInstanceMap().isEmpty()) { + if (root.isSequential()) { clres = CegarLoopResult.iterate(mServices, name, root, taPrefs, predicateFactory, errorLocs, witnessAutomaton, rawFloydHoareAutomataFromFile, computeHoareAnnotation, taPrefs.getConcurrency()); } else { @@ -409,7 +409,7 @@ private Result iterate(final DebugIdentifier name, final IIcfg roo final List> rawFloydHoareAutomataFromFile, final boolean computeHoareAnnotation) { IIcfg icfg; - if (root.getCfgSmtToolkit().getConcurrencyInformation().getThreadInstanceMap().isEmpty()) { + if (root.isSequential()) { icfg = root; } else { final int numberOfThreadInstances = 3; diff --git a/trunk/source/TraceAbstractionConcurrent/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstractionconcurrent/TraceAbstractionConcurrentObserver.java b/trunk/source/TraceAbstractionConcurrent/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstractionconcurrent/TraceAbstractionConcurrentObserver.java index 8661a0d190e..43283d3ddf7 100644 --- a/trunk/source/TraceAbstractionConcurrent/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstractionconcurrent/TraceAbstractionConcurrentObserver.java +++ b/trunk/source/TraceAbstractionConcurrent/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstractionconcurrent/TraceAbstractionConcurrentObserver.java @@ -103,7 +103,7 @@ public boolean process(final IElement root) { csToolkit.getSymbolTable()); final TraceAbstractionBenchmarks timingStatistics = new TraceAbstractionBenchmarks(petrifiedIcfg); final Set threadErrorLocations; - if (csToolkit.getConcurrencyInformation().getThreadInstanceMap().isEmpty()) { + if (petrifiedIcfg.isSequential()) { // no fork or join threadErrorLocations = Collections.emptySet(); } else { From 6b6fb54fe8bcb01d6ccee4100e5dacb2320bb429 Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Thu, 3 Sep 2020 15:42:03 +0200 Subject: [PATCH 009/536] only write Hoare annotation for sequential programs --- .../plugins/generator/traceabstraction/BasicCegarLoop.java | 2 +- .../plugins/generator/traceabstraction/CegarLoopResult.java | 2 +- .../generator/traceabstraction/TraceAbstractionStarter.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java index c1d326fdeb3..69ae0c3ac70 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java @@ -1072,7 +1072,7 @@ protected void computeCFGHoareAnnotation() { final HoareAnnotationComposer clha = computeHoareAnnotationComposer(); final HoareAnnotationWriter writer = new HoareAnnotationWriter(mIcfg, mCsToolkit, mPredicateFactory, clha, mServices, mSimplificationTechnique, mXnfConversionTechnique); - // writer.addHoareAnnotationToCFG(); + writer.addHoareAnnotationToCFG(); mCegarLoopBenchmark.stop(CegarLoopStatisticsDefinitions.HoareAnnotationTime.toString()); mCegarLoopBenchmark.addHoareAnnotationData(clha.getHoareAnnotationStatisticsGenerator()); } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/CegarLoopResult.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/CegarLoopResult.java index 2e8fc712523..a7ac601bc21 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/CegarLoopResult.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/CegarLoopResult.java @@ -179,7 +179,7 @@ public static > CegarLoopResult iterat floydHoareAutomata = null; } - if (computeHoareAnnotation && result == Result.SAFE) { + if (root.isSequential() && computeHoareAnnotation && result == Result.SAFE) { basicCegarLoop.computeCFGHoareAnnotation(); // final Set locsForHoareAnnotation = diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java index 7fd3b5931de..cb650cb2595 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java @@ -453,7 +453,7 @@ private Result iterate(final DebugIdentifier name, final IIcfg roo mOverallResult = computeOverallResult(errorLocs, basicCegarLoop, result); - if (computeHoareAnnotation && mOverallResult == Result.SAFE) { + if (icfg.isSequential() && computeHoareAnnotation && mOverallResult == Result.SAFE) { mLogger.debug("Computing Hoare annotation of CFG"); basicCegarLoop.computeCFGHoareAnnotation(); From a3a04e7e198922eca53643d85c30fc43499ca399 Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Thu, 3 Sep 2020 16:13:58 +0200 Subject: [PATCH 010/536] fix ConcurrentModificationException --- .../generator/traceabstraction/HoareAnnotationFragments.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationFragments.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationFragments.java index b1ce163a9f8..b492fa14f43 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationFragments.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationFragments.java @@ -30,6 +30,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -135,7 +136,7 @@ private void update(final IUpdate update, final INwaOutgoingLetterAndTransitionP if (mPred2ProgPoint.isEmpty()) { oldStates = (Set) mHoareAnnotationPositions; } else { - oldStates = mPred2ProgPoint.keySet(); + oldStates = new HashSet<>(mPred2ProgPoint.keySet()); } // TODO possibly merge this loop with the next, avoid redundant computation of getNewPredicates for (final IPredicate oldState : oldStates) { From c841bbd7f422b48440a4c4107b94341d1290248d Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Thu, 3 Sep 2020 16:16:06 +0200 Subject: [PATCH 011/536] fix assertion: no problem if old and new entry are equal --- .../traceabstraction/HoareAnnotationFragments.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationFragments.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationFragments.java index b492fa14f43..69865d79b62 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationFragments.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationFragments.java @@ -144,8 +144,12 @@ private void update(final IUpdate update, final INwaOutgoingLetterAndTransitionP final List newStates = update.getNewPredicates(oldState); if (newStates != null) { for (final IPredicate newState : newStates) { - assert !mPred2ProgPoint.containsKey(newState); - mPred2ProgPoint.put(newState, pp); + if (mPred2ProgPoint.containsKey(newState)) { + final IPredicate oldPP = mPred2ProgPoint.get(newState); + assert oldPP == pp : "State " + newState + " cannot represent both " + oldPP + " and " + pp + "!"; + } else { + mPred2ProgPoint.put(newState, pp); + } } mPred2ProgPoint.remove(oldState); } From aa8fe8d88630bfbb39ff45b10d5f1ced697fcc95 Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Thu, 3 Sep 2020 16:18:41 +0200 Subject: [PATCH 012/536] remove unnecessary anonymous type --- .../traceabstraction/HoareAnnotationFragments.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationFragments.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationFragments.java index 69865d79b62..ea85007e470 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationFragments.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationFragments.java @@ -76,7 +76,7 @@ public class HoareAnnotationFragments { private final HashRelation mProgPoint2StatesWithEmptyContext = new HashRelation<>(); - private final Set mHoareAnnotationPositions; + private final Set mHoareAnnotationPositions; private final HoareAnnotationPositions mHoareAnnotationPos; @@ -96,7 +96,7 @@ HashMap getCallpred2Entry() { return mContext2Entry; } - public HoareAnnotationFragments(final ILogger logger, final Set hoareAnnotationLocations, + public HoareAnnotationFragments(final ILogger logger, final Set hoareAnnotationLocations, final HoareAnnotationPositions hoareAnnotationPos) { mLogger = logger; mHoareAnnotationPositions = hoareAnnotationLocations; @@ -134,7 +134,7 @@ public void updateOnMinimization(final Map old2New, private void update(final IUpdate update, final INwaOutgoingLetterAndTransitionProvider newAbstraction) { final Set oldStates; if (mPred2ProgPoint.isEmpty()) { - oldStates = (Set) mHoareAnnotationPositions; + oldStates = mHoareAnnotationPositions; } else { oldStates = new HashSet<>(mPred2ProgPoint.keySet()); } From 5ecd10685aa95582e56c197337bf873b45c833f8 Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Thu, 3 Sep 2020 16:40:49 +0200 Subject: [PATCH 013/536] some code cleanup --- .../traceabstraction/BasicCegarLoop.java | 21 +++++++------------ .../CFG2NestedWordAutomaton.java | 6 ++++-- .../HoareAnnotationComposer.java | 7 +++++-- .../HoareAnnotationExtractor.java | 2 +- .../PredicateFactoryRefinement.java | 13 ++---------- .../TraceAbstractionStarter.java | 8 +------ 6 files changed, 21 insertions(+), 36 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java index 69ae0c3ac70..0ad8645cb60 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java @@ -71,6 +71,7 @@ import de.uni_freiburg.informatik.ultimate.automata.nestedword.operations.oldapi.IOpWithDelayedDeadEndRemoval; import de.uni_freiburg.informatik.ultimate.automata.nestedword.senwa.DifferenceSenwa; import de.uni_freiburg.informatik.ultimate.automata.nestedword.transitions.OutgoingCallTransition; +import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; import de.uni_freiburg.informatik.ultimate.automata.petrinet.Marking; import de.uni_freiburg.informatik.ultimate.automata.petrinet.PetriNetNot1SafeException; import de.uni_freiburg.informatik.ultimate.automata.petrinet.netdatastructures.BoundedPetriNet; @@ -247,6 +248,8 @@ public enum PetriNetLbe { private final AStarHeuristic mAStarHeuristic; private final Integer mAStarRandomHeuristicSeed; + private IPetriNet mPetriNet = null; + private Map, IPredicate> mMarking2State = null; private PetriNetLargeBlockEncoding mLBE; public BasicCegarLoop(final DebugIdentifier name, final IIcfg rootNode, final CfgSmtToolkit csToolkit, @@ -336,8 +339,6 @@ public BasicCegarLoop(final DebugIdentifier name, final IIcfg rootNode, final mAStarRandomHeuristicSeed = taPrefs.getHeuristicEmptinessCheckAStarHeuristicRandomSeed(); } - private Map, IPredicate> mMarking2State = null; - @Override protected void getInitialAbstraction() throws AutomataLibraryException { if (isSequential()) { @@ -363,6 +364,7 @@ protected void getInitialAbstraction() throws AutomataLibraryException { net = petrifiedCfg; } try { + mPetriNet = net; final PetriNet2FiniteAutomaton conversion = new PetriNet2FiniteAutomaton<>(new AutomataLibraryServices(mServices), mStateFactoryForRefinement, net); mAbstraction = conversion.getResult(); @@ -405,7 +407,6 @@ protected void getInitialAbstraction() throws AutomataLibraryException { } } } - if (mWitnessAutomaton != null) { mAbstraction = WitnessUtils.constructIcfgAndWitnessProduct(mServices, mAbstraction, mWitnessAutomaton, mCsToolkit, mPredicateFactory, mStateFactoryForRefinement, mLogger, Property.NON_REACHABILITY); @@ -1132,19 +1133,14 @@ public IStatisticsDataProvider getCegarLoopBenchmark() { */ public void finish() { if (!isSequential() && mPref.useLbeInConcurrentAnalysis() == PetriNetLbe.OFF) { - try { - computeOwickiGries(mStateFactoryForRefinement); - } catch (AutomataLibraryException e) { - throw new RuntimeException(e); // TODO - } + computeOwickiGries(mStateFactoryForRefinement); } mCegarLoopBenchmark.stop(CegarLoopStatisticsDefinitions.OverallTime.toString()); } - private void computeOwickiGries(IPetriNet2FiniteAutomatonStateFactory factory) throws PetriNetNot1SafeException, AutomataOperationCanceledException { + private void computeOwickiGries(IPetriNet2FiniteAutomatonStateFactory factory) { Map floydHoare = computeHoareAnnotationComposer().getLoc2hoare(); - IHoareTripleChecker htc = null; // TODO final Map, IPredicate> petriFloydHoare = new HashMap<>(); for (final Map.Entry, IPredicate> entry : mMarking2State.entrySet()) { @@ -1156,10 +1152,9 @@ private void computeOwickiGries(IPetriNet2FiniteAutomatonStateFactory annotation = OwickiGriesAnnotation.fromFloydHoare(petriNet, - // petriFloydHoare, htc); + //OwickiGriesAnnotation annotation = OwickiGriesAnnotation.fromFloydHoare(mServices, mCsToolkit, mPetriNet, petriFloydHoare); // TODO: simplify - //assert annotation.isValidAnnotation() : "Invalid Owicki-Gries annotation"; + //assert new OwickiGriesValidityCheck(mServices, mCsToolkit, annotation).isValid() : "Invalid Owicki-Gries annotation"; } @Override diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/CFG2NestedWordAutomaton.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/CFG2NestedWordAutomaton.java index 8afee733399..e62101decf0 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/CFG2NestedWordAutomaton.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/CFG2NestedWordAutomaton.java @@ -293,13 +293,15 @@ private static BoundedPetriNet constructPetriNet( for (final ThreadInstance ti : threadInstances) { IPredicate threadNotInUsePredicate; { + // TODO (2020-09-03 Dominik) Label predicate with the string below; but use trueTerm (not dontCare). final String threadNotInUseString = ti.getThreadInstanceName() + "NotInUse"; - threadNotInUsePredicate = predicateFactory.newPredicate(trueTerm); //.newDebugPredicate(threadNotInUseString); + threadNotInUsePredicate = predicateFactory.newPredicate(trueTerm); } IPredicate threadInUsePredicate; { + // TODO (2020-09-03 Dominik) Label predicate with the string below; but use trueTerm (not dontCare). final String threadInUseString = ti.getThreadInstanceName() + "InUse"; - threadInUsePredicate = predicateFactory.newPredicate(trueTerm); //.newDebugPredicate(threadInUseString); + threadInUsePredicate = predicateFactory.newPredicate(trueTerm); } threadInstance2notinUseState.put(ti.getThreadInstanceName(), threadNotInUsePredicate); threadInstance2inUseState.put(ti.getThreadInstanceName(), threadInUsePredicate); diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationComposer.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationComposer.java index 707f3f6b39e..ad5dbf55b40 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationComposer.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationComposer.java @@ -143,8 +143,11 @@ public HoareAnnotationComposer(final CfgSmtToolkit csToolkit, final PredicateFac final Set vars = TermVarsProc.computeTermVarsProc(conjunction, mCsToolkit.getManagedScript().getScript(), mCsToolkit.getSymbolTable()).getVars(); + + // TODO (2020-09-03 Dominik) Functionality below is probably necessary. Make it work with IPredicate instead of IcfgLocation. //conjunction = TraceAbstractionUtils.substituteOldVarsOfNonModifiableGlobals(loc.getProcedure(), vars, // conjunction, mCsToolkit.getModifiableGlobalsTable(), mCsToolkit.getManagedScript().getScript()); + final ExtendedSimplificationResult simplificationResult = SmtUtils.simplifyWithStatistics( mCsToolkit.getManagedScript(), conjunction, null, mServices, SimplificationTechnique.SIMPLIFY_DDA); mHoareAnnotationStatisticsGenerator.reportSimplificationInter(); @@ -261,8 +264,8 @@ public HashRelation3 constructMappingOld() { * @param precondForContext * @param pp2preds */ - private static void addHoareAnnotationForCallPred( - final HashRelation3 loc2callPred2invariant, + private static void addHoareAnnotationForCallPred( + final HashRelation3 loc2callPred2invariant, final IPredicate precondForContext, final HashRelation pp2preds) { for (final DOM loc : pp2preds.getDomain()) { final Set preds = pp2preds.getImage(loc); diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationExtractor.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationExtractor.java index 354c06b2e8c..ff3565f7aee 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationExtractor.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationExtractor.java @@ -87,7 +87,7 @@ private void addContext(final DoubleDecker doubleDecker) { protected Collection getInitialStates() { final Collection result = mTraversedNwa.getInitialStates(); if (result.size() == 1) { - // case where automaton is emtpy minimized and contains only one + // case where automaton is empty minimized and contains only one // dummy state. final IPredicate p = result.iterator().next(); if (!(p instanceof SPredicate) && !(p instanceof MLPredicate)) { diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/PredicateFactoryRefinement.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/PredicateFactoryRefinement.java index d0bbba5fcb4..0758e8ef291 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/PredicateFactoryRefinement.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/PredicateFactoryRefinement.java @@ -76,20 +76,11 @@ public IPredicate intersection(final IPredicate p1, final IPredicate p2) { if (p1 instanceof IMLPredicate) { final IcfgLocation[] pps = ((IMLPredicate) p1).getProgramPoints(); // assert mCsToolkit.isDontCare(p2); - //assert !mComputeHoareAnnotation; if (Arrays.stream(pps).anyMatch(mHoareAnnotationProgramPoints::contains)) { Term conjunction = mPredicateFactory.and(p1, p2).getFormula(); conjunction = new CommuhashNormalForm(mServices, mMgdScript.getScript()).transform(conjunction); - final IPredicate result; - /*if (DEBUG_COMPUTE_HISTORY) { - assert p1 instanceof PredicateWithHistory; - final Map history = ((PredicateWithHistory) p1).getCopyOfHistory(); - history.put(mIteration, p2.getFormula()); - result = mPredicateFactory.newPredicateWithHistory(pp, conjunction, history); - } else {*/ - result = mPredicateFactory.newMLPredicate(pps, conjunction); - //} - return result; + // TODO (2020-09-03 Dominik) Possibly support DEBUG_COMPUTE_HISTORY like below? + return mPredicateFactory.newMLPredicate(pps, conjunction); } return mPredicateFactory.newMLDontCarePredicate(((IMLPredicate) p1).getProgramPoints()); } else if (p1 instanceof ISLPredicate) { diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java index cb650cb2595..7d7a8daae4c 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java @@ -141,13 +141,7 @@ private void runCegarLoops(final IIcfg icfg, final TAPreferences taPrefs = new TAPreferences(mServices); final boolean computeHoareAnnotation; - /*if (taPrefs.computeHoareAnnotation() - && !icfg.isSequential()) { - mLogger.warn("Switching off computation of Hoare annotation because input is a concurrent program"); - computeHoareAnnotation = false; - } else {*/ - computeHoareAnnotation = taPrefs.computeHoareAnnotation(); - //} + computeHoareAnnotation = taPrefs.computeHoareAnnotation(); String settings = "Automizer settings:"; settings += " Hoare:" + computeHoareAnnotation; From 460f27abb0a3fa6356ae81156a5e3a5ac4ce07f0 Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Fri, 4 Sep 2020 10:10:18 +0200 Subject: [PATCH 014/536] call O/G computation in same place as Hoare computation --- .../traceabstraction/BasicCegarLoop.java | 9 +++++---- .../traceabstraction/CegarLoopResult.java | 18 ++++++++++------- .../TraceAbstractionStarter.java | 20 +++++++++++-------- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java index 0ad8645cb60..fb2aa3e1abe 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java @@ -1132,13 +1132,14 @@ public IStatisticsDataProvider getCegarLoopBenchmark() { * method called at the end of the cegar loop */ public void finish() { - if (!isSequential() && mPref.useLbeInConcurrentAnalysis() == PetriNetLbe.OFF) { - computeOwickiGries(mStateFactoryForRefinement); - } mCegarLoopBenchmark.stop(CegarLoopStatisticsDefinitions.OverallTime.toString()); } - private void computeOwickiGries(IPetriNet2FiniteAutomatonStateFactory factory) { + public void computeOwickiGries() { + assert !isSequential() : "Cannot compute Owicki-Gries for sequential program."; + if (mPref.useLbeInConcurrentAnalysis() != PetriNetLbe.OFF) { + throw new AssertionError("Owicki-Gries does currently not support Petri net LBE."); + } Map floydHoare = computeHoareAnnotationComposer().getLoc2hoare(); diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/CegarLoopResult.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/CegarLoopResult.java index a7ac601bc21..bb185e06acd 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/CegarLoopResult.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/CegarLoopResult.java @@ -179,15 +179,19 @@ public static > CegarLoopResult iterat floydHoareAutomata = null; } - if (root.isSequential() && computeHoareAnnotation && result == Result.SAFE) { - basicCegarLoop.computeCFGHoareAnnotation(); + if (computeHoareAnnotation && result == Result.SAFE) { + if (root.isSequential()) { + basicCegarLoop.computeCFGHoareAnnotation(); - // final Set locsForHoareAnnotation = - // TraceAbstractionUtils.getLocationsForWhichHoareAnnotationIsComputed( - // root, taPrefs.getHoareAnnotationPositions()); - // computeHoareAnnotation(locsForHoareAnnotation); + // final Set locsForHoareAnnotation = + // TraceAbstractionUtils.getLocationsForWhichHoareAnnotationIsComputed( + // root, taPrefs.getHoareAnnotationPositions()); + // computeHoareAnnotation(locsForHoareAnnotation); - writeHoareAnnotationToLogger(services, root); + writeHoareAnnotationToLogger(services, root); + } else { + basicCegarLoop.computeOwickiGries(); + } } return new CegarLoopResult<>(result, programExecution, unprovabilityReasons, runningTaskStackProvider, diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java index 7d7a8daae4c..8510f46ff9d 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java @@ -447,16 +447,20 @@ private Result iterate(final DebugIdentifier name, final IIcfg roo mOverallResult = computeOverallResult(errorLocs, basicCegarLoop, result); - if (icfg.isSequential() && computeHoareAnnotation && mOverallResult == Result.SAFE) { - mLogger.debug("Computing Hoare annotation of CFG"); - basicCegarLoop.computeCFGHoareAnnotation(); + if (computeHoareAnnotation && mOverallResult == Result.SAFE) { + if (icfg.isSequential()) { + mLogger.debug("Computing Hoare annotation of CFG"); + basicCegarLoop.computeCFGHoareAnnotation(); - // final Set locsForHoareAnnotation = - // TraceAbstractionUtils.getLocationsForWhichHoareAnnotationIsComputed( - // root, taPrefs.getHoareAnnotationPositions()); - // computeHoareAnnotation(locsForHoareAnnotation); + // final Set locsForHoareAnnotation = + // TraceAbstractionUtils.getLocationsForWhichHoareAnnotationIsComputed( + // root, taPrefs.getHoareAnnotationPositions()); + // computeHoareAnnotation(locsForHoareAnnotation); - writeHoareAnnotationToLogger(root); + writeHoareAnnotationToLogger(root); + } else { + basicCegarLoop.computeOwickiGries(); + } } else { mLogger.debug("Omitting computation of Hoare annotation"); From 9db5df138fd85fa82f3111b830b446e857c3913a Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Mon, 21 Sep 2020 11:27:42 +0200 Subject: [PATCH 015/536] move O/G construction to separate class --- .../concurrency/OwickiGriesAnnotation.java | 50 +++++++++----- .../concurrency/OwickiGriesConstruction.java | 65 +++++++++++++++++++ .../concurrency/OwickiGriesValidityCheck.java | 34 ++++++++++ 3 files changed, 133 insertions(+), 16 deletions(-) create mode 100644 trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java index 107486ba0c2..fa63cad2518 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java @@ -1,14 +1,44 @@ +/* + * Copyright (C) 2020 University of Freiburg + * + * This file is part of the ULTIMATE TraceAbstraction plug-in. + * + * The ULTIMATE TraceAbstraction plug-in is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * The ULTIMATE TraceAbstraction plug-in is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with the ULTIMATE TraceAbstraction plug-in. If not, see . + * + * Additional permission under GNU GPL version 3 section 7: + * If you modify the ULTIMATE TraceAbstraction plug-in, or any covered work, by linking + * or combining it with Eclipse RCP (or a modified version of Eclipse RCP), + * containing parts covered by the terms of the Eclipse Public License, the + * licensors of the ULTIMATE TraceAbstraction plug-in grant you additional permission + * to convey the resulting work. + */ package de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency; import java.util.Map; import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; -import de.uni_freiburg.informatik.ultimate.automata.petrinet.Marking; -import de.uni_freiburg.informatik.ultimate.core.model.services.IUltimateServiceProvider; -import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.CfgSmtToolkit; -import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.BasicPredicateFactory; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; +/** + * TODO + * + * @author Dominik Klumpp (klumpp@informatik.uni-freiburg.de) + * @author Miriam Lagunes Rochin + * + * @param + * @param + */ public class OwickiGriesAnnotation { // Petri net @@ -27,16 +57,4 @@ public int getSize() { // ... return 0; } - - public static OwickiGriesAnnotation fromFloydHoare(IUltimateServiceProvider services, - CfgSmtToolkit csToolkit, IPetriNet net, Map, IPredicate> floydHoare) { - final BasicPredicateFactory factory = new BasicPredicateFactory(services, csToolkit.getManagedScript(), - csToolkit.getSymbolTable()); - - // TODO Use factory.and(preds) - // ... - - return new OwickiGriesAnnotation<>(); - } - } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java new file mode 100644 index 00000000000..f0b3825af42 --- /dev/null +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2020 University of Freiburg + * + * This file is part of the ULTIMATE TraceAbstraction plug-in. + * + * The ULTIMATE TraceAbstraction plug-in is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * The ULTIMATE TraceAbstraction plug-in is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with the ULTIMATE TraceAbstraction plug-in. If not, see . + * + * Additional permission under GNU GPL version 3 section 7: + * If you modify the ULTIMATE TraceAbstraction plug-in, or any covered work, by linking + * or combining it with Eclipse RCP (or a modified version of Eclipse RCP), + * containing parts covered by the terms of the Eclipse Public License, the + * licensors of the ULTIMATE TraceAbstraction plug-in grant you additional permission + * to convey the resulting work. + */ +package de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency; + +import java.util.Map; + +import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; +import de.uni_freiburg.informatik.ultimate.automata.petrinet.Marking; +import de.uni_freiburg.informatik.ultimate.core.model.services.IUltimateServiceProvider; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.CfgSmtToolkit; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IIcfgTransition; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IcfgLocation; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.BasicPredicateFactory; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; + +/** + * TODO + * + * @author Dominik Klumpp (klumpp@informatik.uni-freiburg.de) + * @author Miriam Lagunes Rochin + * + * @param + */ +public class OwickiGriesConstruction { + private final OwickiGriesAnnotation, PLACE> mAnnotation; + + public OwickiGriesConstruction(IUltimateServiceProvider services, CfgSmtToolkit csToolkit, + IPetriNet, PLACE> net, + Map, PLACE>, IPredicate> floydHoare) { + final BasicPredicateFactory factory = new BasicPredicateFactory(services, csToolkit.getManagedScript(), + csToolkit.getSymbolTable()); + + // TODO Use factory.and(preds) + // ... + + mAnnotation = new OwickiGriesAnnotation<>(); + } + + public OwickiGriesAnnotation, PLACE> getResult() { + return mAnnotation; + } +} diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java index f9edc4ced28..adebe87d2d6 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java @@ -1,3 +1,28 @@ +/* + * Copyright (C) 2020 University of Freiburg + * + * This file is part of the ULTIMATE TraceAbstraction plug-in. + * + * The ULTIMATE TraceAbstraction plug-in is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * The ULTIMATE TraceAbstraction plug-in is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with the ULTIMATE TraceAbstraction plug-in. If not, see . + * + * Additional permission under GNU GPL version 3 section 7: + * If you modify the ULTIMATE TraceAbstraction plug-in, or any covered work, by linking + * or combining it with Eclipse RCP (or a modified version of Eclipse RCP), + * containing parts covered by the terms of the Eclipse Public License, the + * licensors of the ULTIMATE TraceAbstraction plug-in grant you additional permission + * to convey the resulting work. + */ package de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency; import de.uni_freiburg.informatik.ultimate.core.model.services.IUltimateServiceProvider; @@ -6,6 +31,15 @@ import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.hoaretriple.MonolithicHoareTripleChecker; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.BasicPredicateFactory; +/** + * TODO + * + * @author Dominik Klumpp (klumpp@informatik.uni-freiburg.de) + * @author Miriam Lagunes Rochin + * + * @param + * @param + */ public class OwickiGriesValidityCheck { private final boolean mIsInductive; private final boolean mIsInterferenceFree; From 81304cf2497360e22685a0e35dd9374931b2127b Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Thu, 24 Sep 2020 00:11:06 +0200 Subject: [PATCH 016/536] Partial Omage construction --- .../concurrency/OwickiGriesAnnotation.java | 23 +++++- .../concurrency/OwickiGriesConstruction.java | 74 ++++++++++++++++++- .../concurrency/OwickiGriesValidityCheck.java | 3 +- 3 files changed, 92 insertions(+), 8 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java index fa63cad2518..1ed3423f288 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java @@ -26,15 +26,20 @@ package de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency; import java.util.Map; +import java.util.Set; +import java.util.Collection; +import java.util.HashMap; import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; +import de.uni_freiburg.informatik.ultimate.automata.petrinet.ITransition; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.variables.IProgramVar; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; /** * TODO * * @author Dominik Klumpp (klumpp@informatik.uni-freiburg.de) - * @author Miriam Lagunes Rochin + * @author Miriam Lagunes (miriam.lagunes@students.uni-freiburg.de) * * @param * @param @@ -44,13 +49,25 @@ public class OwickiGriesAnnotation { // Petri net private final IPetriNet mPetriNet; - // + //Omega: Predicate -> Place private final Map mFormulaMapping; - // ... + + //Gamma: GhostAssignment -> transition + private final Map, LETTER> mAssignmentMapping; + + //VGhost: set of Ghost Variables + private final Set mGhostVariables; + + //rho(VGhost): value -> GhostVariables + private final Map mGhostAssignment; public OwickiGriesAnnotation() { mPetriNet = null; mFormulaMapping = null; + mAssignmentMapping = null; + mGhostVariables = null; + mGhostAssignment = null; + } public int getSize() { diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java index f0b3825af42..d53e6a15322 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java @@ -25,7 +25,11 @@ */ package de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; import de.uni_freiburg.informatik.ultimate.automata.petrinet.Marking; @@ -33,6 +37,7 @@ import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.CfgSmtToolkit; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IIcfgTransition; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IcfgLocation; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.variables.IProgramVar; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.BasicPredicateFactory; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; @@ -40,26 +45,87 @@ * TODO * * @author Dominik Klumpp (klumpp@informatik.uni-freiburg.de) - * @author Miriam Lagunes Rochin + * @author Miriam Lagunes (miriam.lagunes@students.uni-freiburg.de) + * * * @param */ public class OwickiGriesConstruction { + private final OwickiGriesAnnotation, PLACE> mAnnotation; + private final IPetriNet, PLACE> mNet; + private final BasicPredicateFactory mFactory; + private final Map, PLACE>, IPredicate> mFloydHoareAnnotation; + private final Map mGhostVariables; public OwickiGriesConstruction(IUltimateServiceProvider services, CfgSmtToolkit csToolkit, IPetriNet, PLACE> net, Map, PLACE>, IPredicate> floydHoare) { - final BasicPredicateFactory factory = new BasicPredicateFactory(services, csToolkit.getManagedScript(), + + mNet = net; + mFloydHoareAnnotation = floydHoare; + mFactory = new BasicPredicateFactory(services, csToolkit.getManagedScript(), csToolkit.getSymbolTable()); + mGhostVariables = getGhostVariables(); + + //Omega: + //Gamma + //Ghost Variables set/map (to assign to place for GhostAssignments) + + - // TODO Use factory.and(preds) - // ... mAnnotation = new OwickiGriesAnnotation<>(); } + + public Map getFormulaMapping () { + Map Mapping = new HashMap(); + + //Assign predicate to All place in PetriNet + Collection Places = mNet.getPlaces(); + for (PLACE place: Places) { + //Find Markings in FloydHoareAnn containing place + Set Clauses = new HashSet<>(); + mFloydHoareAnnotation.forEach((key,value)-> { + if(mFloydHoareAnnotation.containsKey(place)) { + Clauses.add(getMarkingPredicate(place, key));}}); + //Disjunction of Clauses in Set + //Assign Predicate to Place + } + + + return Mapping; + } + + private IPredicate getMarkingPredicate(PLACE place, Marking, PLACE> marking) { + //TODO: Conjunction of Vars not in Marking + IPredicate clause = null; + + //terms = Ghost Variables of place in MArking + marking predicate + Set terms = null; + //Conjunction of GhostVariables + //mFactory.and(terms) + return clause; + + } + + private Map getGhostVariables(){ + Map GhostVars = new HashMap(); + for(PLACE place: mNet.getPlaces()) { + //IProgramVar var = null; + //TODO: extend IProgramVar: name, place, type, value. + //GhostVars.put(place, var); + } + //create-add variables per place + return mGhostVariables; + + } + + public OwickiGriesAnnotation, PLACE> getResult() { return mAnnotation; } + + } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java index adebe87d2d6..9d1570e25a6 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java @@ -35,7 +35,7 @@ * TODO * * @author Dominik Klumpp (klumpp@informatik.uni-freiburg.de) - * @author Miriam Lagunes Rochin + * @author Miriam Lagunes (miriam.lagunes@students.uni-freiburg.de) * * @param * @param @@ -48,6 +48,7 @@ public class OwickiGriesValidityCheck { public OwickiGriesValidityCheck(IUltimateServiceProvider services, CfgSmtToolkit csToolkit, OwickiGriesAnnotation annotation) { + mPredicateFactory = new BasicPredicateFactory(services, csToolkit.getManagedScript(), csToolkit.getSymbolTable()); mHoareTripleChecker = new MonolithicHoareTripleChecker(csToolkit); From 7d4dd49bf5581907b3182f029ef9e1751c9682be Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Mon, 28 Sep 2020 00:37:41 +0200 Subject: [PATCH 017/536] OGAnnotation Construction Partial GhostVariables, Initial Assignments and Formula Mapping. --- .../concurrency/OwickiGriesAnnotation.java | 37 +++-- .../concurrency/OwickiGriesConstruction.java | 129 +++++++++++------- 2 files changed, 100 insertions(+), 66 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java index 1ed3423f288..1111caceac3 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java @@ -27,11 +27,10 @@ import java.util.Map; import java.util.Set; -import java.util.Collection; -import java.util.HashMap; -import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; import de.uni_freiburg.informatik.ultimate.automata.petrinet.ITransition; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IIcfgTransition; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IcfgLocation; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.variables.IProgramVar; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; @@ -46,23 +45,32 @@ */ public class OwickiGriesAnnotation { - // Petri net - private final IPetriNet mPetriNet; + // Petri net //TODO: Still is this PetriNet needed here? + //protected IPetriNet mPetriNet; - //Omega: Predicate -> Place - private final Map mFormulaMapping; + /** + * Omega: maps Predicate -> Place + */ + protected Map mFormulaMapping; - //Gamma: GhostAssignment -> transition - private final Map, LETTER> mAssignmentMapping; + /** + * Gamma: maps GhostAssignment -> transition + */ + protected Map, LETTER> mAssignmentMapping; - //VGhost: set of Ghost Variables - private final Set mGhostVariables; + /** + * VGhost: maps Ghost Variables to set + */ + protected Map mGhostVariables; - //rho(VGhost): value -> GhostVariables - private final Map mGhostAssignment; + /** + * rho(VGhost): set of predicate value -> GhostVariables + */ + //protected Map,LETTER> mGhostAssignment; + protected Set> mGhostAssignment; public OwickiGriesAnnotation() { - mPetriNet = null; + //mPetriNet = null; mFormulaMapping = null; mAssignmentMapping = null; mGhostVariables = null; @@ -70,6 +78,7 @@ public OwickiGriesAnnotation() { } + //TODO: define OGAnnotation Size public int getSize() { // ... return 0; diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java index d53e6a15322..9d67599533d 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java @@ -25,7 +25,6 @@ */ package de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency; -import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -50,79 +49,105 @@ * * @param */ -public class OwickiGriesConstruction { +public class OwickiGriesConstruction { - private final OwickiGriesAnnotation, PLACE> mAnnotation; - private final IPetriNet, PLACE> mNet; - private final BasicPredicateFactory mFactory; + private final IPetriNet, PLACE> mNet; private final Map, PLACE>, IPredicate> mFloydHoareAnnotation; - private final Map mGhostVariables; + + private final OwickiGriesAnnotation, PLACE> mAnnotation; + private final BasicPredicateFactory mFactory; + public OwickiGriesConstruction(IUltimateServiceProvider services, CfgSmtToolkit csToolkit, IPetriNet, PLACE> net, - Map, PLACE>, IPredicate> floydHoare) { - + Map, PLACE>, IPredicate> floydHoare) { mNet = net; mFloydHoareAnnotation = floydHoare; mFactory = new BasicPredicateFactory(services, csToolkit.getManagedScript(), - csToolkit.getSymbolTable()); - mGhostVariables = getGhostVariables(); - - //Omega: - //Gamma - //Ghost Variables set/map (to assign to place for GhostAssignments) - - - + csToolkit.getSymbolTable()); + + mAnnotation = new OwickiGriesAnnotation<>(); + mAnnotation.mGhostVariables = getGhostVariables(); + mAnnotation.mFormulaMapping = getFormulaMapping(); + //TODO: m.Annotation.mAssignmentMapping = + mAnnotation.mGhostInitAssignment = getGhostInitAssignment(); + } - mAnnotation = new OwickiGriesAnnotation<>(); - } - + /** + * Predicate: disjunction of Markings predicate. + * Markings predicate: Conjunction of GhostVariable and FH predicate. + * @return a Map with a predicate for each place in Net. + */ public Map getFormulaMapping () { - Map Mapping = new HashMap(); - - //Assign predicate to All place in PetriNet - Collection Places = mNet.getPlaces(); - for (PLACE place: Places) { - //Find Markings in FloydHoareAnn containing place - Set Clauses = new HashSet<>(); + Map Mapping = new HashMap(); + for (PLACE place: mNet.getPlaces()) { + Set Clauses = new HashSet<>(); mFloydHoareAnnotation.forEach((key,value)-> { - if(mFloydHoareAnnotation.containsKey(place)) { + if(mFloydHoareAnnotation.containsKey(place)) { Clauses.add(getMarkingPredicate(place, key));}}); - //Disjunction of Clauses in Set - //Assign Predicate to Place - } - - - return Mapping; + Mapping.put(place, mFactory.or(Clauses)); } + return Mapping; } + /** + * @param place + * @param marking + * @return Predicate with conjunction of Ghost variables and predicate of marking + */ private IPredicate getMarkingPredicate(PLACE place, Marking, PLACE> marking) { - //TODO: Conjunction of Vars not in Marking - IPredicate clause = null; - - //terms = Ghost Variables of place in MArking + marking predicate - Set terms = null; - //Conjunction of GhostVariables - //mFactory.and(terms) - return clause; - + //TODO: Conjunction of variables not in Marking + Set terms = new HashSet<>(); //Conjunction of GhostVariables of places in marking + marking.forEach(element -> terms.add(getGhostPredicate(element))); + terms.add(mFloydHoareAnnotation.get(place)); //Predicate of marking + return mFactory.and(terms); } + /** + * @param place + * @return Predicate place's GhostVariable + */ + private IPredicate getGhostPredicate(PLACE place) { + //TODO: Value assignment ?? + return mFactory.newPredicate(mAnnotation.mGhostVariables.get(place).getTerm()); + } + + /** + * @return Map of GhostVariables to Places + */ private Map getGhostVariables(){ + //TODO: Extend IProgramVar?: name, place, type, value. + //TODO: Deal with not place Ghost variables? Map GhostVars = new HashMap(); for(PLACE place: mNet.getPlaces()) { - //IProgramVar var = null; - //TODO: extend IProgramVar: name, place, type, value. - //GhostVars.put(place, var); - } - //create-add variables per place - return mGhostVariables; - + IProgramVar var = null; + GhostVars.put(place, var);} + return GhostVars; + } + + /** + * @return set of Initial value assignment of all GhostVariables. + */ + private Set> getGhostInitAssignment(){ + Set> InitAssignments = new HashSet<>(); + mNet.getInitialPlaces().forEach(place -> InitAssignments.add(getGhostAssignment(place))); //true + Set NotInit = new HashSet<>(mNet.getPlaces()); + NotInit.removeAll(mNet.getInitialPlaces()); + NotInit.forEach(place -> InitAssignments.add(getGhostAssignment(place))); //false + return InitAssignments; + } + + /** + * + * @param place + * @return assignment of the place's GhostVariable. + */ + private IIcfgTransition getGhostAssignment(PLACE place){ + //TODO: Generate assignment/statement from GhostVar + IIcfgTransition assignment = null; + mAnnotation.mGhostVariables.get(place); + return assignment; } - - public OwickiGriesAnnotation, PLACE> getResult() { return mAnnotation; } From 4bef1b202ecc490beadd33eaf7393729b4f2b01f Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Mon, 28 Sep 2020 16:49:48 +0200 Subject: [PATCH 018/536] discussed changes --- .../concurrency/OwickiGriesAnnotation.java | 1 + .../concurrency/OwickiGriesConstruction.java | 19 ++++++++++++++++++- .../concurrency/OwickiGriesValidityCheck.java | 4 +++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java index 1111caceac3..68db7b5d94a 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java @@ -51,6 +51,7 @@ public class OwickiGriesAnnotation { /** * Omega: maps Predicate -> Place */ + // TODO These fields should be private final; and set in the constructor; and there should be getter methods protected Map mFormulaMapping; /** diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java index 9d67599533d..c8763b77f74 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java @@ -37,8 +37,12 @@ import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IIcfgTransition; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IcfgLocation; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.variables.IProgramVar; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.variables.ProgramVarUtils; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.BasicPredicateFactory; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; +import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.SmtSortUtils; +import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.SmtUtils; +import de.uni_freiburg.informatik.ultimate.logic.TermVariable; /** * TODO @@ -70,7 +74,15 @@ public OwickiGriesConstruction(IUltimateServiceProvider services, CfgSmtToolkit mAnnotation.mGhostVariables = getGhostVariables(); mAnnotation.mFormulaMapping = getFormulaMapping(); //TODO: m.Annotation.mAssignmentMapping = - mAnnotation.mGhostInitAssignment = getGhostInitAssignment(); + // mAnnotation.mGhostInitAssignment = getGhostInitAssignment(); + + // TODO Code to set variables to false. + // Similarly for true. + // Use TransformulaUtils.sequentialComposition to combine. + // + // final UnmodifiableTransFormula setToFalse = + // TransFormulaBuilder.constructAssignment(new ArrayList<>(variables.values()), + // Collections.nCopies(variables.size(), script.term("false")), mSymbolTable, mManagedScript); } /** @@ -120,6 +132,11 @@ private Map getGhostVariables(){ Map GhostVars = new HashMap(); for(PLACE place: mNet.getPlaces()) { IProgramVar var = null; + // TODO Code to create a new boolean variable. + //final TermVariable tv = + // mManagedScript.constructFreshTermVariable("loc_" + i, SmtSortUtils.getBoolSort(mManagedScript)); + //final IProgramVar var = ProgramVarUtils.constructGlobalProgramVarPair(tv.getName(), + // SmtSortUtils.getBoolSort(mManagedScript), mManagedScript, this); GhostVars.put(place, var);} return GhostVars; } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java index 9d1570e25a6..20469b7629f 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java @@ -27,6 +27,7 @@ import de.uni_freiburg.informatik.ultimate.core.model.services.IUltimateServiceProvider; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.CfgSmtToolkit; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IAction; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.hoaretriple.IHoareTripleChecker; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.hoaretriple.MonolithicHoareTripleChecker; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.BasicPredicateFactory; @@ -40,7 +41,7 @@ * @param * @param */ -public class OwickiGriesValidityCheck { +public class OwickiGriesValidityCheck { private final boolean mIsInductive; private final boolean mIsInterferenceFree; private final IHoareTripleChecker mHoareTripleChecker; @@ -54,6 +55,7 @@ public OwickiGriesValidityCheck(IUltimateServiceProvider services, CfgSmtToolkit mHoareTripleChecker = new MonolithicHoareTripleChecker(csToolkit); // TODO Use mPredicateFactory.and(preds) + // TODO Use BasicInternalAction to create an IInternalAction ("act" below) from ghost assignments // TODO Use mHoareTripleChecker.checkInternal(pre, act, succ) mIsInductive = false; // TODO From 02ac46b9cb24510c9a859035c28e52f4ab996def Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Thu, 1 Oct 2020 16:14:41 +0200 Subject: [PATCH 019/536] Update OwickiGriesConstruction.java OG Construction, places formula without negated places. --- .../concurrency/OwickiGriesConstruction.java | 142 +++++++++++++----- 1 file changed, 106 insertions(+), 36 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java index c8763b77f74..e89e0086412 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java @@ -25,25 +25,37 @@ */ package de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; +import de.uni_freiburg.informatik.ultimate.automata.petrinet.ITransition; import de.uni_freiburg.informatik.ultimate.automata.petrinet.Marking; import de.uni_freiburg.informatik.ultimate.core.model.services.IUltimateServiceProvider; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.CfgSmtToolkit; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.IIcfgSymbolTable; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IIcfgTransition; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IcfgLocation; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.TransFormulaBuilder; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.TransFormulaUtils; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.UnmodifiableTransFormula; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.variables.IProgramVar; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.variables.ProgramVarUtils; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.BasicPredicateFactory; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; +import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.ManagedScript; import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.SmtSortUtils; -import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.SmtUtils; +import de.uni_freiburg.informatik.ultimate.logic.Script; import de.uni_freiburg.informatik.ultimate.logic.TermVariable; + /** * TODO * @@ -58,31 +70,48 @@ public class OwickiGriesConstruction { private final IPetriNet, PLACE> mNet; private final Map, PLACE>, IPredicate> mFloydHoareAnnotation; - private final OwickiGriesAnnotation, PLACE> mAnnotation; + private final OwickiGriesAnnotation, PLACE> mAnnotation; + private final IUltimateServiceProvider mServices; + private final ManagedScript mManagedScript; + private final Script mScript; private final BasicPredicateFactory mFactory; + private final IIcfgSymbolTable mSymbolTable; + + //Variables for Annotation construction + private final Map mGhostVariables; + private final Map mFormulaMapping; + private final Set mGhostInitAssignment; + private final Map, PLACE>,UnmodifiableTransFormula> mAssignmentMapping; - public OwickiGriesConstruction(IUltimateServiceProvider services, CfgSmtToolkit csToolkit, IPetriNet, PLACE> net, Map, PLACE>, IPredicate> floydHoare) { mNet = net; - mFloydHoareAnnotation = floydHoare; - mFactory = new BasicPredicateFactory(services, csToolkit.getManagedScript(), - csToolkit.getSymbolTable()); + mFloydHoareAnnotation = floydHoare; + mScript = null; + mManagedScript = csToolkit.getManagedScript(); + mSymbolTable = csToolkit.getSymbolTable(); + mServices = services; + mFactory = new BasicPredicateFactory(mServices, mManagedScript, + csToolkit.getSymbolTable()); + + + mGhostVariables = getGhostVariables(); + mFormulaMapping = getFormulaMapping(); + mGhostInitAssignment = getGhostInitAssignment(); + mAssignmentMapping = getAssignmentMapping(); mAnnotation = new OwickiGriesAnnotation<>(); - mAnnotation.mGhostVariables = getGhostVariables(); - mAnnotation.mFormulaMapping = getFormulaMapping(); - //TODO: m.Annotation.mAssignmentMapping = - // mAnnotation.mGhostInitAssignment = getGhostInitAssignment(); + + //TODO: Cambiar esto a mandarlo a Annotation constructor + //TODO: assignment AssignmentMapping = + // TODO Code to set variables to false. // Similarly for true. - // Use TransformulaUtils.sequentialComposition to combine. - // - // final UnmodifiableTransFormula setToFalse = - // TransFormulaBuilder.constructAssignment(new ArrayList<>(variables.values()), - // Collections.nCopies(variables.size(), script.term("false")), mSymbolTable, mManagedScript); + + + } /** @@ -107,7 +136,13 @@ public Map getFormulaMapping () { * @return Predicate with conjunction of Ghost variables and predicate of marking */ private IPredicate getMarkingPredicate(PLACE place, Marking, PLACE> marking) { - //TODO: Conjunction of variables not in Marking + //TODO: Conjunction of variables not in Marking + //OptionA: Just Marking shared variables, Which variables?: Find if marking is subset of another. + //If marking if subset of another marking in FHAnn, get variables and set to false from SuperMarking\marking. + //OptionB: Negation of all other Ghost variables not in Marking. + //Complement set: GhostVariables(Only for places/ only construction??)\marking places + + Set terms = new HashSet<>(); //Conjunction of GhostVariables of places in marking marking.forEach(element -> terms.add(getGhostPredicate(element))); terms.add(mFloydHoareAnnotation.get(place)); //Predicate of marking @@ -127,29 +162,33 @@ private IPredicate getGhostPredicate(PLACE place) { * @return Map of GhostVariables to Places */ private Map getGhostVariables(){ - //TODO: Extend IProgramVar?: name, place, type, value. - //TODO: Deal with not place Ghost variables? Map GhostVars = new HashMap(); + int i = 0; for(PLACE place: mNet.getPlaces()) { - IProgramVar var = null; - // TODO Code to create a new boolean variable. - //final TermVariable tv = - // mManagedScript.constructFreshTermVariable("loc_" + i, SmtSortUtils.getBoolSort(mManagedScript)); - //final IProgramVar var = ProgramVarUtils.constructGlobalProgramVarPair(tv.getName(), - // SmtSortUtils.getBoolSort(mManagedScript), mManagedScript, this); - GhostVars.put(place, var);} + final TermVariable tVar = mManagedScript.constructFreshTermVariable + ("np_" + i, SmtSortUtils.getBoolSort(mManagedScript)); + final IProgramVar pVar = ProgramVarUtils.constructGlobalProgramVarPair + (tVar.getName(), SmtSortUtils.getBoolSort(mManagedScript), mManagedScript, this); + GhostVars.put(place, pVar); + i++; + } return GhostVars; } /** * @return set of Initial value assignment of all GhostVariables. + * TODO: result: Set with twoTransFormula, or a single Transformula? + * */ - private Set> getGhostInitAssignment(){ - Set> InitAssignments = new HashSet<>(); - mNet.getInitialPlaces().forEach(place -> InitAssignments.add(getGhostAssignment(place))); //true - Set NotInit = new HashSet<>(mNet.getPlaces()); - NotInit.removeAll(mNet.getInitialPlaces()); - NotInit.forEach(place -> InitAssignments.add(getGhostAssignment(place))); //false + private Set getGhostInitAssignment(){ + Set InitAssignments = new HashSet<>(); + Collection InitGhostVariables = new HashSet<>();//Get all GhostVariables from Initial places + mNet.getInitialPlaces().forEach(place -> + InitGhostVariables.add(mGhostVariables.get(place))); + Collection NotInitGhostVariables = mGhostVariables.values(); + NotInitGhostVariables.removeAll(InitGhostVariables); //Ghost variables of not Initial places + InitAssignments.add(getGhostAssignment(InitGhostVariables, "true")); + InitAssignments.add(getGhostAssignment(NotInitGhostVariables, "false")); return InitAssignments; } @@ -158,11 +197,42 @@ private Set> getGhostInitAssignment(){ * @param place * @return assignment of the place's GhostVariable. */ - private IIcfgTransition getGhostAssignment(PLACE place){ - //TODO: Generate assignment/statement from GhostVar - IIcfgTransition assignment = null; - mAnnotation.mGhostVariables.get(place); - return assignment; + private UnmodifiableTransFormula getGhostAssignment(Collection vars, String term){ + return TransFormulaBuilder.constructAssignment(new ArrayList<>(vars), + Collections.nCopies(vars.size(), mScript.term(term)), mSymbolTable, mManagedScript); + } + + /** + * + * @return Map of Places' Ghost Variables assignments to Transitions + * + */ + + private Map, PLACE>,UnmodifiableTransFormula> getAssignmentMapping(){ + Map,PLACE>,UnmodifiableTransFormula> AssignmentMapping = + new HashMap ,PLACE>, UnmodifiableTransFormula>(); + Collection,PLACE>> Transitions = mNet.getTransitions(); + Transitions.forEach(transition -> AssignmentMapping.put(transition, getTransitionAssignment(transition))); + return AssignmentMapping; + } + + /** + * + * @param transition + * @return Transformula of sequential compositions of GhostVariables assignments. + * GhostVariables of Predecessors Places are assign to false, + * GhostVariables of Successors Places are assign to truel + */ + private UnmodifiableTransFormula getTransitionAssignment(ITransition,PLACE> transition) { + List assignments = new ArrayList<>(); + Set Places = mNet.getPredecessors(transition); + Places.forEach(place -> assignments.add + (getGhostAssignment(Collections.nCopies(1,mGhostVariables.get(place)),"false"))); + Places = mNet.getSuccessors(transition); + Places.forEach(place -> assignments.add + (getGhostAssignment(Collections.nCopies(1,mGhostVariables.get(place)),"true"))); + return TransFormulaUtils.sequentialComposition(null, mServices, mManagedScript, + false, false, false, null, null, assignments); } public OwickiGriesAnnotation, PLACE> getResult() { From fbbd85e5824c8781119f2d84edf6b380b61e1511 Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Thu, 1 Oct 2020 23:15:12 +0200 Subject: [PATCH 020/536] Update OwickiGriesConstruction.java Predicate with negation of all GVariables not in marking. --- .../concurrency/OwickiGriesConstruction.java | 51 ++++++++++++------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java index e89e0086412..62f38a3dc35 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java @@ -34,6 +34,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; import de.uni_freiburg.informatik.ultimate.automata.petrinet.ITransition; @@ -86,7 +87,7 @@ public class OwickiGriesConstruction { public OwickiGriesConstruction(IUltimateServiceProvider services, CfgSmtToolkit csToolkit, IPetriNet, PLACE> net, Map, PLACE>, IPredicate> floydHoare) { - mNet = net; + mNet = net; mFloydHoareAnnotation = floydHoare; mScript = null; mManagedScript = csToolkit.getManagedScript(); @@ -103,15 +104,7 @@ public OwickiGriesConstruction(IUltimateServiceProvider services, CfgSmtToolkit mAnnotation = new OwickiGriesAnnotation<>(); - //TODO: Cambiar esto a mandarlo a Annotation constructor - //TODO: assignment AssignmentMapping = - - - // TODO Code to set variables to false. - // Similarly for true. - - - + //TODO: Cambiar esto a mandarlo a Annotation constructor, notas en Annotation class } /** @@ -142,20 +135,44 @@ private IPredicate getMarkingPredicate(PLACE place, Marking terms = new HashSet<>(); //Conjunction of GhostVariables of places in marking - marking.forEach(element -> terms.add(getGhostPredicate(element))); - terms.add(mFloydHoareAnnotation.get(place)); //Predicate of marking + Set terms = new HashSet<>(); + marking.forEach(element -> terms.add(getGhostPredicate(element))); //GhostVariables of places in marking + terms.addAll(getAllNotMarking(marking)); //OptionB + terms.add(mFloydHoareAnnotation.get(place)); //Predicate of marking return mFactory.and(terms); } + private Set getAllNotMarking(Marking, PLACE> marking){ + //Formula MethodB: GhostVariables of all other places not in marking + Set predicates = new HashSet<>(); + Collection notMarking = mNet.getPlaces(); + notMarking.removeAll(marking.stream().collect(Collectors.toSet())); + notMarking.forEach(element -> predicates.add(mFactory.not(getGhostPredicate(element)))); + return predicates; + } + + private Set getSubsetMarking(Marking, PLACE> marking){ + //Formula MethodB: GhostVariables of all other places not in marking + + Set markPlaces = marking.stream().collect(Collectors.toSet()); + //Get all Supersets of Marking + mFloydHoareAnnotation.keySet().forEach(marking -> ); + Set predicates = new HashSet<>(); + Collection notMarking = mNet.getPlaces(); + notMarking.removeAll(markPlaces); + notMarking.forEach(element -> predicates.add(mFactory.not(getGhostPredicate(element)))); + return predicates; + } + + /** * @param place * @return Predicate place's GhostVariable */ private IPredicate getGhostPredicate(PLACE place) { - //TODO: Value assignment ?? - return mFactory.newPredicate(mAnnotation.mGhostVariables.get(place).getTerm()); + return mFactory.newPredicate(mAnnotation.mGhostVariables.get(place).getTerm()); } /** @@ -219,9 +236,9 @@ private Map, PLACE>,UnmodifiableTransFormula> g /** * * @param transition - * @return Transformula of sequential compositions of GhostVariables assignments. + * @return TransFormula of sequential compositions of GhostVariables assignments. * GhostVariables of Predecessors Places are assign to false, - * GhostVariables of Successors Places are assign to truel + * GhostVariables of Successors Places are assign to true. */ private UnmodifiableTransFormula getTransitionAssignment(ITransition,PLACE> transition) { List assignments = new ArrayList<>(); From 44fb7434af69f1953dd53ec70fe4cebb4fbaf6a4 Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Mon, 5 Oct 2020 00:39:47 +0200 Subject: [PATCH 021/536] OGAnnotation Annotation and Construction complete. Partial Inductive check. --- .../concurrency/OwickiGriesAnnotation.java | 61 ++++++++-- .../concurrency/OwickiGriesConstruction.java | 105 ++++++++++++------ .../concurrency/OwickiGriesValidityCheck.java | 77 ++++++++++++- 3 files changed, 197 insertions(+), 46 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java index 68db7b5d94a..7587d294dbe 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java @@ -28,9 +28,11 @@ import java.util.Map; import java.util.Set; +import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; import de.uni_freiburg.informatik.ultimate.automata.petrinet.ITransition; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IIcfgTransition; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IcfgLocation; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.UnmodifiableTransFormula; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.variables.IProgramVar; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; @@ -45,43 +47,82 @@ */ public class OwickiGriesAnnotation { - // Petri net //TODO: Still is this PetriNet needed here? - //protected IPetriNet mPetriNet; + //Petri net + private final IPetriNet mPetriNet; /** * Omega: maps Predicate -> Place */ - // TODO These fields should be private final; and set in the constructor; and there should be getter methods - protected Map mFormulaMapping; + private final Map mFormulaMapping; /** * Gamma: maps GhostAssignment -> transition */ - protected Map, LETTER> mAssignmentMapping; + private final Map, LETTER> mAssignmentMapping; /** * VGhost: maps Ghost Variables to set */ - protected Map mGhostVariables; + //TODO: Map or Set? Map might be only needed for Construction + private final Set mGhostVariables; /** * rho(VGhost): set of predicate value -> GhostVariables */ //protected Map,LETTER> mGhostAssignment; - protected Set> mGhostAssignment; + private final Map,UnmodifiableTransFormula> mGhostInitAssignment; public OwickiGriesAnnotation() { - //mPetriNet = null; + mPetriNet = null; mFormulaMapping = null; mAssignmentMapping = null; mGhostVariables = null; - mGhostAssignment = null; + mGhostInitAssignment = null; } - + + /** + * Constructor + * @param FormulaMapping + * @param AssignmentMapping + * @param GhostVariables + * @param GhostInitAssignment + * @param net + */ + public OwickiGriesAnnotation + (Map FormulaMapping, Map, LETTER> AssignmentMapping, + Set GhostVariables, Map,UnmodifiableTransFormula> GhostInitAssignment, IPetriNet net) { + mFormulaMapping = FormulaMapping; + mAssignmentMapping = AssignmentMapping; + mGhostVariables = GhostVariables; + mGhostInitAssignment = GhostInitAssignment; + mPetriNet = net; + } + + public Map getFormulaMapping() { + return mFormulaMapping; + } + + public Map, LETTER> getAssignmentMapping(){ + return mAssignmentMapping; + } + + public Set GhostVariables(){ + return mGhostVariables; + } + + public Map,UnmodifiableTransFormula> getGhostAssignment(){ + return mGhostInitAssignment; + } + + public IPetriNet getPetriNet(){ + return mPetriNet; + } + //TODO: define OGAnnotation Size public int getSize() { // ... return 0; } + } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java index 62f38a3dc35..2ff2583b133 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java @@ -80,7 +80,8 @@ public class OwickiGriesConstruction { //Variables for Annotation construction private final Map mGhostVariables; - private final Map mFormulaMapping; + private final Map mFormulaMappingD; + private final Map mFormulaMappingI; private final Set mGhostInitAssignment; private final Map, PLACE>,UnmodifiableTransFormula> mAssignmentMapping; @@ -94,58 +95,88 @@ public OwickiGriesConstruction(IUltimateServiceProvider services, CfgSmtToolkit mSymbolTable = csToolkit.getSymbolTable(); mServices = services; mFactory = new BasicPredicateFactory(mServices, mManagedScript, - csToolkit.getSymbolTable()); - + csToolkit.getSymbolTable()); mGhostVariables = getGhostVariables(); - mFormulaMapping = getFormulaMapping(); + mFormulaMappingD = getFormulaMappingD(); + mFormulaMappingI = getFormulaMappingI(); mGhostInitAssignment = getGhostInitAssignment(); - mAssignmentMapping = getAssignmentMapping(); + mAssignmentMapping = getAssignmentMapping(); + //TODO: call other constructor. mAnnotation = new OwickiGriesAnnotation<>(); - - //TODO: Cambiar esto a mandarlo a Annotation constructor, notas en Annotation class + } /** * Predicate: disjunction of Markings predicate. - * Markings predicate: Conjunction of GhostVariable and FH predicate. + * Markings predicate: Conjunction of All GhostVariable and FH predicate. * @return a Map with a predicate for each place in Net. */ - public Map getFormulaMapping () { + public Map getFormulaMappingD() { Map Mapping = new HashMap(); for (PLACE place: mNet.getPlaces()) { Set Clauses = new HashSet<>(); mFloydHoareAnnotation.forEach((key,value)-> { if(mFloydHoareAnnotation.containsKey(place)) { - Clauses.add(getMarkingPredicate(place, key));}}); + Clauses.add(getMarkingPredicateD(place, key));}}); Mapping.put(place, mFactory.or(Clauses)); } return Mapping; } + /** + * Predicate: Implication of Markings predicate. + * Markings predicate: Conjunction of All GhostVariable and FH predicate. + * @return a Map with a predicate for each place in Net. + */ + public Map getFormulaMappingI () { + Map Mapping = new HashMap(); + for (PLACE place: mNet.getPlaces()) { + Set Clauses = new HashSet<>(); + Clauses.add(getGhostPredicate(place)); //place's GhostVariable + mFloydHoareAnnotation.forEach((key,value)-> { //get implication + if(mFloydHoareAnnotation.containsKey(place)) { + Clauses.add(getMarkingPredicateI(place, key));}}); + Mapping.put(place, mFactory.and(Clauses)); } + return Mapping; + } + /** * @param place * @param marking * @return Predicate with conjunction of Ghost variables and predicate of marking */ - private IPredicate getMarkingPredicate(PLACE place, Marking, PLACE> marking) { - //TODO: Conjunction of variables not in Marking - //OptionA: Just Marking shared variables, Which variables?: Find if marking is subset of another. - //If marking if subset of another marking in FHAnn, get variables and set to false from SuperMarking\marking. - //OptionB: Negation of all other Ghost variables not in Marking. - //Complement set: GhostVariables(Only for places/ only construction??)\marking places - - //TODO:Formula Type: Conjunction and Implication - + private IPredicate getMarkingPredicateD(PLACE place, Marking, PLACE> marking) { + //TODO:Formula Type: Conjunction and Implication Set terms = new HashSet<>(); marking.forEach(element -> terms.add(getGhostPredicate(element))); //GhostVariables of places in marking - terms.addAll(getAllNotMarking(marking)); //OptionB + terms.addAll(getAllNotMarking(marking)); //OptionB: getAllNotMarking; OptionA: getSubsetMarking; terms.add(mFloydHoareAnnotation.get(place)); //Predicate of marking return mFactory.and(terms); } + /** + * @param place + * @param marking + * @return Predicate with implication of Ghost variables and predicate of marking + */ + private IPredicate getMarkingPredicateI(PLACE place, Marking, PLACE> marking) { + //TODO://Change return to Implication of other places and marking predicate. + Set terms = new HashSet<>(), clauses = new HashSet<>(); //other places in in Marking with place + marking.forEach(element -> { + if(element != place) { //Conjunction of other places' GhostVariables + terms.add(getGhostPredicate(element));}}); + clauses.add(mFactory.and(terms)); + clauses.add(mFloydHoareAnnotation.get(place)); //marking predicate + return mFactory.and(terms); + } + + /** + * + * @param marking + * @return Formula MethodB:Predicate with GhostVariables of all other places not in marking + */ private Set getAllNotMarking(Marking, PLACE> marking){ - //Formula MethodB: GhostVariables of all other places not in marking Set predicates = new HashSet<>(); Collection notMarking = mNet.getPlaces(); notMarking.removeAll(marking.stream().collect(Collectors.toSet())); @@ -153,26 +184,37 @@ private Set getAllNotMarking(Marking, PLACE> ma return predicates; } + /** + * + * @param marking + * @return Formula MethodA: GhostVariables if marking is subset of other marking + */ private Set getSubsetMarking(Marking, PLACE> marking){ - //Formula MethodB: GhostVariables of all other places not in marking - - Set markPlaces = marking.stream().collect(Collectors.toSet()); - //Get all Supersets of Marking - mFloydHoareAnnotation.keySet().forEach(marking -> ); - Set predicates = new HashSet<>(); - Collection notMarking = mNet.getPlaces(); - notMarking.removeAll(markPlaces); + Set markPlaces = marking.stream().collect(Collectors.toSet()); + Set, PLACE>> Markings = mFloydHoareAnnotation.keySet(); + Collection notMarking = new HashSet<>(); + Markings.forEach(otherMarking -> notMarking.addAll(getSupPlaces(otherMarking, markPlaces))); + Set predicates = new HashSet<>(); notMarking.forEach(element -> predicates.add(mFactory.not(getGhostPredicate(element)))); return predicates; } + private Collection getSupPlaces(Marking, PLACE> otherMarking, Set markPlaces){ + Collection SubPlaces = new HashSet<>(); + Set otherPlaces = otherMarking.stream().collect(Collectors.toSet()); + if (otherPlaces.containsAll(markPlaces)) { + otherPlaces.removeAll(markPlaces); + SubPlaces.addAll(otherPlaces);} + return SubPlaces; + } + /** * @param place * @return Predicate place's GhostVariable */ private IPredicate getGhostPredicate(PLACE place) { - return mFactory.newPredicate(mAnnotation.mGhostVariables.get(place).getTerm()); + return mFactory.newPredicate(mGhostVariables.get(place).getTerm()); } /** @@ -223,8 +265,7 @@ private UnmodifiableTransFormula getGhostAssignment(Collection vars * * @return Map of Places' Ghost Variables assignments to Transitions * - */ - + */ private Map, PLACE>,UnmodifiableTransFormula> getAssignmentMapping(){ Map,PLACE>,UnmodifiableTransFormula> AssignmentMapping = new HashMap ,PLACE>, UnmodifiableTransFormula>(); diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java index 20469b7629f..120b15e7fdb 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java @@ -25,12 +25,25 @@ */ package de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency; +import java.util.List; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Set; + +import de.uni_freiburg.informatik.ultimate.automata.petrinet.ITransition; import de.uni_freiburg.informatik.ultimate.core.model.services.IUltimateServiceProvider; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.CfgSmtToolkit; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.BasicInternalAction; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IAction; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IInternalAction; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.TransFormulaUtils; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.UnmodifiableTransFormula; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.hoaretriple.IHoareTripleChecker; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.hoaretriple.MonolithicHoareTripleChecker; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.BasicPredicateFactory; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; +import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.ManagedScript; +import de.uni_freiburg.informatik.ultimate.plugins.source.automatascriptparser.AST.TransitionListAST; /** * TODO @@ -42,24 +55,80 @@ * @param */ public class OwickiGriesValidityCheck { + private final IUltimateServiceProvider mServices; + private final ManagedScript mManagedScript; + private final boolean mIsInductive; private final boolean mIsInterferenceFree; + private final OwickiGriesAnnotation mAnnotation; + private final Collection> mTransitions; private final IHoareTripleChecker mHoareTripleChecker; private final BasicPredicateFactory mPredicateFactory; + public OwickiGriesValidityCheck(IUltimateServiceProvider services, CfgSmtToolkit csToolkit, OwickiGriesAnnotation annotation) { - mPredicateFactory = new BasicPredicateFactory(services, csToolkit.getManagedScript(), + mServices = services; + mManagedScript = csToolkit.getManagedScript(); + mAnnotation = annotation; + mPredicateFactory = new BasicPredicateFactory(services, mManagedScript, csToolkit.getSymbolTable()); + mHoareTripleChecker = new MonolithicHoareTripleChecker(csToolkit); - + mTransitions = mAnnotation.getPetriNet().getTransitions(); + // TODO Use mPredicateFactory.and(preds) + //!!!!! Check a Hoare Triple per transition with the conjunction of each place pred? + //-> Yes, enabled transition if all places with marking and all its formulas should hold. X/ // TODO Use BasicInternalAction to create an IInternalAction ("act" below) from ghost assignments // TODO Use mHoareTripleChecker.checkInternal(pre, act, succ) - mIsInductive = false; // TODO - mIsInterferenceFree = false; // TODO + mIsInductive = checkInductivity(); // TODO: finish predicates of Pred and Succ + mIsInterferenceFree = checkInterference(); // TODO + } + + private boolean checkInductivity() { + //TODO: check this line code + if(mTransitions.stream().filter(transition -> + !getTransitionInd(transition)).count() >= 1) + {return false;} + return true; + } + + private boolean getTransitionInd(ITransition Transition) { + Set Predecessors = mAnnotation.getPetriNet().getPredecessors(Transition); + if (Predecessors.stream().filter(pred -> + !checkTripleInd(Transition, pred)).count() >= 1) return false; + return true; + } + private boolean checkTripleInd(ITransition Transition, PLACE Predecessor) { + Set Succesors = mAnnotation.getPetriNet().getSuccessors(Transition); + if (Succesors.stream().filter(succ -> !getHoareTripleVal(Transition, Predecessor, succ)).count() >= 1) return false; + return true; + } + + private boolean getHoareTripleVal(ITransition Transition, PLACE Predecessor, PLACE Successor) { + //TODO: replace nulls with terms from PLACE Predecessor and Successor -> + //Find where is the the formula "assigned" to Place in PetriNet? + IPredicate Pred = mPredicateFactory.newPredicate(null); + IPredicate Succ = mPredicateFactory.newPredicate(null); + List actions = new ArrayList<>(); + actions.add((UnmodifiableTransFormula) Transition.getSymbol()); + actions.add((UnmodifiableTransFormula) mAnnotation.getAssignmentMapping().get(Transition)); + IInternalAction Act = new BasicInternalAction + (null, null, TransFormulaUtils.sequentialComposition + (null, mServices, mManagedScript,false, false, false, null, null, actions)); + mHoareTripleChecker.checkInternal(Pred, Act, Succ); + return false; + } + + + private boolean checkInterference() { + //Check Interference Freedom of each transition + //For each transition -> find the coenabled transition + //Check definition for pred-tran-succ to check (triples) + return false; } public boolean isValid() { From e1ced7a8465223f49265f3723019916cd53bae96 Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Mon, 5 Oct 2020 10:40:00 +0200 Subject: [PATCH 022/536] Update OwickiGriesValidityCheck.java --- .../concurrency/OwickiGriesValidityCheck.java | 80 ++++++++++++------- 1 file changed, 52 insertions(+), 28 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java index 120b15e7fdb..ab3c1ae8fa8 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java @@ -28,6 +28,7 @@ import java.util.List; import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; import java.util.Set; import de.uni_freiburg.informatik.ultimate.automata.petrinet.ITransition; @@ -43,7 +44,7 @@ import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.BasicPredicateFactory; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.ManagedScript; -import de.uni_freiburg.informatik.ultimate.plugins.source.automatascriptparser.AST.TransitionListAST; +import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.IncrementalPlicationChecker.Validity; /** * TODO @@ -76,13 +77,7 @@ public OwickiGriesValidityCheck(IUltimateServiceProvider services, CfgSmtToolkit csToolkit.getSymbolTable()); mHoareTripleChecker = new MonolithicHoareTripleChecker(csToolkit); - mTransitions = mAnnotation.getPetriNet().getTransitions(); - - // TODO Use mPredicateFactory.and(preds) - //!!!!! Check a Hoare Triple per transition with the conjunction of each place pred? - //-> Yes, enabled transition if all places with marking and all its formulas should hold. X/ - // TODO Use BasicInternalAction to create an IInternalAction ("act" below) from ghost assignments - // TODO Use mHoareTripleChecker.checkInternal(pre, act, succ) + mTransitions = mAnnotation.getPetriNet().getTransitions(); mIsInductive = checkInductivity(); // TODO: finish predicates of Pred and Succ mIsInterferenceFree = checkInterference(); // TODO @@ -91,37 +86,66 @@ public OwickiGriesValidityCheck(IUltimateServiceProvider services, CfgSmtToolkit private boolean checkInductivity() { //TODO: check this line code if(mTransitions.stream().filter(transition -> - !getTransitionInd(transition)).count() >= 1) + !getTransitionInductivity(transition)).count() >= 1) {return false;} return true; } - private boolean getTransitionInd(ITransition Transition) { - Set Predecessors = mAnnotation.getPetriNet().getPredecessors(Transition); - if (Predecessors.stream().filter(pred -> - !checkTripleInd(Transition, pred)).count() >= 1) return false; - return true; - } - private boolean checkTripleInd(ITransition Transition, PLACE Predecessor) { - Set Succesors = mAnnotation.getPetriNet().getSuccessors(Transition); - if (Succesors.stream().filter(succ -> !getHoareTripleVal(Transition, Predecessor, succ)).count() >= 1) return false; - return true; - } - - private boolean getHoareTripleVal(ITransition Transition, PLACE Predecessor, PLACE Successor) { - //TODO: replace nulls with terms from PLACE Predecessor and Successor -> - //Find where is the the formula "assigned" to Place in PetriNet? - IPredicate Pred = mPredicateFactory.newPredicate(null); - IPredicate Succ = mPredicateFactory.newPredicate(null); + private boolean getTransitionInductivity(ITransition Transition) { + Set Predecessors = mAnnotation.getPetriNet().getPredecessors(Transition), + Successors = mAnnotation.getPetriNet().getSuccessors(Transition); + Collection preds = new HashSet<>(), succs = new HashSet<>(); + Predecessors.stream().forEach(pred -> preds.add(getPlacePredicate(pred))); + Successors.stream().forEach(succ -> succs.add(getPlacePredicate(succ))); + IPredicate Pred = mPredicateFactory.and(preds), + Succ = mPredicateFactory.and(succs); List actions = new ArrayList<>(); actions.add((UnmodifiableTransFormula) Transition.getSymbol()); actions.add((UnmodifiableTransFormula) mAnnotation.getAssignmentMapping().get(Transition)); IInternalAction Act = new BasicInternalAction (null, null, TransFormulaUtils.sequentialComposition (null, mServices, mManagedScript,false, false, false, null, null, actions)); - mHoareTripleChecker.checkInternal(Pred, Act, Succ); - return false; + return getValidityResult(mHoareTripleChecker.checkInternal(Pred, Act, Succ)); + } + + private IPredicate getPlacePredicate(PLACE Place) { + //TODO: Get Term from Place and replace null + return mPredicateFactory.newPredicate(null); + } + + private boolean getValidityResult(Validity validity) { + final boolean result; + if (validity == Validity.VALID) { + result = true; + } else { + result = false; + } + return result; } + /* + * private boolean getTransitionInd(ITransition Transition) { + * Set Predecessors = + * mAnnotation.getPetriNet().getPredecessors(Transition); if + * (Predecessors.stream().filter(pred -> !checkTripleInd(Transition, + * pred)).count() >= 1) return false; return true; } private boolean + * checkTripleInd(ITransition Transition, PLACE Predecessor) { + * Set Succesors = mAnnotation.getPetriNet().getSuccessors(Transition); + * if (Succesors.stream().filter(succ -> !getHoareTripleVal(Transition, + * Predecessor, succ)).count() >= 1) return false; return true; } + * + * private boolean getHoareTripleVal(ITransition Transition, + * PLACE Predecessor, PLACE Successor) { //TODO: replace nulls with terms from + * PLACE Predecessor and Successor -> //Find where is the the formula "assigned" + * to Place in PetriNet? IPredicate Pred = mPredicateFactory.newPredicate(null); + * IPredicate Succ = mPredicateFactory.newPredicate(null); + * List actions = new ArrayList<>(); + * actions.add((UnmodifiableTransFormula) Transition.getSymbol()); + * actions.add((UnmodifiableTransFormula) + * mAnnotation.getAssignmentMapping().get(Transition)); IInternalAction Act = + * new BasicInternalAction (null, null, TransFormulaUtils.sequentialComposition + * (null, mServices, mManagedScript,false, false, false, null, null, actions)); + * mHoareTripleChecker.checkInternal(Pred, Act, Succ); return false; } + */ private boolean checkInterference() { From 3a1e9b45f820a3141e9aa5838b6ab780179a62d4 Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Mon, 5 Oct 2020 13:18:30 +0200 Subject: [PATCH 023/536] Update OwickiGriesValidityCheck.java --- .../concurrency/OwickiGriesValidityCheck.java | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java index ab3c1ae8fa8..5e20af061e0 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java @@ -150,11 +150,31 @@ private boolean getValidityResult(Validity validity) { private boolean checkInterference() { //Check Interference Freedom of each transition - //For each transition -> find the coenabled transition - //Check definition for pred-tran-succ to check (triples) + //For each transition -> + //Get co-marked places of transition (steps in notes) + //getConjuntion of all transition predecessors' predicate + //getAction: PetriNet Action; GhostAssignments + //For each co-marked place -> getInterferenceFreeHoareTriple + //getPlacesPred + //checkHoareTriple(Conjunction of pred and Pred(comarkplace), Action, ) + return false; } + + /** + * + * @param Pred + * @param Action + * @param place + * @return Validity of Interference Freedom of Transition wrt co-marked place + */ + private boolean getInterferenceFreeTriple(IPredicate Pred, IInternalAction Action, PLACE place) { + + IPredicate placePred = getPlacePredicate(place); + return true; + } + public boolean isValid() { return mIsInductive && mIsInterferenceFree; } From cfa72c9133aa0caf82c93775a942630ae4381054 Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Tue, 6 Oct 2020 19:55:34 +0200 Subject: [PATCH 024/536] Update OwickiGriesValidityCheck.java --- .../concurrency/OwickiGriesValidityCheck.java | 118 +++++++++--------- 1 file changed, 62 insertions(+), 56 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java index 5e20af061e0..672f5f6d328 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java @@ -26,16 +26,22 @@ package de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency; import java.util.List; +import java.util.Map; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Set; +import java.util.stream.Collector; +import java.util.stream.Collectors; import de.uni_freiburg.informatik.ultimate.automata.petrinet.ITransition; +import de.uni_freiburg.informatik.ultimate.automata.petrinet.Marking; import de.uni_freiburg.informatik.ultimate.core.model.services.IUltimateServiceProvider; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.CfgSmtToolkit; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.BasicInternalAction; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IAction; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IIcfgTransition; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IInternalAction; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.TransFormulaUtils; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.UnmodifiableTransFormula; @@ -62,16 +68,18 @@ public class OwickiGriesValidityCheck { private final boolean mIsInductive; private final boolean mIsInterferenceFree; private final OwickiGriesAnnotation mAnnotation; + private final Map, IPredicate> mFloydHoareAnnotation; private final Collection> mTransitions; private final IHoareTripleChecker mHoareTripleChecker; private final BasicPredicateFactory mPredicateFactory; public OwickiGriesValidityCheck(IUltimateServiceProvider services, CfgSmtToolkit csToolkit, - OwickiGriesAnnotation annotation) { + OwickiGriesAnnotation annotation, Map, IPredicate> FloydHoareAnnotation) { mServices = services; mManagedScript = csToolkit.getManagedScript(); + mFloydHoareAnnotation = FloydHoareAnnotation; mAnnotation = annotation; mPredicateFactory = new BasicPredicateFactory(services, mManagedScript, csToolkit.getSymbolTable()); @@ -79,7 +87,7 @@ public OwickiGriesValidityCheck(IUltimateServiceProvider services, CfgSmtToolkit mHoareTripleChecker = new MonolithicHoareTripleChecker(csToolkit); mTransitions = mAnnotation.getPetriNet().getTransitions(); - mIsInductive = checkInductivity(); // TODO: finish predicates of Pred and Succ + mIsInductive = checkInductivity(); mIsInterferenceFree = checkInterference(); // TODO } @@ -91,26 +99,30 @@ private boolean checkInductivity() { return true; } - private boolean getTransitionInductivity(ITransition Transition) { - Set Predecessors = mAnnotation.getPetriNet().getPredecessors(Transition), - Successors = mAnnotation.getPetriNet().getSuccessors(Transition); - Collection preds = new HashSet<>(), succs = new HashSet<>(); - Predecessors.stream().forEach(pred -> preds.add(getPlacePredicate(pred))); - Successors.stream().forEach(succ -> succs.add(getPlacePredicate(succ))); - IPredicate Pred = mPredicateFactory.and(preds), - Succ = mPredicateFactory.and(succs); - List actions = new ArrayList<>(); - actions.add((UnmodifiableTransFormula) Transition.getSymbol()); - actions.add((UnmodifiableTransFormula) mAnnotation.getAssignmentMapping().get(Transition)); - IInternalAction Act = new BasicInternalAction + private boolean getTransitionInductivity(ITransition Transition) { + return getValidityResult(mHoareTripleChecker.checkInternal + (getConjunctionPredicate(mAnnotation.getPetriNet().getPredecessors(Transition)), + getTransitionSeqAction(Transition), + getConjunctionPredicate(mAnnotation.getPetriNet().getSuccessors(Transition)))); + } + + private IPredicate getConjunctionPredicate(Set set) { + Collection predicates = new HashSet<>(); + set.stream().forEach(element -> predicates.add(getPlacePredicate(element))); + return mPredicateFactory.and(predicates); + } + + private IInternalAction getTransitionSeqAction(ITransition Transition) { + List actions = Arrays.asList( + (UnmodifiableTransFormula)Transition.getSymbol(), + (UnmodifiableTransFormula) mAnnotation.getAssignmentMapping().get(Transition) ); + return new BasicInternalAction (null, null, TransFormulaUtils.sequentialComposition - (null, mServices, mManagedScript,false, false, false, null, null, actions)); - return getValidityResult(mHoareTripleChecker.checkInternal(Pred, Act, Succ)); + (null, mServices, mManagedScript,false, false, false, null, null, actions)); } private IPredicate getPlacePredicate(PLACE Place) { - //TODO: Get Term from Place and replace null - return mPredicateFactory.newPredicate(null); + return mAnnotation.getFormulaMapping().get(Place); } private boolean getValidityResult(Validity validity) { @@ -122,43 +134,36 @@ private boolean getValidityResult(Validity validity) { } return result; } - /* - * private boolean getTransitionInd(ITransition Transition) { - * Set Predecessors = - * mAnnotation.getPetriNet().getPredecessors(Transition); if - * (Predecessors.stream().filter(pred -> !checkTripleInd(Transition, - * pred)).count() >= 1) return false; return true; } private boolean - * checkTripleInd(ITransition Transition, PLACE Predecessor) { - * Set Succesors = mAnnotation.getPetriNet().getSuccessors(Transition); - * if (Succesors.stream().filter(succ -> !getHoareTripleVal(Transition, - * Predecessor, succ)).count() >= 1) return false; return true; } - * - * private boolean getHoareTripleVal(ITransition Transition, - * PLACE Predecessor, PLACE Successor) { //TODO: replace nulls with terms from - * PLACE Predecessor and Successor -> //Find where is the the formula "assigned" - * to Place in PetriNet? IPredicate Pred = mPredicateFactory.newPredicate(null); - * IPredicate Succ = mPredicateFactory.newPredicate(null); - * List actions = new ArrayList<>(); - * actions.add((UnmodifiableTransFormula) Transition.getSymbol()); - * actions.add((UnmodifiableTransFormula) - * mAnnotation.getAssignmentMapping().get(Transition)); IInternalAction Act = - * new BasicInternalAction (null, null, TransFormulaUtils.sequentialComposition - * (null, mServices, mManagedScript,false, false, false, null, null, actions)); - * mHoareTripleChecker.checkInternal(Pred, Act, Succ); return false; } - */ - - - private boolean checkInterference() { - //Check Interference Freedom of each transition - //For each transition -> - //Get co-marked places of transition (steps in notes) - //getConjuntion of all transition predecessors' predicate - //getAction: PetriNet Action; GhostAssignments - //For each co-marked place -> getInterferenceFreeHoareTriple - //getPlacesPred - //checkHoareTriple(Conjunction of pred and Pred(comarkplace), Action, ) - return false; + private boolean checkInterference() { + if(mTransitions.stream().filter(transition -> + !getTransitionInterFree(transition)).count() >= 1) + return false; + return true; + } + + private boolean getTransitionInterFree(ITransition Transition) { + IPredicate PredecessorsPred = getConjunctionPredicate(mAnnotation.getPetriNet().getPredecessors(Transition)); + IInternalAction Action = getTransitionSeqAction(Transition); + Set Comarked = getComarkedPlaces(Transition); + if (Comarked.stream().filter(place -> !getInterferenceFreeTriple(PredecessorsPred, Action, place )).count() >= 1) + return false; + return true; + } + + private Set getComarkedPlaces(ITransition Transition){ + Set Predecessors = mAnnotation.getPetriNet().getPredecessors(Transition), + comarked = new HashSet<>(); + //Reachable Markings in which transition is enabled: All predecessors of transition is in Marking + Set> enabledMarkings = + mFloydHoareAnnotation.keySet().stream().filter(marking -> + marking.containsAll(Predecessors)).collect(Collectors.toSet()); + //places in markings + enabledMarkings.stream().forEach(marking -> + comarked.addAll(marking.stream().collect(Collectors.toSet()))); + //places that are not predecessors of transition + comarked.removeAll(Predecessors); + return comarked; } /** @@ -169,9 +174,10 @@ private boolean checkInterference() { * @return Validity of Interference Freedom of Transition wrt co-marked place */ private boolean getInterferenceFreeTriple(IPredicate Pred, IInternalAction Action, PLACE place) { - IPredicate placePred = getPlacePredicate(place); - return true; + List predicate = Arrays.asList(Pred,placePred); / + return getValidityResult(mHoareTripleChecker.checkInternal + (mPredicateFactory.and(predicate), Action, placePred)); } From 352dc23d0f31ebb7dc172932ea1c8fd337308ef6 Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Tue, 6 Oct 2020 23:48:31 +0200 Subject: [PATCH 025/536] Update: OGAnnotation and Construction complete --- .../concurrency/OwickiGriesAnnotation.java | 19 +++++++++++-------- .../concurrency/OwickiGriesConstruction.java | 15 +++++++-------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java index 7587d294dbe..5d962e69369 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java @@ -58,19 +58,19 @@ public class OwickiGriesAnnotation { /** * Gamma: maps GhostAssignment -> transition */ - private final Map, LETTER> mAssignmentMapping; + private final Map, UnmodifiableTransFormula> mAssignmentMapping; /** * VGhost: maps Ghost Variables to set */ //TODO: Map or Set? Map might be only needed for Construction - private final Set mGhostVariables; + private final Map mGhostVariables; /** * rho(VGhost): set of predicate value -> GhostVariables */ //protected Map,LETTER> mGhostAssignment; - private final Map,UnmodifiableTransFormula> mGhostInitAssignment; + private final Set mGhostInitAssignment; public OwickiGriesAnnotation() { mPetriNet = null; @@ -90,8 +90,9 @@ public OwickiGriesAnnotation() { * @param net */ public OwickiGriesAnnotation - (Map FormulaMapping, Map, LETTER> AssignmentMapping, - Set GhostVariables, Map,UnmodifiableTransFormula> GhostInitAssignment, IPetriNet net) { + (Map FormulaMapping, Map, UnmodifiableTransFormula> AssignmentMapping, + Map GhostVariables, Set GhostInitAssignment, + IPetriNet net) { mFormulaMapping = FormulaMapping; mAssignmentMapping = AssignmentMapping; mGhostVariables = GhostVariables; @@ -103,15 +104,15 @@ public Map getFormulaMapping() { return mFormulaMapping; } - public Map, LETTER> getAssignmentMapping(){ + public Map, UnmodifiableTransFormula> getAssignmentMapping(){ return mAssignmentMapping; } - public Set GhostVariables(){ + public Map GhostVariables(){ return mGhostVariables; } - public Map,UnmodifiableTransFormula> getGhostAssignment(){ + public Set getGhostAssignment(){ return mGhostInitAssignment; } @@ -119,6 +120,8 @@ public IPetriNet getPetriNet(){ return mPetriNet; } + + //TODO: define OGAnnotation Size public int getSize() { // ... diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java index 2ff2583b133..191c89e818d 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java @@ -103,9 +103,8 @@ public OwickiGriesConstruction(IUltimateServiceProvider services, CfgSmtToolkit mGhostInitAssignment = getGhostInitAssignment(); mAssignmentMapping = getAssignmentMapping(); - //TODO: call other constructor. - mAnnotation = new OwickiGriesAnnotation<>(); - + mAnnotation = new OwickiGriesAnnotation, PLACE> (mFormulaMappingD, mAssignmentMapping, + mGhostVariables, mGhostInitAssignment, mNet); } /** @@ -150,7 +149,7 @@ private IPredicate getMarkingPredicateD(PLACE place, Marking terms = new HashSet<>(); marking.forEach(element -> terms.add(getGhostPredicate(element))); //GhostVariables of places in marking - terms.addAll(getAllNotMarking(marking)); //OptionB: getAllNotMarking; OptionA: getSubsetMarking; + terms.addAll(getSubsetMarking(marking)); //OptionB: getAllNotMarking; OptionA: getSubsetMarking; terms.add(mFloydHoareAnnotation.get(place)); //Predicate of marking return mFactory.and(terms); } @@ -161,14 +160,14 @@ private IPredicate getMarkingPredicateD(PLACE place, Marking, PLACE> marking) { - //TODO://Change return to Implication of other places and marking predicate. Set terms = new HashSet<>(), clauses = new HashSet<>(); //other places in in Marking with place marking.forEach(element -> { if(element != place) { //Conjunction of other places' GhostVariables - terms.add(getGhostPredicate(element));}}); - clauses.add(mFactory.and(terms)); + terms.add(getGhostPredicate(element));}}); + terms.addAll(getSubsetMarking(marking)); + clauses.add(mFactory.not(mFactory.and(terms))); //(not Conjunction) or markingPred clauses.add(mFloydHoareAnnotation.get(place)); //marking predicate - return mFactory.and(terms); + return mFactory.or(terms); } /** From 4bfcc9244cae3ee81c461d08943a3e875c4f7448 Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Thu, 8 Oct 2020 15:00:42 +0200 Subject: [PATCH 026/536] Update --- .../traceabstraction/BasicCegarLoop.java | 9 ++-- .../concurrency/OwickiGriesConstruction.java | 42 ++++++++++--------- .../concurrency/OwickiGriesValidityCheck.java | 2 +- 3 files changed, 29 insertions(+), 24 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java index fb2aa3e1abe..3ab5ba116f1 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java @@ -119,6 +119,7 @@ import de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder.util.IcfgAngelicProgramExecution; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.automataminimization.AutomataMinimization; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.automataminimization.AutomataMinimization.AutomataMinimizationTimeout; +import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency.OwickiGriesConstruction; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.errorabstraction.ErrorGeneralizationEngine; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.errorlocalization.FlowSensitiveFaultLocalizer; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.interpolantautomata.transitionappender.AbstractInterpolantAutomaton; @@ -1132,7 +1133,7 @@ public IStatisticsDataProvider getCegarLoopBenchmark() { * method called at the end of the cegar loop */ public void finish() { - mCegarLoopBenchmark.stop(CegarLoopStatisticsDefinitions.OverallTime.toString()); + mCegarLoopBenchmark.stop(CegarLoopStatisticsDefinitions.OverallTime.toString()); } public void computeOwickiGries() { @@ -1152,8 +1153,10 @@ public void computeOwickiGries() { } assert !petriFloydHoare.isEmpty(); - - //OwickiGriesAnnotation annotation = OwickiGriesAnnotation.fromFloydHoare(mServices, mCsToolkit, mPetriNet, petriFloydHoare); + + OwickiGriesConstruction construction = new OwickiGriesConstruction + (mServices, mCsToolkit, mPetriNet, petriFloydHoare); + //OwickiGriesAnnotation annotation = OwickiGriesAnnotation.fromFloydHoare(mServices, mCsToolkit, mPetriNet, petriFloydHoare); // TODO: simplify //assert new OwickiGriesValidityCheck(mServices, mCsToolkit, annotation).isValid() : "Invalid Owicki-Gries annotation"; } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java index 191c89e818d..6647e94d70a 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java @@ -42,6 +42,7 @@ import de.uni_freiburg.informatik.ultimate.core.model.services.IUltimateServiceProvider; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.CfgSmtToolkit; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.IIcfgSymbolTable; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IAction; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IIcfgTransition; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IcfgLocation; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.TransFormulaBuilder; @@ -66,12 +67,12 @@ * * @param */ -public class OwickiGriesConstruction { +public class OwickiGriesConstruction { - private final IPetriNet, PLACE> mNet; - private final Map, PLACE>, IPredicate> mFloydHoareAnnotation; + private final IPetriNet mNet; + private final Map, IPredicate> mFloydHoareAnnotation; - private final OwickiGriesAnnotation, PLACE> mAnnotation; + private final OwickiGriesAnnotation mAnnotation; private final IUltimateServiceProvider mServices; private final ManagedScript mManagedScript; private final Script mScript; @@ -83,11 +84,12 @@ public class OwickiGriesConstruction { private final Map mFormulaMappingD; private final Map mFormulaMappingI; private final Set mGhostInitAssignment; - private final Map, PLACE>,UnmodifiableTransFormula> mAssignmentMapping; + private final Map, UnmodifiableTransFormula> mAssignmentMapping; + public OwickiGriesConstruction(IUltimateServiceProvider services, CfgSmtToolkit csToolkit, - IPetriNet, PLACE> net, - Map, PLACE>, IPredicate> floydHoare) { + IPetriNet net, + Map, IPredicate> floydHoare) { mNet = net; mFloydHoareAnnotation = floydHoare; mScript = null; @@ -103,7 +105,7 @@ public OwickiGriesConstruction(IUltimateServiceProvider services, CfgSmtToolkit mGhostInitAssignment = getGhostInitAssignment(); mAssignmentMapping = getAssignmentMapping(); - mAnnotation = new OwickiGriesAnnotation, PLACE> (mFormulaMappingD, mAssignmentMapping, + mAnnotation = new OwickiGriesAnnotation (mFormulaMappingD, mAssignmentMapping, mGhostVariables, mGhostInitAssignment, mNet); } @@ -145,7 +147,7 @@ public Map getFormulaMappingI () { * @param marking * @return Predicate with conjunction of Ghost variables and predicate of marking */ - private IPredicate getMarkingPredicateD(PLACE place, Marking, PLACE> marking) { + private IPredicate getMarkingPredicateD(PLACE place, Marking marking) { //TODO:Formula Type: Conjunction and Implication Set terms = new HashSet<>(); marking.forEach(element -> terms.add(getGhostPredicate(element))); //GhostVariables of places in marking @@ -159,7 +161,7 @@ private IPredicate getMarkingPredicateD(PLACE place, Marking, PLACE> marking) { + private IPredicate getMarkingPredicateI(PLACE place, Marking marking) { Set terms = new HashSet<>(), clauses = new HashSet<>(); //other places in in Marking with place marking.forEach(element -> { if(element != place) { //Conjunction of other places' GhostVariables @@ -175,7 +177,7 @@ private IPredicate getMarkingPredicateI(PLACE place, Marking getAllNotMarking(Marking, PLACE> marking){ + private Set getAllNotMarking(Marking marking){ Set predicates = new HashSet<>(); Collection notMarking = mNet.getPlaces(); notMarking.removeAll(marking.stream().collect(Collectors.toSet())); @@ -188,9 +190,9 @@ private Set getAllNotMarking(Marking, PLACE> ma * @param marking * @return Formula MethodA: GhostVariables if marking is subset of other marking */ - private Set getSubsetMarking(Marking, PLACE> marking){ + private Set getSubsetMarking(Marking marking){ Set markPlaces = marking.stream().collect(Collectors.toSet()); - Set, PLACE>> Markings = mFloydHoareAnnotation.keySet(); + Set> Markings = mFloydHoareAnnotation.keySet(); Collection notMarking = new HashSet<>(); Markings.forEach(otherMarking -> notMarking.addAll(getSupPlaces(otherMarking, markPlaces))); Set predicates = new HashSet<>(); @@ -198,7 +200,7 @@ private Set getSubsetMarking(Marking, PLACE> ma return predicates; } - private Collection getSupPlaces(Marking, PLACE> otherMarking, Set markPlaces){ + private Collection getSupPlaces(Marking otherMarking, Set markPlaces){ Collection SubPlaces = new HashSet<>(); Set otherPlaces = otherMarking.stream().collect(Collectors.toSet()); if (otherPlaces.containsAll(markPlaces)) { @@ -265,10 +267,10 @@ private UnmodifiableTransFormula getGhostAssignment(Collection vars * @return Map of Places' Ghost Variables assignments to Transitions * */ - private Map, PLACE>,UnmodifiableTransFormula> getAssignmentMapping(){ - Map,PLACE>,UnmodifiableTransFormula> AssignmentMapping = - new HashMap ,PLACE>, UnmodifiableTransFormula>(); - Collection,PLACE>> Transitions = mNet.getTransitions(); + private Map,UnmodifiableTransFormula> getAssignmentMapping(){ + Map,UnmodifiableTransFormula> AssignmentMapping = + new HashMap , UnmodifiableTransFormula>(); + Collection> Transitions = mNet.getTransitions(); Transitions.forEach(transition -> AssignmentMapping.put(transition, getTransitionAssignment(transition))); return AssignmentMapping; } @@ -280,7 +282,7 @@ private Map, PLACE>,UnmodifiableTransFormula> g * GhostVariables of Predecessors Places are assign to false, * GhostVariables of Successors Places are assign to true. */ - private UnmodifiableTransFormula getTransitionAssignment(ITransition,PLACE> transition) { + private UnmodifiableTransFormula getTransitionAssignment(ITransition transition) { List assignments = new ArrayList<>(); Set Places = mNet.getPredecessors(transition); Places.forEach(place -> assignments.add @@ -292,7 +294,7 @@ private UnmodifiableTransFormula getTransitionAssignment(ITransition, PLACE> getResult() { + public OwickiGriesAnnotation getResult() { return mAnnotation; } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java index 672f5f6d328..080465c1618 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java @@ -175,7 +175,7 @@ private Set getComarkedPlaces(ITransition Transition){ */ private boolean getInterferenceFreeTriple(IPredicate Pred, IInternalAction Action, PLACE place) { IPredicate placePred = getPlacePredicate(place); - List predicate = Arrays.asList(Pred,placePred); / + List predicate = Arrays.asList(Pred,placePred); return getValidityResult(mHoareTripleChecker.checkInternal (mPredicateFactory.and(predicate), Action, placePred)); } From 7939f39e42d641e69d551a288466d14a88deaabf Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Thu, 8 Oct 2020 15:09:19 +0200 Subject: [PATCH 027/536] Update: Basic Cegar Loop --- .../plugins/generator/traceabstraction/BasicCegarLoop.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java index 3ab5ba116f1..843c60652ee 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java @@ -120,6 +120,7 @@ import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.automataminimization.AutomataMinimization; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.automataminimization.AutomataMinimization.AutomataMinimizationTimeout; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency.OwickiGriesConstruction; +import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency.OwickiGriesValidityCheck; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.errorabstraction.ErrorGeneralizationEngine; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.errorlocalization.FlowSensitiveFaultLocalizer; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.interpolantautomata.transitionappender.AbstractInterpolantAutomaton; @@ -1155,10 +1156,9 @@ public void computeOwickiGries() { assert !petriFloydHoare.isEmpty(); OwickiGriesConstruction construction = new OwickiGriesConstruction - (mServices, mCsToolkit, mPetriNet, petriFloydHoare); - //OwickiGriesAnnotation annotation = OwickiGriesAnnotation.fromFloydHoare(mServices, mCsToolkit, mPetriNet, petriFloydHoare); + (mServices, mCsToolkit, mPetriNet, petriFloydHoare); // TODO: simplify - //assert new OwickiGriesValidityCheck(mServices, mCsToolkit, annotation).isValid() : "Invalid Owicki-Gries annotation"; + assert new OwickiGriesValidityCheck(mServices, mCsToolkit, construction.getResult(), petriFloydHoare).isValid() : "Invalid Owicki-Gries annotation"; } @Override From bab7a7d7367e976ddfb5ccdcce17c95b54f4cfdc Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Sun, 11 Oct 2020 14:01:49 +0200 Subject: [PATCH 028/536] Update OwickiGriesAnnotation.java Change InitGhostAsign to Map --- .../traceabstraction/concurrency/OwickiGriesAnnotation.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java index 5d962e69369..546c5d5a56e 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java @@ -84,17 +84,17 @@ public OwickiGriesAnnotation() { /** * Constructor * @param FormulaMapping - * @param AssignmentMapping + * @param mAssignmentMapping2 * @param GhostVariables * @param GhostInitAssignment * @param net */ public OwickiGriesAnnotation - (Map FormulaMapping, Map, UnmodifiableTransFormula> AssignmentMapping, + (Map FormulaMapping, Map, UnmodifiableTransFormula> mAssignmentMapping2, Map GhostVariables, Set GhostInitAssignment, IPetriNet net) { mFormulaMapping = FormulaMapping; - mAssignmentMapping = AssignmentMapping; + mAssignmentMapping = mAssignmentMapping2; mGhostVariables = GhostVariables; mGhostInitAssignment = GhostInitAssignment; mPetriNet = net; From 971159820d7b52c249d195ccb8baf25f023019f4 Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Mon, 12 Oct 2020 22:54:02 +0200 Subject: [PATCH 029/536] Update OG construction --- .../concurrency/OwickiGriesAnnotation.java | 7 +- .../concurrency/OwickiGriesConstruction.java | 96 ++++++++----------- 2 files changed, 43 insertions(+), 60 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java index 546c5d5a56e..271d8d4831c 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java @@ -35,6 +35,7 @@ import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.UnmodifiableTransFormula; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.variables.IProgramVar; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; +import de.uni_freiburg.informatik.ultimate.logic.Term; /** * TODO @@ -70,7 +71,7 @@ public class OwickiGriesAnnotation { * rho(VGhost): set of predicate value -> GhostVariables */ //protected Map,LETTER> mGhostAssignment; - private final Set mGhostInitAssignment; + private final Map mGhostInitAssignment; public OwickiGriesAnnotation() { mPetriNet = null; @@ -91,7 +92,7 @@ public OwickiGriesAnnotation() { */ public OwickiGriesAnnotation (Map FormulaMapping, Map, UnmodifiableTransFormula> mAssignmentMapping2, - Map GhostVariables, Set GhostInitAssignment, + Map GhostVariables, Map GhostInitAssignment, IPetriNet net) { mFormulaMapping = FormulaMapping; mAssignmentMapping = mAssignmentMapping2; @@ -112,7 +113,7 @@ public Map GhostVariables(){ return mGhostVariables; } - public Set getGhostAssignment(){ + public Map getGhostAssignment(){ return mGhostInitAssignment; } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java index 6647e94d70a..dd7a52b4537 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java @@ -34,12 +34,17 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; import de.uni_freiburg.informatik.ultimate.automata.petrinet.ITransition; import de.uni_freiburg.informatik.ultimate.automata.petrinet.Marking; +import de.uni_freiburg.informatik.ultimate.boogie.ExpressionFactory; +import de.uni_freiburg.informatik.ultimate.boogie.ast.BooleanLiteral; +import de.uni_freiburg.informatik.ultimate.core.model.services.ILogger; import de.uni_freiburg.informatik.ultimate.core.model.services.IUltimateServiceProvider; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.ModelCheckerUtils; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.CfgSmtToolkit; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.IIcfgSymbolTable; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IAction; @@ -54,7 +59,10 @@ import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.ManagedScript; import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.SmtSortUtils; +import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.SmtUtils.SimplificationTechnique; +import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.SmtUtils.XnfConversionTechnique; import de.uni_freiburg.informatik.ultimate.logic.Script; +import de.uni_freiburg.informatik.ultimate.logic.Term; import de.uni_freiburg.informatik.ultimate.logic.TermVariable; @@ -77,13 +85,16 @@ public class OwickiGriesConstruction { private final ManagedScript mManagedScript; private final Script mScript; private final BasicPredicateFactory mFactory; + private final ILogger mLogger; private final IIcfgSymbolTable mSymbolTable; + private final static SimplificationTechnique mSimplificationTechnique = SimplificationTechnique.SIMPLIFY_DDA; + private final static XnfConversionTechnique mXnfConversionTechnique = XnfConversionTechnique.BOTTOM_UP_WITH_LOCAL_SIMPLIFICATION; + //Variables for Annotation construction private final Map mGhostVariables; private final Map mFormulaMappingD; - private final Map mFormulaMappingI; - private final Set mGhostInitAssignment; + private final Map mGhostInitAssignment; private final Map, UnmodifiableTransFormula> mAssignmentMapping; @@ -92,18 +103,18 @@ public OwickiGriesConstruction(IUltimateServiceProvider services, CfgSmtToolkit Map, IPredicate> floydHoare) { mNet = net; mFloydHoareAnnotation = floydHoare; - mScript = null; + mScript = csToolkit.getManagedScript().getScript(); mManagedScript = csToolkit.getManagedScript(); mSymbolTable = csToolkit.getSymbolTable(); mServices = services; + mLogger = services.getLoggingService().getLogger(ModelCheckerUtils.PLUGIN_ID); mFactory = new BasicPredicateFactory(mServices, mManagedScript, csToolkit.getSymbolTable()); mGhostVariables = getGhostVariables(); - mFormulaMappingD = getFormulaMappingD(); - mFormulaMappingI = getFormulaMappingI(); + mFormulaMappingD = getFormulaMapping(); + mAssignmentMapping = getAssignmentMapping(); mGhostInitAssignment = getGhostInitAssignment(); - mAssignmentMapping = getAssignmentMapping(); mAnnotation = new OwickiGriesAnnotation (mFormulaMappingD, mAssignmentMapping, mGhostVariables, mGhostInitAssignment, mNet); @@ -114,40 +125,24 @@ public OwickiGriesConstruction(IUltimateServiceProvider services, CfgSmtToolkit * Markings predicate: Conjunction of All GhostVariable and FH predicate. * @return a Map with a predicate for each place in Net. */ - public Map getFormulaMappingD() { + public Map getFormulaMapping() { Map Mapping = new HashMap(); for (PLACE place: mNet.getPlaces()) { Set Clauses = new HashSet<>(); mFloydHoareAnnotation.forEach((key,value)-> { if(mFloydHoareAnnotation.containsKey(place)) { - Clauses.add(getMarkingPredicateD(place, key));}}); + Clauses.add(getMarkingPredicate(place, key));}}); Mapping.put(place, mFactory.or(Clauses)); } return Mapping; } - /** - * Predicate: Implication of Markings predicate. - * Markings predicate: Conjunction of All GhostVariable and FH predicate. - * @return a Map with a predicate for each place in Net. - */ - public Map getFormulaMappingI () { - Map Mapping = new HashMap(); - for (PLACE place: mNet.getPlaces()) { - Set Clauses = new HashSet<>(); - Clauses.add(getGhostPredicate(place)); //place's GhostVariable - mFloydHoareAnnotation.forEach((key,value)-> { //get implication - if(mFloydHoareAnnotation.containsKey(place)) { - Clauses.add(getMarkingPredicateI(place, key));}}); - Mapping.put(place, mFactory.and(Clauses)); } - return Mapping; - } /** * @param place * @param marking * @return Predicate with conjunction of Ghost variables and predicate of marking */ - private IPredicate getMarkingPredicateD(PLACE place, Marking marking) { + private IPredicate getMarkingPredicate(PLACE place, Marking marking) { //TODO:Formula Type: Conjunction and Implication Set terms = new HashSet<>(); marking.forEach(element -> terms.add(getGhostPredicate(element))); //GhostVariables of places in marking @@ -155,23 +150,7 @@ private IPredicate getMarkingPredicateD(PLACE place, Marking mar terms.add(mFloydHoareAnnotation.get(place)); //Predicate of marking return mFactory.and(terms); } - - /** - * @param place - * @param marking - * @return Predicate with implication of Ghost variables and predicate of marking - */ - private IPredicate getMarkingPredicateI(PLACE place, Marking marking) { - Set terms = new HashSet<>(), clauses = new HashSet<>(); //other places in in Marking with place - marking.forEach(element -> { - if(element != place) { //Conjunction of other places' GhostVariables - terms.add(getGhostPredicate(element));}}); - terms.addAll(getSubsetMarking(marking)); - clauses.add(mFactory.not(mFactory.and(terms))); //(not Conjunction) or markingPred - clauses.add(mFloydHoareAnnotation.get(place)); //marking predicate - return mFactory.or(terms); - } - + /** * * @param marking @@ -224,7 +203,8 @@ private IPredicate getGhostPredicate(PLACE place) { private Map getGhostVariables(){ Map GhostVars = new HashMap(); int i = 0; - for(PLACE place: mNet.getPlaces()) { + Collection places = mNet.getPlaces(); + for(PLACE place: places) { final TermVariable tVar = mManagedScript.constructFreshTermVariable ("np_" + i, SmtSortUtils.getBoolSort(mManagedScript)); final IProgramVar pVar = ProgramVarUtils.constructGlobalProgramVarPair @@ -237,18 +217,18 @@ private Map getGhostVariables(){ /** * @return set of Initial value assignment of all GhostVariables. - * TODO: result: Set with twoTransFormula, or a single Transformula? * */ - private Set getGhostInitAssignment(){ - Set InitAssignments = new HashSet<>(); - Collection InitGhostVariables = new HashSet<>();//Get all GhostVariables from Initial places - mNet.getInitialPlaces().forEach(place -> - InitGhostVariables.add(mGhostVariables.get(place))); - Collection NotInitGhostVariables = mGhostVariables.values(); - NotInitGhostVariables.removeAll(InitGhostVariables); //Ghost variables of not Initial places - InitAssignments.add(getGhostAssignment(InitGhostVariables, "true")); - InitAssignments.add(getGhostAssignment(NotInitGhostVariables, "false")); + private Map getGhostInitAssignment(){ + HashMap InitAssignments = new HashMap(); + Set InitGhostVariables = new HashSet();//Get all GhostVariables from Initial places + Set Places = mNet.getInitialPlaces(); + Places.forEach(place -> + InitGhostVariables.add(mGhostVariables.get(place))); + InitGhostVariables.stream().forEach(variable -> InitAssignments.put(variable, mScript.term("true"))); + Collection NotInitGhostVariables = mGhostVariables.values(); + NotInitGhostVariables.removeAll(InitGhostVariables);//Ghost variables of not Initial places + NotInitGhostVariables.forEach(variable -> InitAssignments.put(variable, mScript.term("false"))); return InitAssignments; } @@ -285,13 +265,15 @@ private Map,UnmodifiableTransFormula> getAssignmentMa private UnmodifiableTransFormula getTransitionAssignment(ITransition transition) { List assignments = new ArrayList<>(); Set Places = mNet.getPredecessors(transition); - Places.forEach(place -> assignments.add - (getGhostAssignment(Collections.nCopies(1,mGhostVariables.get(place)),"false"))); + Places.forEach(place -> { + IProgramVar var = mGhostVariables.get(place); + assignments.add + (getGhostAssignment(Collections.nCopies(1,var),"false"));}); Places = mNet.getSuccessors(transition); Places.forEach(place -> assignments.add (getGhostAssignment(Collections.nCopies(1,mGhostVariables.get(place)),"true"))); - return TransFormulaUtils.sequentialComposition(null, mServices, mManagedScript, - false, false, false, null, null, assignments); + return TransFormulaUtils.sequentialComposition(mLogger, mServices, mManagedScript, + false, false, false, mXnfConversionTechnique, mSimplificationTechnique, assignments); } public OwickiGriesAnnotation getResult() { From 3ed6af7c8f7cd12c04a9d1935bdda5e338c70635 Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Tue, 13 Oct 2020 12:43:58 +0200 Subject: [PATCH 030/536] changes to O/G --- .../traceabstraction/BasicCegarLoop.java | 12 +- .../concurrency/OwickiGriesAnnotation.java | 77 +++-- .../concurrency/OwickiGriesConstruction.java | 305 ++++++++++-------- .../concurrency/OwickiGriesValidityCheck.java | 156 +++++---- 4 files changed, 281 insertions(+), 269 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java index 843c60652ee..b07bb8b9e6a 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java @@ -1143,7 +1143,7 @@ public void computeOwickiGries() { throw new AssertionError("Owicki-Gries does currently not support Petri net LBE."); } - Map floydHoare = computeHoareAnnotationComposer().getLoc2hoare(); + final Map floydHoare = computeHoareAnnotationComposer().getLoc2hoare(); final Map, IPredicate> petriFloydHoare = new HashMap<>(); for (final Map.Entry, IPredicate> entry : mMarking2State.entrySet()) { @@ -1154,11 +1154,13 @@ public void computeOwickiGries() { } assert !petriFloydHoare.isEmpty(); - - OwickiGriesConstruction construction = new OwickiGriesConstruction - (mServices, mCsToolkit, mPetriNet, petriFloydHoare); + + final OwickiGriesConstruction construction = + new OwickiGriesConstruction<>(mServices, mCsToolkit, mPetriNet, petriFloydHoare); // TODO: simplify - assert new OwickiGriesValidityCheck(mServices, mCsToolkit, construction.getResult(), petriFloydHoare).isValid() : "Invalid Owicki-Gries annotation"; + final OwickiGriesValidityCheck check = new OwickiGriesValidityCheck<>(mServices, mCsToolkit, + construction.getResult(), construction.getCoMarkedPlaces()); + assert check.isValid() : "Invalid Owicki-Gries annotation"; } @Override diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java index 271d8d4831c..fa43ad7ad06 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java @@ -26,12 +26,10 @@ package de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency; import java.util.Map; -import java.util.Set; import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; import de.uni_freiburg.informatik.ultimate.automata.petrinet.ITransition; -import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IIcfgTransition; -import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IcfgLocation; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.IIcfgSymbolTable; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.UnmodifiableTransFormula; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.variables.IProgramVar; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; @@ -39,7 +37,7 @@ /** * TODO - * + * * @author Dominik Klumpp (klumpp@informatik.uni-freiburg.de) * @author Miriam Lagunes (miriam.lagunes@students.uni-freiburg.de) * @@ -48,85 +46,82 @@ */ public class OwickiGriesAnnotation { - //Petri net + // Petri net private final IPetriNet mPetriNet; /** * Omega: maps Predicate -> Place */ private final Map mFormulaMapping; - + /** * Gamma: maps GhostAssignment -> transition */ - private final Map, UnmodifiableTransFormula> mAssignmentMapping; - + private final Map, UnmodifiableTransFormula> mAssignmentMapping; + + private final IIcfgSymbolTable mSymbolTable; + /** * VGhost: maps Ghost Variables to set - */ - //TODO: Map or Set? Map might be only needed for Construction - private final Map mGhostVariables; - + */ + // TODO: Map or Set? Map might be only needed for Construction + private final Map mGhostVariables; + /** - * rho(VGhost): set of predicate value -> GhostVariables + * rho(VGhost): set of predicate value -> GhostVariables */ - //protected Map,LETTER> mGhostAssignment; + // protected Map,LETTER> mGhostAssignment; private final Map mGhostInitAssignment; - public OwickiGriesAnnotation() { - mPetriNet = null; - mFormulaMapping = null; - mAssignmentMapping = null; - mGhostVariables = null; - mGhostInitAssignment = null; - - } - /** * Constructor + * * @param FormulaMapping * @param mAssignmentMapping2 * @param GhostVariables * @param GhostInitAssignment * @param net */ - public OwickiGriesAnnotation - (Map FormulaMapping, Map, UnmodifiableTransFormula> mAssignmentMapping2, - Map GhostVariables, Map GhostInitAssignment, - IPetriNet net) { + public OwickiGriesAnnotation(final Map FormulaMapping, + final Map, UnmodifiableTransFormula> mAssignmentMapping2, + final Map GhostVariables, final Map GhostInitAssignment, + final IPetriNet net, final IIcfgSymbolTable symbolTable) { mFormulaMapping = FormulaMapping; mAssignmentMapping = mAssignmentMapping2; mGhostVariables = GhostVariables; mGhostInitAssignment = GhostInitAssignment; mPetriNet = net; + mSymbolTable = symbolTable; } - + public Map getFormulaMapping() { return mFormulaMapping; } - - public Map, UnmodifiableTransFormula> getAssignmentMapping(){ + + public Map, UnmodifiableTransFormula> getAssignmentMapping() { return mAssignmentMapping; } - - public Map GhostVariables(){ + + public Map GhostVariables() { return mGhostVariables; } - - public Map getGhostAssignment(){ + + public Map getGhostAssignment() { return mGhostInitAssignment; } - - public IPetriNet getPetriNet(){ + + public IPetriNet getPetriNet() { return mPetriNet; } - - - - //TODO: define OGAnnotation Size + + public IIcfgSymbolTable getSymbolTable() { + return mSymbolTable; + } + + // TODO: define OGAnnotation Size public int getSize() { // ... return 0; } - + } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java index dd7a52b4537..7d82bfe5bb8 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java @@ -25,7 +25,6 @@ */ package de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -34,21 +33,16 @@ import java.util.List; import java.util.Map; import java.util.Set; -import java.util.function.Function; import java.util.stream.Collectors; import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; import de.uni_freiburg.informatik.ultimate.automata.petrinet.ITransition; import de.uni_freiburg.informatik.ultimate.automata.petrinet.Marking; -import de.uni_freiburg.informatik.ultimate.boogie.ExpressionFactory; -import de.uni_freiburg.informatik.ultimate.boogie.ast.BooleanLiteral; import de.uni_freiburg.informatik.ultimate.core.model.services.ILogger; import de.uni_freiburg.informatik.ultimate.core.model.services.IUltimateServiceProvider; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.ModelCheckerUtils; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.CfgSmtToolkit; -import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.IIcfgSymbolTable; -import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IAction; -import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IIcfgTransition; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.DefaultIcfgSymbolTable; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IcfgLocation; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.TransFormulaBuilder; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.TransFormulaUtils; @@ -64,221 +58,250 @@ import de.uni_freiburg.informatik.ultimate.logic.Script; import de.uni_freiburg.informatik.ultimate.logic.Term; import de.uni_freiburg.informatik.ultimate.logic.TermVariable; - +import de.uni_freiburg.informatik.ultimate.util.datastructures.DataStructureUtils; +import de.uni_freiburg.informatik.ultimate.util.datastructures.relation.HashRelation; /** * TODO - * + * * @author Dominik Klumpp (klumpp@informatik.uni-freiburg.de) * @author Miriam Lagunes (miriam.lagunes@students.uni-freiburg.de) - * + * * * @param */ -public class OwickiGriesConstruction { - - private final IPetriNet mNet; +public class OwickiGriesConstruction { + + private final IPetriNet mNet; private final Map, IPredicate> mFloydHoareAnnotation; - + private final OwickiGriesAnnotation mAnnotation; private final IUltimateServiceProvider mServices; private final ManagedScript mManagedScript; private final Script mScript; private final BasicPredicateFactory mFactory; private final ILogger mLogger; - private final IIcfgSymbolTable mSymbolTable; + private final DefaultIcfgSymbolTable mSymbolTable; private final static SimplificationTechnique mSimplificationTechnique = SimplificationTechnique.SIMPLIFY_DDA; - private final static XnfConversionTechnique mXnfConversionTechnique = XnfConversionTechnique.BOTTOM_UP_WITH_LOCAL_SIMPLIFICATION; + private final static XnfConversionTechnique mXnfConversionTechnique = + XnfConversionTechnique.BOTTOM_UP_WITH_LOCAL_SIMPLIFICATION; - - //Variables for Annotation construction + // Variables for Annotation construction private final Map mGhostVariables; private final Map mFormulaMappingD; private final Map mGhostInitAssignment; private final Map, UnmodifiableTransFormula> mAssignmentMapping; - - - public OwickiGriesConstruction(IUltimateServiceProvider services, CfgSmtToolkit csToolkit, - IPetriNet net, - Map, IPredicate> floydHoare) { - mNet = net; - mFloydHoareAnnotation = floydHoare; - mScript = csToolkit.getManagedScript().getScript(); - mManagedScript = csToolkit.getManagedScript(); - mSymbolTable = csToolkit.getSymbolTable(); - mServices = services; - mLogger = services.getLoggingService().getLogger(ModelCheckerUtils.PLUGIN_ID); - mFactory = new BasicPredicateFactory(mServices, mManagedScript, - csToolkit.getSymbolTable()); - - mGhostVariables = getGhostVariables(); - mFormulaMappingD = getFormulaMapping(); - mAssignmentMapping = getAssignmentMapping(); - mGhostInitAssignment = getGhostInitAssignment(); - - mAnnotation = new OwickiGriesAnnotation (mFormulaMappingD, mAssignmentMapping, - mGhostVariables, mGhostInitAssignment, mNet); - } + + public OwickiGriesConstruction(final IUltimateServiceProvider services, final CfgSmtToolkit csToolkit, + final IPetriNet net, final Map, IPredicate> floydHoare) { + mNet = net; + mFloydHoareAnnotation = floydHoare; + mScript = csToolkit.getManagedScript().getScript(); + mManagedScript = csToolkit.getManagedScript(); + mSymbolTable = new DefaultIcfgSymbolTable(csToolkit.getSymbolTable(), csToolkit.getProcedures()); + mServices = services; + mLogger = services.getLoggingService().getLogger(ModelCheckerUtils.PLUGIN_ID); + + mFactory = new BasicPredicateFactory(mServices, mManagedScript, mSymbolTable); + + mGhostVariables = getGhostVariables(); + mFormulaMappingD = getFormulaMapping(); + mAssignmentMapping = getAssignmentMapping(); + mGhostInitAssignment = getGhostInitAssignment(); + + mAnnotation = new OwickiGriesAnnotation<>(mFormulaMappingD, mAssignmentMapping, mGhostVariables, + mGhostInitAssignment, mNet, mSymbolTable); + } /** - * Predicate: disjunction of Markings predicate. - * Markings predicate: Conjunction of All GhostVariable and FH predicate. + * Predicate: disjunction of Markings predicate. Markings predicate: Conjunction of All GhostVariable and FH + * predicate. + * * @return a Map with a predicate for each place in Net. - */ + */ public Map getFormulaMapping() { - Map Mapping = new HashMap(); - for (PLACE place: mNet.getPlaces()) { - Set Clauses = new HashSet<>(); - mFloydHoareAnnotation.forEach((key,value)-> { - if(mFloydHoareAnnotation.containsKey(place)) { - Clauses.add(getMarkingPredicate(place, key));}}); - Mapping.put(place, mFactory.or(Clauses)); } - return Mapping; + final Map Mapping = new HashMap<>(); + for (final PLACE place : mNet.getPlaces()) { + final Set Clauses = new HashSet<>(); + mFloydHoareAnnotation.forEach((marking, formula) -> { + if (marking.contains(place)) { + Clauses.add(getMarkingPredicate(place, marking)); + } + }); + Mapping.put(place, mFactory.or(Clauses)); + } + return Mapping; } - /** * @param place * @param marking * @return Predicate with conjunction of Ghost variables and predicate of marking */ - private IPredicate getMarkingPredicate(PLACE place, Marking marking) { - //TODO:Formula Type: Conjunction and Implication - Set terms = new HashSet<>(); - marking.forEach(element -> terms.add(getGhostPredicate(element))); //GhostVariables of places in marking - terms.addAll(getSubsetMarking(marking)); //OptionB: getAllNotMarking; OptionA: getSubsetMarking; - terms.add(mFloydHoareAnnotation.get(place)); //Predicate of marking - return mFactory.and(terms); + private IPredicate getMarkingPredicate(final PLACE place, final Marking marking) { + // TODO:Formula Type: Conjunction and Implication + final Set terms = new HashSet<>(); + for (final PLACE otherPlace : marking) { + final IPredicate ghost = getGhostPredicate(otherPlace); + terms.add(ghost); + } + // marking.forEach(element -> terms.add(getGhostPredicate(element))); // GhostVariables of places in marking + terms.addAll(getAllNotMarking(marking)); // OptionB: getAllNotMarking; OptionA: getSubsetMarking; + terms.add(mFloydHoareAnnotation.get(marking)); // Predicate of marking + return mFactory.and(terms); } /** - * + * * @param marking * @return Formula MethodB:Predicate with GhostVariables of all other places not in marking */ - private Set getAllNotMarking(Marking marking){ - Set predicates = new HashSet<>(); - Collection notMarking = mNet.getPlaces(); - notMarking.removeAll(marking.stream().collect(Collectors.toSet())); - notMarking.forEach(element -> predicates.add(mFactory.not(getGhostPredicate(element)))); - return predicates; + private Set getAllNotMarking(final Marking marking) { + final Set markPlaces = marking.stream().collect(Collectors.toSet()); + final Collection notMarking = DataStructureUtils.difference(new HashSet<>(mNet.getPlaces()), markPlaces); + final Set predicates = new HashSet<>(); + notMarking.forEach(element -> predicates.add(mFactory.not(getGhostPredicate(element)))); + return predicates; } - + /** - * + * * @param marking * @return Formula MethodA: GhostVariables if marking is subset of other marking */ - private Set getSubsetMarking(Marking marking){ - Set markPlaces = marking.stream().collect(Collectors.toSet()); - Set> Markings = mFloydHoareAnnotation.keySet(); - Collection notMarking = new HashSet<>(); + private Set getSubsetMarking(final Marking marking) { + final Set markPlaces = marking.stream().collect(Collectors.toSet()); + final Set> Markings = mFloydHoareAnnotation.keySet(); + final Collection notMarking = new HashSet<>(); Markings.forEach(otherMarking -> notMarking.addAll(getSupPlaces(otherMarking, markPlaces))); - Set predicates = new HashSet<>(); - notMarking.forEach(element -> predicates.add(mFactory.not(getGhostPredicate(element)))); - return predicates; + final Set predicates = new HashSet<>(); + notMarking.forEach(element -> predicates.add(mFactory.not(getGhostPredicate(element)))); + return predicates; } - - private Collection getSupPlaces(Marking otherMarking, Set markPlaces){ - Collection SubPlaces = new HashSet<>(); - Set otherPlaces = otherMarking.stream().collect(Collectors.toSet()); + + private Collection getSupPlaces(final Marking otherMarking, final Set markPlaces) { + final Collection SubPlaces = new HashSet<>(); + final Set otherPlaces = otherMarking.stream().collect(Collectors.toSet()); if (otherPlaces.containsAll(markPlaces)) { otherPlaces.removeAll(markPlaces); - SubPlaces.addAll(otherPlaces);} + SubPlaces.addAll(otherPlaces); + } return SubPlaces; } - - /** + /** * @param place * @return Predicate place's GhostVariable */ - private IPredicate getGhostPredicate(PLACE place) { - return mFactory.newPredicate(mGhostVariables.get(place).getTerm()); - } - + private IPredicate getGhostPredicate(final PLACE place) { + return mFactory.newPredicate(mGhostVariables.get(place).getTerm()); + } + /** * @return Map of GhostVariables to Places */ - private Map getGhostVariables(){ - Map GhostVars = new HashMap(); + private Map getGhostVariables() { + final Map GhostVars = new HashMap<>(); int i = 0; - Collection places = mNet.getPlaces(); - for(PLACE place: places) { - final TermVariable tVar = mManagedScript.constructFreshTermVariable - ("np_" + i, SmtSortUtils.getBoolSort(mManagedScript)); - final IProgramVar pVar = ProgramVarUtils.constructGlobalProgramVarPair - (tVar.getName(), SmtSortUtils.getBoolSort(mManagedScript), mManagedScript, this); - GhostVars.put(place, pVar); - i++; + final Collection places = mNet.getPlaces(); + mManagedScript.lock(this); + try { + for (final PLACE place : places) { + final TermVariable tVar = + mManagedScript.constructFreshTermVariable("np_" + i, SmtSortUtils.getBoolSort(mManagedScript)); + final IProgramVar pVar = ProgramVarUtils.constructGlobalProgramVarPair(tVar.getName(), + SmtSortUtils.getBoolSort(mManagedScript), mManagedScript, this); + mSymbolTable.add(pVar); + GhostVars.put(place, pVar); + i++; + } + return GhostVars; + } finally { + mManagedScript.unlock(this); } - return GhostVars; } - + /** * @return set of Initial value assignment of all GhostVariables. - * + * */ - private Map getGhostInitAssignment(){ - HashMap InitAssignments = new HashMap(); - Set InitGhostVariables = new HashSet();//Get all GhostVariables from Initial places - Set Places = mNet.getInitialPlaces(); - Places.forEach(place -> - InitGhostVariables.add(mGhostVariables.get(place))); - InitGhostVariables.stream().forEach(variable -> InitAssignments.put(variable, mScript.term("true"))); - Collection NotInitGhostVariables = mGhostVariables.values(); - NotInitGhostVariables.removeAll(InitGhostVariables);//Ghost variables of not Initial places + private Map getGhostInitAssignment() { + final HashMap InitAssignments = new HashMap<>(); + final Set InitGhostVariables = new HashSet<>();// Get all GhostVariables from Initial + // places + final Set Places = mNet.getInitialPlaces(); + Places.forEach(place -> InitGhostVariables.add(mGhostVariables.get(place))); + InitGhostVariables.stream().forEach(variable -> InitAssignments.put(variable, mScript.term("true"))); + final Collection NotInitGhostVariables = new HashSet<>(mGhostVariables.values()); + NotInitGhostVariables.removeAll(InitGhostVariables);// Ghost variables of not Initial places NotInitGhostVariables.forEach(variable -> InitAssignments.put(variable, mScript.term("false"))); return InitAssignments; } - + /** - * + * * @param place * @return assignment of the place's GhostVariable. */ - private UnmodifiableTransFormula getGhostAssignment(Collection vars, String term){ - return TransFormulaBuilder.constructAssignment(new ArrayList<>(vars), - Collections.nCopies(vars.size(), mScript.term(term)), mSymbolTable, mManagedScript); - } + private UnmodifiableTransFormula getGhostAssignment(final Collection vars, final String term) { + return TransFormulaBuilder.constructAssignment(new ArrayList<>(vars), + Collections.nCopies(vars.size(), mScript.term(term)), mSymbolTable, mManagedScript); + } /** - * + * * @return Map of Places' Ghost Variables assignments to Transitions - * - */ - private Map,UnmodifiableTransFormula> getAssignmentMapping(){ - Map,UnmodifiableTransFormula> AssignmentMapping = - new HashMap , UnmodifiableTransFormula>(); - Collection> Transitions = mNet.getTransitions(); - Transitions.forEach(transition -> AssignmentMapping.put(transition, getTransitionAssignment(transition))); + * + */ + private Map, UnmodifiableTransFormula> getAssignmentMapping() { + final Map, UnmodifiableTransFormula> AssignmentMapping = new HashMap<>(); + final Collection> Transitions = mNet.getTransitions(); + Transitions.forEach(transition -> AssignmentMapping.put(transition, getTransitionAssignment(transition))); return AssignmentMapping; } - + /** - * + * * @param transition - * @return TransFormula of sequential compositions of GhostVariables assignments. - * GhostVariables of Predecessors Places are assign to false, - * GhostVariables of Successors Places are assign to true. + * @return TransFormula of sequential compositions of GhostVariables assignments. GhostVariables of Predecessors + * Places are assign to false, GhostVariables of Successors Places are assign to true. */ - private UnmodifiableTransFormula getTransitionAssignment(ITransition transition) { - List assignments = new ArrayList<>(); + private UnmodifiableTransFormula getTransitionAssignment(final ITransition transition) { + final List assignments = new ArrayList<>(); Set Places = mNet.getPredecessors(transition); Places.forEach(place -> { - IProgramVar var = mGhostVariables.get(place); - assignments.add - (getGhostAssignment(Collections.nCopies(1,var),"false"));}); - Places = mNet.getSuccessors(transition); - Places.forEach(place -> assignments.add - (getGhostAssignment(Collections.nCopies(1,mGhostVariables.get(place)),"true"))); - return TransFormulaUtils.sequentialComposition(mLogger, mServices, mManagedScript, - false, false, false, mXnfConversionTechnique, mSimplificationTechnique, assignments); + final IProgramVar var = mGhostVariables.get(place); + assignments.add(getGhostAssignment(Collections.nCopies(1, var), "false")); + }); + Places = mNet.getSuccessors(transition); + Places.forEach(place -> assignments + .add(getGhostAssignment(Collections.nCopies(1, mGhostVariables.get(place)), "true"))); + return TransFormulaUtils.sequentialComposition(mLogger, mServices, mManagedScript, false, false, false, + mXnfConversionTechnique, mSimplificationTechnique, assignments); } - + public OwickiGriesAnnotation getResult() { return mAnnotation; } - - + + public HashRelation, PLACE> getCoMarkedPlaces() { + final HashRelation, PLACE> relation = new HashRelation<>(); + for (final ITransition transition : mNet.getTransitions()) { + final Set predecessors = mNet.getPredecessors(transition); + // Reachable Markings in which transition is enabled: All predecessors of transition is in Marking + final Set> enabledMarkings = mFloydHoareAnnotation.keySet().stream() + .filter(marking -> marking.containsAll(predecessors)).collect(Collectors.toSet()); + // places in markings + for (final Marking marking : enabledMarkings) { + for (final PLACE place : marking) { + // places that are not predecessors of transition + if (!predecessors.contains(place)) { + relation.addPair(transition, place); + } + } + } + } + return relation; + } + } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java index 080465c1618..79ee12a3108 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java @@ -25,23 +25,18 @@ */ package de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency; -import java.util.List; -import java.util.Map; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; +import java.util.List; import java.util.Set; -import java.util.stream.Collector; -import java.util.stream.Collectors; import de.uni_freiburg.informatik.ultimate.automata.petrinet.ITransition; -import de.uni_freiburg.informatik.ultimate.automata.petrinet.Marking; +import de.uni_freiburg.informatik.ultimate.core.model.services.ILogger; import de.uni_freiburg.informatik.ultimate.core.model.services.IUltimateServiceProvider; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.CfgSmtToolkit; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.BasicInternalAction; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IAction; -import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IIcfgTransition; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IInternalAction; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.TransFormulaUtils; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.UnmodifiableTransFormula; @@ -49,12 +44,13 @@ import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.hoaretriple.MonolithicHoareTripleChecker; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.BasicPredicateFactory; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; -import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.ManagedScript; import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.IncrementalPlicationChecker.Validity; +import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.ManagedScript; +import de.uni_freiburg.informatik.ultimate.util.datastructures.relation.HashRelation; /** * TODO - * + * * @author Dominik Klumpp (klumpp@informatik.uni-freiburg.de) * @author Miriam Lagunes (miriam.lagunes@students.uni-freiburg.de) * @@ -63,69 +59,74 @@ */ public class OwickiGriesValidityCheck { private final IUltimateServiceProvider mServices; + private final ILogger mLogger; private final ManagedScript mManagedScript; - + private final boolean mIsInductive; private final boolean mIsInterferenceFree; private final OwickiGriesAnnotation mAnnotation; - private final Map, IPredicate> mFloydHoareAnnotation; private final Collection> mTransitions; private final IHoareTripleChecker mHoareTripleChecker; private final BasicPredicateFactory mPredicateFactory; - + private final HashRelation, PLACE> mCoMarkedPlaces; + + public OwickiGriesValidityCheck(final IUltimateServiceProvider services, final CfgSmtToolkit csToolkit, + final OwickiGriesAnnotation annotation, + final HashRelation, PLACE> coMarkedPlaces) { - public OwickiGriesValidityCheck(IUltimateServiceProvider services, CfgSmtToolkit csToolkit, - OwickiGriesAnnotation annotation, Map, IPredicate> FloydHoareAnnotation) { - mServices = services; + mLogger = services.getLoggingService().getLogger(OwickiGriesValidityCheck.class); mManagedScript = csToolkit.getManagedScript(); - mFloydHoareAnnotation = FloydHoareAnnotation; mAnnotation = annotation; - mPredicateFactory = new BasicPredicateFactory(services, mManagedScript, - csToolkit.getSymbolTable()); - + mPredicateFactory = new BasicPredicateFactory(services, mManagedScript, annotation.getSymbolTable()); + mCoMarkedPlaces = coMarkedPlaces; + mHoareTripleChecker = new MonolithicHoareTripleChecker(csToolkit); - mTransitions = mAnnotation.getPetriNet().getTransitions(); + mTransitions = mAnnotation.getPetriNet().getTransitions(); - mIsInductive = checkInductivity(); + mIsInductive = checkInductivity(); mIsInterferenceFree = checkInterference(); // TODO } - - private boolean checkInductivity() { - //TODO: check this line code - if(mTransitions.stream().filter(transition -> - !getTransitionInductivity(transition)).count() >= 1) - {return false;} + + private boolean checkInductivity() { + // TODO: check this line code + for (final ITransition transition : mTransitions) { + if (!getTransitionInductivity(transition)) { + return false; + } + } return true; } - - private boolean getTransitionInductivity(ITransition Transition) { - return getValidityResult(mHoareTripleChecker.checkInternal - (getConjunctionPredicate(mAnnotation.getPetriNet().getPredecessors(Transition)), - getTransitionSeqAction(Transition), - getConjunctionPredicate(mAnnotation.getPetriNet().getSuccessors(Transition)))); + + private boolean getTransitionInductivity(final ITransition Transition) { + final Set predecessors = mAnnotation.getPetriNet().getPredecessors(Transition); + for (final PLACE pre : predecessors) { + mLogger.info(getPlacePredicate(pre)); + } + final IPredicate precondition = getConjunctionPredicate(predecessors); + final IPredicate postcondition = getConjunctionPredicate(mAnnotation.getPetriNet().getSuccessors(Transition)); + return getValidityResult( + mHoareTripleChecker.checkInternal(precondition, getTransitionSeqAction(Transition), postcondition)); } - - private IPredicate getConjunctionPredicate(Set set) { - Collection predicates = new HashSet<>(); + + private IPredicate getConjunctionPredicate(final Set set) { + final Collection predicates = new HashSet<>(); set.stream().forEach(element -> predicates.add(getPlacePredicate(element))); return mPredicateFactory.and(predicates); } - - private IInternalAction getTransitionSeqAction(ITransition Transition) { - List actions = Arrays.asList( - (UnmodifiableTransFormula)Transition.getSymbol(), - (UnmodifiableTransFormula) mAnnotation.getAssignmentMapping().get(Transition) ); - return new BasicInternalAction - (null, null, TransFormulaUtils.sequentialComposition - (null, mServices, mManagedScript,false, false, false, null, null, actions)); + + private IInternalAction getTransitionSeqAction(final ITransition Transition) { + final List actions = Arrays.asList(Transition.getSymbol().getTransformula(), + mAnnotation.getAssignmentMapping().get(Transition)); + return new BasicInternalAction(null, null, TransFormulaUtils.sequentialComposition(mLogger, mServices, + mManagedScript, false, false, false, null, null, actions)); } - - private IPredicate getPlacePredicate(PLACE Place) { - return mAnnotation.getFormulaMapping().get(Place); + + private IPredicate getPlacePredicate(final PLACE Place) { + return mAnnotation.getFormulaMapping().get(Place); } - - private boolean getValidityResult(Validity validity) { + + private boolean getValidityResult(final Validity validity) { final boolean result; if (validity == Validity.VALID) { result = true; @@ -134,53 +135,44 @@ private boolean getValidityResult(Validity validity) { } return result; } - - private boolean checkInterference() { - if(mTransitions.stream().filter(transition -> - !getTransitionInterFree(transition)).count() >= 1) + + private boolean checkInterference() { + if (mTransitions.stream().filter(transition -> !getTransitionInterFree(transition)).count() >= 1) { return false; - return true; + } + return true; } - private boolean getTransitionInterFree(ITransition Transition) { - IPredicate PredecessorsPred = getConjunctionPredicate(mAnnotation.getPetriNet().getPredecessors(Transition)); - IInternalAction Action = getTransitionSeqAction(Transition); - Set Comarked = getComarkedPlaces(Transition); - if (Comarked.stream().filter(place -> !getInterferenceFreeTriple(PredecessorsPred, Action, place )).count() >= 1) - return false; + private boolean getTransitionInterFree(final ITransition Transition) { + final IPredicate PredecessorsPred = + getConjunctionPredicate(mAnnotation.getPetriNet().getPredecessors(Transition)); + final IInternalAction Action = getTransitionSeqAction(Transition); + final Set Comarked = getComarkedPlaces(Transition); + if (Comarked.stream().filter(place -> !getInterferenceFreeTriple(PredecessorsPred, Action, place)) + .count() >= 1) { + return false; + } return true; } - - private Set getComarkedPlaces(ITransition Transition){ - Set Predecessors = mAnnotation.getPetriNet().getPredecessors(Transition), - comarked = new HashSet<>(); - //Reachable Markings in which transition is enabled: All predecessors of transition is in Marking - Set> enabledMarkings = - mFloydHoareAnnotation.keySet().stream().filter(marking -> - marking.containsAll(Predecessors)).collect(Collectors.toSet()); - //places in markings - enabledMarkings.stream().forEach(marking -> - comarked.addAll(marking.stream().collect(Collectors.toSet()))); - //places that are not predecessors of transition - comarked.removeAll(Predecessors); - return comarked; + + private Set getComarkedPlaces(final ITransition transition) { + return mCoMarkedPlaces.getImage(transition); } - + /** - * + * * @param Pred * @param Action * @param place * @return Validity of Interference Freedom of Transition wrt co-marked place */ - private boolean getInterferenceFreeTriple(IPredicate Pred, IInternalAction Action, PLACE place) { - IPredicate placePred = getPlacePredicate(place); - List predicate = Arrays.asList(Pred,placePred); - return getValidityResult(mHoareTripleChecker.checkInternal - (mPredicateFactory.and(predicate), Action, placePred)); + private boolean getInterferenceFreeTriple(final IPredicate Pred, final IInternalAction Action, final PLACE place) { + final IPredicate placePred = getPlacePredicate(place); + final List predicate = Arrays.asList(Pred, placePred); + return getValidityResult( + mHoareTripleChecker.checkInternal(mPredicateFactory.and(predicate), Action, placePred)); } - public boolean isValid() { return mIsInductive && mIsInterferenceFree; } From c3608b47d4c2ee904c7e2e29a969f430ab101206 Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Tue, 13 Oct 2020 12:56:40 +0200 Subject: [PATCH 031/536] fix bug introduced by merge --- .../plugins/generator/traceabstraction/BasicCegarLoop.java | 1 - 1 file changed, 1 deletion(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java index 94f80f2f054..0b491402aff 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java @@ -1082,7 +1082,6 @@ protected HoareAnnotationComposer computeHoareAnnotationComposer() { } final INestedWordAutomaton abstraction = (INestedWordAutomaton) mAbstraction; - mCegarLoopBenchmark.start(CegarLoopStatisticsDefinitions.HoareAnnotationTime.toString()); new HoareAnnotationExtractor<>(mServices, abstraction, mHaf); final HoareAnnotationComposer clha = new HoareAnnotationComposer(mCsToolkit, mPredicateFactory, mHaf, mServices, mSimplificationTechnique, mXnfConversionTechnique); From ea8e683634a633445578ae175e8e1abc76668b54 Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Wed, 14 Oct 2020 21:54:06 +0200 Subject: [PATCH 032/536] name changes --- .../dangerInvariantsGuessing.epf | 7 -- .../concurrency/OwickiGriesConstruction.java | 87 +++++++++---------- .../concurrency/OwickiGriesValidityCheck.java | 44 +++++----- 3 files changed, 63 insertions(+), 75 deletions(-) delete mode 100644 trunk/examples/settings/automizer/dangerInvariants/dangerInvariantsGuessing.epf diff --git a/trunk/examples/settings/automizer/dangerInvariants/dangerInvariantsGuessing.epf b/trunk/examples/settings/automizer/dangerInvariants/dangerInvariantsGuessing.epf deleted file mode 100644 index 5d6d67643eb..00000000000 --- a/trunk/examples/settings/automizer/dangerInvariants/dangerInvariantsGuessing.epf +++ /dev/null @@ -1,7 +0,0 @@ -#Thu Aug 31 18:46:39 GMT+01:00 2017 -\!/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.invariantsynthesis= -/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.invariantsynthesis/Kind\ of\ invariant=DANGER -/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.invariantsynthesis/Large-Block-Encoding=true -/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.invariantsynthesis/Guess\ danger\ invariant=true -@de.uni_freiburg.informatik.ultimate.plugins.generator.invariantsynthesis=0.1.20 -file_export_version=3.0 diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java index 7d82bfe5bb8..8fdb09a00cd 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java @@ -71,6 +71,9 @@ * @param */ public class OwickiGriesConstruction { + //TODO: replace all foreach for for when there is an effect. + //TODO: correct getSubplaces (it is removing places from PetriNet) + //TODO: Change type of GhostVaribles in OGAnnn to set. Y enviar solo las variables. private final IPetriNet mNet; private final Map, IPredicate> mFloydHoareAnnotation; @@ -101,9 +104,7 @@ public OwickiGriesConstruction(final IUltimateServiceProvider services, final Cf mSymbolTable = new DefaultIcfgSymbolTable(csToolkit.getSymbolTable(), csToolkit.getProcedures()); mServices = services; mLogger = services.getLoggingService().getLogger(ModelCheckerUtils.PLUGIN_ID); - mFactory = new BasicPredicateFactory(mServices, mManagedScript, mSymbolTable); - mGhostVariables = getGhostVariables(); mFormulaMappingD = getFormulaMapping(); mAssignmentMapping = getAssignmentMapping(); @@ -112,7 +113,7 @@ public OwickiGriesConstruction(final IUltimateServiceProvider services, final Cf mAnnotation = new OwickiGriesAnnotation<>(mFormulaMappingD, mAssignmentMapping, mGhostVariables, mGhostInitAssignment, mNet, mSymbolTable); } - + /** * Predicate: disjunction of Markings predicate. Markings predicate: Conjunction of All GhostVariable and FH * predicate. @@ -120,17 +121,17 @@ public OwickiGriesConstruction(final IUltimateServiceProvider services, final Cf * @return a Map with a predicate for each place in Net. */ public Map getFormulaMapping() { - final Map Mapping = new HashMap<>(); + final Map mapping = new HashMap<>(); for (final PLACE place : mNet.getPlaces()) { - final Set Clauses = new HashSet<>(); + final Set clauses = new HashSet<>(); mFloydHoareAnnotation.forEach((marking, formula) -> { if (marking.contains(place)) { - Clauses.add(getMarkingPredicate(place, marking)); + clauses.add(getMarkingPredicate(place, marking)); } }); - Mapping.put(place, mFactory.or(Clauses)); + mapping.put(place, mFactory.or(clauses)); } - return Mapping; + return mapping; } /** @@ -138,16 +139,14 @@ public Map getFormulaMapping() { * @param marking * @return Predicate with conjunction of Ghost variables and predicate of marking */ - private IPredicate getMarkingPredicate(final PLACE place, final Marking marking) { - // TODO:Formula Type: Conjunction and Implication + private IPredicate getMarkingPredicate(final PLACE place, final Marking marking) { final Set terms = new HashSet<>(); for (final PLACE otherPlace : marking) { final IPredicate ghost = getGhostPredicate(otherPlace); terms.add(ghost); - } - // marking.forEach(element -> terms.add(getGhostPredicate(element))); // GhostVariables of places in marking - terms.addAll(getAllNotMarking(marking)); // OptionB: getAllNotMarking; OptionA: getSubsetMarking; - terms.add(mFloydHoareAnnotation.get(marking)); // Predicate of marking + } + terms.addAll(getAllNotMarking(marking)); + terms.add(mFloydHoareAnnotation.get(marking)); return mFactory.and(terms); } @@ -168,25 +167,26 @@ private Set getAllNotMarking(final Marking marking) { * * @param marking * @return Formula MethodA: GhostVariables if marking is subset of other marking + * TODO: Restructure and use difference() instead of removeAll. (when brain is back) in getSubPlaces */ private Set getSubsetMarking(final Marking marking) { final Set markPlaces = marking.stream().collect(Collectors.toSet()); - final Set> Markings = mFloydHoareAnnotation.keySet(); + final Set> markings = mFloydHoareAnnotation.keySet(); final Collection notMarking = new HashSet<>(); - Markings.forEach(otherMarking -> notMarking.addAll(getSupPlaces(otherMarking, markPlaces))); + markings.forEach(otherMarking -> notMarking.addAll(getSupPlaces(otherMarking, markPlaces))); final Set predicates = new HashSet<>(); notMarking.forEach(element -> predicates.add(mFactory.not(getGhostPredicate(element)))); return predicates; } private Collection getSupPlaces(final Marking otherMarking, final Set markPlaces) { - final Collection SubPlaces = new HashSet<>(); + final Collection subPlaces = new HashSet<>(); final Set otherPlaces = otherMarking.stream().collect(Collectors.toSet()); if (otherPlaces.containsAll(markPlaces)) { otherPlaces.removeAll(markPlaces); - SubPlaces.addAll(otherPlaces); + subPlaces.addAll(otherPlaces); } - return SubPlaces; + return subPlaces; } /** @@ -201,7 +201,7 @@ private IPredicate getGhostPredicate(final PLACE place) { * @return Map of GhostVariables to Places */ private Map getGhostVariables() { - final Map GhostVars = new HashMap<>(); + final Map ghostVars = new HashMap<>(); int i = 0; final Collection places = mNet.getPlaces(); mManagedScript.lock(this); @@ -212,10 +212,10 @@ private Map getGhostVariables() { final IProgramVar pVar = ProgramVarUtils.constructGlobalProgramVarPair(tVar.getName(), SmtSortUtils.getBoolSort(mManagedScript), mManagedScript, this); mSymbolTable.add(pVar); - GhostVars.put(place, pVar); + ghostVars.put(place, pVar); i++; } - return GhostVars; + return ghostVars; } finally { mManagedScript.unlock(this); } @@ -226,16 +226,15 @@ private Map getGhostVariables() { * */ private Map getGhostInitAssignment() { - final HashMap InitAssignments = new HashMap<>(); - final Set InitGhostVariables = new HashSet<>();// Get all GhostVariables from Initial - // places - final Set Places = mNet.getInitialPlaces(); - Places.forEach(place -> InitGhostVariables.add(mGhostVariables.get(place))); - InitGhostVariables.stream().forEach(variable -> InitAssignments.put(variable, mScript.term("true"))); - final Collection NotInitGhostVariables = new HashSet<>(mGhostVariables.values()); - NotInitGhostVariables.removeAll(InitGhostVariables);// Ghost variables of not Initial places - NotInitGhostVariables.forEach(variable -> InitAssignments.put(variable, mScript.term("false"))); - return InitAssignments; + final HashMap initAssignments = new HashMap<>(); + final Set initGhostVariables = new HashSet<>(); + final Set places = mNet.getInitialPlaces(); + places.forEach(place -> initGhostVariables.add(mGhostVariables.get(place))); + initGhostVariables.stream().forEach(variable -> initAssignments.put(variable, mScript.term("true"))); + final Collection notInitGhostVariables = new HashSet<>(mGhostVariables.values()); + notInitGhostVariables.removeAll(initGhostVariables); + notInitGhostVariables.forEach(variable -> initAssignments.put(variable, mScript.term("false"))); + return initAssignments; } /** @@ -254,10 +253,10 @@ private UnmodifiableTransFormula getGhostAssignment(final Collection, UnmodifiableTransFormula> getAssignmentMapping() { - final Map, UnmodifiableTransFormula> AssignmentMapping = new HashMap<>(); - final Collection> Transitions = mNet.getTransitions(); - Transitions.forEach(transition -> AssignmentMapping.put(transition, getTransitionAssignment(transition))); - return AssignmentMapping; + final Map, UnmodifiableTransFormula> assignmentMapping = new HashMap<>(); + final Collection> transitions = mNet.getTransitions(); + transitions.forEach(transition -> assignmentMapping.put(transition, getTransitionAssignment(transition))); + return assignmentMapping; } /** @@ -268,14 +267,14 @@ private Map, UnmodifiableTransFormula> getAssignmentM */ private UnmodifiableTransFormula getTransitionAssignment(final ITransition transition) { final List assignments = new ArrayList<>(); - Set Places = mNet.getPredecessors(transition); - Places.forEach(place -> { + Set places = mNet.getPredecessors(transition); + places.forEach(place -> { final IProgramVar var = mGhostVariables.get(place); assignments.add(getGhostAssignment(Collections.nCopies(1, var), "false")); }); - Places = mNet.getSuccessors(transition); - Places.forEach(place -> assignments - .add(getGhostAssignment(Collections.nCopies(1, mGhostVariables.get(place)), "true"))); + places = mNet.getSuccessors(transition); + places.forEach(place -> assignments.add(getGhostAssignment( + Collections.nCopies(1, mGhostVariables.get(place)), "true"))); return TransFormulaUtils.sequentialComposition(mLogger, mServices, mManagedScript, false, false, false, mXnfConversionTechnique, mSimplificationTechnique, assignments); } @@ -287,11 +286,9 @@ public OwickiGriesAnnotation getResult() { public HashRelation, PLACE> getCoMarkedPlaces() { final HashRelation, PLACE> relation = new HashRelation<>(); for (final ITransition transition : mNet.getTransitions()) { - final Set predecessors = mNet.getPredecessors(transition); - // Reachable Markings in which transition is enabled: All predecessors of transition is in Marking + final Set predecessors = mNet.getPredecessors(transition); final Set> enabledMarkings = mFloydHoareAnnotation.keySet().stream() - .filter(marking -> marking.containsAll(predecessors)).collect(Collectors.toSet()); - // places in markings + .filter(marking -> marking.containsAll(predecessors)).collect(Collectors.toSet()); for (final Marking marking : enabledMarkings) { for (final PLACE place : marking) { // places that are not predecessors of transition diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java index 79ee12a3108..17a77d58c84 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java @@ -64,6 +64,7 @@ public class OwickiGriesValidityCheck { private final boolean mIsInductive; private final boolean mIsInterferenceFree; + private final boolean mIsProgramSafe; private final OwickiGriesAnnotation mAnnotation; private final Collection> mTransitions; private final IHoareTripleChecker mHoareTripleChecker; @@ -85,11 +86,11 @@ public OwickiGriesValidityCheck(final IUltimateServiceProvider services, final C mTransitions = mAnnotation.getPetriNet().getTransitions(); mIsInductive = checkInductivity(); - mIsInterferenceFree = checkInterference(); // TODO + mIsInterferenceFree = checkInterference(); + mIsProgramSafe = true; //TODO getProgramSafety(); and chose other name, and replace all } - private boolean checkInductivity() { - // TODO: check this line code + private boolean checkInductivity() { for (final ITransition transition : mTransitions) { if (!getTransitionInductivity(transition)) { return false; @@ -105,8 +106,8 @@ private boolean getTransitionInductivity(final ITransition Transi } final IPredicate precondition = getConjunctionPredicate(predecessors); final IPredicate postcondition = getConjunctionPredicate(mAnnotation.getPetriNet().getSuccessors(Transition)); - return getValidityResult( - mHoareTripleChecker.checkInternal(precondition, getTransitionSeqAction(Transition), postcondition)); + return mHoareTripleChecker.checkInternal(precondition, getTransitionSeqAction(Transition), postcondition) + == Validity.VALID; } private IPredicate getConjunctionPredicate(final Set set) { @@ -126,16 +127,6 @@ private IPredicate getPlacePredicate(final PLACE Place) { return mAnnotation.getFormulaMapping().get(Place); } - private boolean getValidityResult(final Validity validity) { - final boolean result; - if (validity == Validity.VALID) { - result = true; - } else { - result = false; - } - return result; - } - private boolean checkInterference() { if (mTransitions.stream().filter(transition -> !getTransitionInterFree(transition)).count() >= 1) { return false; @@ -144,11 +135,11 @@ private boolean checkInterference() { } private boolean getTransitionInterFree(final ITransition Transition) { - final IPredicate PredecessorsPred = + final IPredicate predecessorsPred = getConjunctionPredicate(mAnnotation.getPetriNet().getPredecessors(Transition)); - final IInternalAction Action = getTransitionSeqAction(Transition); - final Set Comarked = getComarkedPlaces(Transition); - if (Comarked.stream().filter(place -> !getInterferenceFreeTriple(PredecessorsPred, Action, place)) + final IInternalAction action = getTransitionSeqAction(Transition); + final Set coMarked = getComarkedPlaces(Transition); + if (coMarked.stream().filter(place -> !getInterferenceFreeTriple(predecessorsPred, action, place)) .count() >= 1) { return false; } @@ -169,11 +160,18 @@ private Set getComarkedPlaces(final ITransition transition private boolean getInterferenceFreeTriple(final IPredicate Pred, final IInternalAction Action, final PLACE place) { final IPredicate placePred = getPlacePredicate(place); final List predicate = Arrays.asList(Pred, placePred); - return getValidityResult( - mHoareTripleChecker.checkInternal(mPredicateFactory.and(predicate), Action, placePred)); + return mHoareTripleChecker.checkInternal(mPredicateFactory.and(predicate), Action, placePred) == Validity.VALID; + } + + //TODO:find better name + private boolean getProgramSafety() { + //Check InitAssignment and formula implication + //Check all accepting places are map to false or "eq" formula. + //Elegir si la formula es falsa por construccion or si se permite y checar equivalencia. + //Other point. + return true; } - public boolean isValid() { - return mIsInductive && mIsInterferenceFree; + return mIsInductive && mIsInterferenceFree && mIsProgramSafe; } } From 15b1ef2a0f34ddba0e841344bd68cf656b8fa246 Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Thu, 15 Oct 2020 19:35:43 +0200 Subject: [PATCH 033/536] added Cfgsafety Error in TraceAbstractionObserver --- .../concurrency/OwickiGriesAnnotation.java | 3 +- .../concurrency/OwickiGriesValidityCheck.java | 64 +++++++++++++++---- 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java index fa43ad7ad06..b9d985f1c7b 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java @@ -84,7 +84,8 @@ public class OwickiGriesAnnotation { */ public OwickiGriesAnnotation(final Map FormulaMapping, final Map, UnmodifiableTransFormula> mAssignmentMapping2, - final Map GhostVariables, final Map GhostInitAssignment, + final Map GhostVariables, + final Map GhostInitAssignment, final IPetriNet net, final IIcfgSymbolTable symbolTable) { mFormulaMapping = FormulaMapping; mAssignmentMapping = mAssignmentMapping2; diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java index 17a77d58c84..9d7cb188911 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java @@ -25,6 +25,7 @@ */ package de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; @@ -40,19 +41,24 @@ import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IInternalAction; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.TransFormulaUtils; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.UnmodifiableTransFormula; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.variables.IProgramVar; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.hoaretriple.IHoareTripleChecker; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.hoaretriple.MonolithicHoareTripleChecker; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.BasicPredicateFactory; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.IncrementalPlicationChecker.Validity; +import de.uni_freiburg.informatik.ultimate.logic.Script; +import de.uni_freiburg.informatik.ultimate.logic.Script.LBool; +import de.uni_freiburg.informatik.ultimate.logic.Term; import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.ManagedScript; +import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.SmtUtils; import de.uni_freiburg.informatik.ultimate.util.datastructures.relation.HashRelation; /** * TODO * * @author Dominik Klumpp (klumpp@informatik.uni-freiburg.de) - * @author Miriam Lagunes (miriam.lagunes@students.uni-freiburg.de) + * @author Miriam Lagunes (miri am.lagunes@students.uni-freiburg.de) * * @param * @param @@ -61,6 +67,7 @@ public class OwickiGriesValidityCheck { private final IUltimateServiceProvider mServices; private final ILogger mLogger; private final ManagedScript mManagedScript; + private final Script mScript; private final boolean mIsInductive; private final boolean mIsInterferenceFree; @@ -78,6 +85,7 @@ public OwickiGriesValidityCheck(final IUltimateServiceProvider services, final C mServices = services; mLogger = services.getLoggingService().getLogger(OwickiGriesValidityCheck.class); mManagedScript = csToolkit.getManagedScript(); + mScript = csToolkit.getManagedScript().getScript(); mAnnotation = annotation; mPredicateFactory = new BasicPredicateFactory(services, mManagedScript, annotation.getSymbolTable()); mCoMarkedPlaces = coMarkedPlaces; @@ -87,7 +95,7 @@ public OwickiGriesValidityCheck(final IUltimateServiceProvider services, final C mIsInductive = checkInductivity(); mIsInterferenceFree = checkInterference(); - mIsProgramSafe = true; //TODO getProgramSafety(); and chose other name, and replace all + mIsProgramSafe = getCfgSafety(); } private boolean checkInductivity() { @@ -128,8 +136,10 @@ private IPredicate getPlacePredicate(final PLACE Place) { } private boolean checkInterference() { - if (mTransitions.stream().filter(transition -> !getTransitionInterFree(transition)).count() >= 1) { - return false; + for (final ITransition transition : mTransitions) { + if (!getTransitionInterFree(transition)) { + return false; + } } return true; } @@ -139,9 +149,10 @@ private boolean getTransitionInterFree(final ITransition Transiti getConjunctionPredicate(mAnnotation.getPetriNet().getPredecessors(Transition)); final IInternalAction action = getTransitionSeqAction(Transition); final Set coMarked = getComarkedPlaces(Transition); - if (coMarked.stream().filter(place -> !getInterferenceFreeTriple(predecessorsPred, action, place)) - .count() >= 1) { - return false; + for(final PLACE place: coMarked) { + if(!getInterferenceFreeTriple(predecessorsPred, action, place)) { + return false; + } } return true; } @@ -164,11 +175,40 @@ private boolean getInterferenceFreeTriple(final IPredicate Pred, final IInternal } //TODO:find better name - private boolean getProgramSafety() { - //Check InitAssignment and formula implication - //Check all accepting places are map to false or "eq" formula. - //Elegir si la formula es falsa por construccion or si se permite y checar equivalencia. - //Other point. + private boolean getCfgSafety() { + if (!getInitImplication() || !getAcceptFormula()) { + return false; + } + return true; + } + + private boolean getInitImplication() { + IPredicate initFormula = getInitFormula(); + for(final PLACE place: mAnnotation.getPetriNet().getInitialPlaces()) { + final Term implication = SmtUtils.implies(mScript, initFormula.getFormula(), getPlacePredicate(place).getFormula()); + if (!SmtUtils.areFormulasEquivalent(implication, mScript.term("true"), mScript)) { //TODO: implications must be valid? + return false; + } + } + return true; + } + + private IPredicate getInitFormula() { + final List terms = new ArrayList<>(); + for (final IProgramVar var: mAnnotation.getGhostAssignment().keySet()) { + terms.add(mPredicateFactory.newPredicate(SmtUtils.binaryEquality(mScript, var.getTerm(), + mAnnotation.getGhostAssignment().get(var)))); + } + return mPredicateFactory.and(terms); + } + + private boolean getAcceptFormula() { + for (final PLACE place: mAnnotation.getPetriNet().getAcceptingPlaces()) { + //Ask about this or checkSatEquivalence + if(LBool.UNSAT != SmtUtils.checkSatTerm(mScript,getPlacePredicate(place).getFormula())) { + return false; + }; + } return true; } public boolean isValid() { From a84f947ff20fa57061691a68a3716c72b503dc53 Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Thu, 15 Oct 2020 21:38:48 +0200 Subject: [PATCH 034/536] Fix getSubPlaces --- .../concurrency/OwickiGriesAnnotation.java | 15 ++++++------ .../concurrency/OwickiGriesConstruction.java | 23 ++++++++++--------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java index b9d985f1c7b..2af0f787454 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java @@ -26,6 +26,7 @@ package de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency; import java.util.Map; +import java.util.Set; import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; import de.uni_freiburg.informatik.ultimate.automata.petrinet.ITransition; @@ -65,7 +66,7 @@ public class OwickiGriesAnnotation { * VGhost: maps Ghost Variables to set */ // TODO: Map or Set? Map might be only needed for Construction - private final Map mGhostVariables; + private final Set mGhostVariables; /** * rho(VGhost): set of predicate value -> GhostVariables @@ -83,12 +84,12 @@ public class OwickiGriesAnnotation { * @param net */ public OwickiGriesAnnotation(final Map FormulaMapping, - final Map, UnmodifiableTransFormula> mAssignmentMapping2, - final Map GhostVariables, - final Map GhostInitAssignment, - final IPetriNet net, final IIcfgSymbolTable symbolTable) { + final Map, UnmodifiableTransFormula> AssignmentMapping, + final Set GhostVariables, + final Map GhostInitAssignment, + final IPetriNet net, final IIcfgSymbolTable symbolTable) { mFormulaMapping = FormulaMapping; - mAssignmentMapping = mAssignmentMapping2; + mAssignmentMapping = AssignmentMapping; mGhostVariables = GhostVariables; mGhostInitAssignment = GhostInitAssignment; mPetriNet = net; @@ -103,7 +104,7 @@ public Map, UnmodifiableTransFormula> getAssignmentMa return mAssignmentMapping; } - public Map GhostVariables() { + public Set GhostVariables() { return mGhostVariables; } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java index 8fdb09a00cd..ca29b16facf 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java @@ -72,9 +72,7 @@ */ public class OwickiGriesConstruction { //TODO: replace all foreach for for when there is an effect. - //TODO: correct getSubplaces (it is removing places from PetriNet) - //TODO: Change type of GhostVaribles in OGAnnn to set. Y enviar solo las variables. - + private final IPetriNet mNet; private final Map, IPredicate> mFloydHoareAnnotation; @@ -110,7 +108,7 @@ public OwickiGriesConstruction(final IUltimateServiceProvider services, final Cf mAssignmentMapping = getAssignmentMapping(); mGhostInitAssignment = getGhostInitAssignment(); - mAnnotation = new OwickiGriesAnnotation<>(mFormulaMappingD, mAssignmentMapping, mGhostVariables, + mAnnotation = new OwickiGriesAnnotation<>(mFormulaMappingD, mAssignmentMapping, new HashSet<>(mGhostVariables.values()), mGhostInitAssignment, mNet, mSymbolTable); } @@ -172,19 +170,22 @@ private Set getAllNotMarking(final Marking marking) { private Set getSubsetMarking(final Marking marking) { final Set markPlaces = marking.stream().collect(Collectors.toSet()); final Set> markings = mFloydHoareAnnotation.keySet(); - final Collection notMarking = new HashSet<>(); - markings.forEach(otherMarking -> notMarking.addAll(getSupPlaces(otherMarking, markPlaces))); + final Set notInMarking = new HashSet<>(); + for(final Marking otherMarking : markings) { + notInMarking.addAll(getSupPlaces(otherMarking,markPlaces)); + } final Set predicates = new HashSet<>(); - notMarking.forEach(element -> predicates.add(mFactory.not(getGhostPredicate(element)))); + for(final PLACE place: notInMarking) { + predicates.add(mFactory.not(getGhostPredicate(place))); + } return predicates; } - private Collection getSupPlaces(final Marking otherMarking, final Set markPlaces) { - final Collection subPlaces = new HashSet<>(); + private Set getSupPlaces(final Marking otherMarking, final Set markPlaces) { + Set subPlaces = new HashSet<>(); final Set otherPlaces = otherMarking.stream().collect(Collectors.toSet()); if (otherPlaces.containsAll(markPlaces)) { - otherPlaces.removeAll(markPlaces); - subPlaces.addAll(otherPlaces); + subPlaces = DataStructureUtils.difference(otherPlaces, markPlaces); } return subPlaces; } From e9c34a9eeab10304cece1e4d728de8dfe771cd77 Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Thu, 15 Oct 2020 22:58:52 +0200 Subject: [PATCH 035/536] Update OG construction --- .../concurrency/OwickiGriesConstruction.java | 43 ++++++++++--------- .../concurrency/OwickiGriesValidityCheck.java | 8 ++-- 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java index ca29b16facf..479e387a470 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java @@ -71,7 +71,6 @@ * @param */ public class OwickiGriesConstruction { - //TODO: replace all foreach for for when there is an effect. private final IPetriNet mNet; private final Map, IPredicate> mFloydHoareAnnotation; @@ -155,9 +154,11 @@ private IPredicate getMarkingPredicate(final PLACE place, final Marking getAllNotMarking(final Marking marking) { final Set markPlaces = marking.stream().collect(Collectors.toSet()); - final Collection notMarking = DataStructureUtils.difference(new HashSet<>(mNet.getPlaces()), markPlaces); + final Set notMarking = DataStructureUtils.difference(new HashSet<>(mNet.getPlaces()), markPlaces); final Set predicates = new HashSet<>(); - notMarking.forEach(element -> predicates.add(mFactory.not(getGhostPredicate(element)))); + for(PLACE place: notMarking) { + predicates.add(mFactory.not(getGhostPredicate(place))); + } return predicates; } @@ -165,7 +166,6 @@ private Set getAllNotMarking(final Marking marking) { * * @param marking * @return Formula MethodA: GhostVariables if marking is subset of other marking - * TODO: Restructure and use difference() instead of removeAll. (when brain is back) in getSubPlaces */ private Set getSubsetMarking(final Marking marking) { final Set markPlaces = marking.stream().collect(Collectors.toSet()); @@ -228,13 +228,15 @@ private Map getGhostVariables() { */ private Map getGhostInitAssignment() { final HashMap initAssignments = new HashMap<>(); - final Set initGhostVariables = new HashSet<>(); - final Set places = mNet.getInitialPlaces(); - places.forEach(place -> initGhostVariables.add(mGhostVariables.get(place))); - initGhostVariables.stream().forEach(variable -> initAssignments.put(variable, mScript.term("true"))); - final Collection notInitGhostVariables = new HashSet<>(mGhostVariables.values()); - notInitGhostVariables.removeAll(initGhostVariables); - notInitGhostVariables.forEach(variable -> initAssignments.put(variable, mScript.term("false"))); + //final Set initGhostVariables = new HashSet<>(); + for(PLACE place: mNet.getInitialPlaces()) { + initAssignments.put(mGhostVariables.get(place), mScript.term("true")); + } + final Set notInitGhostVariables = DataStructureUtils.difference + (new HashSet<>(mGhostVariables.values()), initAssignments.keySet()); + for(IProgramVar variable: notInitGhostVariables) { + initAssignments.put(variable, mScript.term("false")); + } return initAssignments; } @@ -255,8 +257,9 @@ private UnmodifiableTransFormula getGhostAssignment(final Collection, UnmodifiableTransFormula> getAssignmentMapping() { final Map, UnmodifiableTransFormula> assignmentMapping = new HashMap<>(); - final Collection> transitions = mNet.getTransitions(); - transitions.forEach(transition -> assignmentMapping.put(transition, getTransitionAssignment(transition))); + for(ITransition transition: mNet.getTransitions()) { + assignmentMapping.put(transition, getTransitionAssignment(transition)); + } return assignmentMapping; } @@ -268,14 +271,12 @@ private Map, UnmodifiableTransFormula> getAssignmentM */ private UnmodifiableTransFormula getTransitionAssignment(final ITransition transition) { final List assignments = new ArrayList<>(); - Set places = mNet.getPredecessors(transition); - places.forEach(place -> { - final IProgramVar var = mGhostVariables.get(place); - assignments.add(getGhostAssignment(Collections.nCopies(1, var), "false")); - }); - places = mNet.getSuccessors(transition); - places.forEach(place -> assignments.add(getGhostAssignment( - Collections.nCopies(1, mGhostVariables.get(place)), "true"))); + for(PLACE place: mNet.getPredecessors(transition)) { + assignments.add(getGhostAssignment(Collections.nCopies(1, mGhostVariables.get(place)), "false")); + } + for(PLACE place: mNet.getSuccessors(transition)) { + assignments.add(getGhostAssignment(Collections.nCopies(1, mGhostVariables.get(place)), "true")); + } return TransFormulaUtils.sequentialComposition(mLogger, mServices, mManagedScript, false, false, false, mXnfConversionTechnique, mSimplificationTechnique, assignments); } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java index 9d7cb188911..1de31be2aa2 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java @@ -118,9 +118,11 @@ private boolean getTransitionInductivity(final ITransition Transi == Validity.VALID; } - private IPredicate getConjunctionPredicate(final Set set) { + private IPredicate getConjunctionPredicate(final Set places) { final Collection predicates = new HashSet<>(); - set.stream().forEach(element -> predicates.add(getPlacePredicate(element))); + for (PLACE place : places) { + predicates.add(getPlacePredicate(place)); + } return mPredicateFactory.and(predicates); } @@ -204,7 +206,7 @@ private IPredicate getInitFormula() { private boolean getAcceptFormula() { for (final PLACE place: mAnnotation.getPetriNet().getAcceptingPlaces()) { - //Ask about this or checkSatEquivalence + //TODO: Ask about this or checkSatEquivalence if(LBool.UNSAT != SmtUtils.checkSatTerm(mScript,getPlacePredicate(place).getFormula())) { return false; }; From 9dfe4a32bf392b6e338e8bf5b07bf392014e8046 Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Fri, 16 Oct 2020 11:46:43 +0200 Subject: [PATCH 036/536] Update OwickiGriesValidityCheck.java Check Implementation change --- .../concurrency/OwickiGriesValidityCheck.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java index 1de31be2aa2..9692712c91e 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java @@ -44,6 +44,7 @@ import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.variables.IProgramVar; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.hoaretriple.IHoareTripleChecker; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.hoaretriple.MonolithicHoareTripleChecker; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.MonolithicImplicationChecker; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.BasicPredicateFactory; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.IncrementalPlicationChecker.Validity; @@ -186,9 +187,10 @@ private boolean getCfgSafety() { private boolean getInitImplication() { IPredicate initFormula = getInitFormula(); + MonolithicImplicationChecker checker = new MonolithicImplicationChecker(mServices, mManagedScript); for(final PLACE place: mAnnotation.getPetriNet().getInitialPlaces()) { - final Term implication = SmtUtils.implies(mScript, initFormula.getFormula(), getPlacePredicate(place).getFormula()); - if (!SmtUtils.areFormulasEquivalent(implication, mScript.term("true"), mScript)) { //TODO: implications must be valid? + if(Validity.VALID != checker.checkImplication(initFormula, false, getPlacePredicate(place), false)) + { return false; } } From ce8753cda4c7c0c8f0c0fea6a27268a8141375cc Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Mon, 9 Nov 2020 14:34:13 +0100 Subject: [PATCH 037/536] remove obsolete LBE reference --- .../plugins/generator/traceabstraction/BasicCegarLoop.java | 1 - 1 file changed, 1 deletion(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java index 66a066e7fcf..dda6302911e 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java @@ -252,7 +252,6 @@ public enum PetriNetLbe { private IPetriNet mPetriNet = null; private Map, IPredicate> mMarking2State = null; - protected PetriNetLargeBlockEncoding mLBE; protected final IPLBECompositionFactory mCompositionFactory; From 9a776273925d85cd8393e080ad8d8e2d6ad1ce63 Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Mon, 9 Nov 2020 16:59:48 +0100 Subject: [PATCH 038/536] fix serial number ambiguity bug Our BasicPredicateFactory reuses serial numbers already used in the Floyd/Hoare-annotation. This leads to different formulae being con- sidered equal. To avoid this, construct the formula on a Term level and only wrap in IPredicate afterwards. --- .../concurrency/OwickiGriesConstruction.java | 46 +++++++++---------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java index 479e387a470..efb180ea8f8 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java @@ -53,6 +53,7 @@ import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.ManagedScript; import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.SmtSortUtils; +import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.SmtUtils; import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.SmtUtils.SimplificationTechnique; import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.SmtUtils.XnfConversionTechnique; import de.uni_freiburg.informatik.ultimate.logic.Script; @@ -120,13 +121,14 @@ public OwickiGriesConstruction(final IUltimateServiceProvider services, final Cf public Map getFormulaMapping() { final Map mapping = new HashMap<>(); for (final PLACE place : mNet.getPlaces()) { - final Set clauses = new HashSet<>(); + final Set clauses = new HashSet<>(); mFloydHoareAnnotation.forEach((marking, formula) -> { if (marking.contains(place)) { clauses.add(getMarkingPredicate(place, marking)); } }); - mapping.put(place, mFactory.or(clauses)); + final Term disjunction = SmtUtils.or(mScript, clauses); + mapping.put(place, mFactory.newPredicate(disjunction)); } return mapping; } @@ -136,15 +138,15 @@ public Map getFormulaMapping() { * @param marking * @return Predicate with conjunction of Ghost variables and predicate of marking */ - private IPredicate getMarkingPredicate(final PLACE place, final Marking marking) { - final Set terms = new HashSet<>(); + private Term getMarkingPredicate(final PLACE place, final Marking marking) { + final Set terms = new HashSet<>(); for (final PLACE otherPlace : marking) { - final IPredicate ghost = getGhostPredicate(otherPlace); + final Term ghost = mGhostVariables.get(otherPlace).getTerm(); terms.add(ghost); - } - terms.addAll(getAllNotMarking(marking)); - terms.add(mFloydHoareAnnotation.get(marking)); - return mFactory.and(terms); + } + terms.addAll(getAllNotMarking(marking)); + terms.add(mFloydHoareAnnotation.get(marking).getFormula()); + return SmtUtils.and(mScript, terms); } /** @@ -152,13 +154,14 @@ private IPredicate getMarkingPredicate(final PLACE place, final Marking getAllNotMarking(final Marking marking) { + private Set getAllNotMarking(final Marking marking) { final Set markPlaces = marking.stream().collect(Collectors.toSet()); final Set notMarking = DataStructureUtils.difference(new HashSet<>(mNet.getPlaces()), markPlaces); - final Set predicates = new HashSet<>(); - for(PLACE place: notMarking) { - predicates.add(mFactory.not(getGhostPredicate(place))); - } + final Set predicates = new HashSet<>(); + for (final PLACE place : notMarking) { + final Term ghost = mGhostVariables.get(place).getTerm(); + predicates.add(SmtUtils.not(mScript, ghost)); + } return predicates; } @@ -167,16 +170,17 @@ private Set getAllNotMarking(final Marking marking) { * @param marking * @return Formula MethodA: GhostVariables if marking is subset of other marking */ - private Set getSubsetMarking(final Marking marking) { + private Set getSubsetMarking(final Marking marking) { final Set markPlaces = marking.stream().collect(Collectors.toSet()); final Set> markings = mFloydHoareAnnotation.keySet(); final Set notInMarking = new HashSet<>(); for(final Marking otherMarking : markings) { notInMarking.addAll(getSupPlaces(otherMarking,markPlaces)); } - final Set predicates = new HashSet<>(); + final Set predicates = new HashSet<>(); for(final PLACE place: notInMarking) { - predicates.add(mFactory.not(getGhostPredicate(place))); + final Term ghost = mGhostVariables.get(place).getTerm(); + predicates.add(SmtUtils.not(mScript, ghost)); } return predicates; } @@ -190,14 +194,6 @@ private Set getSupPlaces(final Marking otherMarking, final return subPlaces; } - /** - * @param place - * @return Predicate place's GhostVariable - */ - private IPredicate getGhostPredicate(final PLACE place) { - return mFactory.newPredicate(mGhostVariables.get(place).getTerm()); - } - /** * @return Map of GhostVariables to Places */ From b0ce5d881491ff623aa024fa3c6a4a47699b2cd8 Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Sun, 15 Nov 2020 19:01:21 +0100 Subject: [PATCH 039/536] Copred ghost variables Added third option for places formula with the negated ghost variables of "copredecesor" places. --- .../concurrency/OwickiGriesConstruction.java | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java index efb180ea8f8..0b8ec48407f 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java @@ -144,11 +144,34 @@ private Term getMarkingPredicate(final PLACE place, final Marking final Term ghost = mGhostVariables.get(otherPlace).getTerm(); terms.add(ghost); } - terms.addAll(getAllNotMarking(marking)); + terms.addAll(getCopredMarking(marking, place)); terms.add(mFloydHoareAnnotation.get(marking).getFormula()); return SmtUtils.and(mScript, terms); } - + + /** + * + * @param marking + * @param placef: place to which the formula will be assigned + * @return Formula MethodC:Predicate with GhostVariables of all co-predecesor places. + */ + private Set getCopredMarking(final Marking marking, final PLACE placef) { + final Set markPlaces = marking.stream().collect(Collectors.toSet()); + final Set notMarking = getCopred(placef, markPlaces); + final Set predicates = new HashSet<>(); + for (final PLACE place : notMarking) { + final Term ghost = mGhostVariables.get(place).getTerm(); + predicates.add(SmtUtils.not(mScript, ghost)); + } + return predicates; + } + + private Set getCopred(PLACE place, Set markPlaces){ + final Set places = new HashSet<>(); + for (final ITransition transition : mNet.getSuccessors(place)){ + places.addAll(DataStructureUtils.difference(mNet.getPredecessors(transition), markPlaces)); + }return places; + } /** * * @param marking From 13a5fd947ef024838bcfd795a7d5ec5eb2e5fbf4 Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Wed, 27 Jan 2021 12:36:54 +0100 Subject: [PATCH 040/536] re-add accidentally deleted file --- .../dangerInvariants/dangerInvariantsGuessing.epf | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 trunk/examples/settings/automizer/dangerInvariants/dangerInvariantsGuessing.epf diff --git a/trunk/examples/settings/automizer/dangerInvariants/dangerInvariantsGuessing.epf b/trunk/examples/settings/automizer/dangerInvariants/dangerInvariantsGuessing.epf new file mode 100644 index 00000000000..5d6d67643eb --- /dev/null +++ b/trunk/examples/settings/automizer/dangerInvariants/dangerInvariantsGuessing.epf @@ -0,0 +1,7 @@ +#Thu Aug 31 18:46:39 GMT+01:00 2017 +\!/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.invariantsynthesis= +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.invariantsynthesis/Kind\ of\ invariant=DANGER +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.invariantsynthesis/Large-Block-Encoding=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.invariantsynthesis/Guess\ danger\ invariant=true +@de.uni_freiburg.informatik.ultimate.plugins.generator.invariantsynthesis=0.1.20 +file_export_version=3.0 From 1f5453d2eba5c668601519cd02b6626fb067a4ed Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Wed, 27 Jan 2021 14:38:07 +0100 Subject: [PATCH 041/536] cc fixes & some comments --- .../TraceAbstractionStarter.java | 3 +- .../concurrency/OwickiGriesAnnotation.java | 95 +++++++----- .../concurrency/OwickiGriesConstruction.java | 136 ++++++++---------- .../concurrency/OwickiGriesValidityCheck.java | 63 ++++---- 4 files changed, 146 insertions(+), 151 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java index 5aff7204acc..fc8002f153e 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java @@ -144,9 +144,8 @@ public TraceAbstractionStarter(final IUltimateServiceProvider services, final II mLogger = mServices.getLoggingService().getLogger(Activator.PLUGIN_ID); mTransitionClazz = transitionClazz; mCompositionFactory = compositionFactory; - // if (icfg.isSequential()) { mFloydHoareAutomataFromOtherErrorLocations = new ArrayList<>(); - // if (icfg.getCfgSmtToolkit().getConcurrencyInformation().getThreadInstanceMap().isEmpty()) { + // if (icfg.isSequential()) { runCegarLoops(icfg, witnessAutomaton, rawFloydHoareAutomataFromFile); // } else { // final IcfgPetrifier icfgPetrifier = diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java index 2af0f787454..4bab0ac28be 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java @@ -27,6 +27,7 @@ import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; import de.uni_freiburg.informatik.ultimate.automata.petrinet.ITransition; @@ -35,67 +36,91 @@ import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.variables.IProgramVar; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; import de.uni_freiburg.informatik.ultimate.logic.Term; +import de.uni_freiburg.informatik.ultimate.smtinterpol.util.DAGSize; /** - * TODO + * An Owicki/Gries annotation of a Petri program. Serves as proof of the program's correctness. * * @author Dominik Klumpp (klumpp@informatik.uni-freiburg.de) * @author Miriam Lagunes (miriam.lagunes@students.uni-freiburg.de) * * @param + * The type of program statements * @param + * The type of places in the Petri program */ public class OwickiGriesAnnotation { - // Petri net + /** + * The annotated Petri program. + */ private final IPetriNet mPetriNet; /** - * Omega: maps Predicate -> Place + * A symbol table containing both the program symbols and the ghost variables in the annotation. + */ + private final IIcfgSymbolTable mSymbolTable; + + /** + * "omega" - maps a place to a predicate that holds whenever the place has a token. */ private final Map mFormulaMapping; /** - * Gamma: maps GhostAssignment -> transition + * "gamma" - annotates transitions with assignments of ghost variables. */ private final Map, UnmodifiableTransFormula> mAssignmentMapping; - private final IIcfgSymbolTable mSymbolTable; - /** - * VGhost: maps Ghost Variables to set + * Set of ghost variables used by the annotation. */ - // TODO: Map or Set? Map might be only needed for Construction private final Set mGhostVariables; /** - * rho(VGhost): set of predicate value -> GhostVariables + * Initial assignment of ghost variables. */ - // protected Map,LETTER> mGhostAssignment; private final Map mGhostInitAssignment; /** - * Constructor + * Creates a new Owicki/Gries annotation. * - * @param FormulaMapping - * @param mAssignmentMapping2 - * @param GhostVariables - * @param GhostInitAssignment + * @param formulaMapping + * The mapping from places to formulas. + * @param assignmentMapping + * The annotation of transitions with ghost assignments. + * @param ghostVariables + * The set of ghost variables used by the annotation. + * @param ghostInitAssignment + * The initial assignment of ghost variables. * @param net + * The Petri program that is annotated. + * @param symbolTable + * A symbol table for the annotation. */ - public OwickiGriesAnnotation(final Map FormulaMapping, - final Map, UnmodifiableTransFormula> AssignmentMapping, - final Set GhostVariables, - final Map GhostInitAssignment, - final IPetriNet net, final IIcfgSymbolTable symbolTable) { - mFormulaMapping = FormulaMapping; - mAssignmentMapping = AssignmentMapping; - mGhostVariables = GhostVariables; - mGhostInitAssignment = GhostInitAssignment; + public OwickiGriesAnnotation(final Map formulaMapping, + final Map, UnmodifiableTransFormula> assignmentMapping, + final Set ghostVariables, final Map ghostInitAssignment, + final IPetriNet net, final IIcfgSymbolTable symbolTable) { + + assert ghostInitAssignment.keySet().stream() + .allMatch(ghostVariables::contains) : "Initial value only allowed for ghost variables"; + + mFormulaMapping = formulaMapping; + mAssignmentMapping = assignmentMapping; + mGhostVariables = ghostVariables; + mGhostInitAssignment = ghostInitAssignment; mPetriNet = net; mSymbolTable = symbolTable; } + public IPetriNet getPetriNet() { + return mPetriNet; + } + + public IIcfgSymbolTable getSymbolTable() { + return mSymbolTable; + } + public Map getFormulaMapping() { return mFormulaMapping; } @@ -104,7 +129,7 @@ public Map, UnmodifiableTransFormula> getAssignmentMa return mAssignmentMapping; } - public Set GhostVariables() { + public Set getGhostVariables() { return mGhostVariables; } @@ -112,18 +137,14 @@ public Map getGhostAssignment() { return mGhostInitAssignment; } - public IPetriNet getPetriNet() { - return mPetriNet; - } - - public IIcfgSymbolTable getSymbolTable() { - return mSymbolTable; - } - - // TODO: define OGAnnotation Size public int getSize() { - // ... - return 0; + final DAGSize sizeComputation = new DAGSize(); + final int initSize = mGhostInitAssignment.entrySet().stream() + .collect(Collectors.summingInt(x -> sizeComputation.size(x.getValue()))); + final int formulaSize = mFormulaMapping.entrySet().stream() + .collect(Collectors.summingInt(x -> sizeComputation.size(x.getValue().getFormula()))); + final int assignSize = mAssignmentMapping.entrySet().stream() + .collect(Collectors.summingInt(x -> sizeComputation.size(x.getValue().getFormula()))); + return initSize + formulaSize + assignSize; } - } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java index 0b8ec48407f..6c8bc4023aa 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java @@ -43,7 +43,6 @@ import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.ModelCheckerUtils; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.CfgSmtToolkit; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.DefaultIcfgSymbolTable; -import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IcfgLocation; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.TransFormulaBuilder; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.TransFormulaUtils; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.UnmodifiableTransFormula; @@ -63,73 +62,74 @@ import de.uni_freiburg.informatik.ultimate.util.datastructures.relation.HashRelation; /** - * TODO + * Constructs an Owicki/Gries annotation for a Petri program from a Floyd/Hoare annotation of the reachability graph of + * the Petri net, by introducing a boolean ghost variable for each place in the Petri net. * * @author Dominik Klumpp (klumpp@informatik.uni-freiburg.de) * @author Miriam Lagunes (miriam.lagunes@students.uni-freiburg.de) * - * * @param + * The type of places in the Petri program + * @param + * The type of statements in the Petri program */ -public class OwickiGriesConstruction { - - private final IPetriNet mNet; - private final Map, IPredicate> mFloydHoareAnnotation; +public class OwickiGriesConstruction { - private final OwickiGriesAnnotation mAnnotation; private final IUltimateServiceProvider mServices; + private final ILogger mLogger; private final ManagedScript mManagedScript; private final Script mScript; private final BasicPredicateFactory mFactory; - private final ILogger mLogger; + + private final IPetriNet mNet; + private final Map, IPredicate> mFloydHoareAnnotation; private final DefaultIcfgSymbolTable mSymbolTable; - private final static SimplificationTechnique mSimplificationTechnique = SimplificationTechnique.SIMPLIFY_DDA; - private final static XnfConversionTechnique mXnfConversionTechnique = + + private static final SimplificationTechnique mSimplificationTechnique = SimplificationTechnique.SIMPLIFY_DDA; + private static final XnfConversionTechnique mXnfConversionTechnique = XnfConversionTechnique.BOTTOM_UP_WITH_LOCAL_SIMPLIFICATION; - // Variables for Annotation construction private final Map mGhostVariables; - private final Map mFormulaMappingD; - private final Map mGhostInitAssignment; - private final Map, UnmodifiableTransFormula> mAssignmentMapping; + private final OwickiGriesAnnotation mAnnotation; public OwickiGriesConstruction(final IUltimateServiceProvider services, final CfgSmtToolkit csToolkit, final IPetriNet net, final Map, IPredicate> floydHoare) { + mServices = services; + mLogger = services.getLoggingService().getLogger(ModelCheckerUtils.PLUGIN_ID); + mManagedScript = csToolkit.getManagedScript(); + mScript = mManagedScript.getScript(); + mNet = net; mFloydHoareAnnotation = floydHoare; - mScript = csToolkit.getManagedScript().getScript(); - mManagedScript = csToolkit.getManagedScript(); mSymbolTable = new DefaultIcfgSymbolTable(csToolkit.getSymbolTable(), csToolkit.getProcedures()); - mServices = services; - mLogger = services.getLoggingService().getLogger(ModelCheckerUtils.PLUGIN_ID); mFactory = new BasicPredicateFactory(mServices, mManagedScript, mSymbolTable); + mGhostVariables = getGhostVariables(); - mFormulaMappingD = getFormulaMapping(); - mAssignmentMapping = getAssignmentMapping(); - mGhostInitAssignment = getGhostInitAssignment(); + final Map formulaMapping = getFormulaMapping(); + final Map, UnmodifiableTransFormula> assignmentMapping = getAssignmentMapping(); + final Map ghostInitAssignment = getGhostInitAssignment(); - mAnnotation = new OwickiGriesAnnotation<>(mFormulaMappingD, mAssignmentMapping, new HashSet<>(mGhostVariables.values()), - mGhostInitAssignment, mNet, mSymbolTable); + mAnnotation = new OwickiGriesAnnotation<>(formulaMapping, assignmentMapping, + new HashSet<>(mGhostVariables.values()), ghostInitAssignment, mNet, mSymbolTable); } - + /** - * Predicate: disjunction of Markings predicate. Markings predicate: Conjunction of All GhostVariable and FH - * predicate. + * Constructs the mapping from places to formulas. A place is mapped to a disjunction of marking predicates, where + * each marking predicate is a conjunction of ghost variables and a Floyd/Hoare predicate. * - * @return a Map with a predicate for each place in Net. + * @return a map with a predicate for each place in the Petri net */ - public Map getFormulaMapping() { + private Map getFormulaMapping() { final Map mapping = new HashMap<>(); + + final Set> reachableMarkings = mFloydHoareAnnotation.keySet(); for (final PLACE place : mNet.getPlaces()) { - final Set clauses = new HashSet<>(); - mFloydHoareAnnotation.forEach((marking, formula) -> { - if (marking.contains(place)) { - clauses.add(getMarkingPredicate(place, marking)); - } - }); + final Set clauses = reachableMarkings.stream().filter(m -> m.contains(place)) + .map(this::getMarkingPredicate).collect(Collectors.toSet()); final Term disjunction = SmtUtils.or(mScript, clauses); mapping.put(place, mFactory.newPredicate(disjunction)); } + return mapping; } @@ -138,40 +138,17 @@ public Map getFormulaMapping() { * @param marking * @return Predicate with conjunction of Ghost variables and predicate of marking */ - private Term getMarkingPredicate(final PLACE place, final Marking marking) { + private Term getMarkingPredicate(final Marking marking) { final Set terms = new HashSet<>(); for (final PLACE otherPlace : marking) { final Term ghost = mGhostVariables.get(otherPlace).getTerm(); terms.add(ghost); } - terms.addAll(getCopredMarking(marking, place)); + terms.addAll(getAllNotMarking(marking)); terms.add(mFloydHoareAnnotation.get(marking).getFormula()); return SmtUtils.and(mScript, terms); } - - /** - * - * @param marking - * @param placef: place to which the formula will be assigned - * @return Formula MethodC:Predicate with GhostVariables of all co-predecesor places. - */ - private Set getCopredMarking(final Marking marking, final PLACE placef) { - final Set markPlaces = marking.stream().collect(Collectors.toSet()); - final Set notMarking = getCopred(placef, markPlaces); - final Set predicates = new HashSet<>(); - for (final PLACE place : notMarking) { - final Term ghost = mGhostVariables.get(place).getTerm(); - predicates.add(SmtUtils.not(mScript, ghost)); - } - return predicates; - } - - private Set getCopred(PLACE place, Set markPlaces){ - final Set places = new HashSet<>(); - for (final ITransition transition : mNet.getSuccessors(place)){ - places.addAll(DataStructureUtils.difference(mNet.getPredecessors(transition), markPlaces)); - }return places; - } + /** * * @param marking @@ -197,11 +174,11 @@ private Set getSubsetMarking(final Marking marking) { final Set markPlaces = marking.stream().collect(Collectors.toSet()); final Set> markings = mFloydHoareAnnotation.keySet(); final Set notInMarking = new HashSet<>(); - for(final Marking otherMarking : markings) { - notInMarking.addAll(getSupPlaces(otherMarking,markPlaces)); + for (final Marking otherMarking : markings) { + notInMarking.addAll(getSupPlaces(otherMarking, markPlaces)); } final Set predicates = new HashSet<>(); - for(final PLACE place: notInMarking) { + for (final PLACE place : notInMarking) { final Term ghost = mGhostVariables.get(place).getTerm(); predicates.add(SmtUtils.not(mScript, ghost)); } @@ -212,13 +189,13 @@ private Set getSupPlaces(final Marking otherMarking, final Set subPlaces = new HashSet<>(); final Set otherPlaces = otherMarking.stream().collect(Collectors.toSet()); if (otherPlaces.containsAll(markPlaces)) { - subPlaces = DataStructureUtils.difference(otherPlaces, markPlaces); + subPlaces = DataStructureUtils.difference(otherPlaces, markPlaces); } return subPlaces; } /** - * @return Map of GhostVariables to Places + * @return map of places to ghost variables */ private Map getGhostVariables() { final Map ghostVars = new HashMap<>(); @@ -227,8 +204,9 @@ private Map getGhostVariables() { mManagedScript.lock(this); try { for (final PLACE place : places) { + // TODO (Dominik 2021-01-27) Name ghost variables by place for easier debugging final TermVariable tVar = - mManagedScript.constructFreshTermVariable("np_" + i, SmtSortUtils.getBoolSort(mManagedScript)); + mManagedScript.constructFreshTermVariable("np" + i, SmtSortUtils.getBoolSort(mManagedScript)); final IProgramVar pVar = ProgramVarUtils.constructGlobalProgramVarPair(tVar.getName(), SmtSortUtils.getBoolSort(mManagedScript), mManagedScript, this); mSymbolTable.add(pVar); @@ -242,18 +220,16 @@ private Map getGhostVariables() { } /** - * @return set of Initial value assignment of all GhostVariables. - * + * @return initial value assignment of all ghost variables. */ private Map getGhostInitAssignment() { final HashMap initAssignments = new HashMap<>(); - //final Set initGhostVariables = new HashSet<>(); - for(PLACE place: mNet.getInitialPlaces()) { + for (final PLACE place : mNet.getInitialPlaces()) { initAssignments.put(mGhostVariables.get(place), mScript.term("true")); } - final Set notInitGhostVariables = DataStructureUtils.difference - (new HashSet<>(mGhostVariables.values()), initAssignments.keySet()); - for(IProgramVar variable: notInitGhostVariables) { + final Set notInitGhostVariables = + DataStructureUtils.difference(new HashSet<>(mGhostVariables.values()), initAssignments.keySet()); + for (final IProgramVar variable : notInitGhostVariables) { initAssignments.put(variable, mScript.term("false")); } return initAssignments; @@ -276,7 +252,7 @@ private UnmodifiableTransFormula getGhostAssignment(final Collection, UnmodifiableTransFormula> getAssignmentMapping() { final Map, UnmodifiableTransFormula> assignmentMapping = new HashMap<>(); - for(ITransition transition: mNet.getTransitions()) { + for (final ITransition transition : mNet.getTransitions()) { assignmentMapping.put(transition, getTransitionAssignment(transition)); } return assignmentMapping; @@ -290,10 +266,10 @@ private Map, UnmodifiableTransFormula> getAssignmentM */ private UnmodifiableTransFormula getTransitionAssignment(final ITransition transition) { final List assignments = new ArrayList<>(); - for(PLACE place: mNet.getPredecessors(transition)) { - assignments.add(getGhostAssignment(Collections.nCopies(1, mGhostVariables.get(place)), "false")); + for (final PLACE place : mNet.getPredecessors(transition)) { + assignments.add(getGhostAssignment(Collections.nCopies(1, mGhostVariables.get(place)), "false")); } - for(PLACE place: mNet.getSuccessors(transition)) { + for (final PLACE place : mNet.getSuccessors(transition)) { assignments.add(getGhostAssignment(Collections.nCopies(1, mGhostVariables.get(place)), "true")); } return TransFormulaUtils.sequentialComposition(mLogger, mServices, mManagedScript, false, false, false, @@ -307,9 +283,9 @@ public OwickiGriesAnnotation getResult() { public HashRelation, PLACE> getCoMarkedPlaces() { final HashRelation, PLACE> relation = new HashRelation<>(); for (final ITransition transition : mNet.getTransitions()) { - final Set predecessors = mNet.getPredecessors(transition); + final Set predecessors = mNet.getPredecessors(transition); final Set> enabledMarkings = mFloydHoareAnnotation.keySet().stream() - .filter(marking -> marking.containsAll(predecessors)).collect(Collectors.toSet()); + .filter(marking -> marking.containsAll(predecessors)).collect(Collectors.toSet()); for (final Marking marking : enabledMarkings) { for (final PLACE place : marking) { // places that are not predecessors of transition diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java index 9692712c91e..12973cce8ae 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesValidityCheck.java @@ -48,18 +48,17 @@ import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.BasicPredicateFactory; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.IncrementalPlicationChecker.Validity; -import de.uni_freiburg.informatik.ultimate.logic.Script; -import de.uni_freiburg.informatik.ultimate.logic.Script.LBool; -import de.uni_freiburg.informatik.ultimate.logic.Term; import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.ManagedScript; import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.SmtUtils; +import de.uni_freiburg.informatik.ultimate.logic.Script; +import de.uni_freiburg.informatik.ultimate.logic.Script.LBool; import de.uni_freiburg.informatik.ultimate.util.datastructures.relation.HashRelation; /** * TODO * * @author Dominik Klumpp (klumpp@informatik.uni-freiburg.de) - * @author Miriam Lagunes (miri am.lagunes@students.uni-freiburg.de) + * @author Miriam Lagunes (miriam.lagunes@students.uni-freiburg.de) * * @param * @param @@ -95,11 +94,11 @@ public OwickiGriesValidityCheck(final IUltimateServiceProvider services, final C mTransitions = mAnnotation.getPetriNet().getTransitions(); mIsInductive = checkInductivity(); - mIsInterferenceFree = checkInterference(); - mIsProgramSafe = getCfgSafety(); + mIsInterferenceFree = checkInterference(); + mIsProgramSafe = getCfgSafety(); } - private boolean checkInductivity() { + private boolean checkInductivity() { for (final ITransition transition : mTransitions) { if (!getTransitionInductivity(transition)) { return false; @@ -115,13 +114,13 @@ private boolean getTransitionInductivity(final ITransition Transi } final IPredicate precondition = getConjunctionPredicate(predecessors); final IPredicate postcondition = getConjunctionPredicate(mAnnotation.getPetriNet().getSuccessors(Transition)); - return mHoareTripleChecker.checkInternal(precondition, getTransitionSeqAction(Transition), postcondition) - == Validity.VALID; + return mHoareTripleChecker.checkInternal(precondition, getTransitionSeqAction(Transition), + postcondition) == Validity.VALID; } private IPredicate getConjunctionPredicate(final Set places) { final Collection predicates = new HashSet<>(); - for (PLACE place : places) { + for (final PLACE place : places) { predicates.add(getPlacePredicate(place)); } return mPredicateFactory.and(predicates); @@ -152,8 +151,8 @@ private boolean getTransitionInterFree(final ITransition Transiti getConjunctionPredicate(mAnnotation.getPetriNet().getPredecessors(Transition)); final IInternalAction action = getTransitionSeqAction(Transition); final Set coMarked = getComarkedPlaces(Transition); - for(final PLACE place: coMarked) { - if(!getInterferenceFreeTriple(predecessorsPred, action, place)) { + for (final PLACE place : coMarked) { + if (!getInterferenceFreeTriple(predecessorsPred, action, place)) { return false; } } @@ -176,45 +175,45 @@ private boolean getInterferenceFreeTriple(final IPredicate Pred, final IInternal final List predicate = Arrays.asList(Pred, placePred); return mHoareTripleChecker.checkInternal(mPredicateFactory.and(predicate), Action, placePred) == Validity.VALID; } - - //TODO:find better name - private boolean getCfgSafety() { + + // TODO:find better name + private boolean getCfgSafety() { if (!getInitImplication() || !getAcceptFormula()) { return false; - } + } return true; } - + private boolean getInitImplication() { - IPredicate initFormula = getInitFormula(); - MonolithicImplicationChecker checker = new MonolithicImplicationChecker(mServices, mManagedScript); - for(final PLACE place: mAnnotation.getPetriNet().getInitialPlaces()) { - if(Validity.VALID != checker.checkImplication(initFormula, false, getPlacePredicate(place), false)) - { + final IPredicate initFormula = getInitFormula(); + final MonolithicImplicationChecker checker = new MonolithicImplicationChecker(mServices, mManagedScript); + for (final PLACE place : mAnnotation.getPetriNet().getInitialPlaces()) { + if (Validity.VALID != checker.checkImplication(initFormula, false, getPlacePredicate(place), false)) { return false; - } + } } return true; } - + private IPredicate getInitFormula() { final List terms = new ArrayList<>(); - for (final IProgramVar var: mAnnotation.getGhostAssignment().keySet()) { - terms.add(mPredicateFactory.newPredicate(SmtUtils.binaryEquality(mScript, var.getTerm(), - mAnnotation.getGhostAssignment().get(var)))); + for (final IProgramVar var : mAnnotation.getGhostAssignment().keySet()) { + terms.add(mPredicateFactory.newPredicate( + SmtUtils.binaryEquality(mScript, var.getTerm(), mAnnotation.getGhostAssignment().get(var)))); } return mPredicateFactory.and(terms); } - + private boolean getAcceptFormula() { - for (final PLACE place: mAnnotation.getPetriNet().getAcceptingPlaces()) { - //TODO: Ask about this or checkSatEquivalence - if(LBool.UNSAT != SmtUtils.checkSatTerm(mScript,getPlacePredicate(place).getFormula())) { + for (final PLACE place : mAnnotation.getPetriNet().getAcceptingPlaces()) { + // TODO: Ask about this or checkSatEquivalence + if (LBool.UNSAT != SmtUtils.checkSatTerm(mScript, getPlacePredicate(place).getFormula())) { return false; - }; + } } return true; } + public boolean isValid() { return mIsInductive && mIsInterferenceFree && mIsProgramSafe; } From 5e1cccfc4221b2e8676a0ca04d0482ed61fa5c5f Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Wed, 27 Jan 2021 15:09:39 +0100 Subject: [PATCH 042/536] fix build error: remove obsolete type param --- .../plugins/generator/traceabstraction/BasicCegarLoop.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java index dda6302911e..4868328e466 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java @@ -1156,7 +1156,7 @@ public void computeOwickiGries() { assert !petriFloydHoare.isEmpty(); - final OwickiGriesConstruction construction = + final OwickiGriesConstruction construction = new OwickiGriesConstruction<>(mServices, mCsToolkit, mPetriNet, petriFloydHoare); // TODO: simplify final OwickiGriesValidityCheck check = new OwickiGriesValidityCheck<>(mServices, mCsToolkit, From 441fd90402b01e2177c4af407a10c927431a9440 Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Wed, 27 Jan 2021 15:15:15 +0100 Subject: [PATCH 043/536] small simplification --- .../traceabstraction/HoareAnnotationFragments.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationFragments.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationFragments.java index ea85007e470..8f44dbbd4f1 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationFragments.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/HoareAnnotationFragments.java @@ -286,11 +286,7 @@ void addDoubleDecker(final IPredicate down, final IPredicate up, final IPredicat } private IPredicate getProgramPoint(final IPredicate pred) { - final IPredicate pp = mPred2ProgPoint.get(pred); - if (pp == null) { - return pred; - } - return pp; + return mPred2ProgPoint.getOrDefault(pred, pred); } void addContextEntryPair(final IPredicate context, final IPredicate entry) { From cc27f7dfae3e7df6897cfc3a6eadfb2215e478a2 Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Sat, 24 Apr 2021 00:23:33 +0200 Subject: [PATCH 044/536] fix overlooked conflicts --- .../traceabstraction/BasicCegarLoop.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java index a8690dea3e5..3dd6a83618a 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java @@ -71,9 +71,7 @@ import de.uni_freiburg.informatik.ultimate.automata.nestedword.operations.RemoveUnreachable; import de.uni_freiburg.informatik.ultimate.automata.nestedword.operations.oldapi.IOpWithDelayedDeadEndRemoval; import de.uni_freiburg.informatik.ultimate.automata.nestedword.senwa.DifferenceSenwa; -import de.uni_freiburg.informatik.ultimate.automata.nestedword.transitions.OutgoingCallTransition;<<<<<<>>>>>>dev +import de.uni_freiburg.informatik.ultimate.automata.partialorder.UnionIndependenceRelation; +import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; +import de.uni_freiburg.informatik.ultimate.automata.petrinet.Marking; import de.uni_freiburg.informatik.ultimate.automata.petrinet.PetriNetNot1SafeException; import de.uni_freiburg.informatik.ultimate.automata.petrinet.netdatastructures.BoundedPetriNet; import de.uni_freiburg.informatik.ultimate.automata.petrinet.operations.LazyPetriNet2FiniteAutomaton; @@ -126,10 +126,10 @@ import de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder.cfg.PathProgram.PathProgramConstructionResult; import de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder.util.IcfgAngelicProgramExecution; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.automataminimization.AutomataMinimization; -import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.automataminimization.AutomataMinimization.AutomataMinimizationTimeout;<<<<<<>>>>>>dev +import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency.OwickiGriesValidityCheck; +import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency.SleepSetStateFactoryForRefinement; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.errorabstraction.ErrorGeneralizationEngine; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.errorlocalization.FlowSensitiveFaultLocalizer; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.independencerelation.SemanticIndependenceRelation; @@ -281,7 +281,7 @@ public enum PartialOrderMode { protected IRefinementEngine> mRefinementEngine; private INwaOutgoingLetterAndTransitionProvider mWitnessAutomaton; - private final boolean mFirstReuseDump = true; + private boolean mFirstReuseDump = true; private boolean mUseHeuristicEmptinessCheck = false; private final ScoringMethod mScoringMethod; private final AStarHeuristic mAStarHeuristic; From 6616f48d76154d9ea264c4b5c7a48aec24f3fdb8 Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Tue, 11 May 2021 10:15:18 +0200 Subject: [PATCH 045/536] avoid code duplication --- .../TraceAbstractionStarter.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java index 28f72e8e55d..abfa9ee57f5 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/TraceAbstractionStarter.java @@ -140,7 +140,7 @@ public TraceAbstractionStarter(final IUltimateServiceProvider services, final II mPrefs = new TAPreferences(mServices); mWitnessAutomaton = witnessAutomaton; mRawFloydHoareAutomataFromFile = rawFloydHoareAutomataFromFile; - mIsConcurrent = isConcurrent(icfg); + mIsConcurrent = !icfg.isSequential(); mComputeHoareAnnotation = mPrefs.computeHoareAnnotation(); runCegarLoops(icfg); @@ -155,10 +155,10 @@ private void runCegarLoops(final IIcfg icfg) { mOverallResult = Result.SAFE; mArtifact = null; - if (isConcurrent(icfg)) { - analyseConcurrentProgram(icfg); - } else { + if (icfg.isSequential()) { analyseSequentialProgram(icfg); + } else { + analyseConcurrentProgram(icfg); } // Report results that were buffered because they may be overridden or amended. @@ -231,7 +231,7 @@ private void analyseConcurrentProgram(final IIcfg icfg) { if (results.isEmpty() || hasSufficientThreadInstances(results.get(results.size() - 1))) { break; } - assert isConcurrent(icfg) : "Insufficient thread instances for sequential program"; + assert !icfg.isSequential() : "Insufficient thread instances for sequential program"; mLogger.warn(numberOfThreadInstances + " thread instances were not sufficient, I will increase this number and restart the analysis"); numberOfThreadInstances++; @@ -439,12 +439,8 @@ private static boolean isInsufficientThreadsIdentifier(final DebugIdentifier ide return false; } - private static boolean isConcurrent(final IIcfg icfg) { - return !icfg.getCfgSmtToolkit().getConcurrencyInformation().getThreadInstanceMap().isEmpty(); - } - private IIcfg petrify(final IIcfg icfg, final int numberOfThreadInstances) { - assert isConcurrent(icfg) : "Petrification unnecessary for sequential programs"; + assert !icfg.isSequential() : "Petrification unnecessary for sequential programs"; mLogger.info("Constructing petrified ICFG for " + numberOfThreadInstances + " thread instances."); final IcfgPetrifier icfgPetrifier = new IcfgPetrifier(mServices, icfg, From d682adea3fa11d190938654c77e8c8d58c0e21ff Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Thu, 13 May 2021 21:48:21 +0200 Subject: [PATCH 046/536] FH ann construction from maximal Cosets --- ant-acslast.log | 0 ant-acslparser.log | 0 ant-astbuilder.log | 0 ant-automatascriptparser.log | 12 + ant-benchmark.log | 0 ant-boogieast.log | 0 ant-boogieparser.log | 12 + ant-constraintparser.log | 12 + ant-crocparser.log | 0 ant-ltl2aut.log | 11 + ant-smtinterpol-dimacs.log | 12 + ant-smtinterpol-smtlib1.log | 12 + ant-smtinterpol-smtlib2.log | 12 + ant-smtsolverbridge.log | 0 ant-spaceexparserparser.log | 0 ant-srparseparser.log | 0 ant-toolchain.log | 0 .../concurrency/OwickiGriesConstruction.java | 5 + .../concurrency/OwickiGriesFloydHoare.java | 240 ++++++++++++++++++ 19 files changed, 328 insertions(+) create mode 100644 ant-acslast.log create mode 100644 ant-acslparser.log create mode 100644 ant-astbuilder.log create mode 100644 ant-automatascriptparser.log create mode 100644 ant-benchmark.log create mode 100644 ant-boogieast.log create mode 100644 ant-boogieparser.log create mode 100644 ant-constraintparser.log create mode 100644 ant-crocparser.log create mode 100644 ant-ltl2aut.log create mode 100644 ant-smtinterpol-dimacs.log create mode 100644 ant-smtinterpol-smtlib1.log create mode 100644 ant-smtinterpol-smtlib2.log create mode 100644 ant-smtsolverbridge.log create mode 100644 ant-spaceexparserparser.log create mode 100644 ant-srparseparser.log create mode 100644 ant-toolchain.log create mode 100644 trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java diff --git a/ant-acslast.log b/ant-acslast.log new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ant-acslparser.log b/ant-acslparser.log new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ant-astbuilder.log b/ant-astbuilder.log new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ant-automatascriptparser.log b/ant-automatascriptparser.log new file mode 100644 index 00000000000..ea09c65589b --- /dev/null +++ b/ant-automatascriptparser.log @@ -0,0 +1,12 @@ +Buildfile: C:\Users\miria\Documents\ultimate\trunk\source\AutomataScriptParser\src\de\uni_freiburg\informatik\ultimate\plugins\source\automatascriptparser\build-parser.xml + +build_parser: + [java] Picked up JAVA_TOOL_OPTIONS: -Dmaven.gitcommitid.skip=true + [java] Error: Could not find or load main class com.github.jhoenicke.javacup.Main + [java] Caused by: java.lang.ClassNotFoundException: com.github.jhoenicke.javacup.Main + +BUILD FAILED +C:\Users\miria\Documents\ultimate\trunk\source\AutomataScriptParser\src\de\uni_freiburg\informatik\ultimate\plugins\source\automatascriptparser\build-parser.xml:9: Java returned: 1 + +Total time: 1 second + diff --git a/ant-benchmark.log b/ant-benchmark.log new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ant-boogieast.log b/ant-boogieast.log new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ant-boogieparser.log b/ant-boogieparser.log new file mode 100644 index 00000000000..3d8eeeb6675 --- /dev/null +++ b/ant-boogieparser.log @@ -0,0 +1,12 @@ +Buildfile: C:\Users\miria\Documents\ultimate\trunk\source\BoogiePLParser\src\de\uni_freiburg\informatik\ultimate\boogie\parser\build-parser.xml + +generate_parser: + [java] Picked up JAVA_TOOL_OPTIONS: -Dmaven.gitcommitid.skip=true + [java] Error: Could not find or load main class com.github.jhoenicke.javacup.Main + [java] Caused by: java.lang.ClassNotFoundException: com.github.jhoenicke.javacup.Main + +BUILD FAILED +C:\Users\miria\Documents\ultimate\trunk\source\BoogiePLParser\src\de\uni_freiburg\informatik\ultimate\boogie\parser\build-parser.xml:10: Java returned: 1 + +Total time: 2 seconds + diff --git a/ant-constraintparser.log b/ant-constraintparser.log new file mode 100644 index 00000000000..35c0a203ac2 --- /dev/null +++ b/ant-constraintparser.log @@ -0,0 +1,12 @@ +Buildfile: C:\Users\miria\Documents\ultimate\trunk\source\ConstraintParser\src\de\uni_freiburg\informatik\ultimate\constraintparser\build-parser.xml + +generate_parser: + [java] Picked up JAVA_TOOL_OPTIONS: -Dmaven.gitcommitid.skip=true + [java] Error: Could not find or load main class com.github.jhoenicke.javacup.Main + [java] Caused by: java.lang.ClassNotFoundException: com.github.jhoenicke.javacup.Main + +BUILD FAILED +C:\Users\miria\Documents\ultimate\trunk\source\ConstraintParser\src\de\uni_freiburg\informatik\ultimate\constraintparser\build-parser.xml:10: Java returned: 1 + +Total time: 1 second + diff --git a/ant-crocparser.log b/ant-crocparser.log new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ant-ltl2aut.log b/ant-ltl2aut.log new file mode 100644 index 00000000000..b4f18078e0c --- /dev/null +++ b/ant-ltl2aut.log @@ -0,0 +1,11 @@ +Buildfile: C:\Users\miria\Documents\ultimate\trunk\source\LTL2aut\src\de\uni_freiburg\informatik\ultimate\ltl2aut\build-parser.xml + +generate_parser: + [echo] AutPromela.flex + [java] Error: Unable to access jarfile C:\Users\miria\Documents\ultimate\JavaCup\JFlex.jar + +BUILD FAILED +C:\Users\miria\Documents\ultimate\trunk\source\LTL2aut\src\de\uni_freiburg\informatik\ultimate\ltl2aut\build-parser.xml:11: Java returned: 1 + +Total time: 860 milliseconds + diff --git a/ant-smtinterpol-dimacs.log b/ant-smtinterpol-dimacs.log new file mode 100644 index 00000000000..66ab697688b --- /dev/null +++ b/ant-smtinterpol-dimacs.log @@ -0,0 +1,12 @@ +Buildfile: C:\Users\miria\Documents\ultimate\trunk\source\SMTInterpol\src\de\uni_freiburg\informatik\ultimate\smtinterpol\dimacs\build-parser.xml + +generate_parser: + [java] Picked up JAVA_TOOL_OPTIONS: -Dmaven.gitcommitid.skip=true + [java] Error: Could not find or load main class com.github.jhoenicke.javacup.Main + [java] Caused by: java.lang.ClassNotFoundException: com.github.jhoenicke.javacup.Main + +BUILD FAILED +C:\Users\miria\Documents\ultimate\trunk\source\SMTInterpol\src\de\uni_freiburg\informatik\ultimate\smtinterpol\dimacs\build-parser.xml:28: Java returned: 1 + +Total time: 1 second + diff --git a/ant-smtinterpol-smtlib1.log b/ant-smtinterpol-smtlib1.log new file mode 100644 index 00000000000..5f4b22f22b9 --- /dev/null +++ b/ant-smtinterpol-smtlib1.log @@ -0,0 +1,12 @@ +Buildfile: C:\Users\miria\Documents\ultimate\trunk\source\SMTInterpol\src\de\uni_freiburg\informatik\ultimate\smtinterpol\smtlib\build-parser.xml + +generate_parser: + [java] Picked up JAVA_TOOL_OPTIONS: -Dmaven.gitcommitid.skip=true + [java] Error: Could not find or load main class com.github.jhoenicke.javacup.Main + [java] Caused by: java.lang.ClassNotFoundException: com.github.jhoenicke.javacup.Main + +BUILD FAILED +C:\Users\miria\Documents\ultimate\trunk\source\SMTInterpol\src\de\uni_freiburg\informatik\ultimate\smtinterpol\smtlib\build-parser.xml:28: Java returned: 1 + +Total time: 1 second + diff --git a/ant-smtinterpol-smtlib2.log b/ant-smtinterpol-smtlib2.log new file mode 100644 index 00000000000..6685b9b856e --- /dev/null +++ b/ant-smtinterpol-smtlib2.log @@ -0,0 +1,12 @@ +Buildfile: C:\Users\miria\Documents\ultimate\trunk\source\SMTInterpol\src\de\uni_freiburg\informatik\ultimate\smtinterpol\smtlib2\build-parser.xml + +generate_parser: + [java] Picked up JAVA_TOOL_OPTIONS: -Dmaven.gitcommitid.skip=true + [java] Error: Could not find or load main class com.github.jhoenicke.javacup.Main + [java] Caused by: java.lang.ClassNotFoundException: com.github.jhoenicke.javacup.Main + +BUILD FAILED +C:\Users\miria\Documents\ultimate\trunk\source\SMTInterpol\src\de\uni_freiburg\informatik\ultimate\smtinterpol\smtlib2\build-parser.xml:28: Java returned: 1 + +Total time: 1 second + diff --git a/ant-smtsolverbridge.log b/ant-smtsolverbridge.log new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ant-spaceexparserparser.log b/ant-spaceexparserparser.log new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ant-srparseparser.log b/ant-srparseparser.log new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ant-toolchain.log b/ant-toolchain.log new file mode 100644 index 00000000000..e69de29bb2d diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java index 6c8bc4023aa..58797b0fa6b 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java @@ -38,6 +38,7 @@ import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; import de.uni_freiburg.informatik.ultimate.automata.petrinet.ITransition; import de.uni_freiburg.informatik.ultimate.automata.petrinet.Marking; +import de.uni_freiburg.informatik.ultimate.automata.petrinet.unfolding.BranchingProcess; import de.uni_freiburg.informatik.ultimate.core.model.services.ILogger; import de.uni_freiburg.informatik.ultimate.core.model.services.IUltimateServiceProvider; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.ModelCheckerUtils; @@ -91,6 +92,7 @@ public class OwickiGriesConstruction { private final Map mGhostVariables; private final OwickiGriesAnnotation mAnnotation; + public OwickiGriesConstruction(final IUltimateServiceProvider services, final CfgSmtToolkit csToolkit, final IPetriNet net, final Map, IPredicate> floydHoare) { @@ -112,6 +114,8 @@ public OwickiGriesConstruction(final IUltimateServiceProvider services, final Cf mAnnotation = new OwickiGriesAnnotation<>(formulaMapping, assignmentMapping, new HashSet<>(mGhostVariables.values()), ghostInitAssignment, mNet, mSymbolTable); } + + /** * Constructs the mapping from places to formulas. A place is mapped to a disjunction of marking predicates, where @@ -297,5 +301,6 @@ public HashRelation, PLACE> getCoMarkedPlaces() { } return relation; } + } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java new file mode 100644 index 00000000000..03a1908851c --- /dev/null +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java @@ -0,0 +1,240 @@ +/* + * Copyright (C) 2020 University of Freiburg + * + * This file is part of the ULTIMATE TraceAbstraction plug-in. + * + * The ULTIMATE TraceAbstraction plug-in is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * The ULTIMATE TraceAbstraction plug-in is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with the ULTIMATE TraceAbstraction plug-in. If not, see . + * + * Additional permission under GNU GPL version 3 section 7: + * If you modify the ULTIMATE TraceAbstraction plug-in, or any covered work, by linking + * or combining it with Eclipse RCP (or a modified version of Eclipse RCP), + * containing parts covered by the terms of the Eclipse Public License, the + * licensors of the ULTIMATE TraceAbstraction plug-in grant you additional permission + * to convey the resulting work. + */ +package de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import de.uni_freiburg.informatik.ultimate.automata.petrinet.Marking; +import de.uni_freiburg.informatik.ultimate.automata.petrinet.unfolding.BranchingProcess; +import de.uni_freiburg.informatik.ultimate.automata.petrinet.unfolding.Event; +import de.uni_freiburg.informatik.ultimate.core.model.services.ILogger; +import de.uni_freiburg.informatik.ultimate.core.model.services.IUltimateServiceProvider; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.ModelCheckerUtils; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.CfgSmtToolkit; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.DefaultIcfgSymbolTable; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.BasicPredicateFactory; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; +import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.ManagedScript; +import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.SmtUtils; +import de.uni_freiburg.informatik.ultimate.logic.Script; +import de.uni_freiburg.informatik.ultimate.logic.Term; +import de.uni_freiburg.informatik.ultimate.util.datastructures.DataStructureUtils; + +/** + * Constructs an Floyd Hoare annotation from a Branching process + * of the Final refined Petri Net. + * + * @author Dominik Klumpp (klumpp@informatik.uni-freiburg.de) + * @author Miriam Lagunes (miriam.lagunes@students.uni-freiburg.de) + * + * @param + * The type of places in the Petri program + * @param + * The type of statements in the Petri program + */ + +public class OwickiGriesFloydHoare { + + private final IUltimateServiceProvider mServices; + private final ILogger mLogger; + private final ManagedScript mManagedScript; + private final Script mScript; + private final DefaultIcfgSymbolTable mSymbolTable; + private final BasicPredicateFactory mFactory; + + private final BranchingProcess mBp; + private final Map mAssertion; + + private Set> mCuts; + private Set mPlaces; + private Set mAssertPlaces; + private Set mOrigPlaces; + private Set> mReach; + + private final Map, IPredicate> mFloydHoareAnnotation; + + + public OwickiGriesFloydHoare(final IUltimateServiceProvider services, final CfgSmtToolkit csToolkit, + BranchingProcess bp, Map assertion) { + + mServices = services; + mLogger = services.getLoggingService().getLogger(ModelCheckerUtils.PLUGIN_ID); + mManagedScript = csToolkit.getManagedScript(); + mScript = mManagedScript.getScript(); + mSymbolTable = new DefaultIcfgSymbolTable(csToolkit.getSymbolTable(), csToolkit.getProcedures()); + mFactory = new BasicPredicateFactory(mServices, mManagedScript, mSymbolTable); + + + mBp = bp; + mAssertion = assertion; + + mCuts = computeMaximalCosets(mBp); + mAssertPlaces = mAssertion.keySet(); + mPlaces = getPlaces(mCuts); + mOrigPlaces = getOrigPlaces(mPlaces, mAssertPlaces); + mReach = getReach(mCuts); + + mFloydHoareAnnotation = getAnnotation(); + + } + + /** + * @param branching process + * @return set of all maximal coset (cuts) + * TODO: Set>, no set of conditions?? labelling function? cCheck branching def + */ + private static Set> computeMaximalCosets(final BranchingProcess bp) { + final Set> maximalCoSets = new LinkedHashSet<>(); + for (final Event event : bp.getEvents()) { + // small optimization, cut-off event has same condition mark as companion + if (!event.isCutoffEvent()) { + maximalCoSets.add(event.getMark().stream().collect(Collectors.toSet())); + } + } + return maximalCoSets; + } + + private Map, IPredicate> getAnnotation(){ + final Map, IPredicate> mapping = new HashMap<>(); + for (Set marking : mReach) { + mapping.put(new Marking(marking), getCutAssertion(marking)); + } + return mapping; + } + + + //phi(d) = conjuct(assert(p)) for each p in z(d) (assertion places) -> Cut assertion + private IPredicate getCutAssertion(Set cut){ + final Set predicates = new HashSet<>(); + for (PLACE place : getAssertPlaces(cut)) { + predicates.add((Term) mAssertion.get(place)); //TODO: properly get Term? + } + return mFactory.newPredicate(SmtUtils.and(mScript, predicates)); + } + + private IPredicate getMarkingAssertion(Set marking){ + final Set predicates = new HashSet<>(); + for (Set cut : getCuts(marking)) { + predicates.add((Term) getCutAssertion(cut)); //TODO: properly get Term? + } + return mFactory.newPredicate(SmtUtils.or(mScript, predicates)); + } + + /** + * @param cuts + * @return set of all places in Petri Net* + * TODO: or get it as parameter from Net.getPlaces() + */ + private Set getPlaces(Set> cuts){ + final Set places = new HashSet<>(); + for (Set cut : cuts) { + places.addAll(cut); + } + return places; + } + + /** + * @param places + * @param assertPlaces + * @return set of original places + * @TODO: remove p_block? Is in any cut? No, right? + * @TODO: with Parameters or not? + * @TODO: Get original places from Petri Net? + */ + private Set getOrigPlaces(Set places, Set assertPlaces){ + return DataStructureUtils.difference(places, assertPlaces); + } + + /** + * @param cut + * @return mark, set of original places in cut + */ + private Set getCutMarking(Set cut){ + Set mark = new HashSet<>(); + for (PLACE place : cut ) { + if (mOrigPlaces.contains(place)) { + mark.add(place); + } + } + return mark; + } + + /** + * @param cut + * @return set of all assertion places in cut + */ + private Set getAssertPlaces(Set cut){ + final Set places = new HashSet<>(); + for (PLACE place : cut ) { + if (mAssertPlaces.contains(place)) { + places.add(place); + } + } + return places; + } + + /** + * @param Cuts + * @return set of all markings (set of original places) + * @TODO: Set> or Set>? + */ + private Set> getReach(Set> Cuts){ + final Set> markings = new HashSet<>(); + for (Set cut : Cuts) { + markings.add(getCutMarking(cut)); + } + return markings; + } + + /** + * @param marking + * @return set of cuts that have marking as original marking + */ + private Set> getCuts(Set marking){ + final Set> cuts = new HashSet<>(); + for (Set cut : mCuts) { + if (marking.equals(getCutMarking(cut))) { + cuts.add(cut); + } + } + return cuts; + } + + + public Map, IPredicate> getResult(){ + return mFloydHoareAnnotation; + } + + public IPredicate getAssertion(Marking marking) { + return mFloydHoareAnnotation.get(marking); + } + +} From 8b1efaa08e6ddf480c4ad243d7361584717f5740 Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Thu, 20 May 2021 21:44:39 +0200 Subject: [PATCH 047/536] OG FloydHoare annotation --- ...-Automizer_Default-noMmResRef-PN-NoLbe.epf | 2 +- trunk/source/CoreRCP/plugin.xml | 3 +- .../concurrency/CegarLoopForPetriNet.java | 28 ++++++++++++++++ .../concurrency/OwickiGriesFloydHoare.java | 32 ++++++++++++------- 4 files changed, 51 insertions(+), 14 deletions(-) diff --git a/trunk/examples/settings/automizer/concurrent/svcomp-Reach-32bit-Automizer_Default-noMmResRef-PN-NoLbe.epf b/trunk/examples/settings/automizer/concurrent/svcomp-Reach-32bit-Automizer_Default-noMmResRef-PN-NoLbe.epf index 815dc10e2ca..0ae3ecdcd6b 100644 --- a/trunk/examples/settings/automizer/concurrent/svcomp-Reach-32bit-Automizer_Default-noMmResRef-PN-NoLbe.epf +++ b/trunk/examples/settings/automizer/concurrent/svcomp-Reach-32bit-Automizer_Default-noMmResRef-PN-NoLbe.epf @@ -45,7 +45,7 @@ file_export_version=3.0 /instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Use\ separate\ solver\ for\ trace\ checks=true /instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/SMT\ solver=External_ModelsAndUnsatCoreMode /instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Command\ for\ external\ solver=z3 SMTLIB2_COMPLIANT\=true -memory\:2024 -smt2 -in -/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Compute\ Hoare\ Annotation\ of\ negated\ interpolant\ automaton,\ abstraction\ and\ CFG=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Compute\ Hoare\ Annotation\ of\ negated\ interpolant\ automaton,\ abstraction\ and\ CFG=true /instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Positions\ where\ we\ compute\ the\ Hoare\ Annotation=LoopsAndPotentialCycles /instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Trace\ refinement\ strategy=CAMEL /instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Automaton\ type\ used\ in\ concurrency\ analysis=PETRI_NET diff --git a/trunk/source/CoreRCP/plugin.xml b/trunk/source/CoreRCP/plugin.xml index b563a81c65e..9409cb1fad6 100644 --- a/trunk/source/CoreRCP/plugin.xml +++ b/trunk/source/CoreRCP/plugin.xml @@ -21,7 +21,8 @@ - + ) automaton).getResult(); return super.accepts(services, petriNetAsFA, nw, false); } + + public void computeOwickiGries(final BranchingProcess bp, IPetriNet net) { + //assert !isSequential() : "Cannot compute Owicki-Gries for sequential program."; + //assert !floydHoare.isEmpty(); + if (mPref.useLbeInConcurrentAnalysis() != PetriNetLbe.OFF) { + throw new AssertionError("Owicki-Gries does currently not support Petri net LBE."); + } + final OwickiGriesFloydHoare floydHoare = new OwickiGriesFloydHoare + (mServices, mCsToolkit, bp, net); + final Map, IPredicate> petriFloydHoare = floydHoare.getResult(); + + + final OwickiGriesConstruction construction = + new OwickiGriesConstruction<>(mServices, mCsToolkit, net, petriFloydHoare); + // TODO: simplify + final OwickiGriesValidityCheck check = new OwickiGriesValidityCheck<>(mServices, mCsToolkit, + construction.getResult(), construction.getCoMarkedPlaces()); + assert check.isValid() : "Invalid Owicki-Gries annotation"; + } + + + @Override public IStatisticsDataProvider getCegarLoopBenchmark() { diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java index 03a1908851c..37e26970700 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java @@ -32,6 +32,7 @@ import java.util.Set; import java.util.stream.Collectors; +import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; import de.uni_freiburg.informatik.ultimate.automata.petrinet.Marking; import de.uni_freiburg.informatik.ultimate.automata.petrinet.unfolding.BranchingProcess; import de.uni_freiburg.informatik.ultimate.automata.petrinet.unfolding.Event; @@ -71,7 +72,7 @@ public class OwickiGriesFloydHoare { private final BasicPredicateFactory mFactory; private final BranchingProcess mBp; - private final Map mAssertion; + private final IPetriNet mNet; private Set> mCuts; private Set mPlaces; @@ -81,9 +82,15 @@ public class OwickiGriesFloydHoare { private final Map, IPredicate> mFloydHoareAnnotation; - + /** + * @TODO: assertion, places are IPredicate + * @param services + * @param csToolkit + * @param bp + * @param assertion + */ public OwickiGriesFloydHoare(final IUltimateServiceProvider services, final CfgSmtToolkit csToolkit, - BranchingProcess bp, Map assertion) { + final BranchingProcess bp, final IPetriNet net) { mServices = services; mLogger = services.getLoggingService().getLogger(ModelCheckerUtils.PLUGIN_ID); @@ -94,12 +101,13 @@ public OwickiGriesFloydHoare(final IUltimateServiceProvider services, final CfgS mBp = bp; - mAssertion = assertion; - + mNet = net; + mCuts = computeMaximalCosets(mBp); - mAssertPlaces = mAssertion.keySet(); + mPlaces = getPlaces(mCuts); - mOrigPlaces = getOrigPlaces(mPlaces, mAssertPlaces); + mOrigPlaces = new HashSet<>(mNet.getPlaces()); + mAssertPlaces = getAssertPlaces(mPlaces, mOrigPlaces); mReach = getReach(mCuts); mFloydHoareAnnotation = getAnnotation(); @@ -108,7 +116,7 @@ public OwickiGriesFloydHoare(final IUltimateServiceProvider services, final CfgS /** * @param branching process - * @return set of all maximal coset (cuts) + * @return set of all maximal co-set (cuts) * TODO: Set>, no set of conditions?? labelling function? cCheck branching def */ private static Set> computeMaximalCosets(final BranchingProcess bp) { @@ -125,7 +133,7 @@ private static Set> computeMaximalCosets(final Branch private Map, IPredicate> getAnnotation(){ final Map, IPredicate> mapping = new HashMap<>(); for (Set marking : mReach) { - mapping.put(new Marking(marking), getCutAssertion(marking)); + mapping.put(new Marking(marking), getMarkingAssertion(marking)); } return mapping; } @@ -135,7 +143,7 @@ private Map, IPredicate> getAnnotation(){ private IPredicate getCutAssertion(Set cut){ final Set predicates = new HashSet<>(); for (PLACE place : getAssertPlaces(cut)) { - predicates.add((Term) mAssertion.get(place)); //TODO: properly get Term? + predicates.add((Term) place); //TODO: properly get Term? } return mFactory.newPredicate(SmtUtils.and(mScript, predicates)); } @@ -169,8 +177,8 @@ private Set getPlaces(Set> cuts){ * @TODO: with Parameters or not? * @TODO: Get original places from Petri Net? */ - private Set getOrigPlaces(Set places, Set assertPlaces){ - return DataStructureUtils.difference(places, assertPlaces); + private Set getAssertPlaces(Set places, Set origPlaces){ + return DataStructureUtils.difference(places, origPlaces); } /** From 57246c21273e8b4d645b65879e6f732fd28d9f95 Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Fri, 21 May 2021 15:14:54 +0200 Subject: [PATCH 048/536] Update CegarLoopPetriNet --- .../concurrency/CegarLoopForPetriNet.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java index 1b0d05872c0..4b11046a8a8 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java @@ -150,7 +150,10 @@ public enum SizeReduction { private Set mProgramPointPlaces; private final CounterexampleCache mCounterexampleCache; + private BranchingProcess mFinPrefix; + private IPetriNet mInitialNet; + public CegarLoopForPetriNet(final DebugIdentifier name, final IIcfg rootNode, final CfgSmtToolkit csToolkit, final PredicateFactory predicateFactory, final TAPreferences taPrefs, final Collection errorLocs, final IUltimateServiceProvider services, @@ -189,6 +192,7 @@ protected void getInitialAbstraction() throws AutomataLibraryException { "PetriNetLargeBlockEncoding benchmarks", lbe.getStatistics())); } else { mAbstraction = cfg; + mInitialNet = cfg; } mProgramPointPlaces = ((BoundedPetriNet) mAbstraction).getPlaces(); @@ -240,7 +244,7 @@ protected boolean isAbstractionEmpty() throws AutomataOperationCanceledException (finPrefix.getCoRelation().getQueryCounterYes() + finPrefix.getCoRelation().getQueryCounterNo()); mCounterexample = unf.getAcceptingRun(); - // computeOwickiGries(finPrefix, ) + mFinPrefix = finPrefix; } if (mCounterexample == null) { return true; @@ -693,8 +697,9 @@ private boolean acceptsPetriViaFA(final IUltimateServiceProvider services, (IPetriNet) automaton).getResult(); return super.accepts(services, petriNetAsFA, nw, false); } - - public void computeOwickiGries(final BranchingProcess bp, IPetriNet net) { + //final BranchingProcess bp, IPetriNet net + @Override + public void computeOwickiGries() { //assert !isSequential() : "Cannot compute Owicki-Gries for sequential program."; //assert !floydHoare.isEmpty(); if (mPref.useLbeInConcurrentAnalysis() != PetriNetLbe.OFF) { From f96ba3666cbaecb20b8aaccfd975a2d9a5906a7d Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Fri, 21 May 2021 15:20:59 +0200 Subject: [PATCH 049/536] undo accidental change --- trunk/source/CoreRCP/plugin.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/trunk/source/CoreRCP/plugin.xml b/trunk/source/CoreRCP/plugin.xml index 9409cb1fad6..b563a81c65e 100644 --- a/trunk/source/CoreRCP/plugin.xml +++ b/trunk/source/CoreRCP/plugin.xml @@ -21,8 +21,7 @@ - + Date: Fri, 21 May 2021 15:39:34 +0200 Subject: [PATCH 050/536] computeOwickiGries --- .../concurrency/CegarLoopForPetriNet.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java index 4b11046a8a8..b308b3b5cc2 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java @@ -697,21 +697,19 @@ private boolean acceptsPetriViaFA(final IUltimateServiceProvider services, (IPetriNet) automaton).getResult(); return super.accepts(services, petriNetAsFA, nw, false); } - //final BranchingProcess bp, IPetriNet net + @Override public void computeOwickiGries() { - //assert !isSequential() : "Cannot compute Owicki-Gries for sequential program."; - //assert !floydHoare.isEmpty(); + if (mPref.useLbeInConcurrentAnalysis() != PetriNetLbe.OFF) { throw new AssertionError("Owicki-Gries does currently not support Petri net LBE."); } final OwickiGriesFloydHoare floydHoare = new OwickiGriesFloydHoare - (mServices, mCsToolkit, bp, net); - final Map, IPredicate> petriFloydHoare = floydHoare.getResult(); - + (mServices, mCsToolkit, mFinPrefix, mInitialNet); + final Map, IPredicate> petriFloydHoare = floydHoare.getResult(); final OwickiGriesConstruction construction = - new OwickiGriesConstruction<>(mServices, mCsToolkit, net, petriFloydHoare); + new OwickiGriesConstruction<>(mServices, mCsToolkit, mInitialNet, petriFloydHoare); // TODO: simplify final OwickiGriesValidityCheck check = new OwickiGriesValidityCheck<>(mServices, mCsToolkit, construction.getResult(), construction.getCoMarkedPlaces()); From f48e118e95075842f9ff2570084f34c4729f0af4 Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Fri, 21 May 2021 15:57:13 +0200 Subject: [PATCH 051/536] fix for places and predicates --- .../concurrency/CegarLoopForPetriNet.java | 20 +-- .../concurrency/OwickiGriesFloydHoare.java | 170 +++++++++--------- 2 files changed, 94 insertions(+), 96 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java index b308b3b5cc2..374f578f70f 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java @@ -28,7 +28,6 @@ package de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency; import java.util.Collection; -import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -96,7 +95,6 @@ import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.PetriCegarLoopStatisticsGenerator; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.TraceAbstractionStarter; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.TraceAbstractionUtils; -import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.BasicCegarLoop.PetriNetLbe; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.automataminimization.AutomataMinimizationStatisticsGenerator; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.interpolantautomata.transitionappender.DeterministicInterpolantAutomaton; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.petrinetlbe.PetriNetLargeBlockEncoding; @@ -150,10 +148,9 @@ public enum SizeReduction { private Set mProgramPointPlaces; private final CounterexampleCache mCounterexampleCache; - private BranchingProcess mFinPrefix; - private IPetriNet mInitialNet; + private BranchingProcess mFinPrefix; + private IPetriNet mInitialNet; - public CegarLoopForPetriNet(final DebugIdentifier name, final IIcfg rootNode, final CfgSmtToolkit csToolkit, final PredicateFactory predicateFactory, final TAPreferences taPrefs, final Collection errorLocs, final IUltimateServiceProvider services, @@ -243,7 +240,7 @@ protected boolean isAbstractionEmpty() throws AutomataOperationCanceledException mCoRelationQueries += (finPrefix.getCoRelation().getQueryCounterYes() + finPrefix.getCoRelation().getQueryCounterNo()); mCounterexample = unf.getAcceptingRun(); - + mFinPrefix = finPrefix; } if (mCounterexample == null) { @@ -703,10 +700,10 @@ public void computeOwickiGries() { if (mPref.useLbeInConcurrentAnalysis() != PetriNetLbe.OFF) { throw new AssertionError("Owicki-Gries does currently not support Petri net LBE."); - } - final OwickiGriesFloydHoare floydHoare = new OwickiGriesFloydHoare - (mServices, mCsToolkit, mFinPrefix, mInitialNet); - final Map, IPredicate> petriFloydHoare = floydHoare.getResult(); + } + final OwickiGriesFloydHoare floydHoare = + OwickiGriesFloydHoare.create(mServices, mCsToolkit, mFinPrefix, mInitialNet); + final Map, IPredicate> petriFloydHoare = floydHoare.getResult(); final OwickiGriesConstruction construction = new OwickiGriesConstruction<>(mServices, mCsToolkit, mInitialNet, petriFloydHoare); @@ -715,9 +712,6 @@ public void computeOwickiGries() { construction.getResult(), construction.getCoMarkedPlaces()); assert check.isValid() : "Invalid Owicki-Gries annotation"; } - - - @Override public IStatisticsDataProvider getCegarLoopBenchmark() { diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java index 37e26970700..d5c35ecd68a 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java @@ -30,6 +30,7 @@ import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; @@ -44,14 +45,11 @@ import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.BasicPredicateFactory; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.ManagedScript; -import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.SmtUtils; import de.uni_freiburg.informatik.ultimate.logic.Script; -import de.uni_freiburg.informatik.ultimate.logic.Term; import de.uni_freiburg.informatik.ultimate.util.datastructures.DataStructureUtils; /** - * Constructs an Floyd Hoare annotation from a Branching process - * of the Final refined Petri Net. + * Constructs an Floyd Hoare annotation from a Branching process of the Final refined Petri Net. * * @author Dominik Klumpp (klumpp@informatik.uni-freiburg.de) * @author Miriam Lagunes (miriam.lagunes@students.uni-freiburg.de) @@ -63,25 +61,26 @@ */ public class OwickiGriesFloydHoare { - + private final IUltimateServiceProvider mServices; private final ILogger mLogger; private final ManagedScript mManagedScript; private final Script mScript; private final DefaultIcfgSymbolTable mSymbolTable; private final BasicPredicateFactory mFactory; - + private final Function mPlace2Predicate; + private final BranchingProcess mBp; - private final IPetriNet mNet; - - private Set> mCuts; - private Set mPlaces; - private Set mAssertPlaces; - private Set mOrigPlaces; - private Set> mReach; - + private final IPetriNet mNet; + + private final Set> mCuts; + private final Set mPlaces; + private final Set mAssertPlaces; + private final Set mOrigPlaces; + private final Set> mReach; + private final Map, IPredicate> mFloydHoareAnnotation; - + /** * @TODO: assertion, places are IPredicate * @param services @@ -90,159 +89,164 @@ public class OwickiGriesFloydHoare { * @param assertion */ public OwickiGriesFloydHoare(final IUltimateServiceProvider services, final CfgSmtToolkit csToolkit, - final BranchingProcess bp, final IPetriNet net) { - + final BranchingProcess bp, final IPetriNet net, + final Function place2Predicate) { + mServices = services; mLogger = services.getLoggingService().getLogger(ModelCheckerUtils.PLUGIN_ID); mManagedScript = csToolkit.getManagedScript(); mScript = mManagedScript.getScript(); mSymbolTable = new DefaultIcfgSymbolTable(csToolkit.getSymbolTable(), csToolkit.getProcedures()); mFactory = new BasicPredicateFactory(mServices, mManagedScript, mSymbolTable); + mPlace2Predicate = place2Predicate; - mBp = bp; mNet = net; - + mCuts = computeMaximalCosets(mBp); - + mPlaces = getPlaces(mCuts); mOrigPlaces = new HashSet<>(mNet.getPlaces()); mAssertPlaces = getAssertPlaces(mPlaces, mOrigPlaces); mReach = getReach(mCuts); - - mFloydHoareAnnotation = getAnnotation(); - + + mFloydHoareAnnotation = getAnnotation(); + + } + + public static OwickiGriesFloydHoare create(final IUltimateServiceProvider services, + final CfgSmtToolkit csToolkit, final BranchingProcess bp, + final IPetriNet net) { + return new OwickiGriesFloydHoare<>(services, csToolkit, bp, net, x -> x); } - + /** - * @param branching process - * @return set of all maximal co-set (cuts) - * TODO: Set>, no set of conditions?? labelling function? cCheck branching def + * @param branching + * process + * @return set of all maximal co-set (cuts) TODO: Set>, no set of conditions?? labelling function? cCheck + * branching def */ private static Set> computeMaximalCosets(final BranchingProcess bp) { - final Set> maximalCoSets = new LinkedHashSet<>(); - for (final Event event : bp.getEvents()) { - // small optimization, cut-off event has same condition mark as companion - if (!event.isCutoffEvent()) { - maximalCoSets.add(event.getMark().stream().collect(Collectors.toSet())); - } - } - return maximalCoSets; + final Set> maximalCoSets = new LinkedHashSet<>(); + for (final Event event : bp.getEvents()) { + // small optimization, cut-off event has same condition mark as companion + if (!event.isCutoffEvent()) { + maximalCoSets.add(event.getMark().stream().collect(Collectors.toSet())); + } + } + return maximalCoSets; } - - private Map, IPredicate> getAnnotation(){ + + private Map, IPredicate> getAnnotation() { final Map, IPredicate> mapping = new HashMap<>(); - for (Set marking : mReach) { + for (final Set marking : mReach) { mapping.put(new Marking(marking), getMarkingAssertion(marking)); } return mapping; } - - - //phi(d) = conjuct(assert(p)) for each p in z(d) (assertion places) -> Cut assertion - private IPredicate getCutAssertion(Set cut){ - final Set predicates = new HashSet<>(); - for (PLACE place : getAssertPlaces(cut)) { - predicates.add((Term) place); //TODO: properly get Term? + + // phi(d) = conjuct(assert(p)) for each p in z(d) (assertion places) -> Cut assertion + private IPredicate getCutAssertion(final Set cut) { + final Set predicates = new HashSet<>(); + for (final PLACE place : getAssertPlaces(cut)) { + predicates.add(mPlace2Predicate.apply(place)); } - return mFactory.newPredicate(SmtUtils.and(mScript, predicates)); + return mFactory.and(predicates); } - - private IPredicate getMarkingAssertion(Set marking){ - final Set predicates = new HashSet<>(); - for (Set cut : getCuts(marking)) { - predicates.add((Term) getCutAssertion(cut)); //TODO: properly get Term? + + private IPredicate getMarkingAssertion(final Set marking) { + final Set predicates = new HashSet<>(); + for (final Set cut : getCuts(marking)) { + predicates.add(getCutAssertion(cut)); } - return mFactory.newPredicate(SmtUtils.or(mScript, predicates)); + return mFactory.or(predicates); } /** * @param cuts - * @return set of all places in Petri Net* - * TODO: or get it as parameter from Net.getPlaces() + * @return set of all places in Petri Net* TODO: or get it as parameter from Net.getPlaces() */ - private Set getPlaces(Set> cuts){ - final Set places = new HashSet<>(); - for (Set cut : cuts) { + private Set getPlaces(final Set> cuts) { + final Set places = new HashSet<>(); + for (final Set cut : cuts) { places.addAll(cut); - } + } return places; } - + /** * @param places * @param assertPlaces * @return set of original places * @TODO: remove p_block? Is in any cut? No, right? - * @TODO: with Parameters or not? + * @TODO: with Parameters or not? * @TODO: Get original places from Petri Net? */ - private Set getAssertPlaces(Set places, Set origPlaces){ - return DataStructureUtils.difference(places, origPlaces); + private Set getAssertPlaces(final Set places, final Set origPlaces) { + return DataStructureUtils.difference(places, origPlaces); } - + /** * @param cut * @return mark, set of original places in cut */ - private Set getCutMarking(Set cut){ - Set mark = new HashSet<>(); - for (PLACE place : cut ) { + private Set getCutMarking(final Set cut) { + final Set mark = new HashSet<>(); + for (final PLACE place : cut) { if (mOrigPlaces.contains(place)) { mark.add(place); } - } + } return mark; } - + /** * @param cut * @return set of all assertion places in cut */ - private Set getAssertPlaces(Set cut){ + private Set getAssertPlaces(final Set cut) { final Set places = new HashSet<>(); - for (PLACE place : cut ) { + for (final PLACE place : cut) { if (mAssertPlaces.contains(place)) { places.add(place); } - } + } return places; } - + /** * @param Cuts * @return set of all markings (set of original places) * @TODO: Set> or Set>? */ - private Set> getReach(Set> Cuts){ + private Set> getReach(final Set> Cuts) { final Set> markings = new HashSet<>(); - for (Set cut : Cuts) { + for (final Set cut : Cuts) { markings.add(getCutMarking(cut)); } return markings; } - + /** * @param marking * @return set of cuts that have marking as original marking */ - private Set> getCuts(Set marking){ + private Set> getCuts(final Set marking) { final Set> cuts = new HashSet<>(); - for (Set cut : mCuts) { + for (final Set cut : mCuts) { if (marking.equals(getCutMarking(cut))) { cuts.add(cut); } } return cuts; } - - - public Map, IPredicate> getResult(){ + + public Map, IPredicate> getResult() { return mFloydHoareAnnotation; } - - public IPredicate getAssertion(Marking marking) { + + public IPredicate getAssertion(final Marking marking) { return mFloydHoareAnnotation.get(marking); } - + } From aa6c4078f2ceac5f8e22ce963dcd6c693cb5447f Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Wed, 2 Jun 2021 07:53:57 +0200 Subject: [PATCH 052/536] update finite prefix --- .../traceabstraction/concurrency/CegarLoopForPetriNet.java | 1 + 1 file changed, 1 insertion(+) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java index 374f578f70f..085e43f9e60 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java @@ -291,6 +291,7 @@ protected boolean refineAbstraction() throws AutomataLibraryException { if (USE_COUNTEREXAMPLE_CACHE) { final PetriNetRun run = enhancementResult.getSecond().getFinitePrefixOfDifference().getAcceptingRun(); + mFinPrefix = enhancementResult.getSecond().getFinitePrefixOfDifference().getResult(); mCounterexampleCache.setCounterexample(run); } From fe244436e7476f3fb128496e5b86bd52b925ad80 Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Tue, 15 Jun 2021 09:56:19 +0200 Subject: [PATCH 053/536] HittingSet Implementation of hitting set for ghost variables not in marking in OG Construction. --- .../concurrency/CegarLoopForPetriNet.java | 2 +- .../concurrency/OwickiGriesConstruction.java | 136 +++++++++++++++++- 2 files changed, 135 insertions(+), 3 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java index 085e43f9e60..75e429e9966 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java @@ -114,7 +114,7 @@ public enum SizeReduction { REMOVE_DEAD, REMOVE_REDUNDANT_FLOW } - private static final boolean USE_ON_DEMAND_RESULT = false; + private static final boolean USE_ON_DEMAND_RESULT = true; private static final boolean DEBUG_WRITE_NET_HASH_CODES = false; diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java index 58797b0fa6b..2685a3e057f 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java @@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -148,7 +149,7 @@ private Term getMarkingPredicate(final Marking marking) { final Term ghost = mGhostVariables.get(otherPlace).getTerm(); terms.add(ghost); } - terms.addAll(getAllNotMarking(marking)); + terms.addAll(getHitNotMarking(marking)); terms.add(mFloydHoareAnnotation.get(marking).getFormula()); return SmtUtils.and(mScript, terms); } @@ -156,7 +157,7 @@ private Term getMarkingPredicate(final Marking marking) { /** * * @param marking - * @return Formula MethodB:Predicate with GhostVariables of all other places not in marking + * @return Formula MethodA:Predicate with GhostVariables of all other places not in marking */ private Set getAllNotMarking(final Marking marking) { final Set markPlaces = marking.stream().collect(Collectors.toSet()); @@ -168,7 +169,138 @@ private Set getAllNotMarking(final Marking marking) { } return predicates; } + + + /** + * + * @param marking + * @return Formula MethodB:Predicate with GhostVariables of hitting set of other places not in marking + */ + private Set getHitNotMarking(final Marking marking) { + //TODO: quitar marking de este Hitting set? + final Set markPlaces = marking.stream().collect(Collectors.toSet()); + final Set> symmDifference = getSymmDifferences(marking); + final Set notMarking = getHittingSet(symmDifference); + final Set predicates = new HashSet<>(); + for (final PLACE place : notMarking) { + final Term ghost = mGhostVariables.get(place).getTerm(); + predicates.add(SmtUtils.not(mScript, ghost)); + } + return predicates; + } + + /** + * @param marking + * @return set of symmetric differences of marking to all different reachable markings + */ + private Set> getSymmDifferences(final Marking marking){ + Set> differences= new HashSet<>(); + Set> reachableMarkings = mFloydHoareAnnotation.keySet(); + for (final Marking reachable : reachableMarkings) { + if (!marking.equals(reachable)) { + differences.add(SymmDiff(marking.stream().collect(Collectors.toSet()), + reachable.stream().collect(Collectors.toSet())));}} + return differences; + } + + /** + * @param s1 + * @param s2 + * @return Symmetric difference of set + * TODO:Already implemented in Ultimate? Guava library? + */ + private Set SymmDiff(Set s1, Set s2){ + Set symmetricDiff = new HashSet(s1); + symmetricDiff.addAll(s2); + Set tmp = new HashSet(s1); + tmp.retainAll(s2); + symmetricDiff.removeAll(tmp); // use DataStructre.difference?? + return symmetricDiff; + } + /** + * + * @param symmDifference + * @return hitting set of symmetricDifference + */ + private Set getHittingSet(Set> symmDifference) { + Set hittingSet = new HashSet(); + Set> uncovered = new HashSet>(symmDifference); + Set> covered = new HashSet>(); + Set> unchecked = new HashSet>(symmDifference);//TODO: Order by size, more efficient + for (Set set : unchecked) { + + if (!checkHittingSet(hittingSet,symmDifference)) { + Set greedySet = getGreedySet(uncovered, unchecked); + hittingSet.addAll(greedySet); + ArrayList> inter = getIntersections(greedySet, uncovered); + covered.addAll(inter); + uncovered.removeAll(inter); + } + else { + break; + } + unchecked.remove(set); + } + + assert checkHittingSet(hittingSet,symmDifference) : "error hittings set"; + return hittingSet; + } + + /** + * + * @param hittingSet + * @param setUniverse + * @return true if hittinSet intersects with all sets in Universe + */ + + private boolean checkHittingSet(Set hittingSet, Set> setUniverse) { + Set> universe = new HashSet>(setUniverse); + for (Set set : universe) { + if (DataStructureUtils.intersection(set, hittingSet).isEmpty()) { + return false; + } + } + return true; + } + + + /** + * + * @param set + * @param collection + * @return List of sets with which a set intersects + */ + private ArrayList> getIntersections(Set set, Set> collection){ + ArrayList> intersections = new ArrayList>(); + for (Set s : collection) { + if (!DataStructureUtils.intersection(set, s).isEmpty()) { + intersections.add(s); + } + } + return intersections; + } + + /** + * + * @param uncovered + * @param collection of not selected sets + * @return return set in uncovered + */ + private Set getGreedySet(Set> uncovered, Set> collection) { + Set greedy = new HashSet(); + ArrayList> intersections = new ArrayList>(); + for (Set set : collection) { + ArrayList> setInter = getIntersections(set,uncovered); //correct getintersections + if ( setInter.size() > intersections.size()) { + greedy = set; + intersections = setInter; + } + } + return greedy; + + } + /** * * @param marking From 094a0a7132d4d4e8ee6b696eff458283ee4e30bd Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Thu, 17 Jun 2021 20:58:37 +0200 Subject: [PATCH 054/536] HittinSet OG --- .../concurrency/HittingSet.java | 215 ++++++++++++++++++ .../concurrency/OwickiGriesConstruction.java | 126 ++-------- 2 files changed, 228 insertions(+), 113 deletions(-) create mode 100644 trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/HittingSet.java diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/HittingSet.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/HittingSet.java new file mode 100644 index 00000000000..a12395c8b6d --- /dev/null +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/HittingSet.java @@ -0,0 +1,215 @@ +/* + * Copyright (C) 2020 University of Freiburg + * + * This file is part of the ULTIMATE TraceAbstraction plug-in. + * + * The ULTIMATE TraceAbstraction plug-in is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * The ULTIMATE TraceAbstraction plug-in is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with the ULTIMATE TraceAbstraction plug-in. If not, see . + * + * Additional permission under GNU GPL version 3 section 7: + * If you modify the ULTIMATE TraceAbstraction plug-in, or any covered work, by linking + * or combining it with Eclipse RCP (or a modified version of Eclipse RCP), + * containing parts covered by the terms of the Eclipse Public License, the + * licensors of the ULTIMATE TraceAbstraction plug-in grant you additional permission + * to convey the resulting work. + * */ +package de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; +import de.uni_freiburg.informatik.ultimate.automata.petrinet.ITransition; +import de.uni_freiburg.informatik.ultimate.automata.petrinet.Marking; +import de.uni_freiburg.informatik.ultimate.automata.petrinet.unfolding.BranchingProcess; +import de.uni_freiburg.informatik.ultimate.core.model.services.ILogger; +import de.uni_freiburg.informatik.ultimate.core.model.services.IUltimateServiceProvider; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.ModelCheckerUtils; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.CfgSmtToolkit; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.DefaultIcfgSymbolTable; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.TransFormulaBuilder; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.TransFormulaUtils; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.UnmodifiableTransFormula; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.variables.IProgramVar; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.variables.ProgramVarUtils; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.BasicPredicateFactory; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; +import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.ManagedScript; +import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.SmtSortUtils; +import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.SmtUtils; +import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.SmtUtils.SimplificationTechnique; +import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.SmtUtils.XnfConversionTechnique; +import de.uni_freiburg.informatik.ultimate.logic.Script; +import de.uni_freiburg.informatik.ultimate.logic.Term; +import de.uni_freiburg.informatik.ultimate.logic.TermVariable; +import de.uni_freiburg.informatik.ultimate.util.datastructures.DataStructureUtils; +import de.uni_freiburg.informatik.ultimate.util.datastructures.relation.HashRelation; + +/** + * Constructs a Hitting set of from the collections of sets. @TODO: finish description, redundant? + * + * @author Miriam Lagunes (miriam.lagunes@students.uni-freiburg.de) + * + * @param + * + */ + +public class HittingSet { + private final Set> mCollection; + + + public HittingSet(final Set> collection) { + mCollection = collection; + + } + + /** + * + * @param hittingSet + * @param setUniverse + * @return true if hittinSet intersects with all sets in setUniverse + */ + private boolean checkHittingSet(Set hittingSet, Set> setUniverse) { + Set> universe = new HashSet>(setUniverse); + for (Set set : universe) { + if (DataStructureUtils.intersection(set, hittingSet).isEmpty()) { + return false; + } + } + return true; + } + + /** + * @param s1 + * @param s2 + * @return Symmetric difference of set + * TODO:Already implemented in Ultimate? Guava library? + */ + private Set getSymmDiff(Set s1, Set s2){ + Set symmetricDiff = new HashSet(s1); + symmetricDiff.addAll(s2); + Set tmp = new HashSet(s1); + tmp.retainAll(s2); + symmetricDiff.removeAll(tmp); // use DataStructre.difference?? + return symmetricDiff; + } + + /** + * @param collection of set + * @return set of symmetric differences of all set pairs in collection + */ + private Set> getSymmDifferences(Set> collection){ + Set> differences= new HashSet<>(); + Set> toCombine= new HashSet<>(); + toCombine.addAll(collection); + for (Set e: collection) { + if (!toCombine.isEmpty()) { + toCombine.remove(e); + for (Set s :toCombine) { + differences.add(getSymmDiff(e,s)); + } + } + } + return differences; + } + + /** + * + * @param element + * @param collection + * @return List of sets that contains the element + */ + private Set> getIntersections(T element, Set> collection){ + Set> intersections = new HashSet>(); + for (Set set : collection) { + if(set.contains(element)) { + intersections.add(set); + } + } + return intersections; + } + + + /** + * + * @param set + * @param collection of not covered sets + * @return return set in uncovered + */ + private T getGreedyElement(Set set, Set> collection) { + + Set> intersections = new HashSet>(); + T greedy = set.iterator().next(); + for (T element : set) { + Set> setInter = getIntersections(element,collection); + if ( setInter.size() > intersections.size()) { + greedy = element; + intersections = setInter; + } + } + return greedy; + } + + /** + * + * @param symmDifference + * @return hitting set of symmetricDifference + */ + private Set getHittingSet(Set> collection) { + Set hittingSet = new HashSet(); + Set> uncovered = new HashSet>(); + uncovered.addAll(collection); + for (Set set : collection) { + if (!checkHittingSet(hittingSet,collection)) { + T greedy = getGreedyElement(set,uncovered); + hittingSet.add(greedy); + Set> inter = getIntersections(greedy, uncovered); + uncovered = DataStructureUtils.difference(uncovered, inter); + } + else { + break; + } + } + + assert checkHittingSet(hittingSet,collection): "Error in Hitting set"; + return hittingSet; + } + + public Set getSymmHittingSet() { + Set> collection = getSymmDifferences(mCollection); + return getHittingSet(collection); + } + + public Set getHittingSet(){ + return getHittingSet(mCollection); + } + + +} + + + + + + + + + diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java index 2685a3e057f..b4c2467d077 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java @@ -35,6 +35,7 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; import de.uni_freiburg.informatik.ultimate.automata.petrinet.ITransition; @@ -91,6 +92,7 @@ public class OwickiGriesConstruction { private static final XnfConversionTechnique mXnfConversionTechnique = XnfConversionTechnique.BOTTOM_UP_WITH_LOCAL_SIMPLIFICATION; + private final Set mHittingSet; private final Map mGhostVariables; private final OwickiGriesAnnotation mAnnotation; @@ -108,6 +110,7 @@ public OwickiGriesConstruction(final IUltimateServiceProvider services, final Cf mFactory = new BasicPredicateFactory(mServices, mManagedScript, mSymbolTable); mGhostVariables = getGhostVariables(); + mHittingSet = getHittingSet(); final Map formulaMapping = getFormulaMapping(); final Map, UnmodifiableTransFormula> assignmentMapping = getAssignmentMapping(); final Map ghostInitAssignment = getGhostInitAssignment(); @@ -169,18 +172,16 @@ private Set getAllNotMarking(final Marking marking) { } return predicates; } - - + /** * * @param marking * @return Formula MethodB:Predicate with GhostVariables of hitting set of other places not in marking */ private Set getHitNotMarking(final Marking marking) { - //TODO: quitar marking de este Hitting set? - final Set markPlaces = marking.stream().collect(Collectors.toSet()); - final Set> symmDifference = getSymmDifferences(marking); - final Set notMarking = getHittingSet(symmDifference); + //TODO: remove places from hittingSet than are in current marking. + final Set notMarking = DataStructureUtils.difference(mHittingSet, + marking.stream().collect(Collectors.toSet())); final Set predicates = new HashSet<>(); for (final PLACE place : notMarking) { final Term ghost = mGhostVariables.get(place).getTerm(); @@ -189,117 +190,16 @@ private Set getHitNotMarking(final Marking marking) { return predicates; } - /** - * @param marking - * @return set of symmetric differences of marking to all different reachable markings - */ - private Set> getSymmDifferences(final Marking marking){ - Set> differences= new HashSet<>(); - Set> reachableMarkings = mFloydHoareAnnotation.keySet(); - for (final Marking reachable : reachableMarkings) { - if (!marking.equals(reachable)) { - differences.add(SymmDiff(marking.stream().collect(Collectors.toSet()), - reachable.stream().collect(Collectors.toSet())));}} - return differences; - } - - /** - * @param s1 - * @param s2 - * @return Symmetric difference of set - * TODO:Already implemented in Ultimate? Guava library? - */ - private Set SymmDiff(Set s1, Set s2){ - Set symmetricDiff = new HashSet(s1); - symmetricDiff.addAll(s2); - Set tmp = new HashSet(s1); - tmp.retainAll(s2); - symmetricDiff.removeAll(tmp); // use DataStructre.difference?? - return symmetricDiff; - } - /** - * - * @param symmDifference - * @return hitting set of symmetricDifference - */ - private Set getHittingSet(Set> symmDifference) { - Set hittingSet = new HashSet(); - Set> uncovered = new HashSet>(symmDifference); - Set> covered = new HashSet>(); - Set> unchecked = new HashSet>(symmDifference);//TODO: Order by size, more efficient - - for (Set set : unchecked) { - - if (!checkHittingSet(hittingSet,symmDifference)) { - Set greedySet = getGreedySet(uncovered, unchecked); - hittingSet.addAll(greedySet); - ArrayList> inter = getIntersections(greedySet, uncovered); - covered.addAll(inter); - uncovered.removeAll(inter); - } - else { - break; - } - unchecked.remove(set); + private Set getHittingSet(){ + final Set> reachableMarkings = new HashSet>(); + for (Marking mark : mFloydHoareAnnotation.keySet()) { + reachableMarkings.add(mark.stream().collect(Collectors.toSet())); } - - assert checkHittingSet(hittingSet,symmDifference) : "error hittings set"; - return hittingSet; + final HittingSet hitSet = new HittingSet(reachableMarkings); + return hitSet.getSymmHittingSet(); } - /** - * - * @param hittingSet - * @param setUniverse - * @return true if hittinSet intersects with all sets in Universe - */ - - private boolean checkHittingSet(Set hittingSet, Set> setUniverse) { - Set> universe = new HashSet>(setUniverse); - for (Set set : universe) { - if (DataStructureUtils.intersection(set, hittingSet).isEmpty()) { - return false; - } - } - return true; - } - - - /** - * - * @param set - * @param collection - * @return List of sets with which a set intersects - */ - private ArrayList> getIntersections(Set set, Set> collection){ - ArrayList> intersections = new ArrayList>(); - for (Set s : collection) { - if (!DataStructureUtils.intersection(set, s).isEmpty()) { - intersections.add(s); - } - } - return intersections; - } - /** - * - * @param uncovered - * @param collection of not selected sets - * @return return set in uncovered - */ - private Set getGreedySet(Set> uncovered, Set> collection) { - Set greedy = new HashSet(); - ArrayList> intersections = new ArrayList>(); - for (Set set : collection) { - ArrayList> setInter = getIntersections(set,uncovered); //correct getintersections - if ( setInter.size() > intersections.size()) { - greedy = set; - intersections = setInter; - } - } - return greedy; - - } /** * From 190b10656d960e2e22aabd6216a3db1b6c3709eb Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Fri, 18 Jun 2021 18:49:55 +0200 Subject: [PATCH 055/536] HittingSet OG Intersection of Hitting set for positive, negative theta and assignments of ghost variables. --- .../concurrency/OwickiGriesConstruction.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java index b4c2467d077..a5bed8882f8 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java @@ -129,7 +129,6 @@ public OwickiGriesConstruction(final IUltimateServiceProvider services, final Cf */ private Map getFormulaMapping() { final Map mapping = new HashMap<>(); - final Set> reachableMarkings = mFloydHoareAnnotation.keySet(); for (final PLACE place : mNet.getPlaces()) { final Set clauses = reachableMarkings.stream().filter(m -> m.contains(place)) @@ -148,11 +147,14 @@ private Map getFormulaMapping() { */ private Term getMarkingPredicate(final Marking marking) { final Set terms = new HashSet<>(); - for (final PLACE otherPlace : marking) { + final Set posPlaces = DataStructureUtils.intersection(mHittingSet, + marking.stream().collect(Collectors.toSet())); + for (final PLACE otherPlace : posPlaces) { final Term ghost = mGhostVariables.get(otherPlace).getTerm(); terms.add(ghost); } terms.addAll(getHitNotMarking(marking)); + //terms.addAll(getAllNotMarking(marking)); terms.add(mFloydHoareAnnotation.get(marking).getFormula()); return SmtUtils.and(mScript, terms); } @@ -302,10 +304,12 @@ private Map, UnmodifiableTransFormula> getAssignmentM */ private UnmodifiableTransFormula getTransitionAssignment(final ITransition transition) { final List assignments = new ArrayList<>(); - for (final PLACE place : mNet.getPredecessors(transition)) { + final Set predecesors = DataStructureUtils.intersection(mNet.getPredecessors(transition), mHittingSet); + final Set successors = DataStructureUtils.intersection(mNet.getSuccessors(transition), mHittingSet); + for (final PLACE place : predecesors) { assignments.add(getGhostAssignment(Collections.nCopies(1, mGhostVariables.get(place)), "false")); } - for (final PLACE place : mNet.getSuccessors(transition)) { + for (final PLACE place : successors) { assignments.add(getGhostAssignment(Collections.nCopies(1, mGhostVariables.get(place)), "true")); } return TransFormulaUtils.sequentialComposition(mLogger, mServices, mManagedScript, false, false, false, From 6cbf07c602ed6f768b20b14f5533b81a4615050a Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Mon, 21 Jun 2021 23:32:08 +0200 Subject: [PATCH 056/536] add some temporary code for debugging: F/H inductivity check --- .../concurrency/CegarLoopForPetriNet.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java index 75e429e9966..a4bb35f24f8 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java @@ -82,6 +82,7 @@ import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.variables.IProgramVar; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.hoaretriple.IHoareTripleChecker; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.hoaretriple.IncrementalHoareTripleChecker; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.hoaretriple.MonolithicHoareTripleChecker; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicateCoverageChecker; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.PredicateFactory; @@ -706,6 +707,29 @@ public void computeOwickiGries() { OwickiGriesFloydHoare.create(mServices, mCsToolkit, mFinPrefix, mInitialNet); final Map, IPredicate> petriFloydHoare = floydHoare.getResult(); + final var htc = new MonolithicHoareTripleChecker(mCsToolkit); + for (final var entry : petriFloydHoare.entrySet()) { + final var markPre = entry.getKey(); + final var pre = entry.getValue(); + for (final var trans : mInitialNet.getTransitions()) { + if (markPre.isTransitionEnabled(trans, mInitialNet)) { + Marking markPost; + try { + markPost = markPre.fireTransition(trans, mInitialNet); + final var post = petriFloydHoare.getOrDefault(markPost, mPredicateFactory.or()); + final Validity valid = htc.checkInternal(pre, (IInternalAction) trans.getSymbol(), post); + if (valid != Validity.VALID) { + throw new IllegalStateException(""); + } + } catch (final PetriNetNot1SafeException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + } + } + final OwickiGriesConstruction construction = new OwickiGriesConstruction<>(mServices, mCsToolkit, mInitialNet, petriFloydHoare); // TODO: simplify From 7659c30988c85d19c9d0f2d7230e3a8a37611715 Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Wed, 30 Jun 2021 20:03:11 +0200 Subject: [PATCH 057/536] MaximalCosets by succesorCoset computation --- .../petrinet/unfolding/ICoRelation.java | 2 +- .../concurrency/OwickiGriesFloydHoare.java | 95 +++++++++++++++++-- 2 files changed, 89 insertions(+), 8 deletions(-) diff --git a/trunk/source/Library-Automata/src/de/uni_freiburg/informatik/ultimate/automata/petrinet/unfolding/ICoRelation.java b/trunk/source/Library-Automata/src/de/uni_freiburg/informatik/ultimate/automata/petrinet/unfolding/ICoRelation.java index 2b80f86e1b2..953bec60664 100644 --- a/trunk/source/Library-Automata/src/de/uni_freiburg/informatik/ultimate/automata/petrinet/unfolding/ICoRelation.java +++ b/trunk/source/Library-Automata/src/de/uni_freiburg/informatik/ultimate/automata/petrinet/unfolding/ICoRelation.java @@ -92,7 +92,7 @@ public interface ICoRelation { /** - * All initial Conditions in a branchin process are in co relation. Hence, all pairs of Conditions from + * All initial Conditions in a branching process are in co relation. Hence, all pairs of Conditions from * initialConditions are added. * * @param initialConditions diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java index d5c35ecd68a..5d8163b090a 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java @@ -25,6 +25,7 @@ */ package de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; @@ -33,9 +34,11 @@ import java.util.function.Function; import java.util.stream.Collectors; +import de.uni_freiburg.informatik.ultimate.automata.nestedword.NestedWordAutomaton; import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; import de.uni_freiburg.informatik.ultimate.automata.petrinet.Marking; import de.uni_freiburg.informatik.ultimate.automata.petrinet.unfolding.BranchingProcess; +import de.uni_freiburg.informatik.ultimate.automata.petrinet.unfolding.Condition; import de.uni_freiburg.informatik.ultimate.automata.petrinet.unfolding.Event; import de.uni_freiburg.informatik.ultimate.core.model.services.ILogger; import de.uni_freiburg.informatik.ultimate.core.model.services.IUltimateServiceProvider; @@ -46,6 +49,7 @@ import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.ManagedScript; import de.uni_freiburg.informatik.ultimate.logic.Script; +import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.tracehandling.IRefinementEngine; import de.uni_freiburg.informatik.ultimate.util.datastructures.DataStructureUtils; /** @@ -69,15 +73,21 @@ public class OwickiGriesFloydHoare { private final DefaultIcfgSymbolTable mSymbolTable; private final BasicPredicateFactory mFactory; private final Function mPlace2Predicate; + //protected final IRefinementEngine> mRefinementEngine; private final BranchingProcess mBp; private final IPetriNet mNet; + + private final Set> mConditions; + private final Set> mOrigConditions; + private final Set> mAssertConditions; private final Set> mCuts; private final Set mPlaces; private final Set mAssertPlaces; private final Set mOrigPlaces; private final Set> mReach; + private Set>> mMarkingCosets = new HashSet<>(); private final Map, IPredicate> mFloydHoareAnnotation; @@ -91,7 +101,7 @@ public class OwickiGriesFloydHoare { public OwickiGriesFloydHoare(final IUltimateServiceProvider services, final CfgSmtToolkit csToolkit, final BranchingProcess bp, final IPetriNet net, final Function place2Predicate) { - +//IRefinementEngine> refinementEngine mServices = services; mLogger = services.getLoggingService().getLogger(ModelCheckerUtils.PLUGIN_ID); mManagedScript = csToolkit.getManagedScript(); @@ -99,18 +109,26 @@ public OwickiGriesFloydHoare(final IUltimateServiceProvider services, final CfgS mSymbolTable = new DefaultIcfgSymbolTable(csToolkit.getSymbolTable(), csToolkit.getProcedures()); mFactory = new BasicPredicateFactory(mServices, mManagedScript, mSymbolTable); mPlace2Predicate = place2Predicate; + //mRefinementEngine = refinementEngine; mBp = bp; mNet = net; mCuts = computeMaximalCosets(mBp); - - mPlaces = getPlaces(mCuts); + mOrigPlaces = new HashSet<>(mNet.getPlaces()); + mConditions = mBp.getConditions().stream().collect(Collectors.toSet()); + mOrigConditions = getOrigConditions(); + mAssertConditions = DataStructureUtils.difference(mConditions, mOrigConditions); + + + mPlaces = getPlaces(mCuts); mAssertPlaces = getAssertPlaces(mPlaces, mOrigPlaces); mReach = getReach(mCuts); + - mFloydHoareAnnotation = getAnnotation(); + mFloydHoareAnnotation = getMaximalAnnotation(); + getSimpleAnnotation();// to replaceMaximalAnnotation } @@ -130,20 +148,81 @@ private static Set> computeMaximalCosets(final Branch final Set> maximalCoSets = new LinkedHashSet<>(); for (final Event event : bp.getEvents()) { // small optimization, cut-off event has same condition mark as companion - if (!event.isCutoffEvent()) { + //if (!event.isCutoffEvent()) { maximalCoSets.add(event.getMark().stream().collect(Collectors.toSet())); - } + //} } return maximalCoSets; } - private Map, IPredicate> getAnnotation() { + private Map, IPredicate> getMaximalAnnotation() { final Map, IPredicate> mapping = new HashMap<>(); for (final Set marking : mReach) { mapping.put(new Marking(marking), getMarkingAssertion(marking)); } return mapping; } + private void getSimpleAnnotation() { + final Set>> markingCosets = getCosets(new HashSet>(), + new HashSet>(), mOrigConditions, new HashSet>>()); + final Map>, Set>>> markAssertCond = new HashMap<>(); + for(Set> markCoset: markingCosets) { + Set>> assertConds = getCosets(new HashSet>(), markCoset,mAssertConditions, + new HashSet>>()); + //simplifyAnnotation(Set>> assertCond); + } + //markAssertCond.put(markCoset,); + } + + + + + /** + * @param coset + * @param conditions + * @param cuts + * @return set successor maximal cosets from given coset + */ + private Set>> getCosets(Set> coset, Set> compCoset, + Set> conditions, Set>> cuts){ + Set> toAdd = DataStructureUtils.difference(conditions, coset); + Set>> cosets = new HashSet<>(); + for(Condition cond: toAdd) { + if(mBp.getCoRelation().isCoset(compCoset, cond) & mBp.getCoRelation().isCoset(coset, cond)) { + Set> imCoset= + DataStructureUtils.union(coset,DataStructureUtils.toSet(cond)); + cosets.add(imCoset); + } + } + if(!cosets.isEmpty()) { + for (Set> imcoset: cosets) { + cuts = DataStructureUtils.union(cuts, getCosets(imcoset, compCoset, conditions,cuts)); + } + } + else { + cuts.add(coset); + } + return cuts; + } + + private Set>> symplifyAnnotation(Set>> assertCoset){ + Set>> simpCoset = new HashSet<>(); + + //!equal-> weaker + return simpCoset; + } + + + private Set> getOrigConditions(){ + Set> conditions = new HashSet<>(); + for(final Condition cond: mBp.getConditions()) { + if (mOrigPlaces.contains(cond.getPlace())) { + conditions.add(cond); + } + } + return conditions; + } + // phi(d) = conjuct(assert(p)) for each p in z(d) (assertion places) -> Cut assertion private IPredicate getCutAssertion(final Set cut) { @@ -185,6 +264,8 @@ private Set getPlaces(final Set> cuts) { private Set getAssertPlaces(final Set places, final Set origPlaces) { return DataStructureUtils.difference(places, origPlaces); } + + /** * @param cut From 1b315b732cdd9b8908c2d53729ab7adb113011f3 Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Tue, 13 Jul 2021 09:44:55 +0200 Subject: [PATCH 058/536] OG Floyd Hoare partial Simplification --- .../traceabstraction/BasicCegarLoop.java | 2 +- .../concurrency/CegarLoopForPetriNet.java | 13 +- .../concurrency/HittingSet.java | 18 +++ .../concurrency/OwickiGriesConstruction.java | 13 +- .../concurrency/OwickiGriesFloydHoare.java | 122 ++++++++++++++---- 5 files changed, 136 insertions(+), 32 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java index 37c51294ef8..27faa7611af 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java @@ -1275,7 +1275,7 @@ public void computeOwickiGries() { assert !petriFloydHoare.isEmpty(); final OwickiGriesConstruction construction = - new OwickiGriesConstruction<>(mServices, mCsToolkit, mPetriNet, petriFloydHoare); + new OwickiGriesConstruction<>(mServices, mCsToolkit, mPetriNet, petriFloydHoare, null); // TODO: simplify final OwickiGriesValidityCheck check = new OwickiGriesValidityCheck<>(mServices, mCsToolkit, construction.getResult(), construction.getCoMarkedPlaces()); diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java index a4bb35f24f8..3eede00a853 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java @@ -27,6 +27,7 @@ */ package de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency; +import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Map; @@ -73,6 +74,7 @@ import de.uni_freiburg.informatik.ultimate.core.lib.results.StatisticsResult; import de.uni_freiburg.informatik.ultimate.core.model.services.IUltimateServiceProvider; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.CfgSmtToolkit; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IAction; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IIcfg; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IIcfgTransition; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IInternalAction; @@ -103,6 +105,7 @@ import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.predicates.InductivityCheck; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.preferences.TAPreferences; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.preferences.TAPreferences.Artifact; +import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.tracehandling.IRefinementEngine; import de.uni_freiburg.informatik.ultimate.util.HistogramOfIterable; import de.uni_freiburg.informatik.ultimate.util.datastructures.DataStructureUtils; import de.uni_freiburg.informatik.ultimate.util.datastructures.relation.Pair; @@ -151,6 +154,7 @@ public enum SizeReduction { private final CounterexampleCache mCounterexampleCache; private BranchingProcess mFinPrefix; private IPetriNet mInitialNet; + protected ArrayList >> mRefinementEngines = new ArrayList<>(); public CegarLoopForPetriNet(final DebugIdentifier name, final IIcfg rootNode, final CfgSmtToolkit csToolkit, final PredicateFactory predicateFactory, final TAPreferences taPrefs, @@ -274,6 +278,7 @@ protected boolean isAbstractionEmpty() throws AutomataOperationCanceledException @Override protected boolean refineAbstraction() throws AutomataLibraryException { final BoundedPetriNet abstraction = (BoundedPetriNet) mAbstraction; + mRefinementEngines.add(mRefinementEngine); final IHoareTripleChecker htc; if (mRefinementEngine.getHoareTripleChecker() != null) { htc = mRefinementEngine.getHoareTripleChecker(); @@ -703,8 +708,8 @@ public void computeOwickiGries() { if (mPref.useLbeInConcurrentAnalysis() != PetriNetLbe.OFF) { throw new AssertionError("Owicki-Gries does currently not support Petri net LBE."); } - final OwickiGriesFloydHoare floydHoare = - OwickiGriesFloydHoare.create(mServices, mCsToolkit, mFinPrefix, mInitialNet); + final OwickiGriesFloydHoare floydHoare = + new OwickiGriesFloydHoare(mServices, mCsToolkit, mFinPrefix, mInitialNet, x -> x, mRefinementEngines); final Map, IPredicate> petriFloydHoare = floydHoare.getResult(); final var htc = new MonolithicHoareTripleChecker(mCsToolkit); @@ -730,8 +735,8 @@ public void computeOwickiGries() { } } - final OwickiGriesConstruction construction = - new OwickiGriesConstruction<>(mServices, mCsToolkit, mInitialNet, petriFloydHoare); + final OwickiGriesConstructionconstruction = + new OwickiGriesConstruction<>(mServices, mCsToolkit, mInitialNet, petriFloydHoare, mRefinementEngines); // TODO: simplify final OwickiGriesValidityCheck check = new OwickiGriesValidityCheck<>(mServices, mCsToolkit, construction.getResult(), construction.getCoMarkedPlaces()); diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/HittingSet.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/HittingSet.java index a12395c8b6d..9110ff98c7d 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/HittingSet.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/HittingSet.java @@ -89,6 +89,7 @@ public HittingSet(final Set> collection) { */ private boolean checkHittingSet(Set hittingSet, Set> setUniverse) { Set> universe = new HashSet>(setUniverse); + System.out.print(multiply(-14,30)); for (Set set : universe) { if (DataStructureUtils.intersection(set, hittingSet).isEmpty()) { return false; @@ -97,6 +98,23 @@ private boolean checkHittingSet(Set hittingSet, Set> setUniverse) { return true; } + public static int multiply ( int x , int y ) + { + assert x >= 0 & y>= 0: "Out of range"; + int r = 0 ; + int i = 0 ; + assert r == y * i & i < x: "Failed Loop invariant (pre)"; + while ( i < x ) + { + assert r == y * i & i <= x: "Failed Loop invariant"; + r = r + y ; + i = i + 1 ; + + } + assert r == y * i & i == x: "Failed Loop invariant (post)"; + return r; + } + /** * @param s1 * @param s2 diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java index a5bed8882f8..0675d36c8c8 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java @@ -37,6 +37,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import de.uni_freiburg.informatik.ultimate.automata.nestedword.NestedWordAutomaton; import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; import de.uni_freiburg.informatik.ultimate.automata.petrinet.ITransition; import de.uni_freiburg.informatik.ultimate.automata.petrinet.Marking; @@ -46,6 +47,8 @@ import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.ModelCheckerUtils; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.CfgSmtToolkit; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.DefaultIcfgSymbolTable; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IAction; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IIcfgTransition; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.TransFormulaBuilder; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.TransFormulaUtils; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.UnmodifiableTransFormula; @@ -61,6 +64,7 @@ import de.uni_freiburg.informatik.ultimate.logic.Script; import de.uni_freiburg.informatik.ultimate.logic.Term; import de.uni_freiburg.informatik.ultimate.logic.TermVariable; +import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.tracehandling.IRefinementEngine; import de.uni_freiburg.informatik.ultimate.util.datastructures.DataStructureUtils; import de.uni_freiburg.informatik.ultimate.util.datastructures.relation.HashRelation; @@ -76,7 +80,7 @@ * @param * The type of statements in the Petri program */ -public class OwickiGriesConstruction { +public class OwickiGriesConstruction> { private final IUltimateServiceProvider mServices; private final ILogger mLogger; @@ -86,6 +90,7 @@ public class OwickiGriesConstruction { private final IPetriNet mNet; private final Map, IPredicate> mFloydHoareAnnotation; + private final ArrayList >> mRefinementEngines; private final DefaultIcfgSymbolTable mSymbolTable; private static final SimplificationTechnique mSimplificationTechnique = SimplificationTechnique.SIMPLIFY_DDA; @@ -98,14 +103,16 @@ public class OwickiGriesConstruction { public OwickiGriesConstruction(final IUltimateServiceProvider services, final CfgSmtToolkit csToolkit, - final IPetriNet net, final Map, IPredicate> floydHoare) { + final IPetriNet net, final Map, IPredicate> floydHoare, + ArrayList >> refinementEngines) { mServices = services; mLogger = services.getLoggingService().getLogger(ModelCheckerUtils.PLUGIN_ID); mManagedScript = csToolkit.getManagedScript(); mScript = mManagedScript.getScript(); - mNet = net; + mNet = net; mFloydHoareAnnotation = floydHoare; + mRefinementEngines = refinementEngines; mSymbolTable = new DefaultIcfgSymbolTable(csToolkit.getSymbolTable(), csToolkit.getProcedures()); mFactory = new BasicPredicateFactory(mServices, mManagedScript, mSymbolTable); diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java index 5d8163b090a..2fff99031a1 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java @@ -25,7 +25,10 @@ */ package de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; @@ -45,9 +48,11 @@ import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.ModelCheckerUtils; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.CfgSmtToolkit; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.DefaultIcfgSymbolTable; +import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IIcfgTransition; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.BasicPredicateFactory; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.ManagedScript; +import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.IncrementalPlicationChecker.Validity; import de.uni_freiburg.informatik.ultimate.logic.Script; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.tracehandling.IRefinementEngine; import de.uni_freiburg.informatik.ultimate.util.datastructures.DataStructureUtils; @@ -64,7 +69,7 @@ * The type of statements in the Petri program */ -public class OwickiGriesFloydHoare { +public class OwickiGriesFloydHoare> { private final IUltimateServiceProvider mServices; private final ILogger mLogger; @@ -73,7 +78,7 @@ public class OwickiGriesFloydHoare { private final DefaultIcfgSymbolTable mSymbolTable; private final BasicPredicateFactory mFactory; private final Function mPlace2Predicate; - //protected final IRefinementEngine> mRefinementEngine; + private final ArrayList >> mRefinementEngines; private final BranchingProcess mBp; private final IPetriNet mNet; @@ -100,8 +105,9 @@ public class OwickiGriesFloydHoare { */ public OwickiGriesFloydHoare(final IUltimateServiceProvider services, final CfgSmtToolkit csToolkit, final BranchingProcess bp, final IPetriNet net, - final Function place2Predicate) { -//IRefinementEngine> refinementEngine + final Function place2Predicate, + ArrayList >> refinementEngines){ + mServices = services; mLogger = services.getLoggingService().getLogger(ModelCheckerUtils.PLUGIN_ID); mManagedScript = csToolkit.getManagedScript(); @@ -109,7 +115,7 @@ public OwickiGriesFloydHoare(final IUltimateServiceProvider services, final CfgS mSymbolTable = new DefaultIcfgSymbolTable(csToolkit.getSymbolTable(), csToolkit.getProcedures()); mFactory = new BasicPredicateFactory(mServices, mManagedScript, mSymbolTable); mPlace2Predicate = place2Predicate; - //mRefinementEngine = refinementEngine; + mRefinementEngines = refinementEngines; mBp = bp; mNet = net; @@ -128,15 +134,16 @@ public OwickiGriesFloydHoare(final IUltimateServiceProvider services, final CfgS mFloydHoareAnnotation = getMaximalAnnotation(); - getSimpleAnnotation();// to replaceMaximalAnnotation + getCosetAnnotation();// to replaceMaximalAnnotation } - public static OwickiGriesFloydHoare create(final IUltimateServiceProvider services, - final CfgSmtToolkit csToolkit, final BranchingProcess bp, - final IPetriNet net) { - return new OwickiGriesFloydHoare<>(services, csToolkit, bp, net, x -> x); - } +// public static OwickiGriesFloydHoare create(final IUltimateServiceProvider services, +// final CfgSmtToolkit csToolkit, final BranchingProcess bp, +// final IPetriNet net, +// ArrayList >> refinementEngines) { +// return new OwickiGriesFloydHoare<>(services, csToolkit, bp, net, x -> x, refinementEngines); +// } /** * @param branching @@ -162,19 +169,91 @@ private Map, IPredicate> getMaximalAnnotation() { } return mapping; } - private void getSimpleAnnotation() { + /** + * Return mapping of + */ + private void getCosetAnnotation() { + final Map, IPredicate> mapping = new HashMap<>(); final Set>> markingCosets = getCosets(new HashSet>(), new HashSet>(), mOrigConditions, new HashSet>>()); final Map>, Set>>> markAssertCond = new HashMap<>(); for(Set> markCoset: markingCosets) { - Set>> assertConds = getCosets(new HashSet>(), markCoset,mAssertConditions, - new HashSet>>()); - //simplifyAnnotation(Set>> assertCond); - } + Set markPlaces = getCosetPlaces(markCoset); + Set>> assertConds = getCosets(new HashSet>(), + markCoset,mAssertConditions, new HashSet>>()); + Set> markAssertPlaces = new HashSet<>(); + for(Set> assertCond: assertConds) { + markAssertPlaces.add(getCosetPlaces(simplifyAssertions(assertCond))); + } + //add to mapping //markAssertCond.put(markCoset,); + } + } - - + + private Set getCosetPlaces (Set> coset){ + Set placeCoset = new HashSet<>(); + for(Condition condition: coset) { + placeCoset.add(condition.getPlace()); + } + return placeCoset; + + } + + //Set of conditions to set of places + private Set> simplifyAssertions(Set> assertConds){ + Set> simpleAssertions = assertConds; + //Check if equiv to false, set all to false; + for (Condition cond: assertConds) { + if (!thereIsStronger(cond, simpleAssertions)) { + Set> weakerConditions = getWeakerConditions(cond, assertConds); + simpleAssertions = cleanWeakConditions(simpleAssertions, weakerConditions); + } + else { + simpleAssertions = DataStructureUtils.difference(simpleAssertions, + Collections.singleton(cond)); + } + } + return simpleAssertions; + } + + private Set> getWeakerConditions(Condition condition, + Set> assertConditions) { + Set> condImplications = new HashSet<>(); + IPredicate condPredicate = condition.getPlace(); + for (IRefinementEngine> refEngine : mRefinementEngines) { + for(Condition assertCond: assertConditions) { + if(Validity.VALID == refEngine.getPredicateUnifier().getCoverageRelation().isCovered + (condPredicate, assertCond.getPlace())) { + condImplications.add(assertCond); + } + } + } + + return condImplications; + } + + private Set> cleanWeakConditions(Set> assertConditions, + Set> condImplications){ + if (!condImplications.isEmpty()) { + assertConditions = DataStructureUtils.difference(assertConditions, condImplications); + } + return assertConditions; + } + + + //is there an stronger condition already in the set? + private boolean thereIsStronger(Condition condition, + Set> assertConditions) { + IPredicate predCondition = condition.getPlace(); + for (IRefinementEngine> refEngine : mRefinementEngines) { + if(!refEngine.getPredicateUnifier().getCoverageRelation().getCoveredPredicates(condition.getPlace()).isEmpty()) { + return true; + } + } + return false; + } + /** @@ -205,12 +284,6 @@ private Set>> getCosets(Set return cuts; } - private Set>> symplifyAnnotation(Set>> assertCoset){ - Set>> simpCoset = new HashSet<>(); - - //!equal-> weaker - return simpCoset; - } private Set> getOrigConditions(){ @@ -240,6 +313,7 @@ private IPredicate getMarkingAssertion(final Set marking) { } return mFactory.or(predicates); } + // /** * @param cuts From ec0391a084bcc5c054e305aea5f48999087d2f44 Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Fri, 16 Jul 2021 23:03:17 +0200 Subject: [PATCH 059/536] OwickiGriesFloydHoare conditions simplification --- .../concurrency/HittingSet.java | 17 --- .../concurrency/OwickiGriesFloydHoare.java | 132 +++++++++++------- 2 files changed, 78 insertions(+), 71 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/HittingSet.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/HittingSet.java index 9110ff98c7d..40878614aab 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/HittingSet.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/HittingSet.java @@ -89,7 +89,6 @@ public HittingSet(final Set> collection) { */ private boolean checkHittingSet(Set hittingSet, Set> setUniverse) { Set> universe = new HashSet>(setUniverse); - System.out.print(multiply(-14,30)); for (Set set : universe) { if (DataStructureUtils.intersection(set, hittingSet).isEmpty()) { return false; @@ -98,22 +97,6 @@ private boolean checkHittingSet(Set hittingSet, Set> setUniverse) { return true; } - public static int multiply ( int x , int y ) - { - assert x >= 0 & y>= 0: "Out of range"; - int r = 0 ; - int i = 0 ; - assert r == y * i & i < x: "Failed Loop invariant (pre)"; - while ( i < x ) - { - assert r == y * i & i <= x: "Failed Loop invariant"; - r = r + y ; - i = i + 1 ; - - } - assert r == y * i & i == x: "Failed Loop invariant (post)"; - return r; - } /** * @param s1 diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java index 2fff99031a1..27a0a30a28c 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java @@ -133,8 +133,9 @@ public OwickiGriesFloydHoare(final IUltimateServiceProvider services, final CfgS mReach = getReach(mCuts); - mFloydHoareAnnotation = getMaximalAnnotation(); - getCosetAnnotation();// to replaceMaximalAnnotation + mFloydHoareAnnotation = getCosetAnnotation(); + //mFloydHoareAnnotation = getMaximalAnnotation(); + } @@ -148,8 +149,7 @@ public OwickiGriesFloydHoare(final IUltimateServiceProvider services, final CfgS /** * @param branching * process - * @return set of all maximal co-set (cuts) TODO: Set>, no set of conditions?? labelling function? cCheck - * branching def + * @return set of all maximal co-set (cuts) */ private static Set> computeMaximalCosets(final BranchingProcess bp) { final Set> maximalCoSets = new LinkedHashSet<>(); @@ -169,44 +169,52 @@ private Map, IPredicate> getMaximalAnnotation() { } return mapping; } + /** - * Return mapping of + * */ - private void getCosetAnnotation() { - final Map, IPredicate> mapping = new HashMap<>(); - final Set>> markingCosets = getCosets(new HashSet>(), - new HashSet>(), mOrigConditions, new HashSet>>()); - final Map>, Set>>> markAssertCond = new HashMap<>(); - for(Set> markCoset: markingCosets) { - Set markPlaces = getCosetPlaces(markCoset); - Set>> assertConds = getCosets(new HashSet>(), - markCoset,mAssertConditions, new HashSet>>()); - Set> markAssertPlaces = new HashSet<>(); - for(Set> assertCond: assertConds) { - markAssertPlaces.add(getCosetPlaces(simplifyAssertions(assertCond))); - } - //add to mapping - //markAssertCond.put(markCoset,); - } - + private Map, IPredicate> getCosetAnnotation() { + final Map, IPredicate> mapping = new HashMap<>(); + final Set>> markingCosets = getCosets(new HashSet>(), + new HashSet>(), mOrigConditions, new HashSet>>()); + for(Set> markCoset: markingCosets) { + Set markPlaces = getCosetPlaces(markCoset); + Set>> assertConds = getCosets(new HashSet>(), + markCoset,mAssertConditions, new HashSet>>()); + Set> markAssertPlaces = new HashSet<>(); + for(Set> assertCond: assertConds) { + markAssertPlaces.add(simplifyAssertions(getCosetPredicates(assertCond))); + } + mapping.put(new Marking(markPlaces), getMarkingAssertion(markPlaces, markAssertPlaces)); + } + return mapping; } - private Set getCosetPlaces (Set> coset){ + private Set getCosetPlaces (final Set> coset){ Set placeCoset = new HashSet<>(); for(Condition condition: coset) { placeCoset.add(condition.getPlace()); } return placeCoset; + } + + private Set getCosetPredicates (final Set> coset){ + Set predCoset = new HashSet<>(); + for(Condition condition: coset) { + predCoset.add(condition.getPlace()); + } + return predCoset; + } //Set of conditions to set of places - private Set> simplifyAssertions(Set> assertConds){ - Set> simpleAssertions = assertConds; + private Set simplifyAssertions(Set assertConds){ + Set simpleAssertions = assertConds; //Check if equiv to false, set all to false; - for (Condition cond: assertConds) { + for (IPredicate cond: assertConds) { if (!thereIsStronger(cond, simpleAssertions)) { - Set> weakerConditions = getWeakerConditions(cond, assertConds); + Set weakerConditions = getWeakerConditions(cond, assertConds); simpleAssertions = cleanWeakConditions(simpleAssertions, weakerConditions); } else { @@ -217,37 +225,32 @@ private Set> simplifyAssertions(Set> getWeakerConditions(Condition condition, - Set> assertConditions) { - Set> condImplications = new HashSet<>(); - IPredicate condPredicate = condition.getPlace(); + private Set getWeakerConditions(final IPredicate condition, Set assertConditions) { + Set condImplications = new HashSet<>(); + assertConditions = DataStructureUtils.difference(assertConditions, Collections.singleton(condition)); for (IRefinementEngine> refEngine : mRefinementEngines) { - for(Condition assertCond: assertConditions) { - if(Validity.VALID == refEngine.getPredicateUnifier().getCoverageRelation().isCovered - (condPredicate, assertCond.getPlace())) { - condImplications.add(assertCond); - } - } - } - + condImplications.addAll(DataStructureUtils.intersection(assertConditions, + refEngine.getPredicateUnifier().getCoverageRelation().getCoveringPredicates(condition))); + } return condImplications; } - private Set> cleanWeakConditions(Set> assertConditions, - Set> condImplications){ + private Set cleanWeakConditions(Set assertConditions, + final Set condImplications){ if (!condImplications.isEmpty()) { assertConditions = DataStructureUtils.difference(assertConditions, condImplications); } return assertConditions; } - - //is there an stronger condition already in the set? - private boolean thereIsStronger(Condition condition, - Set> assertConditions) { - IPredicate predCondition = condition.getPlace(); + + private boolean thereIsStronger(final IPredicate condition, final Set assertConditions) { + final Set assertPredicates= + DataStructureUtils.difference(assertConditions, Collections.singleton(condition)); for (IRefinementEngine> refEngine : mRefinementEngines) { - if(!refEngine.getPredicateUnifier().getCoverageRelation().getCoveredPredicates(condition.getPlace()).isEmpty()) { + final Set coveredPlaces = + refEngine.getPredicateUnifier().getCoverageRelation().getCoveredPredicates(condition); + if(!DataStructureUtils.intersection(coveredPlaces, assertPredicates).isEmpty()) { return true; } } @@ -297,23 +300,44 @@ private Set> getOrigConditions(){ } - // phi(d) = conjuct(assert(p)) for each p in z(d) (assertion places) -> Cut assertion - private IPredicate getCutAssertion(final Set cut) { + + + private IPredicate getMarkingAssertion(final Set marking) { final Set predicates = new HashSet<>(); - for (final PLACE place : getAssertPlaces(cut)) { - predicates.add(mPlace2Predicate.apply(place)); + for (final Set cut : getCuts(marking)) { + predicates.add(getCutAssertion(cut, getAssertPlaces(cut))); + } + return mFactory.or(predicates); + } + private IPredicate getCutAssertion(final Set cut, final Set assertPlaces) { + final Set predicates = new HashSet<>(); + for (final IPredicate place : assertPlaces) { + predicates.add(place); } return mFactory.and(predicates); } + - private IPredicate getMarkingAssertion(final Set marking) { + + //Call this for simpleAnnotation + private IPredicate getMarkingAssertion(final Set marking, final Set> cuts) { final Set predicates = new HashSet<>(); - for (final Set cut : getCuts(marking)) { + for (final Set cut : cuts) { predicates.add(getCutAssertion(cut)); } return mFactory.or(predicates); } - // + + + // phi(d) = conjuct(assert(p)) for each p in z(d) (assertion places) -> Cut assertion + private IPredicate getCutAssertion(final Set cut) { + final Set predicates = new HashSet<>(); + for (final IPredicate place : cut) { + predicates.add(place); + } + return mFactory.and(predicates); + } + /** * @param cuts From e6005f1fa07906a213f397da60ca3408ccc80234 Mon Sep 17 00:00:00 2001 From: Miriam Lagunes Date: Tue, 3 Aug 2021 20:18:55 +0200 Subject: [PATCH 060/536] Benchmark notes --- .../concurrency/OwickiGriesConstruction.java | 1 + .../concurrency/OwickiGriesFloydHoare.java | 11 ++++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java index 0675d36c8c8..8bac45640b5 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java @@ -156,6 +156,7 @@ private Term getMarkingPredicate(final Marking marking) { final Set terms = new HashSet<>(); final Set posPlaces = DataStructureUtils.intersection(mHittingSet, marking.stream().collect(Collectors.toSet())); + //final Set posPlaces = marking.stream().collect(Collectors.toSet()); for (final PLACE otherPlace : posPlaces) { final Term ghost = mGhostVariables.get(otherPlace).getTerm(); terms.add(ghost); diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java index 27a0a30a28c..ed38d88b0ad 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java @@ -162,6 +162,9 @@ private static Set> computeMaximalCosets(final Branch return maximalCoSets; } + /** + * Annotation with MaximalCosets computation + */ private Map, IPredicate> getMaximalAnnotation() { final Map, IPredicate> mapping = new HashMap<>(); for (final Set marking : mReach) { @@ -171,7 +174,8 @@ private Map, IPredicate> getMaximalAnnotation() { } /** - * + * Cuts computation from "greedy" algorithm + * With simplification */ private Map, IPredicate> getCosetAnnotation() { final Map, IPredicate> mapping = new HashMap<>(); @@ -183,7 +187,8 @@ private Map, IPredicate> getCosetAnnotation() { markCoset,mAssertConditions, new HashSet>>()); Set> markAssertPlaces = new HashSet<>(); for(Set> assertCond: assertConds) { - markAssertPlaces.add(simplifyAssertions(getCosetPredicates(assertCond))); + markAssertPlaces.add(simplifyAssertions(getCosetPredicates(assertCond))); + //markAssertPlaces.add((getCosetPredicates(assertCond)); } mapping.put(new Marking(markPlaces), getMarkingAssertion(markPlaces, markAssertPlaces)); } @@ -319,7 +324,7 @@ private IPredicate getCutAssertion(final Set cut, final Set assert - //Call this for simpleAnnotation + //Call this for simple and "greedy" cuts Annotation private IPredicate getMarkingAssertion(final Set marking, final Set> cuts) { final Set predicates = new HashSet<>(); for (final Set cut : cuts) { From 8d2aa1ba86036b8db3884e08b8c13e660b3e5e6d Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Thu, 5 Aug 2021 15:06:53 +0200 Subject: [PATCH 061/536] comment out debugging code --- .../concurrency/CegarLoopForPetriNet.java | 45 +++++++++---------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java index 3eede00a853..a3993dd82f6 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java @@ -74,7 +74,6 @@ import de.uni_freiburg.informatik.ultimate.core.lib.results.StatisticsResult; import de.uni_freiburg.informatik.ultimate.core.model.services.IUltimateServiceProvider; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.CfgSmtToolkit; -import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IAction; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IIcfg; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IIcfgTransition; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IInternalAction; @@ -84,7 +83,6 @@ import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.variables.IProgramVar; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.hoaretriple.IHoareTripleChecker; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.hoaretriple.IncrementalHoareTripleChecker; -import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.hoaretriple.MonolithicHoareTripleChecker; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicateCoverageChecker; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.PredicateFactory; @@ -712,28 +710,27 @@ public void computeOwickiGries() { new OwickiGriesFloydHoare(mServices, mCsToolkit, mFinPrefix, mInitialNet, x -> x, mRefinementEngines); final Map, IPredicate> petriFloydHoare = floydHoare.getResult(); - final var htc = new MonolithicHoareTripleChecker(mCsToolkit); - for (final var entry : petriFloydHoare.entrySet()) { - final var markPre = entry.getKey(); - final var pre = entry.getValue(); - for (final var trans : mInitialNet.getTransitions()) { - if (markPre.isTransitionEnabled(trans, mInitialNet)) { - Marking markPost; - try { - markPost = markPre.fireTransition(trans, mInitialNet); - final var post = petriFloydHoare.getOrDefault(markPost, mPredicateFactory.or()); - final Validity valid = htc.checkInternal(pre, (IInternalAction) trans.getSymbol(), post); - if (valid != Validity.VALID) { - throw new IllegalStateException(""); - } - } catch (final PetriNetNot1SafeException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - } - } - } + // final var htc = new MonolithicHoareTripleChecker(mCsToolkit); + // for (final var entry : petriFloydHoare.entrySet()) { + // final var markPre = entry.getKey(); + // final var pre = entry.getValue(); + // for (final var trans : mInitialNet.getTransitions()) { + // if (markPre.isTransitionEnabled(trans, mInitialNet)) { + // Marking markPost; + // try { + // markPost = markPre.fireTransition(trans, mInitialNet); + // final var post = petriFloydHoare.getOrDefault(markPost, mPredicateFactory.or()); + // final Validity valid = htc.checkInternal(pre, (IInternalAction) trans.getSymbol(), post); + // if (valid != Validity.VALID) { + // throw new IllegalStateException(""); + // } + // } catch (final PetriNetNot1SafeException e) { + // // TODO Auto-generated catch block + // e.printStackTrace(); + // } + // } + // } + // } final OwickiGriesConstructionconstruction = new OwickiGriesConstruction<>(mServices, mCsToolkit, mInitialNet, petriFloydHoare, mRefinementEngines); From 597ff0c128d308b6ce4e88f9dbe29335cf449813 Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Thu, 5 Aug 2021 15:22:22 +0200 Subject: [PATCH 062/536] cc fixes --- .../concurrency/CegarLoopForPetriNet.java | 10 +- .../concurrency/OwickiGriesConstruction.java | 44 +-- .../concurrency/OwickiGriesFloydHoare.java | 308 ++++++++---------- 3 files changed, 165 insertions(+), 197 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java index a3993dd82f6..80671f8753c 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java @@ -152,7 +152,8 @@ public enum SizeReduction { private final CounterexampleCache mCounterexampleCache; private BranchingProcess mFinPrefix; private IPetriNet mInitialNet; - protected ArrayList >> mRefinementEngines = new ArrayList<>(); + protected ArrayList>> mRefinementEngines = + new ArrayList<>(); public CegarLoopForPetriNet(final DebugIdentifier name, final IIcfg rootNode, final CfgSmtToolkit csToolkit, final PredicateFactory predicateFactory, final TAPreferences taPrefs, @@ -702,12 +703,11 @@ private boolean acceptsPetriViaFA(final IUltimateServiceProvider services, @Override public void computeOwickiGries() { - if (mPref.useLbeInConcurrentAnalysis() != PetriNetLbe.OFF) { throw new AssertionError("Owicki-Gries does currently not support Petri net LBE."); } - final OwickiGriesFloydHoare floydHoare = - new OwickiGriesFloydHoare(mServices, mCsToolkit, mFinPrefix, mInitialNet, x -> x, mRefinementEngines); + final OwickiGriesFloydHoare floydHoare = + new OwickiGriesFloydHoare<>(mServices, mCsToolkit, mFinPrefix, mInitialNet, x -> x, mRefinementEngines); final Map, IPredicate> petriFloydHoare = floydHoare.getResult(); // final var htc = new MonolithicHoareTripleChecker(mCsToolkit); @@ -732,7 +732,7 @@ public void computeOwickiGries() { // } // } - final OwickiGriesConstructionconstruction = + final OwickiGriesConstruction construction = new OwickiGriesConstruction<>(mServices, mCsToolkit, mInitialNet, petriFloydHoare, mRefinementEngines); // TODO: simplify final OwickiGriesValidityCheck check = new OwickiGriesValidityCheck<>(mServices, mCsToolkit, diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java index 8bac45640b5..50aefdadeae 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java @@ -28,26 +28,22 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; -import java.util.stream.Stream; import de.uni_freiburg.informatik.ultimate.automata.nestedword.NestedWordAutomaton; import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet; import de.uni_freiburg.informatik.ultimate.automata.petrinet.ITransition; import de.uni_freiburg.informatik.ultimate.automata.petrinet.Marking; -import de.uni_freiburg.informatik.ultimate.automata.petrinet.unfolding.BranchingProcess; import de.uni_freiburg.informatik.ultimate.core.model.services.ILogger; import de.uni_freiburg.informatik.ultimate.core.model.services.IUltimateServiceProvider; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.ModelCheckerUtils; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.CfgSmtToolkit; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.DefaultIcfgSymbolTable; -import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IAction; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.structure.IIcfgTransition; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.TransFormulaBuilder; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.cfg.transitions.TransFormulaUtils; @@ -90,7 +86,7 @@ public class OwickiGriesConstruction> { private final IPetriNet mNet; private final Map, IPredicate> mFloydHoareAnnotation; - private final ArrayList >> mRefinementEngines; + private final ArrayList>> mRefinementEngines; private final DefaultIcfgSymbolTable mSymbolTable; private static final SimplificationTechnique mSimplificationTechnique = SimplificationTechnique.SIMPLIFY_DDA; @@ -100,17 +96,16 @@ public class OwickiGriesConstruction> { private final Set mHittingSet; private final Map mGhostVariables; private final OwickiGriesAnnotation mAnnotation; - public OwickiGriesConstruction(final IUltimateServiceProvider services, final CfgSmtToolkit csToolkit, - final IPetriNet net, final Map, IPredicate> floydHoare, - ArrayList >> refinementEngines) { + final IPetriNet net, final Map, IPredicate> floydHoare, + final ArrayList>> refinementEngines) { mServices = services; mLogger = services.getLoggingService().getLogger(ModelCheckerUtils.PLUGIN_ID); mManagedScript = csToolkit.getManagedScript(); mScript = mManagedScript.getScript(); - mNet = net; + mNet = net; mFloydHoareAnnotation = floydHoare; mRefinementEngines = refinementEngines; mSymbolTable = new DefaultIcfgSymbolTable(csToolkit.getSymbolTable(), csToolkit.getProcedures()); @@ -125,8 +120,6 @@ public OwickiGriesConstruction(final IUltimateServiceProvider services, final Cf mAnnotation = new OwickiGriesAnnotation<>(formulaMapping, assignmentMapping, new HashSet<>(mGhostVariables.values()), ghostInitAssignment, mNet, mSymbolTable); } - - /** * Constructs the mapping from places to formulas. A place is mapped to a disjunction of marking predicates, where @@ -154,15 +147,15 @@ private Map getFormulaMapping() { */ private Term getMarkingPredicate(final Marking marking) { final Set terms = new HashSet<>(); - final Set posPlaces = DataStructureUtils.intersection(mHittingSet, - marking.stream().collect(Collectors.toSet())); - //final Set posPlaces = marking.stream().collect(Collectors.toSet()); + final Set posPlaces = + DataStructureUtils.intersection(mHittingSet, marking.stream().collect(Collectors.toSet())); + // final Set posPlaces = marking.stream().collect(Collectors.toSet()); for (final PLACE otherPlace : posPlaces) { final Term ghost = mGhostVariables.get(otherPlace).getTerm(); terms.add(ghost); } terms.addAll(getHitNotMarking(marking)); - //terms.addAll(getAllNotMarking(marking)); + // terms.addAll(getAllNotMarking(marking)); terms.add(mFloydHoareAnnotation.get(marking).getFormula()); return SmtUtils.and(mScript, terms); } @@ -182,16 +175,16 @@ private Set getAllNotMarking(final Marking marking) { } return predicates; } - + /** * * @param marking * @return Formula MethodB:Predicate with GhostVariables of hitting set of other places not in marking */ private Set getHitNotMarking(final Marking marking) { - //TODO: remove places from hittingSet than are in current marking. - final Set notMarking = DataStructureUtils.difference(mHittingSet, - marking.stream().collect(Collectors.toSet())); + // TODO: remove places from hittingSet than are in current marking. + final Set notMarking = + DataStructureUtils.difference(mHittingSet, marking.stream().collect(Collectors.toSet())); final Set predicates = new HashSet<>(); for (final PLACE place : notMarking) { final Term ghost = mGhostVariables.get(place).getTerm(); @@ -199,18 +192,16 @@ private Set getHitNotMarking(final Marking marking) { } return predicates; } - - private Set getHittingSet(){ - final Set> reachableMarkings = new HashSet>(); - for (Marking mark : mFloydHoareAnnotation.keySet()) { + + private Set getHittingSet() { + final Set> reachableMarkings = new HashSet<>(); + for (final Marking mark : mFloydHoareAnnotation.keySet()) { reachableMarkings.add(mark.stream().collect(Collectors.toSet())); } - final HittingSet hitSet = new HittingSet(reachableMarkings); + final HittingSet hitSet = new HittingSet<>(reachableMarkings); return hitSet.getSymmHittingSet(); } - - /** * * @param marking @@ -345,6 +336,5 @@ public HashRelation, PLACE> getCoMarkedPlaces() { } return relation; } - } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java index ed38d88b0ad..0f954c62602 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java @@ -26,8 +26,6 @@ package de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.concurrency; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -52,7 +50,6 @@ import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.BasicPredicateFactory; import de.uni_freiburg.informatik.ultimate.lib.modelcheckerutils.smt.predicates.IPredicate; import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.ManagedScript; -import de.uni_freiburg.informatik.ultimate.lib.smtlibutils.IncrementalPlicationChecker.Validity; import de.uni_freiburg.informatik.ultimate.logic.Script; import de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction.tracehandling.IRefinementEngine; import de.uni_freiburg.informatik.ultimate.util.datastructures.DataStructureUtils; @@ -78,11 +75,11 @@ public class OwickiGriesFloydHoare mPlace2Predicate; - private final ArrayList >> mRefinementEngines; + private final ArrayList>> mRefinementEngines; private final BranchingProcess mBp; private final IPetriNet mNet; - + private final Set> mConditions; private final Set> mOrigConditions; private final Set> mAssertConditions; @@ -92,7 +89,7 @@ public class OwickiGriesFloydHoare mAssertPlaces; private final Set mOrigPlaces; private final Set> mReach; - private Set>> mMarkingCosets = new HashSet<>(); + private final Set>> mMarkingCosets = new HashSet<>(); private final Map, IPredicate> mFloydHoareAnnotation; @@ -105,9 +102,9 @@ public class OwickiGriesFloydHoare bp, final IPetriNet net, - final Function place2Predicate, - ArrayList >> refinementEngines){ - + final Function place2Predicate, + final ArrayList>> refinementEngines) { + mServices = services; mLogger = services.getLoggingService().getLogger(ModelCheckerUtils.PLUGIN_ID); mManagedScript = csToolkit.getManagedScript(); @@ -121,30 +118,27 @@ public OwickiGriesFloydHoare(final IUltimateServiceProvider services, final CfgS mNet = net; mCuts = computeMaximalCosets(mBp); - + mOrigPlaces = new HashSet<>(mNet.getPlaces()); - mConditions = mBp.getConditions().stream().collect(Collectors.toSet()); + mConditions = mBp.getConditions().stream().collect(Collectors.toSet()); mOrigConditions = getOrigConditions(); mAssertConditions = DataStructureUtils.difference(mConditions, mOrigConditions); - - - mPlaces = getPlaces(mCuts); + + mPlaces = getPlaces(mCuts); mAssertPlaces = getAssertPlaces(mPlaces, mOrigPlaces); mReach = getReach(mCuts); - mFloydHoareAnnotation = getCosetAnnotation(); - //mFloydHoareAnnotation = getMaximalAnnotation(); - + // mFloydHoareAnnotation = getMaximalAnnotation(); } -// public static OwickiGriesFloydHoare create(final IUltimateServiceProvider services, -// final CfgSmtToolkit csToolkit, final BranchingProcess bp, -// final IPetriNet net, -// ArrayList >> refinementEngines) { -// return new OwickiGriesFloydHoare<>(services, csToolkit, bp, net, x -> x, refinementEngines); -// } + // public static OwickiGriesFloydHoare create(final IUltimateServiceProvider services, + // final CfgSmtToolkit csToolkit, final BranchingProcess bp, + // final IPetriNet net, + // ArrayList >> refinementEngines) { + // return new OwickiGriesFloydHoare<>(services, csToolkit, bp, net, x -> x, refinementEngines); + // } /** * @param branching @@ -155,15 +149,15 @@ private static Set> computeMaximalCosets(final Branch final Set> maximalCoSets = new LinkedHashSet<>(); for (final Event event : bp.getEvents()) { // small optimization, cut-off event has same condition mark as companion - //if (!event.isCutoffEvent()) { - maximalCoSets.add(event.getMark().stream().collect(Collectors.toSet())); - //} + // if (!event.isCutoffEvent()) { + maximalCoSets.add(event.getMark().stream().collect(Collectors.toSet())); + // } } return maximalCoSets; } /** - * Annotation with MaximalCosets computation + * Annotation with MaximalCosets computation */ private Map, IPredicate> getMaximalAnnotation() { final Map, IPredicate> mapping = new HashMap<>(); @@ -172,140 +166,129 @@ private Map, IPredicate> getMaximalAnnotation() { } return mapping; } - + /** - * Cuts computation from "greedy" algorithm - * With simplification + * Cuts computation from "greedy" algorithm With simplification */ - private Map, IPredicate> getCosetAnnotation() { - final Map, IPredicate> mapping = new HashMap<>(); - final Set>> markingCosets = getCosets(new HashSet>(), - new HashSet>(), mOrigConditions, new HashSet>>()); - for(Set> markCoset: markingCosets) { - Set markPlaces = getCosetPlaces(markCoset); - Set>> assertConds = getCosets(new HashSet>(), - markCoset,mAssertConditions, new HashSet>>()); - Set> markAssertPlaces = new HashSet<>(); - for(Set> assertCond: assertConds) { - markAssertPlaces.add(simplifyAssertions(getCosetPredicates(assertCond))); - //markAssertPlaces.add((getCosetPredicates(assertCond)); - } - mapping.put(new Marking(markPlaces), getMarkingAssertion(markPlaces, markAssertPlaces)); - } - return mapping; - } - - private Set getCosetPlaces (final Set> coset){ - Set placeCoset = new HashSet<>(); - for(Condition condition: coset) { - placeCoset.add(condition.getPlace()); - } - return placeCoset; - - } - - private Set getCosetPredicates (final Set> coset){ - Set predCoset = new HashSet<>(); - for(Condition condition: coset) { - predCoset.add(condition.getPlace()); - } - return predCoset; - - } - - //Set of conditions to set of places - private Set simplifyAssertions(Set assertConds){ - Set simpleAssertions = assertConds; - //Check if equiv to false, set all to false; - for (IPredicate cond: assertConds) { - if (!thereIsStronger(cond, simpleAssertions)) { - Set weakerConditions = getWeakerConditions(cond, assertConds); - simpleAssertions = cleanWeakConditions(simpleAssertions, weakerConditions); - } - else { - simpleAssertions = DataStructureUtils.difference(simpleAssertions, - Collections.singleton(cond)); - } - } - return simpleAssertions; - } - - private Set getWeakerConditions(final IPredicate condition, Set assertConditions) { - Set condImplications = new HashSet<>(); - assertConditions = DataStructureUtils.difference(assertConditions, Collections.singleton(condition)); - for (IRefinementEngine> refEngine : mRefinementEngines) { - condImplications.addAll(DataStructureUtils.intersection(assertConditions, - refEngine.getPredicateUnifier().getCoverageRelation().getCoveringPredicates(condition))); - } - return condImplications; - } - - private Set cleanWeakConditions(Set assertConditions, - final Set condImplications){ - if (!condImplications.isEmpty()) { - assertConditions = DataStructureUtils.difference(assertConditions, condImplications); - } - return assertConditions; - } - - - private boolean thereIsStronger(final IPredicate condition, final Set assertConditions) { - final Set assertPredicates= - DataStructureUtils.difference(assertConditions, Collections.singleton(condition)); - for (IRefinementEngine> refEngine : mRefinementEngines) { - final Set coveredPlaces = - refEngine.getPredicateUnifier().getCoverageRelation().getCoveredPredicates(condition); - if(!DataStructureUtils.intersection(coveredPlaces, assertPredicates).isEmpty()) { - return true; - } - } - return false; - } - - - - /** - * @param coset - * @param conditions - * @param cuts - * @return set successor maximal cosets from given coset - */ - private Set>> getCosets(Set> coset, Set> compCoset, - Set> conditions, Set>> cuts){ - Set> toAdd = DataStructureUtils.difference(conditions, coset); - Set>> cosets = new HashSet<>(); - for(Condition cond: toAdd) { - if(mBp.getCoRelation().isCoset(compCoset, cond) & mBp.getCoRelation().isCoset(coset, cond)) { - Set> imCoset= - DataStructureUtils.union(coset,DataStructureUtils.toSet(cond)); - cosets.add(imCoset); - } - } - if(!cosets.isEmpty()) { - for (Set> imcoset: cosets) { - cuts = DataStructureUtils.union(cuts, getCosets(imcoset, compCoset, conditions,cuts)); - } - } - else { - cuts.add(coset); - } - return cuts; - } - - - - private Set> getOrigConditions(){ - Set> conditions = new HashSet<>(); - for(final Condition cond: mBp.getConditions()) { - if (mOrigPlaces.contains(cond.getPlace())) { - conditions.add(cond); - } - } - return conditions; - } - + private Map, IPredicate> getCosetAnnotation() { + final Map, IPredicate> mapping = new HashMap<>(); + final Set>> markingCosets = getCosets(new HashSet>(), + new HashSet>(), mOrigConditions, new HashSet>>()); + for (final Set> markCoset : markingCosets) { + final Set markPlaces = getCosetPlaces(markCoset); + final Set>> assertConds = getCosets(new HashSet>(), + markCoset, mAssertConditions, new HashSet>>()); + final Set> markAssertPlaces = new HashSet<>(); + for (final Set> assertCond : assertConds) { + markAssertPlaces.add(simplifyAssertions(getCosetPredicates(assertCond))); + // markAssertPlaces.add((getCosetPredicates(assertCond)); + } + mapping.put(new Marking(markPlaces), getMarkingAssertion(markPlaces, markAssertPlaces)); + } + return mapping; + } + + private Set getCosetPlaces(final Set> coset) { + final Set placeCoset = new HashSet<>(); + for (final Condition condition : coset) { + placeCoset.add(condition.getPlace()); + } + return placeCoset; + } + + private Set getCosetPredicates(final Set> coset) { + final Set predCoset = new HashSet<>(); + for (final Condition condition : coset) { + predCoset.add(condition.getPlace()); + } + return predCoset; + + } + + // Set of conditions to set of places + private Set simplifyAssertions(final Set assertConds) { + Set simpleAssertions = assertConds; + // Check if equiv to false, set all to false; + for (final IPredicate cond : assertConds) { + if (!thereIsStronger(cond, simpleAssertions)) { + final Set weakerConditions = getWeakerConditions(cond, assertConds); + simpleAssertions = cleanWeakConditions(simpleAssertions, weakerConditions); + } else { + simpleAssertions = DataStructureUtils.difference(simpleAssertions, Collections.singleton(cond)); + } + } + return simpleAssertions; + } + private Set getWeakerConditions(final IPredicate condition, Set assertConditions) { + final Set condImplications = new HashSet<>(); + assertConditions = DataStructureUtils.difference(assertConditions, Collections.singleton(condition)); + for (final IRefinementEngine> refEngine : mRefinementEngines) { + condImplications.addAll(DataStructureUtils.intersection(assertConditions, + refEngine.getPredicateUnifier().getCoverageRelation().getCoveringPredicates(condition))); + } + return condImplications; + } + + private Set cleanWeakConditions(Set assertConditions, + final Set condImplications) { + if (!condImplications.isEmpty()) { + assertConditions = DataStructureUtils.difference(assertConditions, condImplications); + } + return assertConditions; + } + + private boolean thereIsStronger(final IPredicate condition, final Set assertConditions) { + final Set assertPredicates = + DataStructureUtils.difference(assertConditions, Collections.singleton(condition)); + for (final IRefinementEngine> refEngine : mRefinementEngines) { + final Set coveredPlaces = + refEngine.getPredicateUnifier().getCoverageRelation().getCoveredPredicates(condition); + if (!DataStructureUtils.intersection(coveredPlaces, assertPredicates).isEmpty()) { + return true; + } + } + return false; + } + + /** + * @param coset + * @param conditions + * @param cuts + * @return set successor maximal cosets from given coset + */ + private Set>> getCosets(final Set> coset, + final Set> compCoset, final Set> conditions, + Set>> cuts) { + final Set> toAdd = DataStructureUtils.difference(conditions, coset); + final Set>> cosets = new HashSet<>(); + for (final Condition cond : toAdd) { + if (mBp.getCoRelation().isCoset(compCoset, cond) & mBp.getCoRelation().isCoset(coset, cond)) { + final Set> imCoset = + DataStructureUtils.union(coset, DataStructureUtils.toSet(cond)); + cosets.add(imCoset); + } + } + if (!cosets.isEmpty()) { + for (final Set> imcoset : cosets) { + cuts = DataStructureUtils.union(cuts, getCosets(imcoset, compCoset, conditions, cuts)); + } + } else { + cuts.add(coset); + } + return cuts; + } + + private Set> getOrigConditions() { + final Set> conditions = new HashSet<>(); + for (final Condition cond : mBp.getConditions()) { + if (mOrigPlaces.contains(cond.getPlace())) { + conditions.add(cond); + } + } + return conditions; + } private IPredicate getMarkingAssertion(final Set marking) { final Set predicates = new HashSet<>(); @@ -314,6 +297,7 @@ private IPredicate getMarkingAssertion(final Set marking) { } return mFactory.or(predicates); } + private IPredicate getCutAssertion(final Set cut, final Set assertPlaces) { final Set predicates = new HashSet<>(); for (final IPredicate place : assertPlaces) { @@ -321,10 +305,8 @@ private IPredicate getCutAssertion(final Set cut, final Set assert } return mFactory.and(predicates); } - - - //Call this for simple and "greedy" cuts Annotation + // Call this for simple and "greedy" cuts Annotation private IPredicate getMarkingAssertion(final Set marking, final Set> cuts) { final Set predicates = new HashSet<>(); for (final Set cut : cuts) { @@ -332,8 +314,7 @@ private IPredicate getMarkingAssertion(final Set marking, final Set Cut assertion private IPredicate getCutAssertion(final Set cut) { final Set predicates = new HashSet<>(); @@ -342,7 +323,6 @@ private IPredicate getCutAssertion(final Set cut) { } return mFactory.and(predicates); } - /** * @param cuts @@ -367,8 +347,6 @@ private Set getPlaces(final Set> cuts) { private Set getAssertPlaces(final Set places, final Set origPlaces) { return DataStructureUtils.difference(places, origPlaces); } - - /** * @param cut From 015b4f2f8143e9cf6d4dfdd2daf554db74acb207 Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Thu, 5 Aug 2021 15:25:08 +0200 Subject: [PATCH 063/536] add settings and some logging for O/G annotations --- .../traceabstraction/BasicCegarLoop.java | 16 +++++++++++--- .../concurrency/CegarLoopForPetriNet.java | 21 +++++++++++++++---- .../concurrency/OwickiGriesConstruction.java | 19 ++++++++++------- .../concurrency/OwickiGriesFloydHoare.java | 19 ++++++++++++----- .../preferences/TAPreferences.java | 12 +++++++++++ ...TraceAbstractionPreferenceInitializer.java | 19 ++++++++++++++++- 6 files changed, 86 insertions(+), 20 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java index 27faa7611af..b49ba11158b 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java @@ -1262,6 +1262,7 @@ public void computeOwickiGries() { throw new AssertionError("Owicki-Gries does currently not support Petri net LBE."); } + final long startTime = System.nanoTime(); final Map floydHoare = computeHoareAnnotationComposer().getLoc2hoare(); final Map, IPredicate> petriFloydHoare = new HashMap<>(); @@ -1271,15 +1272,24 @@ public void computeOwickiGries() { final IPredicate hoare = floydHoare.get(state); petriFloydHoare.put(marking, hoare); } - assert !petriFloydHoare.isEmpty(); final OwickiGriesConstruction construction = - new OwickiGriesConstruction<>(mServices, mCsToolkit, mPetriNet, petriFloydHoare, null); + new OwickiGriesConstruction<>(mServices, mCsToolkit, mPetriNet, petriFloydHoare, null, false); // TODO: simplify + final long constructionTime = System.nanoTime(); + mLogger.info("Computed Owicki-Gries annotation of size " + construction.getResult().getSize() + " in " + + (constructionTime - startTime) + "ns"); + final OwickiGriesValidityCheck check = new OwickiGriesValidityCheck<>(mServices, mCsToolkit, construction.getResult(), construction.getCoMarkedPlaces()); - assert check.isValid() : "Invalid Owicki-Gries annotation"; + final long endTime = System.nanoTime(); + mLogger.info("Checked inductivity and non-interference of Owicki-Gries annotation in " + + (endTime - constructionTime) + "ns"); + + if (!check.isValid()) { + throw new AssertionError("Invalid Owicki-Gries annotation"); + } } @Override diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java index 80671f8753c..31684af7c5d 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java @@ -706,8 +706,11 @@ public void computeOwickiGries() { if (mPref.useLbeInConcurrentAnalysis() != PetriNetLbe.OFF) { throw new AssertionError("Owicki-Gries does currently not support Petri net LBE."); } + + final long startTime = System.nanoTime(); final OwickiGriesFloydHoare floydHoare = - new OwickiGriesFloydHoare<>(mServices, mCsToolkit, mFinPrefix, mInitialNet, x -> x, mRefinementEngines); + new OwickiGriesFloydHoare<>(mServices, mCsToolkit, mFinPrefix, mInitialNet, x -> x, mRefinementEngines, + mPref.owickiGriesIterativeCosets(), mPref.owickiGriesCoveringSimplification()); final Map, IPredicate> petriFloydHoare = floydHoare.getResult(); // final var htc = new MonolithicHoareTripleChecker(mCsToolkit); @@ -732,12 +735,22 @@ public void computeOwickiGries() { // } // } - final OwickiGriesConstruction construction = - new OwickiGriesConstruction<>(mServices, mCsToolkit, mInitialNet, petriFloydHoare, mRefinementEngines); + final OwickiGriesConstruction construction = new OwickiGriesConstruction<>(mServices, mCsToolkit, + mInitialNet, petriFloydHoare, mRefinementEngines, mPref.owickiGriesHittingSets()); // TODO: simplify + final long constructionTime = System.nanoTime(); + mLogger.info("Computed Owicki-Gries annotation of size " + construction.getResult().getSize() + " in " + + (constructionTime - startTime) + "ns"); + final OwickiGriesValidityCheck check = new OwickiGriesValidityCheck<>(mServices, mCsToolkit, construction.getResult(), construction.getCoMarkedPlaces()); - assert check.isValid() : "Invalid Owicki-Gries annotation"; + final long endTime = System.nanoTime(); + mLogger.info("Checked inductivity and non-interference of Owicki-Gries annotation in " + + (endTime - constructionTime) + "ns"); + + if (!check.isValid()) { + throw new AssertionError("Invalid Owicki-Gries annotation"); + } } @Override diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java index 50aefdadeae..b7d35816a99 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesConstruction.java @@ -99,7 +99,8 @@ public class OwickiGriesConstruction> { public OwickiGriesConstruction(final IUltimateServiceProvider services, final CfgSmtToolkit csToolkit, final IPetriNet net, final Map, IPredicate> floydHoare, - final ArrayList>> refinementEngines) { + final ArrayList>> refinementEngines, + final boolean useHittingSets) { mServices = services; mLogger = services.getLoggingService().getLogger(ModelCheckerUtils.PLUGIN_ID); mManagedScript = csToolkit.getManagedScript(); @@ -112,7 +113,7 @@ public OwickiGriesConstruction(final IUltimateServiceProvider services, final Cf mFactory = new BasicPredicateFactory(mServices, mManagedScript, mSymbolTable); mGhostVariables = getGhostVariables(); - mHittingSet = getHittingSet(); + mHittingSet = useHittingSets ? getHittingSet() : null; final Map formulaMapping = getFormulaMapping(); final Map, UnmodifiableTransFormula> assignmentMapping = getAssignmentMapping(); final Map ghostInitAssignment = getGhostInitAssignment(); @@ -147,15 +148,19 @@ private Map getFormulaMapping() { */ private Term getMarkingPredicate(final Marking marking) { final Set terms = new HashSet<>(); - final Set posPlaces = - DataStructureUtils.intersection(mHittingSet, marking.stream().collect(Collectors.toSet())); - // final Set posPlaces = marking.stream().collect(Collectors.toSet()); + Set posPlaces = marking.stream().collect(Collectors.toSet()); + if (mHittingSet != null) { + posPlaces = DataStructureUtils.intersection(mHittingSet, posPlaces); + } for (final PLACE otherPlace : posPlaces) { final Term ghost = mGhostVariables.get(otherPlace).getTerm(); terms.add(ghost); } - terms.addAll(getHitNotMarking(marking)); - // terms.addAll(getAllNotMarking(marking)); + if (mHittingSet == null) { + terms.addAll(getAllNotMarking(marking)); + } else { + terms.addAll(getHitNotMarking(marking)); + } terms.add(mFloydHoareAnnotation.get(marking).getFormula()); return SmtUtils.and(mScript, terms); } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java index 0f954c62602..412704c22e3 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesFloydHoare.java @@ -76,6 +76,7 @@ public class OwickiGriesFloydHoare mPlace2Predicate; private final ArrayList>> mRefinementEngines; + private final boolean mCoveringSimplification; private final BranchingProcess mBp; private final IPetriNet mNet; @@ -103,7 +104,8 @@ public class OwickiGriesFloydHoare bp, final IPetriNet net, final Function place2Predicate, - final ArrayList>> refinementEngines) { + final ArrayList>> refinementEngines, + final boolean iterativeCosets, final boolean coveringSimplification) { mServices = services; mLogger = services.getLoggingService().getLogger(ModelCheckerUtils.PLUGIN_ID); @@ -128,8 +130,12 @@ public OwickiGriesFloydHoare(final IUltimateServiceProvider services, final CfgS mAssertPlaces = getAssertPlaces(mPlaces, mOrigPlaces); mReach = getReach(mCuts); - mFloydHoareAnnotation = getCosetAnnotation(); - // mFloydHoareAnnotation = getMaximalAnnotation(); + if (iterativeCosets) { + mFloydHoareAnnotation = getCosetAnnotation(); + } else { + mFloydHoareAnnotation = getMaximalAnnotation(); + } + mCoveringSimplification = coveringSimplification; } @@ -180,8 +186,11 @@ private Map, IPredicate> getCosetAnnotation() { markCoset, mAssertConditions, new HashSet>>()); final Set> markAssertPlaces = new HashSet<>(); for (final Set> assertCond : assertConds) { - markAssertPlaces.add(simplifyAssertions(getCosetPredicates(assertCond))); - // markAssertPlaces.add((getCosetPredicates(assertCond)); + Set cosetPredicates = getCosetPredicates(assertCond); + if (mCoveringSimplification) { + cosetPredicates = simplifyAssertions(cosetPredicates); + } + markAssertPlaces.add(cosetPredicates); } mapping.put(new Marking(markPlaces), getMarkingAssertion(markPlaces, markAssertPlaces)); } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/preferences/TAPreferences.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/preferences/TAPreferences.java index 800b2889ea8..38254c43c2c 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/preferences/TAPreferences.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/preferences/TAPreferences.java @@ -455,4 +455,16 @@ public boolean overrideInterpolantAutomaton() { public McrInterpolantMethod getMcrInterpolantMethod() { return mMcrInterpolantMethod; } + + public boolean owickiGriesIterativeCosets() { + return mPrefs.getBoolean(TraceAbstractionPreferenceInitializer.LABEL_OG_ITERATIVE_COSETS); + } + + public boolean owickiGriesCoveringSimplification() { + return mPrefs.getBoolean(TraceAbstractionPreferenceInitializer.LABEL_OG_COVERING_SIMPLIFICATION); + } + + public boolean owickiGriesHittingSets() { + return mPrefs.getBoolean(TraceAbstractionPreferenceInitializer.LABEL_OG_HITTING_SET_OPTIMIZATION); + } } diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/preferences/TraceAbstractionPreferenceInitializer.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/preferences/TraceAbstractionPreferenceInitializer.java index b08fe0bb80f..28480d7a733 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/preferences/TraceAbstractionPreferenceInitializer.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/preferences/TraceAbstractionPreferenceInitializer.java @@ -326,6 +326,17 @@ public class TraceAbstractionPreferenceInitializer extends UltimatePreferenceIni public static final Map DEF_ADDITIONAL_SMT_OPTIONS = RcfgPreferenceInitializer.DEF_ADDITIONAL_SMT_OPTIONS; + public static final String LABEL_OG_ITERATIVE_COSETS = "Compute co-sets for OwickiGries annotation iteratively"; + public static final boolean DEF_OG_ITERATIVE_COSETS = false; + + public static final String LABEL_OG_COVERING_SIMPLIFICATION = + "Simplify away covered predicates in OwickiGries annotation"; + public static final boolean DEF_OG_COVERING_SIMPLIFICATION = false; + + public static final String LABEL_OG_HITTING_SET_OPTIMIZATION = + "Use hitting sets in computation of OwickiGries annotation"; + public static final boolean DEF_OG_HITTING_SET_OPTIMIZATION = false; + /** * Constructor. */ @@ -499,7 +510,13 @@ protected UltimatePreferenceItem[] initDefaultPreferences() { DEF_SMT_FEATURE_EXTRACTION_DUMP_PATH, DESC_SMT_FEATURE_EXTRACTION_DUMP_PATH, PreferenceType.Directory), new UltimatePreferenceItem<>(LABEL_ADDITIONAL_SMT_OPTIONS, DEF_ADDITIONAL_SMT_OPTIONS, - PreferenceType.KeyValue), }; + PreferenceType.KeyValue), + new UltimatePreferenceItem<>(LABEL_OG_ITERATIVE_COSETS, DEF_OG_ITERATIVE_COSETS, + PreferenceType.Boolean), + new UltimatePreferenceItem<>(LABEL_OG_COVERING_SIMPLIFICATION, DEF_OG_COVERING_SIMPLIFICATION, + PreferenceType.Boolean), + new UltimatePreferenceItem<>(LABEL_OG_HITTING_SET_OPTIMIZATION, DEF_OG_HITTING_SET_OPTIMIZATION, + PreferenceType.Boolean), }; } /** From 3397cff944f0b946494079700613352708e17752 Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Thu, 5 Aug 2021 15:34:45 +0200 Subject: [PATCH 064/536] make size a long (and rename method) --- .../generator/traceabstraction/BasicCegarLoop.java | 2 +- .../concurrency/CegarLoopForPetriNet.java | 2 +- .../concurrency/OwickiGriesAnnotation.java | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java index b49ba11158b..3942dcec36c 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/BasicCegarLoop.java @@ -1278,7 +1278,7 @@ public void computeOwickiGries() { new OwickiGriesConstruction<>(mServices, mCsToolkit, mPetriNet, petriFloydHoare, null, false); // TODO: simplify final long constructionTime = System.nanoTime(); - mLogger.info("Computed Owicki-Gries annotation of size " + construction.getResult().getSize() + " in " + mLogger.info("Computed Owicki-Gries annotation of size " + construction.getResult().size() + " in " + (constructionTime - startTime) + "ns"); final OwickiGriesValidityCheck check = new OwickiGriesValidityCheck<>(mServices, mCsToolkit, diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java index 31684af7c5d..2dc48c03885 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/CegarLoopForPetriNet.java @@ -739,7 +739,7 @@ public void computeOwickiGries() { mInitialNet, petriFloydHoare, mRefinementEngines, mPref.owickiGriesHittingSets()); // TODO: simplify final long constructionTime = System.nanoTime(); - mLogger.info("Computed Owicki-Gries annotation of size " + construction.getResult().getSize() + " in " + mLogger.info("Computed Owicki-Gries annotation of size " + construction.getResult().size() + " in " + (constructionTime - startTime) + "ns"); final OwickiGriesValidityCheck check = new OwickiGriesValidityCheck<>(mServices, mCsToolkit, diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java index 4bab0ac28be..bbc4e357ced 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/concurrency/OwickiGriesAnnotation.java @@ -137,14 +137,14 @@ public Map getGhostAssignment() { return mGhostInitAssignment; } - public int getSize() { + public long size() { final DAGSize sizeComputation = new DAGSize(); - final int initSize = mGhostInitAssignment.entrySet().stream() - .collect(Collectors.summingInt(x -> sizeComputation.size(x.getValue()))); - final int formulaSize = mFormulaMapping.entrySet().stream() - .collect(Collectors.summingInt(x -> sizeComputation.size(x.getValue().getFormula()))); - final int assignSize = mAssignmentMapping.entrySet().stream() - .collect(Collectors.summingInt(x -> sizeComputation.size(x.getValue().getFormula()))); + final long initSize = mGhostInitAssignment.entrySet().stream() + .collect(Collectors.summingLong(x -> sizeComputation.size(x.getValue()))); + final long formulaSize = mFormulaMapping.entrySet().stream() + .collect(Collectors.summingLong(x -> sizeComputation.size(x.getValue().getFormula()))); + final long assignSize = mAssignmentMapping.entrySet().stream() + .collect(Collectors.summingLong(x -> sizeComputation.size(x.getValue().getFormula()))); return initSize + formulaSize + assignSize; } } From c068fca4b825ecffd526daec3feb76bb67233282 Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Thu, 5 Aug 2021 15:47:41 +0200 Subject: [PATCH 065/536] add setting files for different O/G variants --- ...-PN-NoLbe-OGIterative-CovSimpl-Hitting.epf | 80 +++++++++++++++++++ ...MmResRef-PN-NoLbe-OGIterative-CovSimpl.epf | 78 ++++++++++++++++++ ...oMmResRef-PN-NoLbe-OGIterative-Hitting.epf | 79 ++++++++++++++++++ ...efault-noMmResRef-PN-NoLbe-OGIterative.epf | 77 ++++++++++++++++++ ...TraceAbstractionPreferenceInitializer.java | 2 +- 5 files changed, 315 insertions(+), 1 deletion(-) create mode 100644 trunk/examples/settings/automizer/concurrent/svcomp-Reach-32bit-Automizer_Default-noMmResRef-PN-NoLbe-OGIterative-CovSimpl-Hitting.epf create mode 100644 trunk/examples/settings/automizer/concurrent/svcomp-Reach-32bit-Automizer_Default-noMmResRef-PN-NoLbe-OGIterative-CovSimpl.epf create mode 100644 trunk/examples/settings/automizer/concurrent/svcomp-Reach-32bit-Automizer_Default-noMmResRef-PN-NoLbe-OGIterative-Hitting.epf create mode 100644 trunk/examples/settings/automizer/concurrent/svcomp-Reach-32bit-Automizer_Default-noMmResRef-PN-NoLbe-OGIterative.epf diff --git a/trunk/examples/settings/automizer/concurrent/svcomp-Reach-32bit-Automizer_Default-noMmResRef-PN-NoLbe-OGIterative-CovSimpl-Hitting.epf b/trunk/examples/settings/automizer/concurrent/svcomp-Reach-32bit-Automizer_Default-noMmResRef-PN-NoLbe-OGIterative-CovSimpl-Hitting.epf new file mode 100644 index 00000000000..9893eb7ae30 --- /dev/null +++ b/trunk/examples/settings/automizer/concurrent/svcomp-Reach-32bit-Automizer_Default-noMmResRef-PN-NoLbe-OGIterative-CovSimpl-Hitting.epf @@ -0,0 +1,80 @@ +#Mon Nov 27 17:23:30 CET 2017 +\!/instance/de.uni_freiburg.informatik.ultimate.core= +file_export_version=3.0 +@de.uni_freiburg.informatik.ultimate.core=0.1.22 + + +#Fri Oct 24 16:34:36 CEST 2014 +\!/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator= +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Translation\ Mode\:=SV_COMP14 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Checked\ method.\ Library\ mode\ if\ empty.=main +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/sizeof\ long=4 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/sizeof\ POINTER=4 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/sizeof\ long\ double=12 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Check\ division\ by\ zero=IGNORE +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Check\ if\ freed\ pointer\ was\ valid=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Pointer\ to\ allocated\ memory\ at\ dereference=IGNORE +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Check\ array\ bounds\ for\ arrays\ that\ are\ off\ heap=IGNORE +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Check\ for\ the\ main\ procedure\ if\ all\ allocated\ memory\ was\ freed=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/If\ two\ pointers\ are\ subtracted\ or\ compared\ they\ have\ the\ same\ base\ address=IGNORE +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Pointer\ base\ address\ is\ valid\ at\ dereference=IGNORE +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Overapproximate\ operations\ on\ floating\ types=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Use\ constant\ arrays=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Adapt\ memory\ model\ on\ pointer\ casts\ if\ necessary=false +@de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator=0.0.1 + + +#Fri Oct 24 16:34:36 CEST 2014 +\!/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder= +file_export_version=3.0 +@de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder=0.0.1 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder/Convert\ code\ blocks\ to\ CNF=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder/Size\ of\ a\ code\ block=SequenceOfStatements +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder/Command\ for\ external\ solver=z3 SMTLIB2_COMPLIANT\=true -memory\:2024 -smt2 -in -t\:2000 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder/SMT\ solver=External_DefaultMode +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder/Dump\ SMT\ script\ to\ file=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder/To\ the\ following\ directory=./dump/ + + +#Thu Nov 06 16:26:23 CET 2014 +\!/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction= +file_export_version=3.0 +@de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction=0.0.1 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Interpolants\ consolidation=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Compute\ Interpolants\ along\ a\ Counterexample=FPandBP +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Use\ separate\ solver\ for\ trace\ checks=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/SMT\ solver=External_ModelsAndUnsatCoreMode +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Command\ for\ external\ solver=z3 SMTLIB2_COMPLIANT\=true -memory\:2024 -smt2 -in +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Compute\ Hoare\ Annotation\ of\ negated\ interpolant\ automaton,\ abstraction\ and\ CFG=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Positions\ where\ we\ compute\ the\ Hoare\ Annotation=LoopsAndPotentialCycles +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Trace\ refinement\ strategy=CAMEL +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Automaton\ type\ used\ in\ concurrency\ analysis=PETRI_NET +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Large\ block\ encoding\ in\ concurrent\ analysis=OFF +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Compute\ cosets\ for\ OwickiGries\ annotation\ iteratively=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Simplify\ away\ covered\ predicates\ in\ OwickiGries\ annotation=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Use\ hitting\ sets\ in\ computation\ of\ OwickiGries\ annotation=true + + + +#Thu Oct 29 23:01:13 CET 2015 +file_export_version=3.0 +@de.uni_freiburg.informatik.ultimate.boogie.procedureinliner=0.0.1 +\!/instance/de.uni_freiburg.informatik.ultimate.boogie.procedureinliner= +/instance/de.uni_freiburg.informatik.ultimate.boogie.procedureinliner/...\ calls\ to\ implemented\ procedures=ONLY_FOR_CONCURRENT_PROGRAMS + + +#Tue Nov 21 08:04:41 CET 2017 +\!/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding= +file_export_version=3.0 +@de.uni_freiburg.informatik.ultimate.plugins.blockencoding=0.1.22 +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Simplify\ transitions=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Apply\ optimizations\ until\ nothing\ changes=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Create\ parallel\ compositions\ if\ possible=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Remove\ sink\ states=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Rewrite\ not-equals=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Iterate\ optimizations\ for\ n\ times\ (<\=0\ means\ until\ nothing\ changes)=0 +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Create\ interprocedural\ compositions=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Remove\ infeasible\ edges=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Maximize\ final\ states=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Use\ SBE=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Minimize\ states\ even\ if\ more\ edges\ are\ added\ than\ removed.=false diff --git a/trunk/examples/settings/automizer/concurrent/svcomp-Reach-32bit-Automizer_Default-noMmResRef-PN-NoLbe-OGIterative-CovSimpl.epf b/trunk/examples/settings/automizer/concurrent/svcomp-Reach-32bit-Automizer_Default-noMmResRef-PN-NoLbe-OGIterative-CovSimpl.epf new file mode 100644 index 00000000000..5880f87fd10 --- /dev/null +++ b/trunk/examples/settings/automizer/concurrent/svcomp-Reach-32bit-Automizer_Default-noMmResRef-PN-NoLbe-OGIterative-CovSimpl.epf @@ -0,0 +1,78 @@ +#Mon Nov 27 17:23:30 CET 2017 +\!/instance/de.uni_freiburg.informatik.ultimate.core= +file_export_version=3.0 +@de.uni_freiburg.informatik.ultimate.core=0.1.22 + + +#Fri Oct 24 16:34:36 CEST 2014 +\!/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator= +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Translation\ Mode\:=SV_COMP14 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Checked\ method.\ Library\ mode\ if\ empty.=main +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/sizeof\ long=4 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/sizeof\ POINTER=4 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/sizeof\ long\ double=12 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Check\ division\ by\ zero=IGNORE +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Check\ if\ freed\ pointer\ was\ valid=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Pointer\ to\ allocated\ memory\ at\ dereference=IGNORE +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Check\ array\ bounds\ for\ arrays\ that\ are\ off\ heap=IGNORE +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Check\ for\ the\ main\ procedure\ if\ all\ allocated\ memory\ was\ freed=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/If\ two\ pointers\ are\ subtracted\ or\ compared\ they\ have\ the\ same\ base\ address=IGNORE +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Pointer\ base\ address\ is\ valid\ at\ dereference=IGNORE +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Overapproximate\ operations\ on\ floating\ types=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Use\ constant\ arrays=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Adapt\ memory\ model\ on\ pointer\ casts\ if\ necessary=false +@de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator=0.0.1 + + +#Fri Oct 24 16:34:36 CEST 2014 +\!/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder= +file_export_version=3.0 +@de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder=0.0.1 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder/Convert\ code\ blocks\ to\ CNF=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder/Size\ of\ a\ code\ block=SequenceOfStatements +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder/Command\ for\ external\ solver=z3 SMTLIB2_COMPLIANT\=true -memory\:2024 -smt2 -in -t\:2000 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder/SMT\ solver=External_DefaultMode +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder/Dump\ SMT\ script\ to\ file=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder/To\ the\ following\ directory=./dump/ + + +#Thu Nov 06 16:26:23 CET 2014 +\!/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction= +file_export_version=3.0 +@de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction=0.0.1 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Interpolants\ consolidation=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Compute\ Interpolants\ along\ a\ Counterexample=FPandBP +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Use\ separate\ solver\ for\ trace\ checks=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/SMT\ solver=External_ModelsAndUnsatCoreMode +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Command\ for\ external\ solver=z3 SMTLIB2_COMPLIANT\=true -memory\:2024 -smt2 -in +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Compute\ Hoare\ Annotation\ of\ negated\ interpolant\ automaton,\ abstraction\ and\ CFG=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Positions\ where\ we\ compute\ the\ Hoare\ Annotation=LoopsAndPotentialCycles +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Trace\ refinement\ strategy=CAMEL +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Automaton\ type\ used\ in\ concurrency\ analysis=PETRI_NET +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Large\ block\ encoding\ in\ concurrent\ analysis=OFF +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Compute\ cosets\ for\ OwickiGries\ annotation\ iteratively=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Simplify\ away\ covered\ predicates\ in\ OwickiGries\ annotation=true + + +#Thu Oct 29 23:01:13 CET 2015 +file_export_version=3.0 +@de.uni_freiburg.informatik.ultimate.boogie.procedureinliner=0.0.1 +\!/instance/de.uni_freiburg.informatik.ultimate.boogie.procedureinliner= +/instance/de.uni_freiburg.informatik.ultimate.boogie.procedureinliner/...\ calls\ to\ implemented\ procedures=ONLY_FOR_CONCURRENT_PROGRAMS + + +#Tue Nov 21 08:04:41 CET 2017 +\!/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding= +file_export_version=3.0 +@de.uni_freiburg.informatik.ultimate.plugins.blockencoding=0.1.22 +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Simplify\ transitions=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Apply\ optimizations\ until\ nothing\ changes=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Create\ parallel\ compositions\ if\ possible=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Remove\ sink\ states=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Rewrite\ not-equals=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Iterate\ optimizations\ for\ n\ times\ (<\=0\ means\ until\ nothing\ changes)=0 +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Create\ interprocedural\ compositions=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Remove\ infeasible\ edges=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Maximize\ final\ states=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Use\ SBE=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Minimize\ states\ even\ if\ more\ edges\ are\ added\ than\ removed.=false diff --git a/trunk/examples/settings/automizer/concurrent/svcomp-Reach-32bit-Automizer_Default-noMmResRef-PN-NoLbe-OGIterative-Hitting.epf b/trunk/examples/settings/automizer/concurrent/svcomp-Reach-32bit-Automizer_Default-noMmResRef-PN-NoLbe-OGIterative-Hitting.epf new file mode 100644 index 00000000000..5e6c031bbbf --- /dev/null +++ b/trunk/examples/settings/automizer/concurrent/svcomp-Reach-32bit-Automizer_Default-noMmResRef-PN-NoLbe-OGIterative-Hitting.epf @@ -0,0 +1,79 @@ +#Mon Nov 27 17:23:30 CET 2017 +\!/instance/de.uni_freiburg.informatik.ultimate.core= +file_export_version=3.0 +@de.uni_freiburg.informatik.ultimate.core=0.1.22 + + +#Fri Oct 24 16:34:36 CEST 2014 +\!/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator= +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Translation\ Mode\:=SV_COMP14 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Checked\ method.\ Library\ mode\ if\ empty.=main +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/sizeof\ long=4 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/sizeof\ POINTER=4 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/sizeof\ long\ double=12 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Check\ division\ by\ zero=IGNORE +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Check\ if\ freed\ pointer\ was\ valid=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Pointer\ to\ allocated\ memory\ at\ dereference=IGNORE +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Check\ array\ bounds\ for\ arrays\ that\ are\ off\ heap=IGNORE +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Check\ for\ the\ main\ procedure\ if\ all\ allocated\ memory\ was\ freed=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/If\ two\ pointers\ are\ subtracted\ or\ compared\ they\ have\ the\ same\ base\ address=IGNORE +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Pointer\ base\ address\ is\ valid\ at\ dereference=IGNORE +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Overapproximate\ operations\ on\ floating\ types=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Use\ constant\ arrays=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Adapt\ memory\ model\ on\ pointer\ casts\ if\ necessary=false +@de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator=0.0.1 + + +#Fri Oct 24 16:34:36 CEST 2014 +\!/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder= +file_export_version=3.0 +@de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder=0.0.1 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder/Convert\ code\ blocks\ to\ CNF=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder/Size\ of\ a\ code\ block=SequenceOfStatements +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder/Command\ for\ external\ solver=z3 SMTLIB2_COMPLIANT\=true -memory\:2024 -smt2 -in -t\:2000 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder/SMT\ solver=External_DefaultMode +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder/Dump\ SMT\ script\ to\ file=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder/To\ the\ following\ directory=./dump/ + + +#Thu Nov 06 16:26:23 CET 2014 +\!/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction= +file_export_version=3.0 +@de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction=0.0.1 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Interpolants\ consolidation=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Compute\ Interpolants\ along\ a\ Counterexample=FPandBP +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Use\ separate\ solver\ for\ trace\ checks=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/SMT\ solver=External_ModelsAndUnsatCoreMode +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Command\ for\ external\ solver=z3 SMTLIB2_COMPLIANT\=true -memory\:2024 -smt2 -in +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Compute\ Hoare\ Annotation\ of\ negated\ interpolant\ automaton,\ abstraction\ and\ CFG=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Positions\ where\ we\ compute\ the\ Hoare\ Annotation=LoopsAndPotentialCycles +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Trace\ refinement\ strategy=CAMEL +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Automaton\ type\ used\ in\ concurrency\ analysis=PETRI_NET +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Large\ block\ encoding\ in\ concurrent\ analysis=OFF +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Compute\ cosets\ for\ OwickiGries\ annotation\ iteratively=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Use\ hitting\ sets\ in\ computation\ of\ OwickiGries\ annotation=true + + + +#Thu Oct 29 23:01:13 CET 2015 +file_export_version=3.0 +@de.uni_freiburg.informatik.ultimate.boogie.procedureinliner=0.0.1 +\!/instance/de.uni_freiburg.informatik.ultimate.boogie.procedureinliner= +/instance/de.uni_freiburg.informatik.ultimate.boogie.procedureinliner/...\ calls\ to\ implemented\ procedures=ONLY_FOR_CONCURRENT_PROGRAMS + + +#Tue Nov 21 08:04:41 CET 2017 +\!/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding= +file_export_version=3.0 +@de.uni_freiburg.informatik.ultimate.plugins.blockencoding=0.1.22 +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Simplify\ transitions=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Apply\ optimizations\ until\ nothing\ changes=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Create\ parallel\ compositions\ if\ possible=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Remove\ sink\ states=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Rewrite\ not-equals=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Iterate\ optimizations\ for\ n\ times\ (<\=0\ means\ until\ nothing\ changes)=0 +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Create\ interprocedural\ compositions=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Remove\ infeasible\ edges=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Maximize\ final\ states=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Use\ SBE=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Minimize\ states\ even\ if\ more\ edges\ are\ added\ than\ removed.=false diff --git a/trunk/examples/settings/automizer/concurrent/svcomp-Reach-32bit-Automizer_Default-noMmResRef-PN-NoLbe-OGIterative.epf b/trunk/examples/settings/automizer/concurrent/svcomp-Reach-32bit-Automizer_Default-noMmResRef-PN-NoLbe-OGIterative.epf new file mode 100644 index 00000000000..512b4dc07c1 --- /dev/null +++ b/trunk/examples/settings/automizer/concurrent/svcomp-Reach-32bit-Automizer_Default-noMmResRef-PN-NoLbe-OGIterative.epf @@ -0,0 +1,77 @@ +#Mon Nov 27 17:23:30 CET 2017 +\!/instance/de.uni_freiburg.informatik.ultimate.core= +file_export_version=3.0 +@de.uni_freiburg.informatik.ultimate.core=0.1.22 + + +#Fri Oct 24 16:34:36 CEST 2014 +\!/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator= +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Translation\ Mode\:=SV_COMP14 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Checked\ method.\ Library\ mode\ if\ empty.=main +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/sizeof\ long=4 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/sizeof\ POINTER=4 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/sizeof\ long\ double=12 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Check\ division\ by\ zero=IGNORE +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Check\ if\ freed\ pointer\ was\ valid=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Pointer\ to\ allocated\ memory\ at\ dereference=IGNORE +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Check\ array\ bounds\ for\ arrays\ that\ are\ off\ heap=IGNORE +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Check\ for\ the\ main\ procedure\ if\ all\ allocated\ memory\ was\ freed=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/If\ two\ pointers\ are\ subtracted\ or\ compared\ they\ have\ the\ same\ base\ address=IGNORE +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Pointer\ base\ address\ is\ valid\ at\ dereference=IGNORE +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Overapproximate\ operations\ on\ floating\ types=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Use\ constant\ arrays=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator/Adapt\ memory\ model\ on\ pointer\ casts\ if\ necessary=false +@de.uni_freiburg.informatik.ultimate.plugins.generator.cacsl2boogietranslator=0.0.1 + + +#Fri Oct 24 16:34:36 CEST 2014 +\!/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder= +file_export_version=3.0 +@de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder=0.0.1 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder/Convert\ code\ blocks\ to\ CNF=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder/Size\ of\ a\ code\ block=SequenceOfStatements +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder/Command\ for\ external\ solver=z3 SMTLIB2_COMPLIANT\=true -memory\:2024 -smt2 -in -t\:2000 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder/SMT\ solver=External_DefaultMode +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder/Dump\ SMT\ script\ to\ file=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.rcfgbuilder/To\ the\ following\ directory=./dump/ + + +#Thu Nov 06 16:26:23 CET 2014 +\!/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction= +file_export_version=3.0 +@de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction=0.0.1 +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Interpolants\ consolidation=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Compute\ Interpolants\ along\ a\ Counterexample=FPandBP +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Use\ separate\ solver\ for\ trace\ checks=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/SMT\ solver=External_ModelsAndUnsatCoreMode +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Command\ for\ external\ solver=z3 SMTLIB2_COMPLIANT\=true -memory\:2024 -smt2 -in +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Compute\ Hoare\ Annotation\ of\ negated\ interpolant\ automaton,\ abstraction\ and\ CFG=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Positions\ where\ we\ compute\ the\ Hoare\ Annotation=LoopsAndPotentialCycles +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Trace\ refinement\ strategy=CAMEL +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Automaton\ type\ used\ in\ concurrency\ analysis=PETRI_NET +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Large\ block\ encoding\ in\ concurrent\ analysis=OFF +/instance/de.uni_freiburg.informatik.ultimate.plugins.generator.traceabstraction/Compute\ cosets\ for\ OwickiGries\ annotation\ iteratively=true + + +#Thu Oct 29 23:01:13 CET 2015 +file_export_version=3.0 +@de.uni_freiburg.informatik.ultimate.boogie.procedureinliner=0.0.1 +\!/instance/de.uni_freiburg.informatik.ultimate.boogie.procedureinliner= +/instance/de.uni_freiburg.informatik.ultimate.boogie.procedureinliner/...\ calls\ to\ implemented\ procedures=ONLY_FOR_CONCURRENT_PROGRAMS + + +#Tue Nov 21 08:04:41 CET 2017 +\!/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding= +file_export_version=3.0 +@de.uni_freiburg.informatik.ultimate.plugins.blockencoding=0.1.22 +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Simplify\ transitions=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Apply\ optimizations\ until\ nothing\ changes=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Create\ parallel\ compositions\ if\ possible=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Remove\ sink\ states=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Rewrite\ not-equals=false +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Iterate\ optimizations\ for\ n\ times\ (<\=0\ means\ until\ nothing\ changes)=0 +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Create\ interprocedural\ compositions=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Remove\ infeasible\ edges=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Maximize\ final\ states=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Use\ SBE=true +/instance/de.uni_freiburg.informatik.ultimate.plugins.blockencoding/Minimize\ states\ even\ if\ more\ edges\ are\ added\ than\ removed.=false diff --git a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/preferences/TraceAbstractionPreferenceInitializer.java b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/preferences/TraceAbstractionPreferenceInitializer.java index 28480d7a733..3c3aa0c275d 100644 --- a/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/preferences/TraceAbstractionPreferenceInitializer.java +++ b/trunk/source/TraceAbstraction/src/de/uni_freiburg/informatik/ultimate/plugins/generator/traceabstraction/preferences/TraceAbstractionPreferenceInitializer.java @@ -326,7 +326,7 @@ public class TraceAbstractionPreferenceInitializer extends UltimatePreferenceIni public static final Map DEF_ADDITIONAL_SMT_OPTIONS = RcfgPreferenceInitializer.DEF_ADDITIONAL_SMT_OPTIONS; - public static final String LABEL_OG_ITERATIVE_COSETS = "Compute co-sets for OwickiGries annotation iteratively"; + public static final String LABEL_OG_ITERATIVE_COSETS = "Compute cosets for OwickiGries annotation iteratively"; public static final boolean DEF_OG_ITERATIVE_COSETS = false; public static final String LABEL_OG_COVERING_SIMPLIFICATION = From c323c66050eeb65c3344888c47e03a3361301688 Mon Sep 17 00:00:00 2001 From: "maul.esel" Date: Thu, 5 Aug 2021 15:57:51 +0200 Subject: [PATCH 066/536] prepare evaluation --- .../default/benchexec/concurrency.xml | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/releaseScripts/default/benchexec/concurrency.xml b/releaseScripts/default/benchexec/concurrency.xml index a46df4a202a..e97dd2d8b32 100644 --- a/releaseScripts/default/benchexec/concurrency.xml +++ b/releaseScripts/default/benchexec/concurrency.xml @@ -1,5 +1,5 @@ - +